2007/5/26
こちらのコメント欄の指摘で、ゆゆぽん☆殿の要件に対して漏れていることが発覚した退避/追越線それぞれに場内信号を設ける件について、サラッと触れておきます。
最初に、そもそも場内信号はどう振舞うべきか、という話なんですが、実はボク自身、ちょっとよくわかりません。理屈の上で考えると・・・
(1) 列車が進入すべき場内が非閉塞であれば緑になる。
(2) 列車の進行方向に関わらず信号が受け持つ防護区間が非閉塞であれば緑になる。のどちらかだろう、とは思うのですが、ご存知の方がおられたらご教示ください。今回は、比較的実装が楽な(2)のケースのみ解説するに留めます。(1)は(2)の応用でしかないので、各自で考えてください。
さて、この場合、考えられるパターンは以下に図示する4つに集約されます。

@場内に列車はいない

A本線(追越線)場内にのみ列車がいる

B待避線場内にのみ列車がいる

C場内は列車でいっぱい
このうち、@〜Aは本線の閉塞信号で実現されているので、特別な措置は必要ありません。残るのはB〜Cですが、これは・・・
・[閉@]センサーが編成を検知した時点で、編成の種別番号を調べる(ポイント切替と同じ考え方)。
・種別番号が待避線行きを示していた場合のみ、待避線場内信号を赤にする。で実現できます。このとき、追越線場内信号も一瞬赤になりますが、これは本線ポイントを退避列車が占有するので、理屈の上では正しい動作です(本物の鉄道がどうかはさておき)。この列車がポイントを渡って[特]センサーを踏めば、前々回に解説した仕組みで追越線場内信号の閉塞は解除されます。
あとは、待避線場内信号を緑に戻すタイミングですが、やや大雑把ながら[出]センサーが列車を検知した時点がシンプルで良いと思われます。厳密に言えば、この時点では列車は待避線を出切っていないのですが、もしこれで運転が破綻するようなレイアウトであれば、それは信号の仕組みよりは、線路容量を超えた列車が投入されていることが問題かと思われますから、ここで無駄に凝る理由はないでしょう。
最後に[換@]センサーに少し手を加えます。ここまで、換呼センサーはどの列車を検知した場合も無条件に自身が担当する信号の名称を編成に渡していましたが、ここだけは、列車が本線に進むのか待避線に進むのかによって換呼すべき信号が異なることになります。
よって、ここだけは、編成検知に連動していきなり信号名称を渡すのではなく、一旦編成の種別番号を調べてから、追越列車であれば追越線場内信号の名称を、退避列車であれば待避線場内信号のそれを、編成に渡してやる必要があります。
なんとか5月中に解説は終わりましたね、ご理解いただけたかどうかは別にして。

2007/6/1 11:45
2007/5/31 19:11
2007/5/31 11:24
ミもフタもないことを言いますが、結局のところご理解いただけていない、ということがよくわかりました。これ以上の介入は、事実上「代わりに作れ」と言われているのと同じなので、正直なところヤル気がおきません。
総じて致命的なのは、場所によって同じ変数名が異なる意味で用いられている点です。
察するに、連載当初、ボクの解説を待たずにご自身の思いで書かれた部分と、ボクがサンプルコードを示したものをコピー&ペーストした部分がゴチャゴチャになっているのが原因でしょう。
現状のレイアウトを手直しして、ゆゆぽん☆殿の意図に近いように動作するようにすることは不可能ではないとは思いますが、それは少なくともVRMスクリプトを理解する、という点においては無意味な行為です。
本気で理解することをお求めなのであれば、一旦このレイアウトは置いておいて、連載全体を精読した上で、もう一度ゼロから作ってみることをお奨めします。それが苦痛なのであれば、スクロールを使った方がいいです。
2007/5/30 22:53
[待避列車]
BeginFunc MtdCheckSignal
Var MtdVoltage
GetCurrentVoltage MtdVoltage
ifeq ObjCheckSignal.VarSignalColor 1
AutoSpeedCtrl 200 0.0
endif
ifeq ObjCheckSignal.VarSignalColor 3
if> MtdVoltage 0.55
AutoSpeedCtrl 200 0.5
endif
endif
EndFunc
何かがおかしいのは確かなのですが…。
2007/5/29 21:14
(ぼくの知っている限りでは)したがって、初期点灯を黄色にして、MtdSignalGは使っていません。
問題の症状ですが、閉@(場内)喚呼センサーを追越列車が踏んだときに切り替るはずのない待避場内が切り替わってしまいます。ログウィンドウに追越列車の変数内容が2つ出たと同時に切り替わるので、喚呼センサーに問題があると思います。
[喚呼センサー]
Var EvtSensor
SetEventSensor MtdSenseTrain EvtSensor
VarSignal ObjSignal12
get ObjSignal12 Signal12
VarSignal ObjSignal11
get ObjSignal11 Signal11
BeginFunc MtdSenseTrain
VarTrain VarTrainType
Var TmpType
GetSenseTrain VarTrainType
//変数TmpTypeに検知した編成のVarTypeの値を取得
mov TmpType VarTrainType.VarType
mov ObjSignal12.VarTrainType TmpType
mov ObjSignal11.VarTrainType TmpType
DrawVar TmpType
ifeq VarTrainType 250
call ObjSignal12 MtdCheckSpeedType
else
call ObjSignal11 MtdCheckSpeedType
endif
EndFunc
MtdSignalYや切替える要素のスクリプトは書いていません。変数が変なところに行き渡っているのでしょうか?
2007/5/29 12:35
合わせて、このコメント欄に「〜なるはずなのに・・・になる」という症状をレポートしておいてください。
メールに書いていただいてもいいのですが、ひょっとするとこの記事を読んでおられる方にとってのケーススタディになるかと思うので、公開しておいた方がベターかと思います。よろしく。
2007/5/29 9:12
が、よく解らないところで待避場内の信号が変わってしまいます。可能性のあるセンサーを探してみたのですが、それらしきものは見つかりません。
レイアウトを送らせていただいてもよろしいですか?
こちらこそ、お付き合いいただきありがとうございました。
足りないのは、ゆゆぽん☆殿の努力ではなく、偏にボクの説明力ですので、その点はお間違いのないように。ただ、その落差は、ご自身で生めていただくより他ありません。
考え方でわからないことがあれば、ご相談には応じますので、いつでもどうぞ。