2007/5/9

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

前回までで、以下のことが実現されました。

・編成が信号を通過すると同時に、信号を赤にする。
・もう1つ先の信号が赤ではない状態になるまで待つ。

今回はその続きです。

次にやることは“もう1つ先の信号が赤になるまで待つ”です。「え、それは前回やったじゃん?」と早とちりしないように。前回やったのは“もう1つ先の信号が赤ではない状態になるまで待つ”ですから。

「え、赤ではない状態になるまで待ったのに、今度は赤になるのを待つ?」

混乱するのはごもっともなので、絵で説明しましょう。前回の最後にも述べましたが“もう1つ先の信号が赤ではない状態になるまで待つ”というのは、実は“もう1つ先の閉塞区間に先行する列車がいないことを確認する”と同じ意味を持っています。

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

上図のαで示した信号(一番右)に注目してください。この信号が受け持っている閉塞区間を薄い緑色で示しています。今、黄色の編成が信号αを通過した(センサーを踏んだ)ので信号αは赤です。つまり、薄い緑色の閉塞区間には黄色い編成がいるので“閉塞している”ということです。

このとき、1つ先の信号βに注目すると、[A]〜[D]のいずれかの状態([C]と[D]の意味合いはほとんど同じですが)であるはずです。信号βの受け持つ水色の閉塞区間に先行する青い編成がいれば、これは水色の区間が閉塞しているということですから、信号βは赤であるはずです。逆に、信号βが赤でない状態(条件待ちメソッドで待った状態)というのは[B]〜[D]のいずれか、つまり水色の区間に編成はいないことを意味しています。ここまではいいですか?

ここで、さらに信号βが赤になるのを待つというのは、下図の状態になるということです。

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

先行列車がいないことは確認済みなのですから、次に信号βを赤にする可能性のある編成は、信号αを赤にした黄色い編成自身以外はあり得ません。つまり、黄色い編成=薄い緑色の区間を閉塞させていた編成が、この閉塞区間を出ていったということです。

※厳密に言うと、ここで判明するのは“黄色い編成が閉塞区間を出始めた”です。完璧な区間閉塞を実現するには、さらに黄色い編成の末尾台車が信号βを通過したことを確認すべきですが、話が複雑化するので無視します。挑戦したい人はやってみてください。

薄い緑の区間から編成が出ていったのですから、信号αにはこの区間を閉塞する理由がなくなりました。つまり、もう信号は赤でなくていい、ということです。なので・・・

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

この時点で、信号αを黄色に切り換えます。やっと信号が遷移しました。後は、同様に信号βが黄色になるのを待って信号αを緑にしてやれば、一連の動作は完了です。

「えー、でも信号βはどうやって黄色になるの?」

なんてコトを聞かないように。信号βにも信号αと同じスクリプトが書いてあればいいだけの話です。ただし、信号βはもう1つ先の信号γの状態を監視するワケです。

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

黄色い編成が左へ向かって走り続ければ、遅かれ早かれ信号γのセンサーを踏みます。もちろん、信号γにも同じスクリプトが書かれているので赤になります。すると、信号βが、信号αがβの状態に合わせて動作したのと同じ理屈で黄色になります。これが上図の状態。

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

この時点で信号αを緑にすれば万事OK。これで課題(3)-3“編成が閉塞区間を通過したことを判別する”が達成できたことになります。次回、この一連の流れをスクリプト化するために、改めてフローチャートにまとめます。

次回へ>>
0

2007/5/10  18:39

投稿者:ghost
謝る必要はないです。

ある意味、意図がうまく伝わっていないという点では、ボクの解説だって偉そうなことは言えませんから。

とりあえず、ifeq命令の変数の書き方を直して、次の記事に掲載するフローチャートを待ってください。多分、今のゆゆぽん☆殿であれば、このフローチャートを見ればいけると思いますので。

2007/5/10  18:29

投稿者:ゆゆぽん☆
説明が下手なものですみません。

> 確かに、MtdWaitNextSingalとなってました。
は、おっしゃるとおり微妙な間違いがあり、
それを修正することでビュワーが起動しました。
という意味です。

>ペアのセンサー
Signal1だったら、SigSns1という組合せの事です。

ぼくが解りやすいかと思ってても伝わらないこともあるということを学びました。

2007/5/10  18:17

投稿者:ghost
以前にも申し上げたと思いますが、貴殿の目の前で起きていることは、ボクには見えていません。そのことを忘れないように。

> 確かに、MtdWaitNextSingalとなってました。

意図がわかりません。
綴り間違いがみつかり、それを修正することでエラーが解決したと理解しますが、それで良いですか?

> ペアのセンサーを通過すると、青から黄になってしまいます

“ペアの信号”とは、具体的に何を指していますか。少なくとも、ボクの解説の中では使っていない言葉なので、ゆゆぽん☆殿がそれが何を指しているのか説明してくれないと、回答できません。

恩着せがましく申し上げるつもりはありませんが、ボクはボクなりに、意図がゆゆぽん☆殿(を含む読者諸兄)に伝わるよう、努力しています。ゆゆぽん☆殿も、ボクに貴殿の意図が伝わるよう、努力してください。



明日日付で、閉塞信号を実現するためのフローチャートを公開する予定です。まずはそれを見て、ゆゆぽん☆殿が今書いているスクリプトと、やろうとしていることが一致するかを確認するように。

少なくとも、現時点でコメント欄に書き込んでくれているスクリプトは、ボクが思っているそれとは違います。

加えて、1つ先の信号(ObjNextSignal)の灯火色(VarSignalColor)をif系命令その他で参照する場合、

 誤:ObjNextSignal VarSignalColor

 正:ObjNextSignal.VarSignalColor

です。要するにオブジェクトと変数名の間のピリオド(.)が抜けています。双方の変数に正しく値がget/setされているならば、

if ObjNextSignal VarSignalColor

(続く1は、構文違反なのでVRMに無視されています)

は常に不成立です。従ってelse以降の命令が即座に実行される状態のはずです。これが“黄になってしまいます”の直接の原因でしょう。

が、繰り返しますが、ロジックが間違っています。でも構文は(前述の.抜けがあるものの)安定してきました。つまり、確実に上達してきているということです。ここが山場ですので、もう一頑張りしちゃってください。よろしく。

2007/5/10  17:38

投稿者:ゆゆぽん☆
確かに、MtdWaitNextSingalとなってました。
ビュワーは起動するのですが、今度はペアのセンサーを通過すると、青から黄になってしまいます。

[信号スクリプト]
//閉塞実施メソッド
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 MtdSignalY
endif
EndFunc

ObjNextSignalが赤ならば、100ミリ秒後に
MtdSignalYを実行し、この信号を黄にする。

はずが、どうしてでしょう?
MtdSignalYは間違いでしょうか?
現在、MtdWaitNextSignalは1つの信号にしか
書いていません。

2007/5/9  23:19

投稿者:ghost
既に複数の信号にスクリプトを書いていませんか?

エラーメッセージを正確に示しましょう。よく見ると、MtdWaitNextSignalと微妙に綴りのことなるそれがエラーになっている可能性があります。

以下の記事も参考にしてください。

http://silver.ap.teacup.com/ghost/564.html

2007/5/9  21:25

投稿者:ゆゆぽん☆
MtdWaitNextSingalのペアができているのに
未定義のメソッドと言われます。
どうしてでしょうか?
[センサースクリプト]
//信号灯火色管理変数
Var VarSignalColor
call this MtdSignalG
//次の信号
VarSignal ObjNextSignal
get ObjNextSignal Signal7
//条件待ち用イベント変数
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 MtdWaitNextSingal WaitID 100
else
call this MtdSignalY
endif
EndFunc

コメントを書く

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




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