マルチトレイン制御
2008年9月8日


 NATOC 1.50で複数ポイントのレイアウトをサポートしました。昭和の「鉄道模型」を作るのレイアウトはポイントがひとつしかありませんのでできる事が限られてしまいます。
 またポイントがひとつでは複数の車両を走らせる事はできません。NATOCはせっかくコンピュータを使っているので人間ができないような複雑なポイントの制御をやらせてみたいものです。

 まずはレイアウト作りから始めなければなりません。どんなレイアウトにするかですが、ここは本格的に畳サイズのレイアウトといきたい所ですがスペースと予算の問題があり結局、昭和の「鉄道模型」を作ると同じミニ電動ポイントを使う事にしました。
 レイアウトの土台は昭和の「鉄道模型」のレイアウトを乗っけているディスクセットと同じものをホームセンターで買ってきてこれに直接レイアウトを組むことにしました。

 机と椅子のセットで2,980円なんでヘタに部材を揃えるより安上がりです。椅子は余分ですがNATOCのギャラリィスタンドという事で。

 机の裏に同じくホームセンターで買ってきたポリプロピレンの食品トレイを3箇所、フック状のヒートンで固定してあります。
 この中にはレイアウトの電源コントローラ、NATOCのI/Oコントローラ、配線を入れてあります。

 メンテナンスを簡単にするために正面のヒートンは1個にしてひねれば簡単に外れるようにしてあります。  反対側の2個のヒートンがちょうつがいの役目をしてトレイを外さなくてもスピード等をコントロールする事ができます。

 レイアウトはポイントを2つ使った2つに分岐する引込み線とポイントを2つ使った列車交換用の待避線を組み合わせたものにしました。


 実際にプログラムを動かしてみたのですが、ひとつのデータベースで管理しているため引込み線に列車が二重に入ったり衝突したりする事はないようです。
 プログラムを動かした時の動画(YouTube)
     

 昭和の「鉄道模型」を作ると並べてみました。ほぼ同じサイズです。


 重ねて2階建てにするとこんな感じです。スペースをとらないので2階建てもありかなと思います。NATOCのカメラの問題がありますが。

 後は長くてちょっと専門的になってしまいます。興味のある方は引き続きご覧ください。


 待避線のポイントはコントローラに対して並列に接続していますので連動します。これで制御用のリレーもポイントひとつ分で済みます。
 また制御コマンドも片方のポイントに対して行えば両方切替える事ができます。

 NATOCのプログラム機能でも複数の車両を制御する事ができます。3両の列車の制御プログラムをサンプルプログラムとしてNATOCで提供しています。
 しかしNATOCのプログラム機能は各車両に対して移動させる引き込み線を予め決めてそこに移動させるためにポイントや列車を制御します。
 今回はプログラムが列車の行き先を決定してそれに必要なポイントや列車を制御します。
 そのため今回はNATOC SDKを使っています。NATOC SDKはVisual BasicやVisual C++といった通常のプログラムからNATOCを制御する機能です。



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

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

 今回のプログラムはマルチタスクという手法を使い、車両一台をひとつのタスクで制御するようにしました。同時に一台の車両しか動かないのでマルチタスクを使わなくても実現できますが、構造上マルチタスクしておいた方が分かりやすいのでそうしています。
 現在引込み線にどの車両が入っているかは共通のデータベースとして各タスクで参照および更新をします。
 ひとつのタスクの動きは次のようになります。

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


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


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

 下の表は縦が現在いる引込み線で横が移動する引込み線で移動するためのポイント切替と列車の制御コマンドを表します。
×は移動できない事を表します。
  交換用本線(P3) 引込み線1(P1) 引込み線2(P2) 交換用待避線(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分,後進
×:移動できない Pn直:ポイントnを直進方向に切替え Pn分:ポイントnを分岐方向に切替え *:列車が本線を0.5周した後に出力

目次に戻る