しばらく更新をサボっておりましたが、
先週末に作成中のスクリプトの修正を行い、何とか動くようになりましたので、ご報告申し上げます。
スクリプト中の
self.throttle.speedSetting = self.sp
で列車の速度を変えるのですが、どうも空振りすることがあることが判明しました。
このとき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)
トータン様、niceありがとうございます。
by pururu (2013-06-07 08:38)