2007/4/28 | 投稿者: ghost
<<前回へ
今回は、課題(1)-2“(1)-1の結果に従ってポイントを切り換える”についてです。下線部(1)-1の結果とは、前回、センサースクリプトにおいて編成オブジェクトから取得した「編成の性格(追越/退避列車のいずれか?)を示す値」です。
まず、大まかに何をしなければならないか、列挙してみましょう。
この部分は、このセンサーが「私は{ポイント名}を担当するセンサーである」と述べている部分になります。以降、スクリプト内では、目的のポイントに何かをするに際し、常にこのポイント変数ObjPointを使っています。これも前回同様に、後々の修正の手間(get命令の{ポイント名}だけを書き換えれば、制御対象のポイントを簡単に変更できる)を考えての措置です。さらに、もう1つ別のセンサーとポイントの組に同じような仕掛けを組み込む場合、このget命令に続く{ポイント名}以外の部分は、コピー&ペーストするだけで使えます。
続いてポイントスクリプトに取り掛かりましょう。順序が前後しますが、先に[g]からいきます。
その上で、残る[f]の部分ですが、これは試みに読者の宿題にして敢えてサンプルコードは示さないことにしましょう。以下、この部分でやらなければならないことを列挙しますと・・・
以上で、編成側に用意したグローバル変数の値に応じて、分岐ポイントを切り替える仕掛けの解説を終わります。ちなみに、合流ポイント、特に駅出発直後のそれについては、出発信号との連動や保安機能の組み込みが関係してくるのでこの手法では解決できません。これは、後日の課題となります。
0
今回は、課題(1)-2“(1)-1の結果に従ってポイントを切り換える”についてです。下線部(1)-1の結果とは、前回、センサースクリプトにおいて編成オブジェクトから取得した「編成の性格(追越/退避列車のいずれか?)を示す値」です。
まず、大まかに何をしなければならないか、列挙してみましょう。
[d'] センサーで取得した値を、ポイントのグローバル変数に代入する。
[e] センサーからポイントの編成判別をおこなうメソッドを実行する。
[f] センサーから得た値からポイントを正/反位のどちらにするか判別する。
[g] ポイントを切り替える。
[センサースクリプト]第一の重要点は、冒頭のVarPoint命令によるポイントオブジェクト変数の宣言と、続くget命令による代入です。get命令の第2引数の{ポイント名}は、実際にはレイアウト上に配置されたポイントに付けた名称に置き換えます。
//センサーイベントを設定
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
この部分は、このセンサーが「私は{ポイント名}を担当するセンサーである」と述べている部分になります。以降、スクリプト内では、目的のポイントに何かをするに際し、常にこのポイント変数ObjPointを使っています。これも前回同様に、後々の修正の手間(get命令の{ポイント名}だけを書き換えれば、制御対象のポイントを簡単に変更できる)を考えての措置です。さらに、もう1つ別のセンサーとポイントの組に同じような仕掛けを組み込む場合、このget命令に続く{ポイント名}以外の部分は、コピー&ペーストするだけで使えます。
続いてポイントスクリプトに取り掛かりましょう。順序が前後しますが、先に[g]からいきます。
[ポイントスクリプト]ポイントの状態は、三叉ポイントを除けば要するに正/反位の2つしかありません。使う/使わないは別にして、とりあえずレイアウト上のすべてのポイントに上記のメソッドを予め用意しておくことをお奨めします。こうしておけば、そこへ至る処理はともかく、call {ポイント名} MtdStraight を実行すれば正位に、call {ポイント名} MtdTurnout としてやれば反位にポイントが切り替わります。[g]はこれがすべてです。
//正位切替メソッド
BeginFunc MtdStraight
SetPointBranch 0
EndFunc
//反位切替メソッド
BeginFunc MtdTurnout
SetPointBranch 1
EndFunc
その上で、残る[f]の部分ですが、これは試みに読者の宿題にして敢えてサンプルコードは示さないことにしましょう。以下、この部分でやらなければならないことを列挙しますと・・・
[f]-1 センサーから編成判別の値を受け取るためのグローバル変数を宣言する。
[f]-2 センサーから実行されるメソッドを作る。
[f]-3 グローバル変数をif命令で調べ、ある条件に当てはまる場合とそうでない場合(追越列車と退避列車に相当)を判別すること。
[f]-4 [f]-3の結果に応じてポイント切替メソッドを実行すること。
以上で、編成側に用意したグローバル変数の値に応じて、分岐ポイントを切り替える仕掛けの解説を終わります。ちなみに、合流ポイント、特に駅出発直後のそれについては、出発信号との連動や保安機能の組み込みが関係してくるのでこの手法では解決できません。これは、後日の課題となります。
