2005/9/19

目指せ完全自動運転(11)−ある条件が整うまで待つメソッド  VRMスクリプト禅問答
難易度:☆☆☆☆☆

昨日紹介した「出発進行待ちメソッド」「G現示待ちメソッド」は、いずれも@条件が整えばあることを実行する、Aそうでなければ自分自身を〜秒後に再実行する、という構造のメソッドになっていました。一般化すると以下のような形になります。
[条件成立待ちメソッド]
Var TimerID
//
//メソッド
//
BeginFunc {メソッド名}
if {チェックすべき条件}
//ここで条件成立時の処理を実行
else
SetEventAfter this {メソッド名} TimerID {チェック間隔}
endif
EndFunc
このメソッドを、他のメソッドから一旦実行してやれば、あとは条件が成立するまで{チェック間隔}毎に自動的に条件のチェックが繰り返されます。そして、条件が成立した際にはelse以降のSetEventAfter命令が実行されないので、そこでこの繰り返しが終了します。
本連載で扱っている完全自律型自動運転においては、しばしばレイアウト上の編成や部品(オブジェクト)が自分以外のものの状態が変化するのを待たなければならないことが発生します。たとえば、ある信号が青になるのを待つ、であるとか、あるポイントが反位に切り替わるのを待つ、であるとか、ある編成がどこかを通過するのを待つ、といった具合に。
この方法の最大のメリットは、条件成立を発生させる部品自身(信号の例で言えば青に切り替わる信号自身)は自分の動作に専念できることです。この方法を使わないと、信号は自分の切り替わりに連動して発生するすべての事柄=他のオブジェクトのメソッド、を知っていなければなりません。この[条件成立待ちメソッド]のテクニックを、本シリーズでは換呼信号の連携に多用している動的オブジェクト参照と組み合わせて使うことにより、それぞれのオブジェクトが「自分がおこなうべき動作のみに専念する」ことが可能になります。これは、そのレイアウトに拡張性をもたらし、修正や問題解決も容易となることを意味しています。

クリックすると元のサイズで表示します
<こういうケースを考えてみよう>

少しハードルが高めの応用問題を考えてみましょう。
上の図を見て下さい。今、赤い太矢印の向きに列車が進入し、停車用センサーを踏んで停止しました。これにより赤矢印の編成は出発信号SIGNAL5がG現示になるのを、前回紹介したメソッドMtdWaitDepartureを実行して待っています。
この後、列車は赤細矢印に従って、本線を跨ぎ渡り線を通って反対側の引込み線に入る予定ですが、何も考えずにSIGNAL5をG現示に切り替えてしまうと、黄太矢印で示した本線を走行する列車と接触してしまいます。また、赤太矢印の列車はあくまでも回送列車であり、可能な限り本線を走行する列車を優先させたい(つまり通過を待ちたい)としてみましょう。
さて。今回紹介した「ある条件が整うまで待つメソッド」を駆使してSIGNAL5をG現示へ切り替えるスクリプトを書くとしたらそれはいったいどんなものになるでしょうか。考えてみてください。
前提条件として、SIGNAL1〜SIGNAL4はこれまで本シリーズで紹介してきた自動閉塞信号であり、黄太矢印の列車もその信号現示を守る自動運転編成であるとします。解答例は数日後に。

質問やご要望があれば気軽にコメント欄に書き込んでください。特に「ここの意味がよくわからないのでもっと詳しく」という指摘は大歓迎です、なぜわかりにくいのかの理由が添えられていると特に。
0

コメントを書く

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




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