Spiegel der Endlosigkeit (Input=Output)

In diesem Beispiel spiegeln wir die Eingänge auf die Ausgänge mit einer Endlosschleife. Dazu muss das DIO Modul in piCtory mit Inputs:19 / Outputs:17 Konfiguriert werden. Dadurch werden die Inputs und Outputs zu einem Wort zusammengefasst und als zwei bytes() zugreifbar.

Das cProfile haben wir hier mal mit eingebaut, damit ihr die Leistung auf dem RevPi prüfen könnt. Das kann man bei jedem Programm machen, sollte es aber aus dem Release entfernen 😀

Wir verwenden hier eine Endlosschleife! Am Beginn der Schleife lesen wir alle Inputs aus dem Prozessabbild in unseren Puffer ein, verarbeiten die Werte und schreiben die gesetzten Outputs wieder aus dem Puffer in das Prozessabbild.

Die Signale haben wir mit eingebaut, damit das Programm sauber durch Strg+C verlassen werden kann, denn wenn beenden=True ist, wird die Schleife doch enden!

#!/usr/bin/python3
import revpimodio
import signal
import time


class RevPiModIOTest():

    """Kleine Testklasse fuer einen selbst gebauten while-loop.

    Wenn nach der Instanziierung der Klasse wird die start() Funktion aufgerufen
    und geht in unsere Endlosschleife. Diese kann durch Strg+C sauber verlassen
    werden

    """

    def __init__(self):
        """Wird bei der Instanziierung aufgerufen."""
        # Signal events
        signal.signal(signal.SIGINT, self._sigexit)
        signal.signal(signal.SIGTERM, self._sigexit)

        # Variable um den While-Loop zu beenden
        self.beenden = False

        # RevPiModIO Instanzieren
        self.revpi = revpimodio.RevPiModIO()

    def _sigexit(self, signum, frame):
        """Signal handler to exit."""
        self.beenden = True

    def start(self):
        """Hier laeuft das eigentliche Programm in der Endlosschleife."""

        # LED A1 am Core grün setzen
        self.revpi.devices.core.A1 = 1

        # In Dauerschleife einsteigen
        while not self.beenden:

            # Inputs vom Prozessabbild in Puffer lesen
            self.revpi.devices.readprocimg()

            # Input Bytes auf Outputs Bytes spiegeln
            # (ACHTUNG: Oben genannte piCtory Konfiguration des DIOs beachten!)
            self.revpi.devices[32]["Output"].value = self.revpi.devices[32]["Input"].value

            # Outputs vom Puffer in das Prozessabbild schreiben
            self.revpi.devices.writeprocimg()

            # Timestamp als Bildschirmausgabe (Sonst wirkt es so tot, kostet
            # aber Zeit!)
            print(time.time(), end="\r")

            # 50 Millisekunden warten
            time.sleep(0.05)

        # LED A1 beim Verlassen der While-Loop ausschalten
        self.revpi.devices.core.A1 = 0
        self.revpi.devices.writeprocimg()


if __name__ == "__main__":
    root = RevPiModIOTest()
    root.start()

Die passende piCtory Konfiguration sieht so aus: