Objekt .io

Diese Klasse bietet direkten Zugriff auf die IOs des Revolution Pi.

revpimodio2.io.IOList()
Klassenobjekte

Diese Klasse bietet alle IOs als Attribute an. Die Namen der Attribute werden aus der piCtory Konfiguration entnommen.

Wird in piCtory ein Eingang mit dem Namen „I_1“ konfiguriert, kann mit Python folgendermaßen auf dessen Wert zugegriffen werden:
.io.I_1.value

Auf die gleiche Weise werden Outputs verwendet, deren Werte über eine Zuweisung änderbar sind. Zum Beispiel für einen Output mit dem Namen „O_1“:
.io.O_1.value = True

Alternativ kann auch per String auf ein IO-Objekt zugegriffen werden:
.io["I_1"].value

Hinweis: Für die Namensvergabe in piCtory müssen die Pythonregeln für Namensvergaben eingehalten werden. Sollte dies nicht möglich sein, ist ein Zugriff nur über Stringangaben (.io["§chlecht'r#Name"].value) möglich.


Alle Attributobjekte haben generell folgende Eigenschaften:

Klassenattribute

  • .address
    Gibt die absolute Byteadresse als <class ‚int‘> im Prozessabbild zurück.

  • .bmk
    Gibt den Text als <class ’str‘> aus Feld „Comment“ des „Value Editors“ in piCtory zurück.

  • .byteorder
    Gibt bei allen IOs die Byteorder als <class ’str‘> zurück.
    Bei Byte-orientierten IOs, wie z.B. auf virtuellen Devices oder Gateways kann die Byteorder auch gesetzt werden. Dies ist wichtig für die Umrechnung der Werte in <class ‚int‘>. Der Standard ist „little“.
    Mögliche Werte: „little“ oder „big“

  • .defaultvalue
    Gibt die, in piCtory konfigurierte, Defaultvalue des IOs zurück.

  • .frm
    Gibt nur bei, durch .replace_io(...), ersetzten IOs die struct Formatierung als <class ’str‘> zurück. Bei anderen IOs existiert das Attribut nicht!

  • .length
    Gibt die Bytelänge des IO Objekts zurück – 0 bei Bits.

  • .name
    Gibt den Namen des IO Objekts zurück – Entspricht Namen in piCtory.

  • .signed
    Gibt bei allen IOs zurück, ob die value-Berechnung mit Vorzeichen durchgeführt werden soll.
    Bei Byte-orientierten IOs, wie z.B. auf virtuellen Devices oder Gateways kann  der Wert auch gesetzt werden. Dies ist wichtig für die Umrechnung der Werte in <class ‚int‘>. Der Standard ist False.
    Mögliche Werte: True oder False
  • .type
    Gibt den IO Typen des IO Objekts als <class ‚int‘> zurück.

    • 200=INP
    • 301=OUT
    • 302=MEM

  • .value
    Gibt den Wert des IO Objekts zurück. Dabei ist der Typ des Rückgabewerts immer der passende.

    • <class ‚bool‘> Bei BIT-orientierten IOs (Digitale Ein- und Ausgänge) oder durch .replace_io(... , "?", bit=0) BIT-orientiert ersetze Bytes.
    • <class ‚int‘> Bei allen anderen inkl. durch .replace_io(...) ersetzten IOs

Klassenfunktionen

.reg_event(func, [delay=0, edge=BOTH, as_thread=False])

Registriert auf diesen IO ein Event bei der Eventüberwachung. Die übergebene Funktion wird ausgeführt, wenn der IO Wert sich ändert. Mit Angabe von optionalen Parametern kann das Auslöseverhalten gesteuert werden.

HINWEIS: Die delay-Zeit muss in die .cycletime passen, ist dies nicht
der Fall, wird IMMER aufgerundet!

  • func
    Funktion die bei Änderung aufgerufen werden soll.
    Der Funktion werden der io_name und io_value übergeben, welche sie akzeptieren muss: def meine_funktion(ioname, iovalue):
  • delay=0
    Verzögerung in Millisekunden zum Auslösen wenn Wert gleich bleibt.
  • edge=revpimodio2.BOTH
    Ausführen bei RISING, FALLING or BOTH Wertänderung von BIT-orientierten IOs.
  • as_thread=False
    Bei Angabe von True, wird die Funktion als EventCallback-Thread ausgeführt und kann parallel zum eigentlichen Programm laufen.
    Der Funktion wird eine Instanz von EventCallback übergeben, welche sie akzeptieren muss: def meine_funktion(ecb): !

.reg_timerevent(func, delay, [edge=BOTH, as_thread=False])

Der Timer wird gestartet, wenn sich der IO Wert ändert, und führt die
übergebene Funktion aus – auch wenn sich der IO Wert in der
zwischenzeit geändert hat. Sollte der Timer nicht abgelaufen sein und
die Bedingung erneut zutreffen, wird der Timer NICHT auf den delay Wert
zurückgesetzt oder ein zweites Mal gestartet. Für dieses Verhalten
kann .reg_event(..., delay=wert) verwendet werden.

HINWEIS: Die delay-Zeit muss in die .cycletime passen, ist dies nicht
der Fall, wird IMMER aufgerundet!

  • func
    Funktion die bei Änderung aufgerufen werden soll.
    Der Funktion werden der io_name und io_value übergeben, welche sie akzeptieren muss: def meine_funktion(ioname, iovalue):
  • delay
    Verzögerung in Millisekunden zum Auslösen.
  • edge=revpimodio2.BOTH
    Ausführen bei RISING, FALLING or BOTH Wertänderung von BIT-orientierten IOs.
  • as_thread=False
    Bei Angabe von True, wird die Funktion als EventCallback-Thread ausgeführt und kann parallel zum eigentlichen Programm laufen.
    Der Funktion wird eine Instanz von EventCallback übergeben, welche sie akzeptieren muss: def meine_funktion(ecb): !

.replace_io(name, frm, [**kwargs])

Registriert an der Stelle von diesem IO einen neuen IO mit angegebener Formatierung. Für die Formatvorgabe, mit Parameter frm, werden die Zeichen der struct()-Funktion von Python3 verwendet.

Bit-IOs registrieren:


Wird als Formatvorlage „?“ (BIT) verwendet, muss als Parameter bit die Bitadresse angegeben werden, an welcher stelle im vorhandenen Byte oder Word der neue IO liegen soll. Es können auf einem IO mit Länge von 1 Byte 8 neue BIT-orientierte IOs erstellt werden – Mit 2 Byte Länge 16 usw.

Zahlen-IOs registrieren:


Wird als Formatvorlage ein Zahlenwert verwendet, der mehr Speicher benötigt als der IO zur Verfügung hat, werden auch nachfolgende IOs ersetzt. Benutzt man für frm z.B. „Q“ – unsigned 8 Byte –  werden der IO selbst, plus sieben nachfolgende IOs ersetzt (wenn IOs je ein Byte lang sind). Durch Angabe von „q“ wird der Wert mit Vorzeichen behandelt und dementsprechend ausgegeben.

Rohe Byte-IOs registrieren:


Möchte man den reinen Bytewert von aneinander hängenden IOs erhalten (vor allem bei Gateways viel genutzt), verwendet man die Formatvorlage „s“. Vor dem „s“ muss eine Zahl stehen, die angibt wie viele Bytes für den neuen IO verwendet werden sollen. Benutzt man für frm z.B. „16s“ werden der IO selbst, plus 15 nachfolgende IOs ersetzt (wenn IOs je ein Byte lang sind).

  • name Name des neuen IO, welcher auch als Attribut in .io hinzugefügt wird.
  • frm struct() Formatierung (1 Zeichen außer bei s) – Nach Python-Vorgaben.
  • kwargs Folgende optionale Keyword-Parameter können übergeben werden:
    • bmk interne Bezeichnung für IO.
    • bit Registriert IO als <class ‚bool‘> am angegebenen Bit im Byte/Word.
    • byteorder Byteorder für den neuen IO – Bei Nichtangabe wird die Byteorder des zu ersetzenden IOs übernommen.
    • defaultvalue Standardwert für neuen IO – Bei Nichtangabe wird die Defaultvalue aus ersetzten IOs berechnet.
    • event Funktion für Eventhandling registrieren.
    • delay Verzögerung in Millisekunden zum Auslösen wenn Wert gleich bleibt.
    • edge Event-Ausführen bei RISING, FALLING or BOTH Wertänderung.
    • as_thread Führt die event-Funktion als RevPiCallback-Thread aus.

.unreg_event([func=None, edge=None])

Entfernt registrierte Events aus dem Eventhandling und ruft dessen Funktionen bei Datenänderung nicht mehr auf. Wird diese Funktion ohne Parameter aufgerufen werde ALLE registrieren Funktionen von diesem IO entfernt. Mit Angabe von Parametern kann man nur bestimmte Funktionen entfernen.

  • func
    Nur Events mit angegebener Funktion löschen
  • edge
    Nur Events mit angegebener Funktion und angegebener edge löschen

.wait([edge=BOTH, exitevent=None, okvalue=None, timeout=0])

Wartet an aufrufender Stelle im Pythonprogramm auf Wertänderung des IOs.
Die Wertänderung wird immer überprüft, wenn das AutoRefresh neue Daten liefert – also RevPiModIO mit Parameter autorefresh=True instantiiert oder für das Device, auf dem sich der IO befindet, .autorefresh() aufgerufen wurde.

Bei Wertänderung, wird das Warten mit 0 als Rückgabewert beendet.

Wenn edge mit RISING oder FALLING angegeben wird, muss diese Flanke ausgelöst werden. Sollte der IO-Wert beim Aufruf True sein mit Flanke RISING, wird das Warten erst bei Änderung von False auf True mit True beendet.

Als exitevent kann ein <class ‚threading.Event‘>-Objekt übergeben werden, welches das Warten bei is_set() sofort mit 1  als Rückgabewert beendet.

Wenn der Wert okvalue an dem Input für das Warten anliegt, wird das Warten sofort mit -1 als Rückgabewert beendet.

Der Wert von timeout bricht beim Erreichen das Warten sofort mit 2 als Rückgabewert ab. (Das Timeout wird über die Zykluszeit der autorefresh Funktion berechnet, entspricht also nicht exakt den angegeben Millisekunden! Es wird immer nach oben gerundet!)

  • edge=revpimodio2.BOTH
    Flanke RISING, FALLING, BOTH die eintreten muss.
  • exitevent=None
    <class ‚thrading.Event‘> für vorzeitiges Beenden.
  • okvalue=None
    IO-Wert, bei dem das Warten sofort beendet wird.
  • timeout=0
    Zeit in Millisekunden, nach der abgebrochen wird. Bei 0 wird Timeout nicht beachtet.

RÜCKGABEWERT: Als Rückgabewert erhält man einen <class ‚int‘> Integer Wert.

  • Erfolgreich gewartet: <= 0
    • 0: IO hat den Wert gewechselt
    • -1: okvalue stimmte mit IO-Wert überein
  • Fehlerhaft gewartet: > 0
    • 1: exitevent wurde gesetzt
    • 2: timeout abgelaufen
    • 100: RevPiModIO.exit() wurde aufgerufen

Erweiterte Getter und Setter Funktionen

.get_defaultvalue()

Gibt die Defaultvalue des IO immer als <class ‚bytes‘> zurück.


.get_intdefaultvalue()

Gibt die Defaultvalue des IO als <class ‚int‘> zurück.
Hinweis: Nur bei IO-Typen der Klasse <class ‚revpimodio.io.IntIO‘> verfügbar.


.get_structdefaultvalue()

Gibt die Defaultvalue des IO als <class ‚int‘> zurück unter Beachtung der struct Formatvorgabe.
Hinweis: Nur bei IO-Typen der Klasse <class ‚revpimodio.io.StructIO‘> verfügbar.


.get_value()

Gibt den IO-Wert immer als <class ‚bytes‘> zurück.


.get_intvalue()

Gibt den IO-Wert als <class ‚int‘> zurück.
Hinweis: Nur bei IO-Typen der Klasse <class ‚revpimodio.io.IntIO‘> verfügbar.


.get_structvalue()

Gibt den IO-Wert als <class ‚int‘> zurück unter Beachtung der struct Formatvorgabe.
Hinweis: Nur bei IO-Typen der Klasse <class ‚revpimodio.io.StructIO‘> verfügbar.


.set_value(value)

Setzt den IO-Wert auf übergebene value vom Typen <class ‚bytes‘>


.set_intvalue(value)

Setzt den IO-Wert auf übergebene value vom Typen <class ‚int‘>
Hinweis: Nur bei IO-Typen der Klasse <class ‚revpimodio.io.IntIO‘> verfügbar.


.set_structvalue(value)

Setzt den IO-Wert auf übergebene value vom Typen <class ‚int‘> und wandelt ihn unter Beachtung der struct Formatvorgabe.
Hinweis: Nur bei IO-Typen der Klasse <class ‚revpimodio.io.StructIO‘> verfügbar.