V minulé kapitole návodu jsme postavili na návěstidle volnoznak. Nyní si ukážeme jak shodit návěstidlo do výchozí návěsti.
Ukázkový skript pro shození vjezdového návěstidla L je Blok_BMi1.py. Podobné skripty jsou i pro shození vjezdových návěstidel S a SK.
Skript Blok_BMi1.py obsahuje třídu Blok_BMi1, která je potomkem třídy Siglet. Definice třídy vypadá následovně:
# Blok_BMi1.py
# Petr Šídlo
import jarray
import jmri
class Blok_BMi1(jmri.jmrit.automat.Siglet) :
# defineIO() spouští se jednou při startu
# načte pole pole vstupů
# jakákoliv změna vstupu spustí metodu setOutput()
def defineIO(self):
# tělo metody
# setOutput je voláno při každé změně vstupu
# podle výpočtu změní výstup
def setOutput(self):
# tělo metody
# konec definice třídy
Tato třída se nespouští ve vlákně. Spouští se jako posluchač událostí vybraných objektů. Po spuštění třídy je vytvořena instance třídy, ale skript neběží. Čeká na spouštěcí událost. V případě, že dojde k zadané události, tak je kód třídy vykonán. Po vykonání předepsaného kódu se vykonávání instance třídy zastaví a znovu se čeká na zadanou událost.
Instance třídy se spouští následovně:
# start
Blok_BMi1().start()
Metoda defineIO() se spustí pouze jednou při vytvoření instance třídy. V metodě se provede registrace objektů na jejichž události se bude čekat. V případě vjezdového návěstidla se jedná o blok záhlaví. Potom se běh instance zastaví.
def defineIO(self):
self.BMi1 = blocks.getBlock("BMi1")
# registrace vstupů
self.setInputs(jarray.array([self.BMi1], jmri.NamedBean))
return
Metoda setOutput() se spustí při výskytu jakékoliv události ze seznamu zaregistrovaných objektů.
V našem příkladu se nejdříve definují proměnné. Těmi jsou vjezdové návěstidlo L a seřaďovací návěstidlo Se1. K tomu jsou definované jejich návěsti.
def setOutput(self):
self.L = masts.getSignalMast("L")
self.Se1 = masts.getSignalMast("Se1")
# návěsti
self.STUJ = "Stůj".decode("UTF-8")
self.VOLNO = "Volno"
self.VYSTRAHA = "Výstraha".decode("UTF-8")
self.OCEKAVEJ_40 = "Očekávej 40".decode("UTF-8")
self.RYCHLOST_40_A_VOLNO = "Rychlost 40 a volno"
self.RYCHLOST_40_A_VYSTRAHA = "Rychlost 40 a výstraha".decode("UTF-8")
self.RYCHLOST_40_A_OCEKAVEJ_40 = "Rychlost 40 a očekávej 40".decode("UTF-8")
self.POSUN_ZAKAZAN = "Posun zakázán".decode("UTF-8")
self.POSUN_DOVOLEN = "Posun dovolen"
self.OPATRNE_NA_PRIVOLAVACI_NAVEST = "Opatrně na přivolávací návěst".decode("UTF-8")
if ((self.BMi1.getState() == jmri.Block.OCCUPIED) \
and ((self.L.getAspect() == self.VOLNO) \
or (self.L.getAspect() == self.VYSTRAHA) \
or (self.L.getAspect() == self.RYCHLOST_40_A_VOLNO) \
or (self.L.getAspect() == self.RYCHLOST_40_A_VYSTRAHA) \
or (self.L.getAspect() == self.RYCHLOST_40_A_OCEKAVEJ_40))) :
self.L.setAspect(self.STUJ)
if ((self.BMi1.getState() == jmri.Block.UNOCCUPIED) \
and (self.Se1.getAspect() == self.POSUN_DOVOLEN)) :
self.Se1.setAspect(self.POSUN_ZAKAZAN)
return
U vjezdového návěstidla se testuje, zdali sledovaný blok přešel do stavu obsazeno a současně zdali je na vjezdovém návěstidle volnoznak. Pokud jsou splněny všechny podmínky, tak se vjezdové návěstidlo přestaví na návěst Stůj.
U seřaďovacího návěstidla je situace opačná. Testuje se, zdali sledovaný blok přešel do stavu neobsazeno a současně zdali je na seřaďovacím návěstidle volnoznak. Pokud jsou splněny všechny podmínky, tak se seřaďovací návěstidlo přestaví na návěst Posun zakázán.
Ukázkový skript pro shození odjezdového návěstidla L2 nebo seřaďovacího návěstidla Se3 je Blok_BV3.py. Podobné skripty jsou i pro shození ostatních odjezdových a seřaďovacích.
Skript Blok_BV3.py obsahuje třídu Blok_BV3, která je potomkem třídy Siglet. Definice třídy je stejná jako u třídy Blok_BMi1.
Instance třídy se spouští stejně jako u třídy Blok_BV3.
V metodě defineIO() se provede registrace objektů na jejichž události se bude čekat. V případě odjezdového návěstidla a seřaďovacího návěstidla se jedná o blok nejbližší výhybky.
# defineIO() spouští se jednou při startu
def defineIO(self):
self.BV3 = blocks.getBlock("BV3")
# registrace vstupů
self.setInputs(jarray.array([self.BV3], jmri.NamedBean))
return
Metoda setOutput() se napřed definují proměnné. Těmi jsou odjezdové návěstidlo L2 a seřaďovací návěstidlo Se3 a jejich návěsti.
# setOutput je voláno při každé změně vstupu
# podle výpočtu změní výstup
def setOutput(self):
self.L2 = masts.getSignalMast("L2")
self.Se3 = masts.getSignalMast("Se3")
# návěsti
self.STUJ = "Stůj".decode("UTF-8")
self.VOLNO = "Volno"
self.VYSTRAHA = "Výstraha".decode("UTF-8")
self.OCEKAVEJ_40 = "Očekávej 40".decode("UTF-8")
self.RYCHLOST_40_A_VOLNO = "Rychlost 40 a volno"
self.RYCHLOST_40_A_VYSTRAHA = "Rychlost 40 a výstraha".decode("UTF-8")
self.RYCHLOST_40_A_OCEKAVEJ_40 = "Rychlost 40 a očekávej 40".decode("UTF-8")
self.POSUN_ZAKAZAN = "Posun zakázán".decode("UTF-8")
self.POSUN_DOVOLEN = "Posun dovolen"
self.OPATRNE_NA_PRIVOLAVACI_NAVEST = "Opatrně na přivolávací návěst".decode("UTF-8")
if ((self.BV3.getState() == jmri.Block.OCCUPIED) \
and ((self.L2.getAspect() == self.VOLNO) \
or (self.L2.getAspect() == self.RYCHLOST_40_A_VOLNO))) :
self.L2.setAspect(self.STUJ)
if ((self.BV3.getState() == jmri.Block.UNOCCUPIED) \
and (self.L2.getAspect() == self.POSUN_DOVOLEN)) :
self.L2.setAspect(self.STUJ)
if ((self.BV3.getState() == jmri.Block.UNOCCUPIED) \
and (self.Se3.getAspect() == self.POSUN_DOVOLEN)) :
self.Se3.setAspect(self.POSUN_ZAKAZAN)
return
U odjezdového návěstidla se testuje, zdali sledovaný blok přešel do stavu obsazeno a současně zdali je na odjezdovém návěstidle volnoznak pro jízdu vlaku. Pokud jsou splněny všechny podmínky, tak se vjezdové návěstidlo přestaví na návěst Stůj.
Druhá podmínka odjezdového návěstidla testuje, zdali sledovaný blok přešel do stavu neobsazeno a současně zdali je na odjezdovém návěstidle volnoznak pro posun. Pokud jsou splněny všechny podmínky, tak se vjezdové návěstidlo přestaví na návěst Stůj.
U seřaďovacího návěstidla se testuje, zdali sledovaný blok přešel do stavu neobsazeno a současně zdali je na seřaďovacím návěstidle volnoznak. Pokud jsou splněny všechny podmínky, tak se seřaďovací návěstidlo přestaví na návěst Posun zakázán.
Skript Blok_BK1.py obsahuje třídu Blok_BK1, která je potomkem třídy Siglet. Definice třídy je stejná jako u třídy Blok_BK1.
Instance třídy se spouští stejně jako u třídy Blok_BMi1.
V metodě defineIO() se provede registrace objektů na jejichž události se bude čekat. V případě odjezdového návěstidla a seřaďovacího návěstidla se jedná o blok ke kterému návěstidlo dovoluje odjezd.
def defineIO(self):
self.BK1 = blocks.getBlock("BK1")
# registrace vstupů
self.setInputs(jarray.array([self.BK1], jmri.NamedBean))
return
Metoda setOutput() se napřed definují proměnné. Těmi jsou odjezdová návěstidla L1 a S1 a jejich návěsti.
def setOutput(self):
self.S1 = masts.getSignalMast("S1")
self.L1 = masts.getSignalMast("L1")
# návěsti
self.STUJ = "Stůj".decode("UTF-8")
self.VOLNO = "Volno"
self.VYSTRAHA = "Výstraha".decode("UTF-8")
self.OCEKAVEJ_40 = "Očekávej 40".decode("UTF-8")
self.RYCHLOST_40_A_VOLNO = "Rychlost 40 a volno"
self.RYCHLOST_40_A_VYSTRAHA = "Rychlost 40 a výstraha".decode("UTF-8")
self.RYCHLOST_40_A_OCEKAVEJ_40 = "Rychlost 40 a očekávej 40".decode("UTF-8")
self.POSUN_ZAKAZAN = "Posun zakázán".decode("UTF-8")
self.POSUN_DOVOLEN = "Posun dovolen"
self.OPATRNE_NA_PRIVOLAVACI_NAVEST = "Opatrně na přivolávací návěst".decode("UTF-8")
if ((self.BK1.getState() == jmri.Block.UNOCCUPIED) \
and (self.S1.getAspect() == self.POSUN_DOVOLEN)) :
self.S1.setAspect(self.STUJ)
if ((self.BK1.getState() == jmri.Block.UNOCCUPIED) \
and (self.L1.getAspect() == self.POSUN_DOVOLEN)) :
self.L1.setAspect(self.STUJ)
return
U odjezdového návěstidla se testuje, zdali sledovaný blok přešel do stavu neobsazeno a současně zdali je na odjezdovém návěstidle volnoznak pro posun. Pokud jsou splněny všechny podmínky, tak se vjezdové návěstidlo přestaví na návěst Stůj.
U seřaďovacího návěstidla Se2 u koleje K4 se postupuje analogicky.
Aby byla instance třídy vytvořena musí být skript právě jednou spuštěn. Správné místo pro jeho spuštění jsou předvolby.
vytvořeno 19. 10. 2019