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: