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…