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:

