2007/5/24

ゆゆぽん☆退避/追越列車とか作っちゃうかMona-(17)−特殊開放センサーで全体の流れを制御する(後編)  VRMスクリプト禅問答
<<前回へ

前回、待避線に退避列車が入りきった時点で、後続(追越)列車のために閉塞を開放するところまで解説しました。今回は、追越列車の通過を待って退避列車を出発させる方法を解説します。

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

今、本線(追越線)/待避線の両方に列車がいます。信号灯火はそれぞれ緑/赤ですから、追越列車が先に出発します。待避線の出発信号(図中の[出])を緑にするためには・・・

・追越列車が既に出発したこと。
・追越列車が駅から十分に離れたこと。

を知る必要があります。どうすればこれを知ることができるでしょうか。

出発した追越列車は、遅かれ早かれ[閉B]を踏むはずです。つまり、この時点で[閉B]の信号が赤になります。逆に、[閉B]の信号は、追越列車が出発するまでは緑であるはずです。

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

つまり“追越列車が既に出発した”というのは、[閉B]が赤になるのとイコールです。ということは、これは閉塞信号でやったのと同様に、条件成立待ちメソッドの出番です。[閉B]信号の灯火色(VarSignalColor)を調べ、赤(1)でなければ自分自身を少し待って再実行するメソッドを作ればいいんですね。

このメソッドの実行開始、つまり、待避線信号を緑にしてよいかどうかの条件待ちの開始と等しいワケですが、これは・・・

・待避線に列車が入っている。
・追越列車の通過の可能性が生じた。

の時点です。これは前回、本線上の[閉@]信号の閉塞を強制開放したのとタイミング的に同じです。よって、前回の閉塞開放メソッドの続きで、このメソッドをcallすれば良いことになります。

続いて“追越列車が駅から十分に離れた”はどうすればわかるでしょう。もう簡単ですね。今度は[閉B]信号が緑になるまで待てば良いワケです。基本的な考え方は閉塞信号と同じですね。

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

この時点で[出]を緑にします。前々回組み込んだ“出発信号とポイントを連動させる”仕組みがありますから、[出]を緑にすれば[出ポ]は反位に切り替わります。

加えて、後ろからさらに他の列車が突っ込んでくることに備えて、本線の信号は閉塞すべきです。これは、[閉A]センサーの閉塞メソッドをcallするだけで実現できます。本来は編成を検知して実行されるメソッドを、この時点でcallするワケです。これで[閉A]信号は赤になります。

ただし、このやり方だと[閉@]信号は緑のままなので、後続列車は最高速の状態で[閉A]信号に突っ込んでくる可能性があります。信号換呼の際の減速のやり方にもよりますが、停車しきれずに突っ込んでくるかも知れません。これを避けるには、できれば上図のように[閉@]を黄にして、赤の[閉A]信号に接近してくる列車を事前に減速させておきたいところです。

これも既に閉塞の仕組みが完成しているのでやり方は簡単で・・・

・最初に[閉@]センサーの閉塞メソッドをcallする。
・少し待って[閉A]センサーの閉塞メソッドをcallする。

これだけです。要するにこれは、列車が[閉@]→[閉A]の順にセンサーを通過する状態を、call命令で代替したものです。まず[閉@]信号が赤になり、続いて[閉A]信号が赤になると、これを受けて[閉@]信号が黄になります(上図の状態)。

あとは、放っておけば退避列車が[閉B]を通過した時点で[閉A]「閉@]は閉塞のルールに従って勝手に緑へ向かって遷移します。これが先に“すべての部品は出揃っている”と述べた理由です。閉塞の仕組みは、このように、単に信号の色を変化させるのみならず、列車走行位置の把握と、それに連動しての複雑な信号切替にそのまま利用することが出来る、というワケです。

加えて、退避列車が出発した後は[出]信号は赤に戻った方がリアルですから、[出]センサーからは[出]信号を赤にするメソッドをcallしておきましょう。この信号が次に緑になるのは、ここまで述べた流れ以外ありませんから、[出]信号には閉塞の仕組みは必要ありません。

次回へ>>
0

2007/5/29  8:41

投稿者:ghost
ぶらぼー。>ゆゆぽん☆殿

2007/5/28  18:18

投稿者:ゆゆぽん☆
待避列車の初期位置を変えて、出信号機の中身を改めたら、動きました。
[出信号機]

//信号灯火色管理変数
Var VarSignalColor
call this MtdSignalR

VarSignal ObjNextSignal
get ObjNextSignal Signal3

VarSignal ObjWaitSignal
get ObjWaitSignal Signal5

VarSensor ObjSensor1
get ObjSensor1 SigSns1

VarSensor ObjSensor11
get ObjSensor11 SigSns11

VarPoint ObjPointW
get ObjPointW Suma-W1

Var TmpType
Var VarTrainType
set TmpType 100

Var WaitID

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

BeginFunc MtdSignalG
set VarSignalColor 6
SetSignal VarSignalColor
call ObjPointW MtdTurnout
EndFunc


BeginFunc MtdWaitSignal
if ObjNextSignal.VarSignalColor 1
call this MtdWaitSignalR
else
SetEventAfter this MtdWaitSignal WaitID 100
endif
EndFunc

BeginFunc MtdWaitSignalR
call this MtdDepCtrl
EndFunc

BeginFunc MtdDepCtrl
ifeq ObjWaitSignal.VarSignalColor 1
call this MtdSignalG
call this MtdMainSigCtrl
else
SetEventAfter this MtdDepCtrl WaitID 100
endif
EndFunc

BeginFunc MtdMainSigCtrl
call ObjSensor11 MtdRelaySectionBlock
SetEventAfter ObjSensor1 MtdRelaySectionBlock WaitID 100
EndFunc

あと、最終ページの課題のみです。

2007/5/27  16:55

投稿者:ghost
メール、受け取りました。
全部読んだワケではありませんが、概ね問題はわかりました。

(1) 退避列車の初期位置が悪い

今回の仕組みでは、出発信号を緑にする条件待ちは、[特]センサーが退避列車を検知することで始まるようになっています。つまり[特]センサーを何かが通過しない限り、出発信号は決して緑になりません。

送っていただいたレイアウトでは退避列車が既に退避線に収まっています。これでは意図通りの動作をしません。

退避列車の初期位置を駅の手前にしてビュワー起動後に入線させるか、今のままの初期位置を保つのであれば、ビュワー起動時に限り、Signal2のメソッドWaitMtdSignalRを強引に実行して(宣言部でSetEcentAfterで100ミリ秒後実行するのがお奨め)、退避列車が一度センサーを通ったのと同じ状況にしてやる必要があります。

(2) 肝心のSignal2のWaitMtdSignalRの中身もおかしい

これについてはもう一度本文を読み直して考えるように。少なくとも1つのメソッドでは無理です。

・追越列車が既に出発したこと。

 閉Bが赤でなければ次へ(1つ目のメソッド)

 閉Bが赤になれば次へ(2つ目のメソッド)

  =閉Bを追越列車が通過した

・追越列車が駅から十分に離れたこと。

 閉Bが緑であれば、出発信号を緑へ(3つ目のメソッド)

こういう構成になるはずです。

2007/5/27  13:45

投稿者:ghost
流石にここまで来ると、これはああですか、あれはどうですか、のやりとりでは解決が難しいです。

“卒業試験”として、ここまで作ったレイアウトファイルをメールに添付して送ってもらえませんか?

2007/5/27  12:30

投稿者:ゆゆぽん☆
[出]センサーは

//Var命令で宣言
VarSignal ObjSignal2
get ObjSignal2 Signal2


Var SigCtrl
SetEventSensor MtdRelaySectionBlock SigCtrl


BeginFunc MtdRelaySectionBlock
call ObjSignal2 MtdSignalR
EndFunc

これだけで、編成を感知したら赤にする以外何もしていません。出信号機のifeq VarTrainType 100 が
心に引っかかるのですが・・・。

2007/5/27  10:54

投稿者:ghost
[出信号機]は・・・

(1) 退避線に退避列車が入ったら、追越列車の通過を待って緑になる。
(2) 退避列車が自身の位置を通過したら=出発したら赤になる。

以外の遷移をする必要がありません。

示していただいていませんが、おそらくは[出]センサーのセンサーイベントから、[出信号機]のWaitMtdSignalRをcallしておられるのではないかと。

これをすると、赤のままであってよい[出信号機]が、閉塞信号同様に前方の信号の遷移に連動して緑になってしまいます。その結果、連鎖メソッドが発動して[閉A]が赤になっている・・・と、まぁ、そういう感じではないかと思うのですが、いかが?

2007/5/27  10:24

投稿者:ゆゆぽん☆
[出信号機]
//信号灯火色管理変数
Var VarSignalColor
call this MtdSignalR

VarSignal ObjNextSignal
get ObjNextSignal Signal3

VarSignal ObjMainSignal
get ObjMainSignal Signal5

VarSignal ObjSignal1
get ObjSignal1 Signal1

VarPoint ObjPointW
get ObjPointW Suma-W1

Var TmpType
Var VarTrainType
set TmpType 100

Var WaitID

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

BeginFunc MtdSignalG
set VarSignalColor 6
SetSignal VarSignalColor
call ObjPointW MtdTurnout
EndFunc


BeginFunc WaitMtdSignalR
if ObjMainSignal.VarSignalColor 6
SetEventAfter this WaitMtdSignalR WaitID 100
endif
ifeq ObjMainSignal.VarSignalColor 1
ifeq VarTrainType 100
call this MtdSignalG
call ObjSignal1 MtdSectionBlock
endif
endif
EndFunc

[特センサー]
VarPoint ObjPoint
get ObjPoint Suma-E1

VarSignal ObjSignal1
get ObjSignal1 Signal1

VarSignal ObjSignal2
get ObjSignal2 Signal2

VarSignal ObjSignal11
get ObjSignal11 Signal11

VarSignal ObjSignal10
get ObjSignal10 Signal10

Var EvtSensor
SetEventSensor MtdPointCtrl EvtSensor

SetSensorMode 1

BeginFunc MtdPointCtrl
call ObjPoint MtdTurnout
call ObjSignal2 WaitMtdSignalR
call ObjSignal11 MtdForceRelease
call ObjSignal10 MtdSignalG
EndFunc

※ObjSignal10=閉@の1つ前の信号
※ObjSignal11=閉@
※ObjSignal3=閉B(この前書き間違えました)

出以外すべて最初は青なので、閉Bが青=閉Bが青になるときに赤になる信号でくらべました。
でも、待避列車がいなくても出が青になり、閉Aが赤になります。よく読み直してスクリプトを変えてみたのですが、間違いは何なのでしょう?

2007/5/25  7:01

投稿者:ゆゆぽん☆
>[閉@喚呼センサー]
たぶん、書くオブジェクトを間違えていたと思います。特センサーに書くのですね。前回の続きにというのはそれを応用するのかと思いました。
あと、PCの調子が悪い(急におちる)ので、やる回数が減るのでコメントなどできない場合があります。

2007/5/24  10:49

投稿者:ghost
(1) [出]のWaitMtdSignalR について

示していただいたスクリプトは“ObjNextSignal(図の[閉B])が赤になったら[出]を緑にする”になってしまっていますが、これが間違いです。

落ち着いて本文を読み直してください。ゆゆぽん☆殿には、既にご自身で答えを見つける力があります。

(2) [閉@]のMtdRelaySectionBlock について

思うに、これは図の[特]センサーに書かれるべきものなので(厳密に言えばまだ抜けがありますが)認識合わせが必要です。

[閉@喚呼センサー]、と書かれたのがそもそもミスタイプなのか、あるいは、ゆゆぽん☆殿がこれを[閉@喚呼センサー]に書くべきものだ、とお考えなのか、で対応が変わります。

(3) [閉A信号機に追加]について

call this MtdSignalR しているのが“閉Aがずっと赤のまま”の原因です。これは“閉塞を解除するメソッド”なのですから、信号は緑にならなければおかしいです。

2007/5/24  10:32

投稿者:ゆゆぽん☆
思い通りに動きません。

[出 信号機]
//信号灯火色管理変数
Var VarSignalColor
call this MtdSignalR

VarSignal ObjNextSignal
get ObjNextSignal Signal3

VarSignal ObjSignal1
get ObjSignal1 Signal1

VarPoint ObjPointW
get ObjPointW Suma-W1

Var WaitID

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

BeginFunc MtdSignalG
set VarSignalColor 6
SetSignal VarSignalColor
call ObjPointW MtdTurnout
EndFunc

//閉塞実施メソッド
BeginFunc MtdSectionBlock
//灯火色切替メソッドを実行
call this MtdSignalR
EndFunc

BeginFunc WaitMtdSignalR
ifeq ObjNextSignal.VarSignalColor 1
call this MtdSignalG
endif
if ObjNextSignal.VarSignalColor 6
SetEventAfter this WaitMtdSignalR WaitID 100
endif
EndFunc

[閉@喚呼センサー]
//Var命令で宣言
VarSignal ObjSignal3
get ObjSignal3 Signal3

VarSignal ObjSignal2
get ObjSignal2 Signal2

VarSignal ObjSignal1
get ObjSignal1 Signal1

Var SigCtrl
SetEventSensor MtdRelaySectionBlock SigCtrl


BeginFunc MtdRelaySectionBlock
call ObjSignal1 MtdForceRelease
call ObjSignal2 WaitMtdSignalR
call ObjSignal3 MtdSectionBlock
EndFunc

[閉A信号機に追加]
BeginFunc MtdForceRelease
KillEvent WaitID
call this MtdSignalR
EndFunc

※ObjSignal1=閉A
※ObjSignal2=出
※ObjSignal3=閉@

出信号機にメソッドは書いてあるのですが、
閉Bを追越列車が通った瞬間青になってしまいます。それと、閉Aがずっと赤のままになってしまいます。KillEventの使い方を間違えていると思うのですが、よく解りません。どうしたらよいのでしょうか?あと、前の件に関しては、解決しました。
すみませんでした。

コメントを書く

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




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