Erste Programmierschritte

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…