NATOC SDKの応用(複数列車の制御)


 NATOC SDKでは、NATOC SDKを使って3台の列車をマルチタスクで制御するプログラムが提供されています。
 このプログラムを動かすには複数のポイントを使ったレイアウトが必要になります。
 NATOCの複数ポイントレイアウトの対応についてはこちらをご覧ください。



 レイアウトはNATOCで提供されている複数ポイントレイアウトのサンプルを使っています。
 なおこのプログラムはシミュレーションモードでも動かす事ができます。実際に複数ポイントのレイアウトがなくてもNATOCで提供されるレイアウトデータで本プログラムを実行する事ができます。



 プログラムを動かすと列車の状態をラジオボタンで表すダイアログが表示されます。
 この時NATOCは本プログラムと通信ができるようにサーバモード(引数-s)で動かしておきます。

 行き先は車両が入っていない引込み線をプログラムで検索させます。
 列車を順番に動かすと動きが一定パタンになってしまうので乱数を使って次に動かす列車を決めてランダムな動きにします。

 現在引込み線にどの車両が入っているかは共通のデータベースとして各タスクで参照および更新をします。
 各タスクの動きは次のようになります。

  1. 自分のいる引き込み線をデータベースから検索する
  2. 現在空いている引き込み線をデータベースから検索する
  3. 現在いる引込み線から行き先の引込み線に行けるかを判断する
    例えば引込み線1から例えば引込み線2には直接行けないので今回はあきらめる
  4. 行ける場合は予め決められた制御コマンドによりポイントと列車を制御して目的の引込み線に移動する
    出発の引込み線と目的の引込み線毎にポイントと列車の制御コマンドが書かれたテーブルが用意されていてそれに基づいてポイントと列車を制御する
  5. 引込み線のデータベースを更新して他のタスクに制御を渡す
    制御される列車の順番が固定されないように制御を渡すタスクは乱数によって決められる


 上の状態で空いている引込み線は交換用待避線(ピンク)しかないのでどの列車に制御がまわってきてもそこに移動します。


 上の状態で空いている引込み線は引込み線2(ピンク)ですが引込み線1にいる列車(水色)はこの引込み線に直接移動させる事ができません。  この列車を動かそうとすると交換用の本線または待避線にはいっているどちらかの列車が動いてしまいます。  この場合は引込み線1の列車の制御はあきらめて別の列車に制御を移します。

 下の表は縦が現在いる引込み線で横が移動する引込み線で移動するためのポイント切替と列車の制御コマンドを表します。
×は移動できない事を表します。
  交換用本線(P3) 引込み線1(P1) 引込み線2(P2) 交換用待避線(P3)
交換用本線 (P1直,P2直,P3直,前進,P3直*) P2直,P1分,P3直,後進 P2分,P1分,P3直,後進 P1直,P2直,P3直,前進,P3分*
引込み線1 P2直,P1分,P3直,前進 (×) × P2直,P1分,P3分,前進
引込み線2 P2分,P1分,P3直,前進 × (×) P2分,P1分,P3分,前進
交換用待避線 P1直,P2直,P3分,後進,P3直* P2直,P1分,P3分,後進 P2分,P1分,P3分,後進 (P1直,P2直,P3分,後進,P3分*)
×:移動できない Pn直:ポイントnを直進方向に切替え Pn分:ポイントnを分岐方向に切替え *:列車が本線を0.5周した後に出力
本来自分が今いる引込み線から同じ引込み線には移動できないが、設定ファイル(ENABLE_SAME)で移動させる事も可能

・ブロック図



・パラメータの設定

 初期位置および各引込み線の停止位置を設定ファイルで指定します。
 また最初に列車が最初に入っている引込み線を指定しておきます。
 標準で提供される設定ファイルはNATOCで提供されている複数ポイントのレイアウトに合わせて作ってありますのでそのまま使ってください。
 各列車初期引込み線もシミュレーションモードの初期位置に合わせてあります。

 シミュレーションモードで本プログラムを動かす場合はNATOCの設定メニュの列車表示設定コマンドで下記のダイアログのように車両を3両(連結しない)にしてください。



 なお本プログラムを動かす時は列車の位置を決められた位置にしておく必要があります。
 実際の列車を制御する場合は、コントローラで列車を移動させるなどしてシミュレーションモードの初期値と同じ交換用本線、引込み線1、引込み線2に移動させておいてください。
 シミュレーションモードの場合はコントローラで列車を移動させておくか列車表示設定コマンドを実行して列車の位置をリセットしてください。

[LAYOUT]
TRAIN_COUNT=3
INIT_POSITION=1,2,3
POSITION_RANGE=32
POSITION0=280,66
POSITION1=300,332
POSITION2=330,356
POSITION3=360,98
[CONTROL]
RANDOM=1
ENABLE_SAME=0

COMMAND00=3,5,7,1,7
COMMAND01=5,4,7,2
COMMAND02=6,4,7,2
COMMAND03=3,5,7,1,8

COMMAND10=5,4,7,1
COMMAND11=0
COMMAND12=0
COMMAND13=5,4,8,1

COMMAND20=6,4,7,1
COMMAND21=0
COMMAND22=0
COMMAND23=6,4,8,1

COMMAND30=3,5,8,1,7
COMMAND31=5,4,8,2
COMMAND32=6,4,8,2
COMMAND33=3,5,8,1,8

 引込み線での停止位置などは設定ファイルに記述されています。  設定ファイルはMultiTrain.iniというファイル名でプログラムと同じディレクトリに置いてください。

 LAYOUTセクションのTRAIN_COUNTは、列車の車両数で2または3台です。
 INIT_POSITIONは最初に引込み線に入っている列車番号で交換用本線、引込み線1、引込み線2、交換用待避線。
 POSITION0〜POSITION3は引込み線での停止位置でPOSITION0は交換用本線です。  POSITION1,POSITION2は引込み線1と引込み線2でPOSITION3は交換用待避線です。
 POSITION_RANGEは停止位置の範囲で指定した停止位置からこの半径の円の中に列車がいる場合停止します。  値はレイアウトのピクセルで指定します。この値を小さくすると停止位置を検出できない事があります。
 またこの値を大きくと停止位置が指定した位置よりもずれてしまいます。  停止位置が検出できないような時は大きな値に変更してください。

 CONTROLセクションのRANDOMは、次のタスクに制御を渡す時に乱数を使うかどうかの指定です。1の場合は乱数を使って開始メッセージを送信するタスクを決定します。0の場合は次の番号のタスク(最後の場合は先頭)に送信します。
 ENABLE_SAMEは、空いている引込み線に移動する時に元いた引込み線に戻る事を許すかどうかの設定で1の場合は半分の確率で同じ場所に戻るようにします。
 COMMANDnmは引込み線を移動するためのレイアウト制御コマンドでnが出発の引込み線でmが行き先の引込み線です。  COMMAND13は引込み線1から交換用待避線に移動する制御コマンドです。
 一回の移動に対して複数のコマンドが指定できます。
 0を指定するとその間の移動はできない事を表します。(COMMAND12は引込み線1から引込み線2で直接行けない事を示す)
 レイアウト制御コマンドの値については本書の
NATOC APIを参照してください。
 ポイント1とポイント2を連続して切替える時は直進側に切替える時はポイント1を分岐側に切替える時はポイント2から行います。  これは2つのポイント切替えの間に停止中の列車の引込み線に電流が流れて一瞬列車が動くのを防ぐためです。

・プログラムの実行環境

 本プログラムを実行するには以下のプログラムとデータが必要でこちらは同じディレクトリになければいけません。

 ・MultiTrain.exe 複数列車の排他制御プログラム
 ・MultiTrain.ini 上記プログラム設定ファイル
 ・MultiTrain2.exe ループレイアウトにおける複数列車の排他制御プログラム
 ・MultiTrain2.ini 上記プログラム設定ファイル
 ・NATOC.dll NATOC通信インタフェイスモジュール

 なおNATOC本体のレイアウトは複数ポイントのレイアウトにしておく必要があります。  NATOCの標準のレイアウトを複数ポイントのレイアウトに変更するにはNATOCのレイアウトデータをoptionディレクトリのデータに置き換えておいてください。
 本プログラムの実行方法については本書のアプリケーションプログラムの実行を参照してください。




 マルチトレイン制御プログラム動画です。
 上記のリンクをクリックするとYouTubeに接続します。

目次に戻る