「ゆゆぽん☆退避/追越列車とか作っちゃうかMona-(12)−信号の灯火色を調べる(後編)」
VRMスクリプト禅問答
<<前回へ
編成に信号を守らせる(少なくとも、黄信号に対しては減速し、赤信号に対しては停車させる)には、以下のことをする必要があることを前回明らかにしました。
[1] それぞれの閉塞信号の直前に“換呼センサー”を配置する。
[2] 換呼センサーは、編成に灯火色を調べるべき信号(換呼センサーの進行方向にある信号)の名称を編成に教える。
[3] 換呼センサーは、信号灯火色に応じてそのまま走行/減速/停車のいずれかをおこなう編成のメソッドを実行する。
今回は、もう少し具体的に、どのようなスクリプトを書かなければならないかを解説します。ただし、動作するスクリプトそのものは示しません。それを書くのは、読者諸兄の楽しみに取っておきましょう。
まず[1]についてですが、これはレイアウター上で前回図に示したような位置にセンサーを置けばよろしい。閉塞信号と閉塞センサーの名称の際同様に、後から見て対応関係がわかるように、閉塞信号と同じ連番を設けた名称をつけておいてやるといいでしょう。
[2]は、もう少し細かく分けて考える必要があります。
第一に、信号の換呼は編成がセンサーを通過する際に起こるワケですから、このためには少なくとも1つのメソッド(仮にMtdRelayCheckSignalとしましょう)と、これを実行するセンサーイベントが必要です。
第二に、このMtdRelayCheckSignalでまずやるべきことは“編成に灯火色を調べるべき信号の名称を教える”ことです。これを実現するには、センサースクリプトは教えるべき信号の名前を知っていなければなりません。これは、これまでに解説したセンサーとポイント、閉塞センサーと閉塞信号の関係と基本的に同じことです。センサースクリプトの冒頭で、適当な信号オブジェクト変数(ObjComingSignalとでもしますか?)を宣言し、これに換呼する信号の名前をgetしておきます。
第三に、これを“編成に教える”には、編成側にこれを受け取る信号オブジェクト変数(同ObjCheckSignal)が必要ですね。編成スクリプトの冒頭で宣言します。
第四に、これにセンサーが知っている=事前にgetしておいた信号名を渡す必要があります。編成オブジェクト変数(仮にObjTrain)に検知した編成名を取得(GetSenseTrain命令)し、これを使ってget命令を使って編成側のObjCheckSignalに、センサー側のObjComingSignalの値を渡してやります。
最後は[3]です。
第一に、編成スクリプトに信号灯火色に応じて走行速度を変化させるメソッドを用意する必要があります。仮にこれをMtdCheckSignalとしましょう。
第二に、このMtdCheckSignalを実行するのはセンサーの仕事ですから、さきほど用意したセンサー側のメソッドMtdRelayCheckSingalの最後で、このメソッドをcallしてやります。
あとは編成側のMtdCheckSignalの中身ですが、[2]で受け取った信号の名称(ObjCheckSignalに入っているはず)を使って信号の灯火色を調べ、これをif系命令で判断して、あとはお好みのSetVoltage/SetTimerVoltage命令で速度を変えれば完成ですね。速度を変える方法については、
こちらの記事も参考にしてみてください。
以上で、退避/追越列車を実現する下準備がすべて終わりました。いよいよ次回から、最後の仕上げに入ります。