11 Shození návěstidla

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.

Shození vjezdového návěstidla

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.

Třída Blok_BMi1

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

Spuštění 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()

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()

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

Vjezdové návěstidlo

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.

Seřaďovací návěstidlo

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.

Shození odjezdového návěstidla

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.

Třída Blok_BV3

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.

Spuštění třídy

Instance třídy se spouští stejně jako u třídy Blok_BV3.

Metoda defineIO()

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()

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

Odjezdové návěstidlo

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.

Seřaďovací návěstidlo

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.

Třída Blok_BK1

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.

Spuštění třídy

Instance třídy se spouští stejně jako u třídy Blok_BMi1.

Metoda defineIO()

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()

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

Odjezdové návěstidlo

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.

Seřaďovací návěstidlo

U seřaďovacího návěstidla Se2 u koleje K4 se postupuje analogicky.

Spuštění skriptu

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