Der Programmstart sieht so aus:
- Wir Instanziieren die Klasse RevPiRevolution(), wodurch die Einstellungen geladen werden
- Dort wird unser RevPiModIO Modul konfiguriert
- Ein Modul mit dem Namen funccatalog bietet die Grundfunktionen, welche wir hier konfigurieren
- Und das wichtige Event für den Taster „t_start“ wird registriert
- Dann gehen wir in den mainloop()
class RevPiRevolution():
"""Hauptklasse fuer den Revolutionsumbau."""
def __init__(self):
"""Instanziiert diese Klasse."""
self.rpi = None
# Gesamte Logik für den Automatikbetrieb
self.th_automatik = None
# Gesamte Logik für den Handbetrieb
self.th_hand = None
# Alles Konfigurieren
self.loadconfig()
# Signale zum Beenden einrichten
signal.signal(signal.SIGINT, self.stop)
signal.signal(signal.SIGTERM, self.stop)
def loadconfig(self):
"""Konfiguriert alles fuer die Ausfuehrung."""
# RevPiModIO konfigurieren mit auto_refresh
self.rpi = revpimodio.RevPiModIO(auto_refresh=True)
# Globale Steuerungsthreads vorbereiten
funccatalog.anlage = funccatalog.Anlage(self.rpi)
funccatalog.anlage.start()
funccatalog.band = funccatalog.Band(self.rpi)
funccatalog.band.start()
funccatalog.zylinder = funccatalog.Zylinder(self.rpi)
funccatalog.zylinder.start()
# Funktions Thrads vorbereiten
self.th_automatik = Automatik(self.rpi)
self.th_hand = Hand(self.rpi)
# Event für Start-Raster registrieren
self.rpi.devices["di01"].reg_event("t_start", self.evt_start)
# Druckverlust
self.rpi.devices["di02"].reg_event(
"m_druck_ok", self.evt_keindruck, edge=revpimodio.FALLING
)
# Notaus
self.rpi.devices["di01"].reg_event(
"notaus_ok", self.evt_notaus, edge=revpimodio.FALLING
)
def evt_keindruck(self, ioname, iovalue):
"""Eventfunktion fuer Druckabfall.
@param ioname Name des IO, der Event ausloest
@param iovalue Wert des IO, der Event ausloest"""
funccatalog.anlage.stoerung = True
self.th_automatik.stop()
def evt_notaus(self, ioname, iovalue):
"""Eventfunktion fuer Notaus.
@param ioname Name des IO, der Event ausloest
@param iovalue Wert des IO, der Event ausloest"""
funccatalog.anlage.stoerung = True
self.th_automatik.stop()
self.th_hand.stop()
def evt_start(self, ioname, iovalue):
"""Eventfunktion fuer den Taster t_start.
@param ioname Name des IO, der Event ausloest
@param iovalue Wert des IO, der Event ausloest
@return None
"""
# Laufende Threads beenden
self.th_automatik.stop()
self.th_hand.stop()
# Wenn Notaus nicht OK ist, abbrechen
if not self.rpi.devices["di01"]["notaus_ok"]:
return None
# Wenn t_start gesetzt ist, wird gewählter Betriebsmodus gestartet
if iovalue:
if self.rpi.devices["di01"]["t_automatik"]:
# Automatikbetrieb starten, wenn Druck und noch nicht läuft
if self.rpi.devices["di02"]["m_druck_ok"] \
and not self.th_automatik.is_alive() \
and not funccatalog.anlage.stoerung:
self.th_automatik = Automatik(self.rpi)
self.th_automatik.start()
else:
# Handbetrieb starten, wenn noch nicht läuft
if not self.th_hand.is_alive():
self.th_hand = Hand(self.rpi)
self.th_hand.start()
def start(self):
"""Startet das Revolutionsumbauprogramm."""
# LED A1 grün schalten
self.rpi.devices.core.A1 = 1
# Druckventil öffnen
self.rpi.devices["do01"]["v_druck"] = True
# In den mainloop() gehen und auf Events warten
self.rpi.devices.mainloop()
# LED A1 ausschalten
self.rpi.devices.core.A1 = 0
# Druckventil schließen
self.rpi.devices["do01"]["v_druck"] = False
# Prozessabbild schreiben, da auto_refresh hier nicht mehr läuft
self.rpi.devices.writeprocimg()
# RevPiModIO herunterfahren
self.rpi.cleanup()
def stop(self, signum=None, frame=None):
"""Beendet das Revolutionsumbauprogramm."""
# Alle Steuerungsthreads beenden
self.th_automatik.stop()
self.th_hand.stop()
# Alle Funktionsthrads beenden
funccatalog.anlage.stop()
funccatalog.band.stop()
funccatalog.zylinder.stop()
# mainloop() verlassen und auto_refresh beenden
self.rpi.devices.exit()
if __name__ == "__main__":
root = RevPiRevolution()
root.start()
