Probieren wir doch mal was… Anlage in Klassen abbilden:
Hier haben wir z.B. unsere Klasse, die uns Funktionen für das Band zur Verfügung stellt. Wir können über die set_* Funktionen das Band ein- und ausschalten. Aus unserem Hauptprogramm rufen wir einfach:
set_schnell_rechts(True)
auf um das Band zu starten und
set_schnell_rechts(False)
um das Band zu stoppen 😀
In der run() Funktion, welche der Thread ständig ausführt, wenn er gestartet wird, werden die Lampen gesteuert. Je nach Zustand der Anlage sollen sie an/aus oder blinkend sein.
class Band(Thread):
"""Thread fuer die Steuerung des Bandmotors.
Ueber die hier zur Verfuegung gestellten Funktionen steuert das Programm
die Eigenschaften des Bandmotors. Die Funktionen kontrollieren
selbststaendig ob die gewuenschte Betriebsart erlaubt ist und geben jeweils
True oder False zurueck. Damit kann in dem aufrufenden Teiles des
Programms kontrolliert werden, ob die Aktion durchgefuert werden konnte.
"""
def __init__(self, rpi):
"""Instanziiert den Bandthread."""
super().__init__()
self.evt_ende = Event()
self.daemon = True
self.rpi = rpi
def grundstellung(self):
"""Setzt die Motorensteuerung in die Grundstellung."""
self.set_lahm_rechts(False)
self.set_lahm_links(False)
self.set_schnell_rechts(False)
def set_lahm_rechts(self, start):
"""Band langsam nach rechts laufen lassen.
@return True, wenn Aktion ausgefuehrt werden konnte"""
if self.rpi.devices["di01"]["notaus_ok"]:
if not self.rpi.devices["do01"]["q_lahm_links"]:
self.rpi.devices["do01"]["q_lahm_rechts"] = start
self.rpi.devices["do01"]["q_schnell_rechts"] = False
return True
else:
self.rpi.devices["do01"]["q_lahm_rechts"] = start
return False
def set_lahm_links(self, start):
"""Band langsam nach links laufen lassen.
@return True, wenn Aktion ausgefuehrt werden konnte"""
if self.rpi.devices["di01"]["notaus_ok"]:
if not self.rpi.devices["do01"]["q_lahm_rechts"] \
and not self.rpi.devices["do01"]["q_schnell_rechts"]:
self.rpi.devices["do01"]["q_lahm_links"] = start
return True
else:
self.rpi.devices["do01"]["q_lahm_links"] = False
return False
def set_schnell_rechts(self, start):
"""Band schnell nach rechts laufen lassen.
@return True, wenn Aktion ausgefuehrt werden konnte"""
if self.rpi.devices["di01"]["notaus_ok"]:
if not self.rpi.devices["do01"]["q_lahm_links"]:
self.rpi.devices["do01"]["q_lahm_rechts"] = False
self.rpi.devices["do01"]["q_schnell_rechts"] = start
return True
else:
self.rpi.devices["do01"]["q_schnell_rechts"] = False
return False
def run(self):
"""Wird durchgehend ausgefuehrt, wenn Bandthread laeuft.
In dieser Funktion werden die Lampen gesteuert, die je nach Betriebsart
dauerhaft leuchten (Automatikbetrieb) oder blinken (Handbetrieb) wenn
der Motor lauft.
"""
while not self.evt_ende.is_set():
# Langsam nach rechts auswerten
if self.rpi.devices["di01"]["m_lahm_rechts"]:
if self.rpi.devices["di01"]["t_automatik"]:
self.rpi.devices["do02"]["h_lahm_rechts"] = True
else:
self.rpi.devices["do02"]["h_lahm_rechts"] = \
myflash.status1
else:
self.rpi.devices["do02"]["h_lahm_rechts"] = False
# Langsam nach links auswerten
if self.rpi.devices["di01"]["m_lahm_links"]:
if self.rpi.devices["di01"]["t_automatik"]:
self.rpi.devices["do02"]["h_lahm_links"] = True
else:
self.rpi.devices["do02"]["h_lahm_links"] = \
myflash.status1
else:
self.rpi.devices["do02"]["h_lahm_links"] = False
# Schnell nach rechts auswerten
if self.rpi.devices["di01"]["m_schnell_rechts"]:
if self.rpi.devices["di01"]["t_automatik"]:
self.rpi.devices["do02"]["h_schnell_rechts"] = True
else:
self.rpi.devices["do02"]["h_schnell_rechts"] = \
myflash.status1
else:
self.rpi.devices["do02"]["h_schnell_rechts"] = False
myflash.wait()
def stop(self):
"""Beendet den Bandthread."""
self.evt_ende.set()
Für die Zylinder sieht es genau so aus:
Zylinder m1 ausfahren:
set_m1(True)
oder einfahren:
set_m1(False)
Auch dieser Thread steuert die Lampen für die Rückmeldungen automatisch in der run() Funktion.
class Zylinder(Thread):
"""Thread fuer die Steuerung der Zylinder.
Ueber die hier zur Verfuegung gestellten Funktionen steuert das Programm
die Eigenschaften der Zylinder.
"""
def __init__(self, rpi):
"""Instanziiert den Zylinder-Thread."""
super().__init__()
self.evt_ende = Event()
self.daemon = True
self.rpi = rpi
def grundstellung(self):
"""Setzt die Zylinder in die Grundstellung."""
self.set_m1(True)
self.set_m2(False)
self.set_m3(False)
def set_m1(self, raus, force=False):
"""Zylinder m1 Ein-/Ausfahren.
@param raus Bei True ausfahren / Bei False einfahren"""
if self.rpi.devices["di01"]["notaus_ok"]:
if force or self.rpi.devices["di02"]["m_druck_ok"]:
self.rpi.devices["do01"]["v_m1_einfahren"] = not raus
self.rpi.devices["do01"]["v_m1_ausfahren"] = raus
def set_m2(self, raus, force=False):
"""Zylinder m2 Ein-/Ausfahren.
@param raus Bei True ausfahren / Bei False einfahren"""
if self.rpi.devices["di01"]["notaus_ok"]:
if force or self.rpi.devices["di02"]["m_druck_ok"]:
self.rpi.devices["do01"]["v_m2_einfahren"] = not raus
self.rpi.devices["do01"]["v_m2_ausfahren"] = raus
def set_m3(self, raus, force=False):
"""Zylinder m3 Ein-/Ausfahren.
@param raus Bei True ausfahren / Bei False einfahren"""
if self.rpi.devices["di01"]["notaus_ok"]:
if force or self.rpi.devices["di02"]["m_druck_ok"]:
self.rpi.devices["do01"]["v_m3_einfahren"] = not raus
self.rpi.devices["do01"]["v_m3_ausfahren"] = raus
def run(self):
"""Wird durchgehend ausgefuehrt, wenn Zylinderthread lauft.
In dieser Funktion werden die Lampen gesteuert, die je nach
Zylinderstellung dauerhaft leuchten (in Grundstellung) oder
blinken (nicht in Grundstellung).
"""
while not self.evt_ende.is_set():
# Zylinder m1 Grundstellung auswerten
if self.rpi.devices["di02"]["m_m1_ausgefahren"]:
self.rpi.devices["do02"]["h_m1_status"] = True
elif self.rpi.devices["di02"]["m_m1_eingefahren"]:
self.rpi.devices["do02"]["h_m1_status"] = myflash.status2
else:
self.rpi.devices["do02"]["h_m1_status"] = False
# Zylinder m2 Grundstellung auswerten
if self.rpi.devices["di02"]["m_m2_eingefahren"]:
self.rpi.devices["do02"]["h_m2_status"] = True
elif self.rpi.devices["di02"]["m_m2_ausgefahren"]:
self.rpi.devices["do02"]["h_m2_status"] = myflash.status2
else:
self.rpi.devices["do02"]["h_m2_status"] = False
# Zylinder m3 Grundstellung auswerten
if self.rpi.devices["di02"]["m_m3_eingefahren"]:
self.rpi.devices["do02"]["h_m3_status"] = True
elif self.rpi.devices["di02"]["m_m3_ausgefahren"]:
self.rpi.devices["do02"]["h_m3_status"] = myflash.status2
else:
self.rpi.devices["do02"]["h_m3_status"] = False
myflash.wait()
def stop(self):
"""Beendet den Zylinderthread."""
self.evt_ende.set()
Mehr Code und Erklärungen folgen…
