« 亡霊たちの真昼 | トップページ | T644~ガチャガチャ »

2006/10/24

T644~ポイントロック

スクリプトについては、意外な(?)発見もありましたので、詳しく書くことにします。ポイント操作に関して、問題になるのは以下の2つだと思いますので、まずはこれを整理してみます。

T644_point0.jpg

(P1) 列車がポイントを跨いでいる時にポイントを切り替えた場合:こうやって列車がポイントを跨いでいる時に、ポイントを操作したら‥‥‥が、問題だったのですが、なんとっ! ポイントが切り替わりません。左上レイアウト図のポイント部分を一所懸命クリックしても変化がありません。向かって左側のポイントはちゃんと切り替わりますし、当該ポイントも列車が退けば切り替わるようになります。スクリプトで切り替えようとしてもダメです。実は、この仕組みはV3時代からあるようですが、初めて気がつきました(^^ゞ なぁ~んだ、こんなインターロック機構があるなら、スクリプトであれこれ考えることもなかったじゃん。

(P2) ポイントが開いていない方向から列車が進入した場合:列車が駅に居る時にポイントを本線側に切り替えた場合などですね。V3では強制的に列車が通過できる(ワープしたようになる)のですが、V4では「運行停止」となってしまいます。

まず、ポイント自身のコードは以下の通りです:

---------------------------------
ポイント POINT_S02
---------------------------------
BeginFunc P_I
  Var p
  GetPointBranch p
  if p
    set p 0
    SetPointBranch p
  endif
EndFunc

BeginFunc P_X
  Var p
  GetPointBranch p
  ifzero p
    set p 1
    SetPointBranch p
  endif
EndFunc
---------------------------------

以前作ったレイアウトと同じもので、直進ならP_I、分岐ならP_Xを呼び出せばよく、なかばブラックボックス的に考えていいです。ポイントはPOINT_S01、POINT_S02の2つありますが、どちらも内容は全く同じです。

キー操作で駅/本線を切り替える最も簡単なスクリプトは以下の通りです:

---------------------------------
レイアウトスクリプト(第1案)
---------------------------------
Var evid01
Var evid02

SetEventKey	this, Saida, evid01, s
SetEventKey	this, notSaida, evid02, S

BeginFunc Saida
	call POINT_S01 P_X
	call POINT_S02 P_X
EndFunc

BeginFunc notSaida
	call POINT_S01 P_I
	call POINT_S02 P_I
EndFunc
---------------------------------

SetEventKeyで呼び出されたMethodから直接ポイントを切り替えるMethodを呼び出しています。鉄道模型と同じくスイッチボックスでポイントをガチャガチャと切り替えるイメージです。シンプルイズベストでいいのですが、色々不都合があると思って、次の改善案を考えました。

T644_point2.jpg

---------------------------------
レイアウト(改善)
---------------------------------
Var evid01
Var evid02
Var S

SetEventKey	this, Saida, evid01, s
SetEventKey	this, notSaida, evid02, S
set	S, 0

BeginFunc Saida
	set	S, 1
EndFunc

BeginFunc notSaida
	set	S, 0
EndFunc

---------------------------------
センサA
---------------------------------
Var evid

SetEventSensor sens evid

BeginFunc sens
  ifeq LAYOUT.S 1
    call "POINT_S02" P_X
  else
    call "POINT_S02" P_I
  endif
EndFunc
---------------------------

列車が対向側から来た場合、駅と本線に振り分けるために、センサを追加しました。レイアウトのスクリプトに「S」という変数を用意して、キーを押した時には、これの値が変るだけです。そして、ポイント直前に置かれたセンサに列車が反応した時初めて「S」の内容に応じてポイントを実際に切り替える、というものです。ワンクッション置くというか、二段階方式というか、「キーを押す」という事象と「ポイントを切り替える」という事象を分けて考えたものですね。「S」という変数を用意することで、例えばメッセージを表示する場合などにも簡単にコードを追加することができます。

この場合、列車が反対方向(背向側)からやってきた場合、列車がポイントを跨いだ状態でセンサAが反応するので問題だったのですが、ポイントロック機能があるなら、そんなことは考えなくてよかった訳です。というか、どんな場合でも列車がポイントを跨いだ状態ではポイントは切り替わらないので、第1案でも問題なかったのかも。

さて、ポイントの背向側から列車が来た場合は話が別です。最初、本線-駅切り替えが頭にあったので、センサもAと同様に変数Sで切り替えようとしたのですが、最初から話が別として考えるべきでした。つまり、は本線-駅切り替えに関係無く、単に自分の方向にポイントを切り替えるだけのことなのでした。なお、センサに関しても、(P1)や列車が反対方向から来た場合については、考慮しなくていいことになります。

---------------------------------
センサB1
---------------------------------
Var evid

SetEventSensor sens evid

BeginFunc sens
    call "POINT_S02" P_X
EndFunc
---------------------------

なんかドタバタした感じで、難しく考えすぎですね(;^^) インターロック機能がある以上は、それを利用しない手はないし、最初からVRMの保護機能を信用して、もっと単純に考えるべきだったのかも。但し、(P2)の「運行停止」だけはV3より厳しくなっているので注意が必要ですね。

|

« 亡霊たちの真昼 | トップページ | T644~ガチャガチャ »

コメント

コメントを書く



(ウェブ上には掲載しません)


コメントは記事投稿者が公開するまで表示されません。



トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/103983/12397286

この記事へのトラックバック一覧です: T644~ポイントロック:

« 亡霊たちの真昼 | トップページ | T644~ガチャガチャ »