2007/5/11

ゆゆぽん☆退避/追越列車とか作っちゃうかMona-(10)−区間閉塞のまとめ  VRMスクリプト禅問答
<<前回へ

第5回から前回までで解説した、区間閉塞信号の実現方法のまとめです。全体の流れをフローチャートで示します。

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

太枠は、それぞれセンサーと信号を示しています。細枠はセンサーおよび信号のスクリプトの中に書かれるメソッド(BeginFunc〜EndFuncの組)がいくつあるかを示しています。つまり、センサーに1つ、信号に4つのメソッドがあれば、区間閉塞を実現できる、ということです。

※本連載に素直に従う限り、この他に信号スクリプトに信号灯火を切り換えるメソッドMtdSignalR/Y/Gがあるはずですが、雑多になるので図には示していません。

青太字は、それぞれのオブジェクトが、自分以外のオブジェクトの変数を調べることを示しています。具体的には、前回までのサンプルコードを例にすると、

センサースクリプトのObjSignal.....(このセンサーが)担当する信号機
信号スクリプトのObjNextSignal.....(この信号の)次区間信号機

ということになります。これは同時に、レイアウト上の閉塞信号(センサー1つと信号1つの組み合わせ)に書かれるスクリプトは、これらのオブジェクト変数にどの部品の名称をgetするかのみが異なるだけで、あとはまったく同じで良いことを意味しています。

下線とそこから伸びる→は、メソッドを実行することを意味しています。単に「実行する」とだけある場合はcall命令を、「一定時間後に」とある場合はSetEventAfter命令を使います。

注意すべき点としては、信号スクリプトにおいてSetEventAfter命令を使う場合のイベント管理変数は、ローカル変数ではなくグローバル変数を使うことです。かつ、すべてのSetEventAfter命令で同じ変数を使います。閉塞メソッド冒頭の「実行中のイベントがあればこれを解除する」としているイベント変数にも同じものを使います。この理由は後日解説します。とりあえず現時点ではそうしておきましょう。

//でそれぞれ着色されている部分は、信号スクリプトが自分自身の灯火色を、この時点で切り換えることを意味しています。本連載的には、MtdSignalR/Y/Gのいずれかをcallする、ということです。

以上で、課題(2)信号自動制御と、課題(3)編成走行位置把握については8割方クリアしたことになります。次回以降、ここまでに作り上げた仕組みを利用して課題(4)保安機構を組み込み、最終的な課題“退避/追越列車とか作っちゃうかMona-”の解決に着手します。

次回へ>>
0

2007/5/12  6:54

投稿者:ghost
おぉ、壁を越えましたね。

次回から2回かけて、編成に信号を守らせる方法を解説します(先にこっちを説明した方が、最後のまとめがわかりやすいはずです)。そしていよいよ退避/追越列車が実現されます。お楽しみに。

2007/5/12  0:52

投稿者:ゆゆぽん☆
動きました。

//信号遷移メソッド
BeginFunc MtdCtrlSignal
ifeq ObjNextSignal.VarSignalColor 3
call this MtdSignalG
endif
ifeq ObjNextSignal.VarSignalColor 1
call this MtdSignalY
endif
if VarSignalColor 6
SetEventAfter this MtdCtrlSignal WaitID 100
endif
EndFunc

順番どおりに入力していくと、動きました。
2編成使ってほぼ同時にセンサーを踏ませてみましたが、信号が矛盾したメソッドを受けることもありませんでした。

次回は出発・場内信号機の処理ですか?
その次に、保安機構組み込みと・・・。
・・・その前におやすみなさい(v_v)ZZZ

2007/5/11  23:44

投稿者:ghost
パッと見、信号遷移メソッドに2つ問題があります。

(1) 緑だったら信号遷移メソッドを再実行、になっていること。正しくは“緑でなかったら”ですね。

(2) ifeq ObjNextSignal.VarSignalColor 1 が成立して信号を黄色に切り換えると、ObjNextSignal.VarSignalColorの値は3になります。

これに続けてifeq ObjNextSignal.VarSignalColor 3をやってしまっているので、これは「赤だったら緑にしろ」と意味的に同じになってます。

これはちょっとボクの書き方がマズかったかもです。正しい順番で書くと・・・

・次の信号が黄だったら自分を緑にする。
・次の信号が赤だったら自分を黄にする。
・自分が緑ではなかったら、信号遷移メソッドを100ミリ秒後に再実行する。

以上を修正して試してみてください。

2007/5/11  23:35

投稿者:ゆゆぽん☆
信号スクリプトに


//信号灯火色管理変数
Var VarSignalColor
call this MtdSignalG
//次の信号
VarSignal ObjNextSignal
get ObjNextSignal Signal3
//条件待ち用イベント変数
Var WaitID


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

BeginFunc MtdSignalY
set VarSignalColor 3
SetSignal VarSignalColor
EndFunc

BeginFunc MtdSignalG
set VarSignalColor 6
SetSignal VarSignalColor
EndFunc


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


//次の信号が赤以外になるのを待つメソッド
BeginFunc MtdWaitNextSignal
ifeq ObjNextSignal.VarSignalColor 1
SetEventAfter this MtdWaitNextSignal WaitID 100
else
call this MtdWaitNextSignalR
endif
EndFunc

//次の信号が赤になるのを待つメソッド
BeginFunc MtdWaitNextSignalR
ifeq ObjNextSignal.VarSignalColor 1
SetEventAfter this MtdWaitNextSignalR WaitID 100
else
call this MtdCtrlSignal
endif
EndFunc

//信号遷移メソッド
BeginFunc MtdCtrlSignal
ifeq ObjNextSignal.VarSignalColor 6
SetEventAfter this MtdCtrlSignal WaitID 100
endif
ifeq ObjNextSignal.VarSignalColor 1
call this MtdSignalY
endif
ifeq ObjNextSignal.VarSignalColor 3
call this MtdSignalG
endif
EndFunc

と書いたのですが、摩訶不思議な動作をします。

ある信号(例としてSignal1)と連動するセンサーを感知したら赤になり、ObjNextSignalの信号と連動するセンサーを感知したら黄色になります。
ここまではいいのですが、その次のセンサーを感知しても青にはならず、最後に編成を感知した信号から順に、赤…黄…黄…黄…となります。
編成がレイアウトを1周し、再度ある信号を通過すると、青になります。どこが間違いですか?

コメントを書く

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




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