「ゆゆぽん☆退避/追越列車とか作っちゃうかMona-(7)−閉塞区間に分けて考える」
VRMスクリプト禅問答
<<前回へ
今回から、いよいよ課題(3)“区間閉塞”について解説していきます。この課題は、前回までに触れた課題(1)〜(2)が1つのセンサーと1つの部品の一対一の関係であったのに対し、複数の部品の相互作用を考えなければならないという点において、その難易度が格段に高いです。気合を入れてついてきてください。
振り落とされそうに感じた場合は、ゆゆぽん氏も含めてコメント欄で詳細解説を要求してください。特に声が挙がらないようであれば、ご理解いただけたものと判断して先へと進んでいきます。なお、ゆゆぽん氏のリクエストに従い、信号は三灯式のものに限定して話を進めます(内容が理解できれば、四・五灯式に対しても応用できるはずです)。
区間閉塞とは、単純化すれば上図のように、一定間隔に閉塞信号を設け、信号と信号の間の経路=閉塞区間に1つの編成だけが進入するように信号灯火を制御する、ということです。信号部品自体はレールに対して何の影響も与えませんから、実際には信号と対で配置されるセンサー(上図では白い□)が、閉塞区間の区切りになります。
まず、前回までで実現されたところをおさらいしてみましょう。経路上の4つのセンサーと信号に、それぞれ前回解説したスクリプトが書き込まれているものと考えてください。中身は基本的に同じですが、センサー側の制御対象信号の名称は、センサーの位置に対応した信号のそれになっているものと想定します。
右側から走行してきた編成が最初のセンサーを踏むと、このセンサーと対になる信号が赤になります。ピンクの矢印は、編成を検知したセンサーが、信号の閉塞実施メソッドMtdSectionBlockをcallしていることを示しています。以下、編成が左へ向かって進むと・・・

↓

となっていきます。追突が防止されるという点で、区間閉塞の目的は果たしていますが、後続の列車が進入してくる余地がありませんね。つまり、閉塞信号を実現するということは、
・編成が進入したら信号を赤にする(前回達成した課題)。
・編成が通過し終えたら、信号を赤以外にする(今回以降に達成する課題)。
の2つの課題により成り立つということです。
さて、やや寄り道になりますが、先に“悪い例”を示しておくことにしましょう。
上図は、信号の制御方法としては間違っていないものの、閉塞信号の作り方としては不適切な考え方を示しています。箇条書きにすると・・・
《これは悪い例です》
・センサーが編成を検知したら、隣接する信号を赤にする。
・1つ前の信号を黄(Y現示)にする。
・2つ前の信号を緑(G現示)にする。
この方法は、しばしばネットVRM界隈でも見受けられるほか、困ったことに、製品付属のスクロールまでもがこの考え方で(しかもより悪い実装で)作られています。結論から言うと、この方法では区間閉塞は実現できません。
その理由は、上図のような状況を考えてみるとすぐにわかります。黄色で示した編成と青色で示した編成が、同時にセンサーを踏んだと考えてください。それぞれの編成位置のセンサーが3つの信号に赤・黄・緑の灯火色切替を命じると、オレンジの▼で示した信号は、同時に「赤になれ」「緑になれ」の矛盾する命令を受けることになります。
「いや、同時なんてあり得ないよ」とあなたは思うかも知れません。では、青の編成がセンサーを通過した直後に黄色の編成がセンサーを通過するケースを想定してみてください。青の編成が閉塞した(赤に変えた)信号を、直後に黄色の編成が緑にしてしまうことがわかりますか。これは、青の編成に後続する列車があった場合、追突を許可していることを意味します。
この方法は絶対に駄目、とまではいいません。が、本連載が目指している退避/追越列車の実現は、厳密な編成走行位置の管理が必要となるため、こういうトイライク(おもちゃ的)な手法は使えません。
ではどうすれば良いのか、については次回解説していきます。