HOME >> 鉄道模型自動運転システム >  複数の電車を同時に走らせる

登山鉄道自動運転システム  複数の電車を同時に走らせる

■ はじめに

 システム検討もいよいよ佳境に入って来た。 最大の峠は、複数の電車を異なる路線で同時に走らせる方法をマスターする事と考えている。 異なる路線で複数の電車を同時に走らせる為には、二つのスレッドを並行して走らせなければならないのだ。 テスト用のレイアウトが準備できたので、この「マルチスレッド・プログラム」を検討した。

 #! /usr/bin/python    #(1)

 import threading
 import time

 def test():
    i = 0
    while i<10:
            time.sleep(0.1)
            print(i)
            i = i + 1
            
 if __name__== '__main__':    #(2)
    t = threading.Thread(target=test)
    t.start()
    
    i = 10
    while i<20:
        time.sleep(0.5)
        print(i)
        i = i +1

 

■ 制御方法の検討

 並列処理の方法は始めてなので、まずはネットや書籍で勉強したが、後期高齢者の身にとっては、すんなりと頭に入るようなレベルでは無かった。 並列しょりにはいくつかの方法があるようであるが、解説よりも実施例の、それもなるべく簡単な例を探してテストするも、やはり四苦八苦の状態であった。

 最初に、”ThreadPoolExecutor”なる記述方法を例に従って記述するも、ラズパイ様からNGをくらってしまった。 その他にも class を使う方法なども読んでみたものの、難しそうなのでパスし、threading という簡単そうな方法に辿り着いた。 そこで示されていた例を参考にして右のようなプログラムを実行させてみた。 その結果、

  1. (1)で示した最初の行は、コメント行と思って記述していなかったが、試しに追加してみると、見事に並列実行を実施するようになった。 その後、この行を消しても問題無く作動するので、本当の問題は他にあったのかも知れない。 もしかして、我がプログラムはPython 3.4.2 で走らせているのであるが、このPythonさんがやっと目を覚ました(?)のかも知れない。 ・・・・・・・・・・・・・・? とにかく、おまじないとして記述しておくことにした。
  2. (2)で示した記述も理解できていないが、参考したネットではなにやら難しい説明がされていた。 いままでの try: の記述では機能しなかった。 これもおまじないとしてそのまま機記述しておこう。

 そして、最後まで苦労したのが、threading.Thread() の記述を使って、関数に引き渡す引数の指定方法であった。 色々試してみたがうまく行かず、ネット上のPython マニュアルをじっくりと見てみると、引数は args=() で指定せよとのことであったので

   d1 = threading.Thread(target=direction5,args=(2))
   d1.start()
   direction1(0)

としたが、これも効果がなかった。

さらに詳しく見てみると、引数はダブルで記述せよと解説してあった。 ダブルで記述せよとは?

if __name__== '__main__':
    while True:
        d1 = threading.Thread(target=direction5,args=(2,))
        d1.start()
        direction1(0)
        sleep(2)
        d2 = threading.Thread(target=direction6,args=(2,))
        d2.start()
        direction2(0)
        sleep(2)

 その答えを他のサイトで見つける事が出来た。 

   d1 = threading.Thread(target=direction5,args=(2,))
   d1.start()
   direction1(0)

 これで初めて、並列運転が実現したのである。 なんの事はない コンマをひとつ無駄なように追加しただけなのであるが・・・・・・・・・!

 そのプラグラムを txt 文書にて紹介しておこう。 ⇒  Goback-model-4-7.txt

 

■ テスト走行モード 4-7

 上記のプログラムを走らせてみたので動画で紹介しよう。

 苦労したプログラムが正常に作動したので、感動した状態でジーと見入ってしまった。 そしてこれで出来たと思い込んでしまって大切なチェックを見逃していた。

 後から気が付いたのであるが、二つのスレッドの実行時間が異なるときのフェールセーフを考えておく必要があったのである。 例えば上記のの場合は、 threading 指定したスレッドが早く完了していたので問題が発覚しなかったが、これが逆の場合はどうだっただろうか。 一方のスレッドが実行中なのに、次のステージに移ってしまうと、運行ダイヤやはクシャクシャとなり、電車の衝突も有りうるのである。 二つのスレッドが両方とも完了してから次のステップに移る仕掛けが必要なのだが・・・・・・・。

 

■ 追加工作の実施

 やっとプログラミングの目途が立ったので、レイアウトでの作業の入れるように残っていた工作を実施した。 最初に異常停止のための表示用LEDとリセットボタンをパネル上に新設した。 下左の写真。 入力と出力のポートは、残っていたGPIOポートを使用した。

 次に、レールエンドの信号処理回路の修正工作を実施した。 そして、下左の写真のように各モジュールを整えた。

 街中駅と登山口駅のモジュールに取り付けたユニットを下に示す。

 また、山頂駅とスイッチバックのモジュールもベニヤ板を使って固定することにした。

 この状態では表の配線等はむき出しであるが、最終的には紙粘土で必要な部分を固定し、配線などはターフなどで覆って隠すつもりである。 仕上げ工作が楽しみであるのだ。

 さて、次回からは、レイアウトでの工作に入ろう!

ページトップへ戻る .


 2017/6/8 作成  M.T.