Über RevPiModIO2

Die neue Version!

Wir konnten durch die erste Version von RevPiModIO und Anregungen aus der Community (vielen Dank an euch ALLE) einiges an Erfahrungen sammeln. Diese haben wir in die neue Syntax von RevPiModIO2 gesteckt und das Ergebnis kann sich sehen lassen!

Was wird besser mit Version 2?

Wichtig für Instanziierung!

Eine Instanz des neuen RevPiModIO2 bietet viele Klassenattribute und hat leichte Änderungen bei den Übergabeparametern!

Keyword auto_refresh=True ist jetzt autorefresh=True

# Alte Syntax: Instanziierung mit autorefresh
import revpimodio
rpi = revpimodio.RevPiModIO(auto_refresh=True)

# Neue Syntax: Keyword auto_refresh ist jetzt autorefresh !!!
import revpimodio2
rpi = revpimodio2.RevPiModIO(autorefresh=True)

# Autorefresh aktualisierungsrate / Zykluszeit
rpi.cycletime

# Kommunikationsfehler mit piControl
rpi.ioerrors

# Soll bei einer bestimmten Anzahl eine Exception ausgelöst werden?
rpi.maxioerrors = 0  # Niemals eine Exception auslösen (Standardwert)

rpi.maxioerrors = 10  # Nach 10 Kommunikationsfehler eine Exception auslösen
Syntax für IO-Zugriffe

Wollte man den Wert eines IOs auslesen, ergab sich folgende kryptische Schreibarbeit mit ständigen eckigen Klammern und Anführungszeichen: rpi.devices["dio02"]["ioname"].value

Mit dem neuen Modul bringen wir die io Klasse mit, die ALLE IOs als Attribute beinhaltet. Damit ist der Zugriff deutlich angenehmer zu programmieren: rpi.io.ioname.value

Diese Veränderung kann bis zu 45% schneller sein (cProfile Messungen mit RevPi-Core1)!

Wie man sehen kann beseitigen wir damit noch eine nervige Sache: Angabe des Devices, auf dem der IO ich befindet. Da in piCtory die Namen der IOs über alle Devices eindeutig sein müssen, kann es dem Programmierer egal sein auf welchem Device der IO liegt.

Syntax zum Starten der Loops

Das Starten des cycleloop oder mainloop wurde von der devices Klasse direkt an die RevPiModIO Klasse verschoben.

Alte Syntax
rpi.devices.cycleloop(zyklusfunktion)
rpi.devices.mainloop()

Neue Syntax
rpi.cycleloop(zyklusfunktion)
rpi.mainloop()

Syntax für Device-Zugriffe

Möchte man mit einem einzelnen Device vom RevPi arbeiten, erledigt man dies über die neue device Klasse. Diese beinhaltet alle Devices als Attribute (wenn eindeutige Namen in piCtory konfiguriert sind): rpi.device.dio02
Ansonsten kann über die Positionsnummer auf das Device zugegriffen werden: rpi.device[32]

Syntax um neue IOs zu registrieren

Wollte man für Gateways oder virtuelle Devices neue IOs in RevPiModIO registrieren, musste man sich über die devices Klasse zum Device hangeln und hatte dort die Funktionen .reg_inp(...) / .reg_out(...). Hier wird ein Bit in einem Byte des virtuellen Device „virt01“ als neuer Input „p_schnell“ registriert: self.rpi.devices["virt01"].reg_inp("p_schnell", "pbit0_7", "?", bit=7)

Diese Funktion wurde entfernt und jeder IO bietet nun die .replace_io(...) Funktion an. Mit neuer Syntax ergibt sich folgender Befehl: self.rpi.io.pbit0_7.replace_io("p_schnell", "?", bit=7)

Syntax um Ein Event im Eventhandling zu registrieren

Die Funktionen .reg_event(...) und .unreg_event(...) wurden von den Devices zu den IOs geschoben. Über jedes IO Attribut der .io Klasse kann man nun direkt die .reg_event(...) und .unreg_event(...) Funktion nutzen. Übergeben werden muss nur noch die Funktion, welche ausgeführt werden soll und ggf. weitere Parameter.

Hier der Vergleich zwischen alter Version (oben) und neuer Version (unten):
self.rpi.devices["di01"].reg_event("t_start", self.evt_start, edge=revpimodio.RISING)
self.rpi.io.t_start.reg_event(self.evt_start, edge=revpimodio2.RISING)

Syntax um auf Änderung eines IOs zu warten

Die Nutzung der .wait(...) Funktion hat sich sehr stark verändert. Sie war Bestandteil der Klasse devices und benötigte sehr viele Parameter: self.rpi.devices.wait("di02", "s_magazin1"). Sie gehört nun auch zu den IOs, welche über die Attribute der io Klasse angesprochen werden: self.rpi.io.s_magazin1.wait().

Die neue Version steht zum Download bereit.