SSブログ

JMRI python scriptに挑戦 [python]

前回まで、Logixを使って、ポイントや信号機、サウンドの制御をセッティングしてきました。

ここまでやっても、運転士が信号を見落とすと事故になります。
どうせなら、先の信号現示を判定して、強制的に減速、停止できれば良いなぁ、と思うのは自然です。

例えば「前方の閉塞信号機が赤現示のときに、その場所にいる列車を停止させる。」のような動きを設定したいのですが、JMRI Logixを使って、これはできません。
これはある意味デジタルコマンドコントロールの泣き所なんです。

アナログ方式だと、前方信号機に連動させて手前の区間の電圧を制御してやれば、どの列車でも減速→停止が可能なのですが、デジタルだとそこにいる列車のアドレスに対して、コマンドを送ってやらなければなりません。

制御すべき列車のIDはMemory Valueとして保持しておりますので、その値のIDに対してスロットルコマンドを送れば良いのですが、JMRIにはそのためのLogixがありません。何となく、簡単にできそうなんですが。。。ダメです。

そこで、私にとっては敷居の高い禁断の果実を取りに行くことになりました。Jython scriptに挑戦です。

BASIC, Fortran の世代(学生以来)なので、Pythonの流儀が全く分かりません。
そこで、サンプルスクリプトを解読しながらの試行錯誤です。
サンプルはJMRI/jythonのフォルダ内にあります。テキストで開いて、コメントを見ながら解読です。

スクリプト.png

Panel Pro ==> Panels ==> Script Entryで開くテキストフィールドにPython Scriptを打ち込んでみて、
動作を確認していきます。コマンドは打ち込まなくても、Loadボタンで上記JMRI/jythonフォルダから読み込めます。うまくいったスクリプトはセーブも出来ます。
複数行のスクリプトでも打ち込んでおいて、Executeすれば良いです。

結果はScript Outputで確認出来ます。エラーがあればメッセージが出ます。

勉強はLocoTest.pyやAutomatonExample.pyなどのコメントを読みながらです。

ここから以降はプログラムの全くの素人が系統的に学習した訳でなく、我流でサンプルスクリプトを解読、理解した範囲で書いてますので、間違っている場合は是非ご指摘ご教示くださいませ。

解読と試行錯誤の結果、例えばID3の列車のスピードを半分にするにはこれだけのscriptを書く必要があります。(と思います。)

1 import jarray
2 import jmri
3 class test(jmri.jmrit.automat.AbstractAutomaton) :
4
5 def init(self):
6 self.throttle = self.getThrottle(3, False)
7 self.throttle.speedSetting = 0.5
8 return
9 def handle(self):
10 return 0
11
12 a = test()
13 a.start()

(pythonは 左インデントに意味がありますので、ご注意を。ここのサイト、スペースを無視するので困ります。行番号は不要です。良い書き方ないでしょうか。)

スロットルを制御するコマンドは
jmri.jmrit.automat.AbstractAutomaton
で定義されていて、これらのコマンドをつかうには、
クラス(コマンド?)を定義して(3~10行)、実行(12~13行)します。

5〜8行、def init から returnまでは最初に一度だけ実行する部分、ここに全部書いてあります。実際に実行するのは2行だけなんです。
def handle から returnまでは、ルーチンに回す部分ですが、return 0で即終了です。return 1だと回り続けますし、判別式を入れておけば条件によって終了させることが出来ます。

自分の場所を読み取って、先の信号を読み取って、、、、結構大変そうです。。。。
タグ:Python DCC
nice!(2)  コメント(4)  トラックバック(0) 

nice! 2

コメント 4

S204

いよいよ、本丸に突撃ですね。私は外堀に到達したらくらいのレベルですので、ブログの内容、非常に興味深いです。私も Basic&Fortran 世代です。分かったつもりでも、実際にはさっぱりわかっていないのが、オブジェクト指向です。
by S204 (2013-04-26 09:24) 

pururu

suzuran様、トータン様、niceありがとうございます。
by pururu (2013-04-27 00:15) 

pururu

S204様、コメントありがとうございます。
さっぱりわかっていなくても、それなりに動いてしまうのですが、大きな建造物はつくれないでしょうね。ですので、Logixと併用で、スロットルのコントロールだけpythonに持たせます。リスナーなどを使いこなせれば複雑なことを簡単に出来そうなんですがねぇ。
by pururu (2013-04-27 00:21) 

Nyrpsik

GO!!!
This phrase was said by the first cosmonaut on Earth - Yuri Gagarin. (Yuri Gagarin)
He was the first astronaut on Earth. He was Russian! ...
Now Russia is becoming a strong country, gas pipelines, a vaccine against COVID-19, an army.
Is this very reminiscent of the communist Soviet Union?
How do you think?
Now we have total control in our country. I am interested in the opinion of foreigners.

<a href=http://www.albonumismatico.ru>Албонумисматико</a>

ПОЕХАЛИ!!
by Nyrpsik (2021-05-10 02:54) 

コメントを書く

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

トラックバック 0

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