2006/10/28

【何か】シリーズを作ってみよう(その12)  【何か】スクロール
前回へ戻る>

今回は変数VarParameterの距離だけ走って期待の停車位置にピタリと止めるメソッドsubStopの中身について解説します。ここには、停車した後の動作(必要に応じて方向転換し、再発車する)のための準備も含まれます。

//↓独自の初期化処理(グローバル変数宣言等)はここで

Var VarParameter //パラメータ保存用
Var VarFlag //折り返し運転フラグ
Var IDEvent //イベントID
Var VarStartVoltage //減速開始時の電圧
Var VarStartTime //停車・再出発所要時間


//↑ここまで

まず、scriptセクション冒頭の初期化処理部に、例によって黄色で示したグローバル変数の宣言を追加しておくことにします。これらを何に使うかについては、メソッドの中身に触れながら見ていくことにしましょう。

では、肝心のメソッドsubStopの中身です。これを既に組み込み済みのメソッドsubSpeedの後に書き加えます。

BeginFunc subStop
//
//VarParameterの距離だけ走行して停車するメソッド
//
//既に停車イベントが設定されていれば、一旦これを解除する
KillEvent IDEvent
//停車イベント設定
SetEventZeroSpeed subStopped IDEvent
//停車所要時間算出
Var TmpSpeed
Var TmpTime
GetCurrentSpeed TmpSpeed
div TmpSpeed 3.6
mov TmpTime VarParameter
mul TmpTime 300.0
div TmpTime TmpSpeed
cnvint TmpTime
//再出発用電圧・加速所要時間記録
GetCurrentVoltage VarStartVoltage
mov VarStartTime TmpTime
//減速開始
SetTimerVoltage 0.0 TmpTime
EndFunc



冒頭からやや難解なことをしていますが、腰を据えて解説していきます。

最初の2行は一組で意味を為しています。まず、2行目の“SubEventZeroSpeed”命令ですが、これは「速度が0になったら=停車したら、あるメソッドをcallせよ」という命令です。実行するメソッドはsubStoppedで、これは次回解説します。その後に書かれたグローバル変数IDEventには、この命令で設定されたイベントを無効化、つまり、停車してもメソッドsubStoppedがcallされないようにするために必要となる番号が代入されます。この番号をイベントIDと言います(イベントIDについては、こちらも参照してください)。

ここで一行戻ります。“KillEvent”命令は「イベントIDが示すイベントを無効化する」役割を有しています。つまりここでは「変数IDEventが示すイベントを無効化せよ」という意味になります。

メソッドsubStopがビュワー起動後に始めてcallされた場合、変数IDEventの値は0です。イベントIDは1から始まる整数であり、0は意味がないため空振りします。つまり、何も起こりません。そして、続くSetEventZeroSpeedで始めてIDEventに値が入ります。次にメソッドsubStopがcallさた時、変数IDEventには、先ほどSetEventZeroSpeedによって得られたイベントIDが入っていると考えられます。

これは何を意味しているかと言うと、停車を命じる【何か】センサーを通過して減速している最中に、もう1度別の停車を命じる【何か】センサーを通過した、ということです。もし、KillEventが冒頭にないと、SetEventZeroSpeedにより再び停車時イベントが多重に設定されます。つまり、停車した際にメソッドsubStoppedが二回実行されてしまう、ということです。これを避けるためには、この例に示しているように前もってKillEventをしておけば良いことになります。この手法は、他にもいろいろと応用があり得るのですが、本題から脱線してしまうので、詳しい解説は後日改めて書くことにします。

続く“停車所要時間算出”の部分はこちらで解説しているのと同じ方法を使っています(単位が異なりますが)。この部分が実行された結果、VarParameter(mm)走行してピタリと停車するための所要時間がローカル変数TmpTime(ミリ秒)が得られます。あとは“SetTimerVoltage”命令で減速するだけですね。

その前に。“再出発用電圧・加速所要時間記録”に続く二行で、グローバル変数VarStartSpeed、VarStartTimeに、それぞれ現在の走行電圧と、さきほど求めた停車のための減速所要時間をそれぞれ代入しています。これは、次回以降解説する「再出発」の際に使うためです。つまり、再出発に際しては停車のまったく逆の動作、停車に際したのと同じだけの時間を使って、停車を命じる【何か】センサーを通過したときの速度まで加速することになります。

最後に、お馴染みのSetTimerVoltage命令で、電圧0.0=停車を目指してTmpTime(ミリ秒)かけての減速を開始します。これでVarParameter(mm)先にある停車位置にピタリと停車することになります。そして、停車によって冒頭のSetEventZeroSpeed命令によって設定されたイベントが発動し、メソッドsubStoppedがcallされることになるワケですが、その中身は次回に。

次回へつづく>
0

コメントを書く

この記事にはコメントを投稿できません




teacup.ブログ “AutoPage”
AutoPage最新お知らせ