2007/4/28 | 投稿者: ghost

<<前回へ

今回は、課題(1)-2“(1)-1の結果に従ってポイントを切り換える”についてです。下線部(1)-1の結果とは、前回、センサースクリプトにおいて編成オブジェクトから取得した「編成の性格(追越/退避列車のいずれか?)を示す値」です。

まず、大まかに何をしなければならないか、列挙してみましょう。

[d'] センサーで取得した値を、ポイントのグローバル変数に代入する。
[e] センサーからポイントの編成判別をおこなうメソッドを実行する。
[f] センサーから得た値からポイントを正/反位のどちらにするか判別する。
[g] ポイントを切り替える。

[d']は、前回の[d]を言い換えたもので、基本的には同じことです。[e]と合わせてミニマムなサンプルコードを以下に示します。なお、センサースクリプトは前回してしたサンプルコードに追記したもので、前回既に示されていた部分は文字色を薄くしています。
[センサースクリプト]
//センサーイベントを設定
Var EvtSensor
SetEventSensor MtdSenseTrain EvtSensor

//このセンサーが担当するポイント
VarPoint ObjPoint
get ObjPoint {ポイント名}

//編成検知時に実行されるメソッド
BeginFunc MtdSenseTrain
  VarTrain TmpTrain
  Var TmpType
//検知した編成オブジェクトを取得
  GetSenseTrain TmpTrain
//変数TmpTypeに検知した編成のVarTypeの値を取得
  mov TmpType TmpTrain.VarType

//[d']ポイントのグローバル変数にTmpTypeの値を代入
  mov ObjPoint.VarTrainType TmpType
//[e]ポイントの編成判別メソッドを実行
  call ObjPoint MtdCheckType
EndFunc
第一の重要点は、冒頭のVarPoint命令によるポイントオブジェクト変数の宣言と、続くget命令による代入です。get命令の第2引数の{ポイント名}は、実際にはレイアウト上に配置されたポイントに付けた名称に置き換えます。

この部分は、このセンサーが「私は{ポイント名}を担当するセンサーである」と述べている部分になります。以降、スクリプト内では、目的のポイントに何かをするに際し、常にこのポイント変数ObjPointを使っています。これも前回同様に、後々の修正の手間(get命令の{ポイント名}だけを書き換えれば、制御対象のポイントを簡単に変更できる)を考えての措置です。さらに、もう1つ別のセンサーとポイントの組に同じような仕掛けを組み込む場合、このget命令に続く{ポイント名}以外の部分は、コピー&ペーストするだけで使えます。

続いてポイントスクリプトに取り掛かりましょう。順序が前後しますが、先に[g]からいきます。
[ポイントスクリプト]
//正位切替メソッド
BeginFunc MtdStraight
  SetPointBranch 0
EndFunc
//反位切替メソッド
BeginFunc MtdTurnout
  SetPointBranch 1
EndFunc
ポイントの状態は、三叉ポイントを除けば要するに正/反位の2つしかありません。使う/使わないは別にして、とりあえずレイアウト上のすべてのポイントに上記のメソッドを予め用意しておくことをお奨めします。こうしておけば、そこへ至る処理はともかく、call {ポイント名} MtdStraight を実行すれば正位に、call {ポイント名} MtdTurnout としてやれば反位にポイントが切り替わります。[g]はこれがすべてです。

その上で、残る[f]の部分ですが、これは試みに読者の宿題にして敢えてサンプルコードは示さないことにしましょう。以下、この部分でやらなければならないことを列挙しますと・・・

[f]-1 センサーから編成判別の値を受け取るためのグローバル変数を宣言する。
[f]-2 センサーから実行されるメソッドを作る。
[f]-3 グローバル変数をif命令で調べ、ある条件に当てはまる場合とそうでない場合(追越列車と退避列車に相当)を判別すること。
[f]-4 [f]-3の結果に応じてポイント切替メソッドを実行すること。

になります。なお、[f]-4に際し、この場合実行する[g]ポイント切替メソッドは自分自身(ポイントオブジェクト)の中にありますから、call命令は、call {ポイント名} {メソッド名}ではなく、call this {メソッド名}になる点に注意してください。わからないことがあれば、随時コメント欄にどうぞ。

以上で、編成側に用意したグローバル変数の値に応じて、分岐ポイントを切り替える仕掛けの解説を終わります。ちなみに、合流ポイント、特に駅出発直後のそれについては、出発信号との連動や保安機能の組み込みが関係してくるのでこの手法では解決できません。これは、後日の課題となります。

次回へ>>
0




AutoPage最新お知らせ