2007/5/7

ゆゆぽん☆退避/追越列車とか作っちゃうかMona-(8)−編成が閉塞区間を通過したことを判別する(前編)  VRMスクリプト禅問答
<<前回へ

“編成が閉塞区間に進入したことを判別する”については、前々回・前回で既に実現できています。つまり、閉塞区間の入口の信号が赤になっていれば=信号のグローバル変数VarSignalColorが1であれば、その閉塞区間には編成が存在するはずです。

ここに今回のテーマである“編成が閉塞区間を通過したことを判別する”処理を加えてやれば、区間閉塞が実現されたことになります。つまり、ある信号から見た場合、自分から次の信号までの区間を、編成が通過し終えた時点で、信号を赤から黄/緑に遷移させる仕組みです。

さて、VRMスクリプトにおいては、すべての処理はすべからく“イベント”から開始されます。編成の通過を判別する処理も例外ではありません。そして、この処理の開始点となり得るイベントは、現時点では閉塞をおこなったセンサーイベント、つまり、前々回示した信号スクリプトのメソッドMtdSectionBlockをcallしたイベントしかありません。従って、編成の通過を判別し、閉塞を解除する処理はこのMtdSectionBlockの中に書くことになります。

クリックすると元のサイズで表示します

上図を見てください。今、右側から黄色の編成が2つの信号で区切られた閉塞区間に進入したとします。右側の信号がセンサーイベントによって赤になります(閉塞区間進入の判別)。

区間閉塞が正しく動作する、と仮定すると、このとき1つ先の信号の状態は、大きく分けて二通り考えられます。1つは上図左のように、黄または緑になっている状態。これは、次の閉塞区間に編成がいないことを意味しています。もう1つは上図右のように、赤になっている状態。これは、次の閉塞区間に編成がいることを意味しています。

上図右の状態にある場合、黄色の編成はこの閉塞区間内で停車し、先行する列車が次の閉塞区間を通過し終えるのを待つべきです。とすると、少なくとも1つ先の信号が赤の状態では、右側の信号もまた赤のままの状態にして、後続列車に黄色の編成がまだ閉塞区間を通過し終えていないことを知らせなければなりません。つまり、

1つ先の信号が赤であれば、黄/緑への遷移を始めてはならない。1つの先の信号が赤でなくなるまで、待たなければならない。

ということです。これを、よりスクリプト的に表現すると、

MtdSectionBlockでまずやるべきことは、1つ先の信号のグローバル変数VarSignalColorが、1でなくなるまで待つことである。

になります。これを実現するには、いわゆる“条件成立待ちメソッド”を使うことになります。前々回に示したサンプルコードにこれを書き加えたものを以下に例示します(元からあったコードはグレーアウトしてあります)。
[信号スクリプト]
//信号灯火色管理変数
Var VarSignalColor
call this MtgSignalG

//次の信号
VarSignal ObjNextSignal
get ObjNextSignal {進行方向の次の信号の名称}
//条件待ち用イベント変数
Var WaitID

//灯火色設定メソッド
BeginFunc MtdSingalR
  set VarSignalColor 1
  SetSignal VarSignalColor
EndFunc

//閉塞実施メソッド
BeginFunc MtdSectionBlock

//イベントを解除
KillEvent WaitID
//灯火色切替メソッドを実行
  call this MtdSingalR
//次の信号が赤以外になるのを待つメソッドを実行

  call this MtdWaitNextSignal
EndFunc

//次の信号が赤以外になるのを待つメソッド
BeginFunc MtdWaitNextSignal
  ifeq ObjNextSignal.VarSignalColor 1
    SetEventAfter this MtdWaitNextSingal WaitID 100
  else
    call this {信号遷移メソッド}
  endif
EndFunc
追記部冒頭の信号オブジェクト変数ObjNextSignalは、その名の通り、進行方向にある次の信号の名称を記憶する変数です。ghost流閉塞信号では、それぞれの信号が知っているべき他の信号は、基本的には進行方向の次の信号、つまり、自分を通過した編成が次に到達する信号だけです。

閉塞をおこなうメソッドMtdSectionBlockへの追加は2つです。まずはKillEvent命令で、これはちょっとピンと来ないかも知れませんが、条件待ち状態にある信号に、さらに後続の編成が進入した際に誤動作をおこさないための御呪いです。とりあえず、こんなものだと思っておいてください(要望があれば後日改めて解説します)。

もう1つが、今回の本題である“条件待ちメソッド”のcallです。これで流れは続くメソッドMtdWaitNextSignalに移ります。そして、このメソッドは、オブジェクト変数ObjNextSignalが示すところの信号のグローバル変数VarSignalColorを100ミリ秒(この数字に深い意味はありません)毎にチェックし、これが1、つまり信号が赤であればもう100ミリ秒待ち、そうでない場合は次のメソッド(次回解説)へ制御を移します。

さて、今回の課題は“編成が閉塞区間を通過したことを判別する”だったわけですが、ここまでで実現されたのはその半分です。つまり、編成が閉塞区間を通過する可能性が生じた(次の閉塞区間には編成がいないことがわかった)ところまでです。次回、残りの半分、つまり、編成が閉塞区間を通過したことを確認し、それに合わせて信号を切り換える処理を解説します。

次回へ>>
0

コメントを書く

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




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