SSブログ

リスナーを使ったスクリプトー完成? [python]

しばらく更新をサボっておりましたが、

先週末に作成中のスクリプトの修正を行い、何とか動くようになりましたので、ご報告申し上げます。

 

スクリプト中の

                self.throttle.speedSetting = self.sp

で列車の速度を変えるのですが、どうも空振りすることがあることが判明しました。

 

スロットル異常.png

このときJMRIのスロットルは、100%の速度になっているのですが、実際には列車にこのコマンドが通らず、列車が動き出さないという事例が極々稀に発生しました。

100%の時はまだましなのですが、赤現示で0%(=ストップ)がスルーされると大事故になります。

実際に試運転時に2,3回起こってしまいました。

理由は全く分かりません。全くのお手上げ状態。

多くのLogixなどが走っているせいでしょうか。

 

そこで、苦肉の策ですが、

                self.spo = self.throttle.getSpeedSetting()

                self.throttle.speedSetting = 0.95*self.sp+0.05*self.spo

                self.throttle.speedSetting = self.sp

変化分の95%と100%を2段階で入れることにしました。どっちかは通るだろうと。

何となく場当たり的な対策ですが、これにより30分くらいの運転でしたが、コマンドがスルーされることはなくなりました。

完全に安全な自動運転に出来ないところが、どうにも弱いです。

 

綺麗なスクリプトをと思ってリスナーに挑戦してみましたが、結局はなんだか後手後手のものが出来てしまいました。

 

以下がスクリプトです。

import jarray
import jmri

class ControlTrain(jmri.jmrit.automat.AbstractAutomaton) :
     def __init__(self, train, basho, genji):
           print "OK"

     def cont(self, train, basho, genji):
           self.tr = int(train)
           self.throttle = self.getThrottle(self.tr, False)
           self.spo = self.throttle.getSpeedSetting()
           self.syudo = self.throttle.getF4()
           if self.syudo == 0:
                if (genji == 'Red') or (sensors.getSensor(sensList[basho]).state == 2):
                     self.sp = 0
                elif genji == 'Yellow':
                     self.sp = halfList[basho]
                elif genji == 'Green':
                     self.sp = 1
                else:
                     self.sp = 0
                self.throttle.speedSetting = 0.95*self.sp+0.05*self.spo
                self.throttle.speedSetting = self.sp
           elif self.syudo == 1 and self.spo > 0.8:
                self.throttle.setF4(0)
           print "Train = ", self.tr, "Speed =", self.sp    


class mListener(java.beans.PropertyChangeListener):
     def propertyChange(self, event):
         if event.newValue != "":
               basho = memoriList.index(event.source.systemName)
               train = event.newValue
               genji = signals.getSignalHead(singoList[basho]).getAppearanceName()
               print "memory", train, basho, genji
               c.cont(train, basho, genji)

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']
a = mListener()
for i in memoriList:
     memories.provideMemory(i).addPropertyChangeListener(a)

class sListener(java.beans.PropertyChangeListener):
     def propertyChange(self, event):
         basho = singoList.index(event.source.systemName)
         train = memories.getMemory(memoriList[basho]).getValue()
         if train != "":
              genji = signals.getSignalHead(singoList[basho]).getAppearanceName()
              print "signal", train, basho, genji
              c.cont(train, basho, genji)

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"']
b = sListener()
for i in singoList:
     signals.getSignalHead(i).addPropertyChangeListener(b)


class sensListener(java.beans.PropertyChangeListener):
     def propertyChange(self, event):
         if (event.source.systemName != "IS25"):
              basho = sensList.index(event.source.systemName)
              train = memories.getMemory(memoriList[basho]).getValue()
              if (event.newValue == 2):
                    genji = "Red"
              elif (event.newValue == 4):
                    genji = signals.getSignalHead(singoList[basho]).getAppearanceName()
              if train != "":
                   print "sensor", train, basho, genji
                   c.cont(train, basho, genji)

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']
d = sensListener()
for i in sensList:
     sensors.provideSensor(i).addPropertyChangeListener(d)

halfList = [0.7, 0.7, 0.7, 0.7, 0.7, 0.71, 0.7, 0.7, 0.7, 0.7, 0.75, 0.7, 0.7, 0.7, 0.7, 0.73, 0.7, 0.7, 0.7, 0.7, 0.7, 0.71, 0.7, 0.7]

train = ""
basho = ""
genji = ""
c = ControlTrain(train, basho, genji)

class delListener(java.beans.PropertyChangeListener):
     def propertyChange(self, event):
          if event.newValue == 2:
               sensors.provideSensor("IS26").setState(INACTIVE)
               for i in singoList:
                    signals.getSignalHead(i).removePropertyChangeListener(b)
               for i in memoriList:
                    memories.provideMemory(i).removePropertyChangeListener(a)
               for i in sensList:
                    sensors.provideSensor(i).removePropertyChangeListener(d)
               sensors.provideSensor("IS26").removePropertyChangeListener(e)
               print "remove all listener!"

e = delListener()
sensors.provideSensor("IS26").addPropertyChangeListener(e)


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

nice! 2

コメント 1

pururu

トータン様、niceありがとうございます。
by pururu (2013-06-07 08:38) 

コメントを書く

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

トラックバック 0

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