2007/8/8

駅構内に編成がいるかいないかを判断する方法  VRMスクリプト禅問答
コレの続きです。

編成がポイント上に停車していたり、あるいはまさに通過中であったりすると、SetPointBranch命令を使ってポイントを切り替えようとしても切り替わりません。前回は、この切り替えの成否を判断する方法と、切り替えを妨げた編成の通過を待って自動的に切り替えを完遂するサンプルコードを示しました。

今回ご紹介するのはこの応用編です。

走行中の編成がこれから進入する駅場内等に、他の編成が既に存在するかどうか知りたい、というシーンは意外にあるような気がします。

VRM4のセンサーは先頭または終端の台車が通過する“瞬間”を検知するもので、センサー上に編成の一部がかかっているか否かは判断することが出来ません。また、区間閉塞信号を組み込んでいれば、信号遷移から間接的に編成の所在を知ることが出来ますが、これが一筋縄ではいかないことは、VRM入道の熱心な読者諸兄はよくご存知のことで御座いましょう。

そこで、前述の「編成が真上にいるとポイント切替に失敗する」という特性を悪用(?)して、駅構内に編成がいるかいないかを判別する方法を紹介しておくことにしましょう。

まず、駅の真ん中辺り・・・そこに編成が停車していたら、間違いなく真上に停車するであろう辺りにポイントを1つ用意します。対向側と渡り線にしてもいいですし、バラスト部品で埋めて、一見してポイントだとわからないようにしてもいいです。そして、このポイントに以下のスクリプトを組み込みます。

[ポイントスクリプト]

Var VarReturnCode
var VarNormalStatus
set VarNormalStatus {ポイント位の平常値}
//ポイント位の平常値、というのは、駅に編成がいるとして
//そのときのポイントの向き。直線区間の駅なら0にする。

//編成存否確認メソッド
BeginFunc MtdCheckTrainExist
Var TmpPointStatus
Var TmpPointResult
//平常値から、平常ではない値を求める
ifeq VarNormalStatus 2
set TmpPointStatus 0
else
set TmpPointStatus 1
sub TmpPointStatus VarNormalStatus
endif
//ポイントを平常ではない状態に切り替える
//編成が存在すれば失敗する
SetPointBranch TmpPointStatus
//切り替えの結果を取得する
GetPointBranch TmpPointResult
//ポイントを元に戻す
SetPointBranch VarNormalStatus
//ポイント切替の成否を判断
ifeq TmpPointStatus TmpPointResult
//成功=編成がいないならVarReturnCodeに0を代入
set VarReturnCode 0
//失敗=編成がいるならVarReturnCodeに1を代入
else
set VarReturnCode 1
endif
EndFunc
このスクリプトのミソは、ポイント切替を試して、その結果を取得したらすぐに元に戻すところです。これにより、ポイントとしての役に立たない代わりに、真上に編成がいるかいないかだけを、間接的に知ることが出来ます。

そして、駅構内の編成の存否を知りたい瞬間・・・たとえば後続列車が踏むであろう駅の手前のセンサーに、以下のスクリプトを組み込みます。
[呼び出し側]

VarPoint ObjCheckPoint
get ObjCheckPoint {ポイント名}

//センサーイベントは各自で設定するべし

//サンプルメソッド
BeginFunc MtdSample
call ObjCheckPoint MtdCheckTrainExist
if ObjCheckPoint.VarReturnCode
//
//列車がポイント上に存在したときの処理
//
else
//
//列車がポイント上に存在しなかったときの処理
//
endif
EndFunc
たとえば、“列車がポイント上に存在したときの処理”のところにセンサーが検知した編成の停車メソッドをcallするように書いて置けば、これは駅での追突を防ぐATSのような仕組みになります。あるいは、列車がいないときだけ、駅入り口のポイントを通過線側へ切り替えて追い抜く、みたいなこともできます。

我こそは、な人は、何か面白いサンプルレイアウトでも作って公開しちゃってください。よろしく。
0

コメントを書く

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




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