SSブログ

信号現示で列車を制御するスクリプトー完成ー [python]

これでversion 1が完成です。


全くエレガントではない、べたべたのスクリプトですが、全容は以下のようになりました。

import jarray
import jmri

class stopHitachi(jmri.jmrit.automat.AbstractAutomaton) :

___def init(self):
______self.c = []
______for self.b in singoList:
_________self.c.append(signals.getSignalHead(self.b))
______print "Go!"
______return

___def handle(self):
______self.waitChange(jarray.array(self.c,jmri.NamedBean))
______self.waitMsec(100)
______for j in range(len(trainList)):
_________for i in range(24):
____________self.ichi = memories.getMemory(memoriList[i]).getValue()
____________if self.ichi == trainList[j]:
_______________if (i == 0) and (memories.getMemory(memoriList[23]).getValue() == trainList[j]):
__________________i = 23
_______________self.singo = singoList[i]
_______________self.iro = signals.getSignalHead(self.singo).getAppearanceName()
_______________break
_________if self.singo == '':
____________self.iro = 'Red'
_________if self.iro == 'Green':
____________self.sp = 1
_________elif self.iro == 'Yellow':
____________self.sp = 0.5
_________elif self.iro == 'Red':
____________self.sp = 0
_________if sensors.getSensor(sensList[i]).state == 2:
____________self.sp = 0
_________print trainList[j], i, self.singo, self.iro, sensors.getSensor(sensList[i]).state, self.sp
_________self.throttle = self.getThrottle(int(trainList[j]), False)
_________self.throttle.speedSetting = self.sp
_________self.singo = ''
______return 1

trainList = ['7', '11', '31', '21', '22']
memoriList = ['IM:AUTO:0005', 'IM:AUTO:0004', 'IM:AUTO:0020', 'IM:AUTO:0019', 'IM:AUTO:0018', 'IM:AUTO:0014', 'IM:AUTO:0013', 'IM:AUTO:0012', 'IM:AUTO:0021', 'IM:AUTO:0022', 'IM:AUTO:0011', 'IM:AUTO:0010', 'IM:AUTO:0009', 'IM:AUTO:0023', 'IM:AUTO:0024', 'IM:AUTO:0001', 'IM:AUTO:0002', 'IM:AUTO:0003', 'IM:AUTO:0015', 'IM:AUTO:0016', 'IM:AUTO:0017', 'IM:AUTO:0008', 'IM:AUTO:0007', 'IM:AUTO:0006']
singoList = ['IH:SE8C:"LT273";"LT274"', 'IH:SE8C:"LT275";"LT276"', 'IH:SE8C:"LT287";"LT288"', 'IH:SE8C:"LT285";"LT286"', 'IH:SE8C:"LT283";"LT284"', 'IH43', 'IH:SE8C:"LT261";"LT262"', 'IH:SE8C:"LT263";"LT264"', 'IH:SE8C:"LT301";"LT302"', 'IH:SE8C:"LT303";"LT304"', 'IH45', 'IH:SE8C:"LT265";"LT266"', 'IH:SE8C:"LT267";"LT268"', 'IH:SE8C:"LT305";"LT306"', 'IH:SE8C:"LT307";"LT308"', 'IH46', 'IH:SE8C:"LT257";"LT258"', 'IH:SE8C:"LT259";"LT260"', 'IH:SE8C:"LT277";"LT278"', 'IH:SE8C:"LT279";"LT280"', 'IH:SE8C:"LT281";"LT282"', 'IH44', 'IH:SE8C:"LT269";"LT270"', 'IH:SE8C:"LT271";"LT272"', 'IH47']
sensList = ['IS25', 'IS25', 'IS133', 'IS134', 'IS25', 'IS25', 'IS25', 'IS25', 'IS132', 'IS131', 'IS25', 'IS25', 'IS25', 'IS130', 'IS129', 'IS25', 'IS25', 'IS25', 'IS136', 'IS135', 'IS25', 'IS25', 'IS25', 'IS25']


a = stopHitachi()
a.setName("stopHitachi")

a.start()


これをRun Scriptで実行してやれば、Thread Monitorに”stopHitachi”という名前でプロセスが走ります。(問題があったらkillできます。)
5つの列車が、前方の信号機が青現示でフルスピード、黄現示で50%、赤現示で停止します。
指令は出発信号機に対して出発許可を出してやるだけです。2区間前に先行列車がいれば黄現示でゆっくりと発車していきます。
場内信号機が全部赤現示なら、2区間前で減速、さらに駅手前で停止、場内が空けば自動的に侵入していきます。
各列車には過減速のdelayが設定されていますので、いきなり100%や0%スロットルを与えても、ゆっくりと加速、減速していきます。
これで5つの列車をひとりで運転できるようになりました。(眺められるようになりました。)

おおむね完成しましたが、細かい問題が出てきました。
次回から、ご紹介していきます。

タグ:DCC Python
nice!(2)  コメント(3)  トラックバック(0) 

nice! 2

コメント 3

pururu

ジュンパパ様、niceありがとうございます。
by pururu (2013-05-07 09:29) 

トータン

うわ~頭の中がこんがらかってしまいます こんなの理解できるって凄いですね~ 私ももっと勉強しておけば良かったと思ってももう遅いですね 残念!(vv;
by トータン (2013-05-07 21:28) 

pururu

トータン様、コメントありがとうございます。
私もBASIC, Fortran世代で学生実習レベルの知識しかありませんが、なんとかなってます。もっと綺麗なスクリプトが書けると思いますが、私の知識ではこんなものです。実は自分でコントローラーを回して運転しながら閉塞を制御を受けるには、トータン様のやっておられるアナログ制御の方が簡単なんですよね。ただ、私にはリレーやコンデンサでの制御の方が難しいのではないかと想像しております。
by pururu (2013-05-08 01:43) 

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。