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.