Encodingzeile an PEP angepasst (muss in Zeile 0 - 1 sein)

Von RevPiModIO kwagrs entfernt und feste keyword vergeben
Bei Änderung der Byteorder wird defaultvalue angepasst da aus piCtory little
Beim Core nur die RS485 Fehlerwerte übernehmen
defaultvalue wird mit Formatierung ausgegeben
.isnumeric gegen isdigit getauscht
docstrings
This commit is contained in:
2017-08-26 15:12:55 +02:00
parent 2aebe170f5
commit 4e9abf794b
14 changed files with 342 additions and 241 deletions

View File

@@ -182,7 +182,7 @@ Gibt den RevPi Core Status zurueck.
</p><dl>
<dt>Returns:</dt>
<dd>
Status als int()
Status als <class 'int'>
</dd>
</dl><a NAME="Core._set_leda1" ID="Core._set_leda1"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
@@ -370,10 +370,10 @@ Methods</h3>
<table>
<tr>
<td><a style="color:#0000FF" href="#Device.__init__">Device</a></td>
<td>Instantiierung der Device()-Klasse.</td>
<td>Instantiierung der Device-Klasse.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#Device.__bytes__">__bytes__</a></td>
<td>Gibt alle Daten des Devices als bytes() zurueck.</td>
<td>Gibt alle Daten des Devices als <class 'bytes'> zurueck.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#Device.__contains__">__contains__</a></td>
<td>Prueft ob IO auf diesem Device liegt.</td>
@@ -434,14 +434,14 @@ Static Methods</h3>
Device (Constructor)</h3>
<b>Device</b>(<i>parentmodio, dict_device, simulator=False</i>)
<p>
Instantiierung der Device()-Klasse.
Instantiierung der Device-Klasse.
</p><dl>
<dt><i>parent</i></dt>
<dd>
RevpiModIO parent object
</dd><dt><i>dict_device</i></dt>
<dd>
dict() fuer dieses Device aus piCotry Konfiguration
<class 'dict'> fuer dieses Device aus piCotry
</dd><dt><i>simulator:</i></dt>
<dd>
Laed das Modul als Simulator und vertauscht IOs
@@ -451,11 +451,11 @@ Laed das Modul als Simulator und vertauscht IOs
Device.__bytes__</h3>
<b>__bytes__</b>(<i></i>)
<p>
Gibt alle Daten des Devices als bytes() zurueck.
Gibt alle Daten des Devices als <class 'bytes'> zurueck.
</p><dl>
<dt>Returns:</dt>
<dd>
Devicedaten als bytes()
Devicedaten als <class 'bytes'>
</dd>
</dl><a NAME="Device.__contains__" ID="Device.__contains__"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
@@ -466,7 +466,7 @@ Prueft ob IO auf diesem Device liegt.
</p><dl>
<dt><i>key</i></dt>
<dd>
IO-Name str() / IO-Bytenummer int()
IO-Name <class 'str'> / IO-Bytenummer <class 'int'>
</dd>
</dl><dl>
<dt>Returns:</dt>
@@ -493,7 +493,7 @@ Gibt Iterator aller IOs zurueck.
</p><dl>
<dt>Returns:</dt>
<dd>
iter() aller IOs
<class 'iter'> aller IOs
</dd>
</dl><a NAME="Device.__len__" ID="Device.__len__"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
@@ -504,7 +504,7 @@ Gibt Anzahl der Bytes zurueck, die dieses Device belegt.
</p><dl>
<dt>Returns:</dt>
<dd>
int()
<class 'int'>
</dd>
</dl><a NAME="Device.__str__" ID="Device.__str__"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
@@ -526,15 +526,15 @@ Erstellt aus der piCtory-Liste die IOs fuer dieses Device.
</p><dl>
<dt><i>dict_io</i></dt>
<dd>
dict()-Objekt aus piCtory Konfiguration
<class 'dict'>-Objekt aus piCtory Konfiguration
</dd><dt><i>iotype</i></dt>
<dd>
io.Type() Wert
<class 'Type'> Wert
</dd>
</dl><dl>
<dt>Returns:</dt>
<dd>
slice()-Objekt mit Start und Stop Position dieser IOs
<class 'slice'> mit Start und Stop Position dieser IOs
</dd>
</dl><a NAME="Device._devconfigure" ID="Device._devconfigure"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
@@ -562,7 +562,7 @@ Gibt eine Liste aller Inputs und Outputs zurueck, keine MEMs.
</p><dl>
<dt>Returns:</dt>
<dd>
list() Input und Output, keine MEMs
<class 'list'> Input und Output, keine MEMs
</dd>
</dl><a NAME="Device.get_inputs" ID="Device.get_inputs"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
@@ -573,7 +573,7 @@ Gibt eine Liste aller Inputs zurueck.
</p><dl>
<dt>Returns:</dt>
<dd>
list() Inputs
<class 'list'> Inputs
</dd>
</dl><a NAME="Device.get_memmories" ID="Device.get_memmories"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
@@ -584,7 +584,7 @@ Gibt eine Liste aller mems zurueck.
</p><dl>
<dt>Returns:</dt>
<dd>
list() Mems
<class 'list'> Mems
</dd>
</dl><a NAME="Device.get_outputs" ID="Device.get_outputs"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
@@ -595,7 +595,7 @@ Gibt eine Liste aller Outputs zurueck.
</p><dl>
<dt>Returns:</dt>
<dd>
list() Outputs
<class 'list'> Outputs
</dd>
</dl><a NAME="Device.readprocimg" ID="Device.readprocimg"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
@@ -711,7 +711,7 @@ Prueft ob Device existiert.
</p><dl>
<dt><i>key</i></dt>
<dd>
DeviceName str() / Positionsnummer int()
DeviceName <class 'str'> / Positionsnummer <class 'int'>
</dd>
</dl><dl>
<dt>Returns:</dt>
@@ -749,12 +749,12 @@ Gibt angegebenes Device zurueck.
</p><dl>
<dt><i>key</i></dt>
<dd>
DeviceName str() / Positionsnummer int()
DeviceName <class 'str'> / Positionsnummer <class 'int'>
</dd>
</dl><dl>
<dt>Returns:</dt>
<dd>
Gefundenes Device()-Objekt
Gefundenes <class 'Device'>-Objekt
</dd>
</dl><a NAME="DeviceList.__iter__" ID="DeviceList.__iter__"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
@@ -765,7 +765,7 @@ Gibt Iterator aller Devices zurueck.
</p><dl>
<dt>Returns:</dt>
<dd>
iter() aller Devices
<class 'iter'> aller Devices
</dd>
</dl><a NAME="DeviceList.__len__" ID="DeviceList.__len__"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
@@ -856,7 +856,7 @@ Gibt die Bytes aus, die dieses Device verwendet.
</p><dl>
<dt>Returns:</dt>
<dd>
bytes() des Devices
<class 'bytes'> des Devices
</dd>
</dl>
<div align="right"><a style="color:#0000FF" href="#top">Up</a></div>

View File

@@ -410,7 +410,7 @@ Gibt Zykluszeit zurueck.
</p><dl>
<dt>Returns:</dt>
<dd>
int() Zykluszeit in Millisekunden
<class 'int'> Zykluszeit in Millisekunden
</dd>
</dl><a NAME="ProcimgWriter.run" ID="ProcimgWriter.run"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
@@ -438,7 +438,7 @@ Setzt die Zykluszeit in Millisekunden.
</p><dl>
<dt><i>value</i></dt>
<dd>
int() Millisekunden
<class 'int'> Millisekunden
</dd>
</dl><a NAME="ProcimgWriter.stop" ID="ProcimgWriter.stop"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">

View File

@@ -28,10 +28,10 @@ Classes</h3>
<td>Basisklasse fuer direkten Zugriff auf IO Objekte.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#IntIO">IntIO</a></td>
<td>Klasse fuer den Zugriff auf die Daten mit Konvertierung in int().</td>
<td>Klasse fuer den Zugriff auf die Daten mit Konvertierung in int.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#StructIO">StructIO</a></td>
<td>Klasse fuer den Zugriff auf Daten ueber ein definierten struct().</td>
<td>Klasse fuer den Zugriff auf Daten ueber ein definierten struct.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#Type">Type</a></td>
<td>IO Typen.</td>
@@ -66,7 +66,7 @@ Methods</h3>
<table>
<tr>
<td><a style="color:#0000FF" href="#DeadIO.__init__">DeadIO</a></td>
<td>Instantiierung der DeadIO()-Klasse.</td>
<td>Instantiierung der DeadIO-Klasse.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#DeadIO.replace_io">replace_io</a></td>
<td>Stellt Funktion fuer weiter Bit-Ersetzungen bereit.</td>
@@ -82,7 +82,7 @@ Static Methods</h3>
DeadIO (Constructor)</h3>
<b>DeadIO</b>(<i>deadio</i>)
<p>
Instantiierung der DeadIO()-Klasse.
Instantiierung der DeadIO-Klasse.
</p><dl>
<dt><i>deadio</i></dt>
<dd>
@@ -108,12 +108,13 @@ Stellt Funktion fuer weiter Bit-Ersetzungen bereit.
Basisklasse fuer alle IO-Objekte.
</p><p>
Die Basisfunktionalitaet ermoeglicht das Lesen und Schreiben der Werte
als bytes() oder bool(). Dies entscheidet sich bei der Instantiierung.
Wenn eine Bittadresse angegeben wird, werden bool()-Werte erwartet
und zurueckgegeben, ansonsten bytes().
als <class bytes'> oder <class 'bool'>. Dies entscheidet sich bei der
Instantiierung.
Wenn eine Bittadresse angegeben wird, werden <class 'bool'>-Werte erwartet
und zurueckgegeben, ansonsten <class bytes'>.
</p><p>
Diese Klasse dient als Basis fuer andere IO-Klassen mit denen die Werte
auch als int() verwendet werden koennen.
auch als <class 'int'> verwendet werden koennen.
</p><p>
</p>
@@ -123,7 +124,7 @@ object
<h3 style="background-color:#FFFFFF;color:#FF0000">
Class Attributes</h3>
<table>
<tr><td>address</td></tr><tr><td>byteorder</td></tr><tr><td>length</td></tr><tr><td>name</td></tr><tr><td>type</td></tr><tr><td>value</td></tr>
<tr><td>address</td></tr><tr><td>byteorder</td></tr><tr><td>defaultvalue</td></tr><tr><td>length</td></tr><tr><td>name</td></tr><tr><td>type</td></tr><tr><td>value</td></tr>
</table>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Class Methods</h3>
@@ -135,13 +136,13 @@ Methods</h3>
<table>
<tr>
<td><a style="color:#0000FF" href="#IOBase.__init__">IOBase</a></td>
<td>Instantiierung der IOBase()-Klasse.</td>
<td>Instantiierung der IOBase-Klasse.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#IOBase.__bool__">__bool__</a></td>
<td>bool()-wert der Klasse.</td>
<td><class 'bool'>-Wert der Klasse.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#IOBase.__str__">__str__</a></td>
<td>str()-wert der Klasse.</td>
<td><class 'str'>-Wert der Klasse.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#IOBase._get_address">_get_address</a></td>
<td>Gibt die absolute Byteadresse im Prozessabbild zurueck.</td>
@@ -158,8 +159,11 @@ Methods</h3>
<td><a style="color:#0000FF" href="#IOBase._get_name">_get_name</a></td>
<td>Gibt den Namen des IOs zurueck.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#IOBase.get_defaultvalue">get_defaultvalue</a></td>
<td>Gibt die Defaultvalue von piCtory zurueck.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#IOBase.get_value">get_value</a></td>
<td>Gibt den Wert des IOs als bytes() oder bool() zurueck.</td>
<td>Gibt den Wert des IOs zurueck.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#IOBase.reg_event">reg_event</a></td>
<td>Registriert ein Event bei der Eventueberwachung.</td>
@@ -168,7 +172,7 @@ Methods</h3>
<td>Ersetzt bestehenden IO mit Neuem.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#IOBase.set_value">set_value</a></td>
<td>Setzt den Wert des IOs mit bytes() oder bool().</td>
<td>Setzt den Wert des IOs.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#IOBase.unreg_event">unreg_event</a></td>
<td>Entfernt ein Event aus der Eventueberwachung.</td>
@@ -187,7 +191,7 @@ Static Methods</h3>
IOBase (Constructor)</h3>
<b>IOBase</b>(<i>parentdevice, valuelist, iotype, byteorder, signed</i>)
<p>
Instantiierung der IOBase()-Klasse.
Instantiierung der IOBase-Klasse.
</p><dl>
<dt><i>parentdevice</i></dt>
<dd>
@@ -197,10 +201,10 @@ Parentdevice auf dem der IO liegt
Datenliste fuer Instantiierung
</dd><dt><i>iotype</i></dt>
<dd>
io.Type() Wert
<class 'Type'> Wert
</dd><dt><i>byteorder</i></dt>
<dd>
Byteorder 'little' / 'big' fuer int() Berechnung
Byteorder 'little'/'big' fuer <class 'int'> Berechnung
</dd><dt><i>sigend</i></dt>
<dd>
Intberechnung mit Vorzeichen durchfuehren
@@ -210,18 +214,18 @@ Intberechnung mit Vorzeichen durchfuehren
IOBase.__bool__</h3>
<b>__bool__</b>(<i></i>)
<p>
bool()-wert der Klasse.
<class 'bool'>-Wert der Klasse.
</p><dl>
<dt>Returns:</dt>
<dd>
IO-Wert als bool(). Nur False wenn False oder 0 sonst True
<class 'bool'> Nur False wenn False oder 0 sonst True
</dd>
</dl><a NAME="IOBase.__str__" ID="IOBase.__str__"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
IOBase.__str__</h3>
<b>__str__</b>(<i></i>)
<p>
str()-wert der Klasse.
<class 'str'>-Wert der Klasse.
</p><dl>
<dt>Returns:</dt>
<dd>
@@ -247,7 +251,7 @@ Gibt konfigurierte Byteorder zurueck.
</p><dl>
<dt>Returns:</dt>
<dd>
str() Byteorder
<class 'str'> Byteorder
</dd>
</dl><a NAME="IOBase._get_iotype" ID="IOBase._get_iotype"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
@@ -258,7 +262,7 @@ Gibt io.Type zurueck.
</p><dl>
<dt>Returns:</dt>
<dd>
int() io.Type
<class 'int'> io.Type
</dd>
</dl><a NAME="IOBase._get_length" ID="IOBase._get_length"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
@@ -282,16 +286,27 @@ Gibt den Namen des IOs zurueck.
<dd>
IO Name
</dd>
</dl><a NAME="IOBase.get_defaultvalue" ID="IOBase.get_defaultvalue"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
IOBase.get_defaultvalue</h3>
<b>get_defaultvalue</b>(<i></i>)
<p>
Gibt die Defaultvalue von piCtory zurueck.
</p><dl>
<dt>Returns:</dt>
<dd>
Defaultvalue als <class 'byte'> oder <class 'bool'>
</dd>
</dl><a NAME="IOBase.get_value" ID="IOBase.get_value"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
IOBase.get_value</h3>
<b>get_value</b>(<i></i>)
<p>
Gibt den Wert des IOs als bytes() oder bool() zurueck.
Gibt den Wert des IOs zurueck.
</p><dl>
<dt>Returns:</dt>
<dd>
IO-Wert
IO-Wert als <class 'bytes'> oder <class 'bool'>
</dd>
</dl><a NAME="IOBase.reg_event" ID="IOBase.reg_event"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
@@ -322,12 +337,12 @@ Ersetzt bestehenden IO mit Neuem.
Name des neuen Inputs
</dd><dt><i>frm</i></dt>
<dd>
struct() formatierung (1 Zeichen)
struct formatierung (1 Zeichen)
</dd><dt><i>kwargs</i></dt>
<dd>
Weitere Parameter:
- bmk: Bezeichnung fuer Input
- bit: Registriert Input als bool() am angegebenen Bit im Byte
- bit: Registriert IO als <class 'bool'> am angegebenen Bit im Byte
- byteorder: Byteorder fuer den Input, Standardwert=little
- defaultvalue: Standardwert fuer Input, Standard ist 0
- event: Funktion fuer Eventhandling registrieren
@@ -337,18 +352,18 @@ Weitere Parameter:
</dl><dl>
<dt><b>See Also:</b></dt>
<dd>
<a style="color:#0000FF" target="_blank" href="https://docs.python.org/3/library/struct.html#format-characters" >Python3 struct()</a>
<a style="color:#0000FF" target="_blank" href="https://docs.python.org/3/library/struct.html#format-characters" >Python3 struct</a>
</dd>
</dl><a NAME="IOBase.set_value" ID="IOBase.set_value"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
IOBase.set_value</h3>
<b>set_value</b>(<i>value</i>)
<p>
Setzt den Wert des IOs mit bytes() oder bool().
Setzt den Wert des IOs.
</p><dl>
<dt><i>value</i></dt>
<dd>
IO-Wert als bytes() oder bool()
IO-Wert als <class bytes'> oder <class 'bool'>
</dd>
</dl><a NAME="IOBase.unreg_event" ID="IOBase.unreg_event"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
@@ -376,15 +391,15 @@ Wartet auf Wertaenderung eines IOs.
</p><p>
Bei Wertaenderung, wird das Warten mit 0 als Rueckgabewert beendet.
</p><p>
HINWEIS: Wenn ProcimgWriter() keine neuen Daten liefert, wird
HINWEIS: Wenn <class 'ProcimgWriter'> keine neuen Daten liefert, wird
bis in die Ewigkeit gewartet (nicht bei Angabe von "timeout").
</p><p>
Wenn edge mit RISING oder FALLING angegeben wird muss diese Flanke
ausgeloest werden. Sollte der Wert 1 sein beim Eintritt mit Flanke
RISING, wird das Warten erst bei Aenderung von 0 auf 1 beendet.
</p><p>
Als exitevent kann ein threading.Event()-Objekt uebergeben werden,
welches das Warten bei is_set() sofort mit 1 als Rueckgabewert
Als exitevent kann ein <class 'threading.Event'>-Objekt uebergeben
werden, welches das Warten bei is_set() sofort mit 1 als Rueckgabewert
beendet.
</p><p>
Wenn der Wert okvalue an dem IO fuer das Warten anliegt, wird
@@ -400,7 +415,7 @@ Wartet auf Wertaenderung eines IOs.
Flanke RISING, FALLING, BOTH bei der mit True beendet wird
</dd><dt><i>exitevent</i></dt>
<dd>
thrading.Event() fuer vorzeitiges Beenden mit False
<class 'thrading.Event'> fuer vorzeitiges Beenden
</dd><dt><i>okvalue</i></dt>
<dd>
IO-Wert, bei dem das Warten sofort mit True beendet wird
@@ -411,7 +426,7 @@ Zeit in ms nach der mit False abgebrochen wird
</dl><dl>
<dt>Returns:</dt>
<dd>
int() erfolgreich Werte <= 0
<class 'int'> erfolgreich Werte <= 0
- Erfolgreich gewartet
Wert 0: IO hat den Wert gewechselt
Wert -1: okvalue stimmte mit IO ueberein
@@ -496,7 +511,7 @@ Prueft ob IO existiert.
</p><dl>
<dt><i>key</i></dt>
<dd>
IO-Name str() oder Byte int()
IO-Name <class 'str'> oder Byte <class 'int'>
</dd>
</dl><dl>
<dt>Returns:</dt>
@@ -608,12 +623,12 @@ Neues IO Objekt
<a NAME="IntIO" ID="IntIO"></a>
<h2 style="background-color:#FFFFFF;color:#0000FF">IntIO</h2>
<p>
Klasse fuer den Zugriff auf die Daten mit Konvertierung in int().
Klasse fuer den Zugriff auf die Daten mit Konvertierung in int.
</p><p>
Diese Klasse erweitert die Funktion von IOBase() um Funktionen,
ueber die mit int() Werten gearbeitet werden kann. Fuer die Umwandlung
koennen 'Byteorder' (Default 'little') und 'signed' (Default False) als
Parameter gesetzt werden.
Diese Klasse erweitert die Funktion von <class 'IOBase'> um Funktionen,
ueber die mit <class 'int'> Werten gearbeitet werden kann. Fuer die
Umwandlung koennen 'Byteorder' (Default 'little') und 'signed' (Default
False) als Parameter gesetzt werden.
</p><dl>
<dt><b>See Also:</b></dt>
<dd>
@@ -626,7 +641,7 @@ IOBase
<h3 style="background-color:#FFFFFF;color:#FF0000">
Class Attributes</h3>
<table>
<tr><td>byteorder</td></tr><tr><td>signed</td></tr><tr><td>value</td></tr>
<tr><td>byteorder</td></tr><tr><td>defaultvalue</td></tr><tr><td>signed</td></tr><tr><td>value</td></tr>
</table>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Class Methods</h3>
@@ -638,19 +653,22 @@ Methods</h3>
<table>
<tr>
<td><a style="color:#0000FF" href="#IntIO.__int__">__int__</a></td>
<td>Gibt IO als int() Wert zurueck mit Beachtung byteorder/signed.</td>
<td>Gibt IO-Wert zurueck mit Beachtung byteorder/signed.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#IntIO._get_signed">_get_signed</a></td>
<td>Ruft ab, ob der Wert Vorzeichenbehaftet behandelt werden soll.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#IntIO._set_byteorder">_set_byteorder</a></td>
<td>Setzt Byteorder fuer int() Umwandlung.</td>
<td>Setzt Byteorder fuer <class 'int'> Umwandlung.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#IntIO._set_signed">_set_signed</a></td>
<td>Left fest, ob der Wert Vorzeichenbehaftet behandelt werden soll.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#IntIO.get_int">get_int</a></td>
<td>Gibt IO als int() Wert zurueck mit Beachtung byteorder/signed.</td>
<td>Gibt IO-Wert zurueck mit Beachtung byteorder/signed.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#IntIO.get_intdefaultvalue">get_intdefaultvalue</a></td>
<td>Gibt die Defaultvalue als <class 'int'> zurueck.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#IntIO.set_int">set_int</a></td>
<td>Setzt IO mit Beachtung byteorder/signed.</td>
@@ -666,11 +684,11 @@ Static Methods</h3>
IntIO.__int__</h3>
<b>__int__</b>(<i></i>)
<p>
Gibt IO als int() Wert zurueck mit Beachtung byteorder/signed.
Gibt IO-Wert zurueck mit Beachtung byteorder/signed.
</p><dl>
<dt>Returns:</dt>
<dd>
int() ohne Vorzeichen
IO-Wert als <class 'int'>
</dd>
</dl><a NAME="IntIO._get_signed" ID="IntIO._get_signed"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
@@ -688,11 +706,11 @@ True, wenn Vorzeichenbehaftet
IntIO._set_byteorder</h3>
<b>_set_byteorder</b>(<i>value</i>)
<p>
Setzt Byteorder fuer int() Umwandlung.
Setzt Byteorder fuer <class 'int'> Umwandlung.
</p><dl>
<dt><i>value</i></dt>
<dd>
str() 'little' or 'big'
<class 'str'> 'little' or 'big'
</dd>
</dl><a NAME="IntIO._set_signed" ID="IntIO._set_signed"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
@@ -710,11 +728,22 @@ True, wenn mit Vorzeichen behandel
IntIO.get_int</h3>
<b>get_int</b>(<i></i>)
<p>
Gibt IO als int() Wert zurueck mit Beachtung byteorder/signed.
Gibt IO-Wert zurueck mit Beachtung byteorder/signed.
</p><dl>
<dt>Returns:</dt>
<dd>
int() Wert
IO-Wert als <class 'int'>
</dd>
</dl><a NAME="IntIO.get_intdefaultvalue" ID="IntIO.get_intdefaultvalue"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
IntIO.get_intdefaultvalue</h3>
<b>get_intdefaultvalue</b>(<i></i>)
<p>
Gibt die Defaultvalue als <class 'int'> zurueck.
</p><dl>
<dt>Returns:</dt>
<dd>
<class 'int'> Defaultvalue
</dd>
</dl><a NAME="IntIO.set_int" ID="IntIO.set_int"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
@@ -725,7 +754,7 @@ Setzt IO mit Beachtung byteorder/signed.
</p><dl>
<dt><i>value</i></dt>
<dd>
int()
<class 'int'> Wert
</dd>
</dl>
<div align="right"><a style="color:#0000FF" href="#top">Up</a></div>
@@ -733,10 +762,9 @@ int()
<a NAME="StructIO" ID="StructIO"></a>
<h2 style="background-color:#FFFFFF;color:#0000FF">StructIO</h2>
<p>
Klasse fuer den Zugriff auf Daten ueber ein definierten struct().
Klasse fuer den Zugriff auf Daten ueber ein definierten struct.
</p><p>
Diese Klasse ueberschreibt get_value() und set_value() der IOBase()
Klasse. Sie stellt ueber struct die Werte in der gewuenschten Formatierung
Sie stellt ueber struct die Werte in der gewuenschten Formatierung
bereit. Der struct-Formatwert wird bei der Instantiierung festgelegt.
</p><dl>
<dt><b>See Also:</b></dt>
@@ -750,7 +778,7 @@ IOBase
<h3 style="background-color:#FFFFFF;color:#FF0000">
Class Attributes</h3>
<table>
<tr><td>frm</td></tr><tr><td>signed</td></tr><tr><td>value</td></tr>
<tr><td>defaultvalue</td></tr><tr><td>frm</td></tr><tr><td>signed</td></tr><tr><td>value</td></tr>
</table>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Class Methods</h3>
@@ -765,11 +793,14 @@ Methods</h3>
<td>Erstellt einen IO mit struct-Formatierung.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#StructIO._get_frm">_get_frm</a></td>
<td>Ruft die struct() Formatierung ab.</td>
<td>Ruft die struct Formatierung ab.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#StructIO._get_signed">_get_signed</a></td>
<td>Ruft ab, ob der Wert Vorzeichenbehaftet behandelt werden soll.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#StructIO.get_structdefaultvalue">get_structdefaultvalue</a></td>
<td>Gibt die Defaultvalue mit struct Formatierung zurueck.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#StructIO.get_structvalue">get_structvalue</a></td>
<td>Gibt den Wert mit struct Formatierung zurueck.</td>
</tr><tr>
@@ -797,12 +828,12 @@ ParentIO Objekt, welches ersetzt wird
Name des neuen IO
</dd><dt><i>frm</i></dt>
<dd>
struct() formatierung (1 Zeichen)
struct formatierung (1 Zeichen)
</dd><dt><i>kwargs</i></dt>
<dd>
Weitere Parameter:
- bmk: Bezeichnung fuer Output
- bit: Registriert Outputs als bool() am angegebenen Bit im Byte
- bit: Registriert IO als <class 'bool'> am angegebenen Bit im Byte
- byteorder: Byteorder fuer den Input, Standardwert=little
- defaultvalue: Standardwert fuer Output, Standard ist 0
</dd>
@@ -811,11 +842,11 @@ Weitere Parameter:
StructIO._get_frm</h3>
<b>_get_frm</b>(<i></i>)
<p>
Ruft die struct() Formatierung ab.
Ruft die struct Formatierung ab.
</p><dl>
<dt>Returns:</dt>
<dd>
struct() Formatierung
struct Formatierung
</dd>
</dl><a NAME="StructIO._get_signed" ID="StructIO._get_signed"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
@@ -828,6 +859,17 @@ Ruft ab, ob der Wert Vorzeichenbehaftet behandelt werden soll.
<dd>
True, wenn Vorzeichenbehaftet
</dd>
</dl><a NAME="StructIO.get_structdefaultvalue" ID="StructIO.get_structdefaultvalue"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
StructIO.get_structdefaultvalue</h3>
<b>get_structdefaultvalue</b>(<i></i>)
<p>
Gibt die Defaultvalue mit struct Formatierung zurueck.
</p><dl>
<dt>Returns:</dt>
<dd>
Defaultvalue vom Typ der struct-Formatierung
</dd>
</dl><a NAME="StructIO.get_structvalue" ID="StructIO.get_structvalue"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
StructIO.get_structvalue</h3>

View File

@@ -126,7 +126,7 @@ Methods</h3>
<td>Beendet mainloop() und optional autorefresh.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiModIO.get_jconfigrsc">get_jconfigrsc</a></td>
<td>Laed die piCotry Konfiguration und erstellt ein dict().</td>
<td>Laed die piCotry Konfiguration und erstellt ein <class 'dict'>.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiModIO.handlesignalend">handlesignalend</a></td>
<td>Signalhandler fuer Programmende verwalten.</td>
@@ -158,19 +158,28 @@ Static Methods</h3>
<a NAME="RevPiModIO.__init__" ID="RevPiModIO.__init__"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiModIO (Constructor)</h3>
<b>RevPiModIO</b>(<i>**kwargs</i>)
<b>RevPiModIO</b>(<i>autorefresh=False, monitoring=False, syncoutputs=True, procimg=None, configrsc=None, simulator=False</i>)
<p>
Instantiiert die Grundfunktionen.
</p><dl>
<dt><i>kwargs</i></dt>
<dt><i>autorefresh</i></dt>
<dd>
Weitere Parameter:
- autorefresh: Wenn True, alle Devices zu autorefresh hinzufuegen
- configrsc: Pfad zur piCtory Konfigurationsdatei
- procimg: Pfad zum Prozessabbild
- monitoring: In- und Outputs werden gelesen, niemals geschrieben
- simulator: Laed das Modul als Simulator und vertauscht IOs
- syncoutputs: Aktuell gesetzte Outputs vom Prozessabbild einlesen
Wenn True, alle Devices zu autorefresh hinzufuegen
</dd><dt><i>monitoring</i></dt>
<dd>
In- und Outputs werden gelesen, niemals geschrieben
</dd><dt><i>syncoutputs</i></dt>
<dd>
Aktuell gesetzte Outputs vom Prozessabbild einlesen
</dd><dt><i>procimg</i></dt>
<dd>
Abweichender Pfad zum Prozessabbild
</dd><dt><i>configrsc</i></dt>
<dd>
Abweichender Pfad zur piCtory Konfigurationsdatei
</dd><dt><i>simulator</i></dt>
<dd>
Laed das Modul als Simulator und vertauscht IOs
</dd>
</dl><a NAME="RevPiModIO.__del__" ID="RevPiModIO.__del__"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
@@ -308,7 +317,7 @@ Setzt Aktualisierungsrate der Prozessabbild-Synchronisierung.
</p><dl>
<dt><i>milliseconds</i></dt>
<dd>
int() in Millisekunden
<class 'int'> in Millisekunden
</dd>
</dl><a NAME="RevPiModIO._set_maxioerrors" ID="RevPiModIO._set_maxioerrors"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
@@ -394,11 +403,11 @@ Entfernt auch alle Devices aus autorefresh
RevPiModIO.get_jconfigrsc</h3>
<b>get_jconfigrsc</b>(<i></i>)
<p>
Laed die piCotry Konfiguration und erstellt ein dict().
Laed die piCotry Konfiguration und erstellt ein <class 'dict'>.
</p><dl>
<dt>Returns:</dt>
<dd>
dict() der piCtory Konfiguration
<class 'dict'> der piCtory Konfiguration
</dd>
</dl><a NAME="RevPiModIO.handlesignalend" ID="RevPiModIO.handlesignalend"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
@@ -579,16 +588,16 @@ Static Methods</h3>
<a NAME="RevPiModIODriver.__init__" ID="RevPiModIODriver.__init__"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiModIODriver (Constructor)</h3>
<b>RevPiModIODriver</b>(<i>vdev, **kwargs</i>)
<b>RevPiModIODriver</b>(<i>virtdev, autorefresh=False, monitoring=False, syncoutputs=True, procimg=None, configrsc=None</i>)
<p>
Instantiiert die Grundfunktionen.
</p><p>
Parameter 'monitoring' und 'simulator' stehen hier nicht zur
Verfuegung, da diese automatisch gesetzt werden.
</p><dl>
<dt><i>vdev</i></dt>
<dt><i>virtdev</i></dt>
<dd>
Virtuelles Device fuer die Verwendung / oder list()
</dd><dt><i>kwargs</i></dt>
<dd>
Weitere Parameter (nicht monitoring und simulator)
Virtuelles Device oder mehrere als <class 'list'>
</dd>
</dl><dl>
<dt><b>See Also:</b></dt>
@@ -639,7 +648,7 @@ Static Methods</h3>
<a NAME="RevPiModIOSelected.__init__" ID="RevPiModIOSelected.__init__"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiModIOSelected (Constructor)</h3>
<b>RevPiModIOSelected</b>(<i>deviceselection, **kwargs</i>)
<b>RevPiModIOSelected</b>(<i>deviceselection, autorefresh=False, monitoring=False, syncoutputs=True, procimg=None, configrsc=None, simulator=False</i>)
<p>
Instantiiert nur fuer angegebene Devices die Grundfunktionen.
</p><p>
@@ -650,9 +659,6 @@ Instantiiert nur fuer angegebene Devices die Grundfunktionen.
<dt><i>deviceselection</i></dt>
<dd>
Positionsnummer oder Devicename
</dd><dt><i>kwargs</i></dt>
<dd>
Weitere Parameter
</dd>
</dl><dl>
<dt><b>See Also:</b></dt>

View File

@@ -74,6 +74,8 @@ revpimodio2.io.IOBase._get_length?5()
revpimodio2.io.IOBase._get_name?5()
revpimodio2.io.IOBase.address?7
revpimodio2.io.IOBase.byteorder?7
revpimodio2.io.IOBase.defaultvalue?7
revpimodio2.io.IOBase.get_defaultvalue?4()
revpimodio2.io.IOBase.get_value?4()
revpimodio2.io.IOBase.length?7
revpimodio2.io.IOBase.name?7
@@ -91,13 +93,17 @@ revpimodio2.io.IntIO._get_signed?5()
revpimodio2.io.IntIO._set_byteorder?5(value)
revpimodio2.io.IntIO._set_signed?5(value)
revpimodio2.io.IntIO.byteorder?7
revpimodio2.io.IntIO.defaultvalue?7
revpimodio2.io.IntIO.get_int?4()
revpimodio2.io.IntIO.get_intdefaultvalue?4()
revpimodio2.io.IntIO.set_int?4(value)
revpimodio2.io.IntIO.signed?7
revpimodio2.io.IntIO.value?7
revpimodio2.io.StructIO._get_frm?5()
revpimodio2.io.StructIO._get_signed?5()
revpimodio2.io.StructIO.defaultvalue?7
revpimodio2.io.StructIO.frm?7
revpimodio2.io.StructIO.get_structdefaultvalue?4()
revpimodio2.io.StructIO.get_structvalue?4()
revpimodio2.io.StructIO.set_structvalue?4(value)
revpimodio2.io.StructIO.signed?7
@@ -139,7 +145,7 @@ revpimodio2.modio.RevPiModIO.setdefaultvalues?4(device=None)
revpimodio2.modio.RevPiModIO.simulator?7
revpimodio2.modio.RevPiModIO.syncoutputs?4(device=None)
revpimodio2.modio.RevPiModIO.writeprocimg?4(device=None)
revpimodio2.modio.RevPiModIO?1(**kwargs)
revpimodio2.modio.RevPiModIODriver?1(vdev, **kwargs)
revpimodio2.modio.RevPiModIOSelected?1(deviceselection, **kwargs)
revpimodio2.modio.RevPiModIO?1(autorefresh=False, monitoring=False, syncoutputs=True, procimg=None, configrsc=None, simulator=False)
revpimodio2.modio.RevPiModIODriver?1(virtdev, autorefresh=False, monitoring=False, syncoutputs=True, procimg=None, configrsc=None)
revpimodio2.modio.RevPiModIOSelected?1(deviceselection, autorefresh=False, monitoring=False, syncoutputs=True, procimg=None, configrsc=None, simulator=False)
revpimodio2.summary.Summary?1(summary)

View File

@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE Project SYSTEM "Project-5.1.dtd">
<!-- eric project file for project revpimodio2 -->
<!-- Saved: 2017-08-21, 17:16:10 -->
<!-- Saved: 2017-08-26, 09:26:35 -->
<!-- Copyright (C) 2017 Sven Sager, akira@narux.de -->
<Project version="5.1">
<Language>en_US</Language>
@@ -9,10 +9,10 @@
<ProgLanguage mixed="0">Python3</ProgLanguage>
<ProjectType>Console</ProjectType>
<Description>Das Modul stellt alle Devices und IOs aus der piCtory Konfiguration in Python3 zur Verfügung. Es ermöglicht den direkten Zugriff auf die Werte über deren vergebenen Namen. Lese- und Schreibaktionen mit dem Prozessabbild werden von dem Modul selbst verwaltet, ohne dass sich der Programmierer um Offsets und Adressen kümmern muss. Für die Gatewaymodule wie ModbusTCP oder Profinet sind eigene 'Inputs' und 'Outputs' über einen bestimmten Adressbereich definierbar. Auf diese IOs kann mit Python3 über den Namen direkt auf die Werte zugegriffen werden.</Description>
<Version>2.0.0</Version>
<Version>2.0.1</Version>
<Author>Sven Sager</Author>
<Email>akira@narux.de</Email>
<Eol index="-1"/>
<Eol index="1"/>
<Sources>
<Source>setup.py</Source>
<Source>revpimodio2/modio.py</Source>
@@ -26,6 +26,9 @@
<Source>test/test_dio_mainloop.py</Source>
<Source>test/test_dio_cycleloop.py</Source>
<Source>test/test_net_leistung.py</Source>
<Source>revpimodio2/net.py</Source>
<Source>test/web_cycleloop.py</Source>
<Source>test/web_mainloop.py</Source>
</Sources>
<Forms/>
<Translations/>

View File

@@ -1,10 +1,10 @@
# -*- coding: utf-8 -*-
#
# python3-RevPiModIO
#
# Webpage: https://revpimodio.org/
# (c) Sven Sager, License: LGPLv3
#
# -*- coding: utf-8 -*-
"""Stellt alle Klassen fuer den RevolutionPi zur Verfuegung.
Stellt Klassen fuer die einfache Verwendung des Revolution Pis der
@@ -24,7 +24,7 @@ __all__ = ["RevPiModIO", "RevPiModIOSelected", "RevPiModIODriver"]
__author__ = "Sven Sager <akira@revpimodio.org>"
__name__ = "revpimodio2"
__package__ = "revpimodio2"
__version__ = "2.0.0"
__version__ = "2.0.1"
# Global package values
OFF = 0

View File

@@ -1,10 +1,10 @@
# -*- coding: utf-8 -*-
#
# python3-RevPiModIO
#
# Webpage: https://revpimodio.org/
# (c) Sven Sager, License: LGPLv3
#
# -*- coding: utf-8 -*-
"""Bildet die App Sektion von piCtory ab."""

View File

@@ -1,10 +1,10 @@
# -*- coding: utf-8 -*-
#
# python3-RevPiModIO
#
# Webpage: https://revpimodio.org/
# (c) Sven Sager, License: LGPLv3
#
# -*- coding: utf-8 -*-
"""Modul fuer die Verwaltung der Devices."""
from threading import Lock
from .helper import ProcimgWriter
@@ -20,7 +20,7 @@ class DeviceList(object):
def __contains__(self, key):
"""Prueft ob Device existiert.
@param key DeviceName str() / Positionsnummer int()
@param key DeviceName <class 'str'> / Positionsnummer <class 'int'>
@return True, wenn Device vorhanden"""
if type(key) == int:
return key in self.__dict_position
@@ -49,8 +49,8 @@ class DeviceList(object):
def __getitem__(self, key):
"""Gibt angegebenes Device zurueck.
@param key DeviceName str() / Positionsnummer int()
@return Gefundenes Device()-Objekt"""
@param key DeviceName <class 'str'> / Positionsnummer <class 'int'>
@return Gefundenes <class 'Device'>-Objekt"""
if type(key) == int:
if key not in self.__dict_position:
raise KeyError("no device on position {}".format(key))
@@ -60,7 +60,7 @@ class DeviceList(object):
def __iter__(self):
"""Gibt Iterator aller Devices zurueck.
@return iter() aller Devices"""
@return <class 'iter'> aller Devices"""
for dev in sorted(self.__dict_position):
yield self.__dict_position[dev]
@@ -91,10 +91,10 @@ class Device(object):
"""
def __init__(self, parentmodio, dict_device, simulator=False):
"""Instantiierung der Device()-Klasse.
"""Instantiierung der Device-Klasse.
@param parent RevpiModIO parent object
@param dict_device dict() fuer dieses Device aus piCotry Konfiguration
@param dict_device <class 'dict'> fuer dieses Device aus piCotry
@param simulator: Laed das Modul als Simulator und vertauscht IOs
"""
@@ -149,13 +149,13 @@ class Device(object):
self._devconfigure()
def __bytes__(self):
"""Gibt alle Daten des Devices als bytes() zurueck.
@return Devicedaten als bytes()"""
"""Gibt alle Daten des Devices als <class 'bytes'> zurueck.
@return Devicedaten als <class 'bytes'>"""
return bytes(self._ba_devdata)
def __contains__(self, key):
"""Prueft ob IO auf diesem Device liegt.
@param key IO-Name str() / IO-Bytenummer int()
@param key IO-Name <class 'str'> / IO-Bytenummer <class 'int'>
@return True, wenn device vorhanden"""
if type(key) == str:
return key in self._modio.io \
@@ -176,14 +176,14 @@ class Device(object):
def __iter__(self):
"""Gibt Iterator aller IOs zurueck.
@return iter() aller IOs"""
@return <class 'iter'> aller IOs"""
for lst_io in self._modio.io[self._slc_devoff]:
for io in lst_io:
yield io
def __len__(self):
"""Gibt Anzahl der Bytes zurueck, die dieses Device belegt.
@return int()"""
@return <class 'int'>"""
return self._length
def __str__(self):
@@ -194,9 +194,9 @@ class Device(object):
def _buildio(self, dict_io, iotype):
"""Erstellt aus der piCtory-Liste die IOs fuer dieses Device.
@param dict_io dict()-Objekt aus piCtory Konfiguration
@param iotype io.Type() Wert
@return slice()-Objekt mit Start und Stop Position dieser IOs
@param dict_io <class 'dict'>-Objekt aus piCtory Konfiguration
@param iotype <class 'Type'> Wert
@return <class 'slice'> mit Start und Stop Position dieser IOs
"""
if len(dict_io) <= 0:
@@ -281,7 +281,7 @@ class Device(object):
def get_allios(self):
"""Gibt eine Liste aller Inputs und Outputs zurueck, keine MEMs.
@return list() Input und Output, keine MEMs"""
@return <class 'list'> Input und Output, keine MEMs"""
lst_return = []
for lst_io in self._modio.io[
self._slc_inpoff.start:self._slc_outoff.stop]:
@@ -290,7 +290,7 @@ class Device(object):
def get_inputs(self):
"""Gibt eine Liste aller Inputs zurueck.
@return list() Inputs"""
@return <class 'list'> Inputs"""
lst_return = []
for lst_io in self._modio.io[self._slc_inpoff]:
lst_return += lst_io
@@ -298,7 +298,7 @@ class Device(object):
def get_outputs(self):
"""Gibt eine Liste aller Outputs zurueck.
@return list() Outputs"""
@return <class 'list'> Outputs"""
lst_return = []
for lst_io in self._modio.io[self._slc_outoff]:
lst_return += lst_io
@@ -306,7 +306,7 @@ class Device(object):
def get_memmories(self):
"""Gibt eine Liste aller mems zurueck.
@return list() Mems"""
@return <class 'list'> Mems"""
lst_return = []
for lst_io in self._modio.io[self._slc_memoff]:
lst_return += lst_io
@@ -376,6 +376,19 @@ class Core(Device):
self._ioerrorlimit1 = 6
self._ioerrorlimit2 = 7
if not self._modio._monitoring:
# Für RS485 errors defaults laden sollte procimg NULL sein
if self._ioerrorlimit1 is not None:
self.__lst_io[self._ioerrorlimit1].set_value(
self.__lst_io[self._ioerrorlimit1].defaultvalue
)
if self._ioerrorlimit2 is not None:
self.__lst_io[self._ioerrorlimit2].set_value(
self.__lst_io[self._ioerrorlimit2].defaultvalue
)
# RS485 errors schreiben
self._modio.writeprocimg(self)
def __errorlimit(self, io_id, errorlimit):
"""Verwaltet das Lesen und Schreiben der ErrorLimits.
@param io_id Index des IOs fuer ErrorLimit
@@ -392,12 +405,12 @@ class Core(Device):
))
else:
raise ValueError(
"errorlimit value int() must be between 0 and 65535"
"errorlimit value must be between 0 and 65535"
)
def _get_status(self):
"""Gibt den RevPi Core Status zurueck.
@return Status als int()"""
@return Status als <class 'int'>"""
return int.from_bytes(
self.__lst_io[0].get_value(), byteorder=self.__lst_io[0]._byteorder
)
@@ -433,7 +446,7 @@ class Core(Device):
length=1, byteorder=self.__lst_io[self._ioled]._byteorder
))
else:
raise ValueError("led status int() must be between 0 and 3")
raise ValueError("led status must be between 0 and 3")
def _set_leda2(self, value):
"""Setzt den Zustand der LED A2 vom core.
@@ -444,7 +457,7 @@ class Core(Device):
length=1, byteorder=self.__lst_io[self._ioled]._byteorder
))
else:
raise ValueError("led status int() must be between 0 and 3")
raise ValueError("led status must be between 0 and 3")
A1 = property(_get_leda1, _set_leda1)
A2 = property(_get_leda2, _set_leda2)
@@ -591,7 +604,7 @@ class Gateway(Device):
def get_rawbytes(self):
"""Gibt die Bytes aus, die dieses Device verwendet.
@return bytes() des Devices"""
@return <class 'bytes'> des Devices"""
return bytes(self._ba_devdata)
@@ -629,7 +642,7 @@ class Virtual(Gateway):
self._filelock.acquire()
for io in self.get_inputs():
self._ba_devdata[io._slc_address] = io.defaultvalue
self._ba_devdata[io._slc_address] = io._defaultvalue
# Outpus auf Bus schreiben
try:

View File

@@ -1,10 +1,10 @@
# -*- coding: utf-8 -*-
#
# python3-RevPiModIO
#
# Webpage: https://revpimodio.org/
# (c) Sven Sager, License: LGPLv3
#
# -*- coding: utf-8 -*-
"""RevPiModIO Helperklassen und Tools."""
import warnings
from threading import Event, Lock, Thread
@@ -263,7 +263,7 @@ class ProcimgWriter(Thread):
def get_refresh(self):
"""Gibt Zykluszeit zurueck.
@return int() Zykluszeit in Millisekunden"""
@return <class 'int'> Zykluszeit in Millisekunden"""
return int(self._refresh * 1000)
def run(self):
@@ -362,7 +362,7 @@ class ProcimgWriter(Thread):
def set_refresh(self, value):
"""Setzt die Zykluszeit in Millisekunden.
@param value int() Millisekunden"""
@param value <class 'int'> Millisekunden"""
if type(value) == int and 10 <= value <= 2000:
waitdiff = self._refresh - self._adjwait
self._refresh = value / 1000

View File

@@ -1,10 +1,10 @@
# -*- coding: utf-8 -*-
#
# python3-RevPiModIO
#
# Webpage: https://revpimodio.org/
# (c) Sven Sager, License: LGPLv3
#
# -*- coding: utf-8 -*-
"""RevPiModIO Modul fuer die Verwaltung der IOs."""
import struct
from threading import Event
@@ -31,7 +31,7 @@ class IOList(object):
def __contains__(self, key):
"""Prueft ob IO existiert.
@param key IO-Name str() oder Byte int()
@param key IO-Name <class 'str'> oder Byte <class 'int'>
@return True, wenn IO vorhanden / Byte belegt"""
if type(key) == int:
return key in self.__dict_iobyte \
@@ -87,7 +87,9 @@ class IOList(object):
elif type(key) == slice:
return [
self.__dict_iobyte[int_io]
for int_io in range(key.start, key.stop)
for int_io in range(
key.start, key.stop, 1 if key.step is None else key.step
)
]
else:
return getattr(self, key)
@@ -139,7 +141,7 @@ class IOList(object):
)
)
else:
# Bereits überschriebene bytes() sind ungültig
# Bereits überschriebene bytes sind ungültig
raise MemoryError(
"new io '{}' overlaps memory of '{}'".format(
io._name, oldio._name
@@ -189,7 +191,7 @@ class DeadIO(object):
"""Klasse, mit der ersetzte IOs verwaltet werden."""
def __init__(self, deadio):
"""Instantiierung der DeadIO()-Klasse.
"""Instantiierung der DeadIO-Klasse.
@param deadio IO, der ersetzt wurde"""
self.__deadio = deadio
@@ -204,22 +206,23 @@ class IOBase(object):
"""Basisklasse fuer alle IO-Objekte.
Die Basisfunktionalitaet ermoeglicht das Lesen und Schreiben der Werte
als bytes() oder bool(). Dies entscheidet sich bei der Instantiierung.
Wenn eine Bittadresse angegeben wird, werden bool()-Werte erwartet
und zurueckgegeben, ansonsten bytes().
als <class bytes'> oder <class 'bool'>. Dies entscheidet sich bei der
Instantiierung.
Wenn eine Bittadresse angegeben wird, werden <class 'bool'>-Werte erwartet
und zurueckgegeben, ansonsten <class bytes'>.
Diese Klasse dient als Basis fuer andere IO-Klassen mit denen die Werte
auch als int() verwendet werden koennen.
auch als <class 'int'> verwendet werden koennen.
"""
def __init__(self, parentdevice, valuelist, iotype, byteorder, signed):
"""Instantiierung der IOBase()-Klasse.
"""Instantiierung der IOBase-Klasse.
@param parentdevice Parentdevice auf dem der IO liegt
@param valuelist Datenliste fuer Instantiierung
@param iotype io.Type() Wert
@param byteorder Byteorder 'little' / 'big' fuer int() Berechnung
@param iotype <class 'Type'> Wert
@param byteorder Byteorder 'little'/'big' fuer <class 'int'> Berechnung
@param sigend Intberechnung mit Vorzeichen durchfuehren
"""
@@ -244,8 +247,8 @@ class IOBase(object):
int_startaddress, int_startaddress + self._length
)
# Defaultvalue aus Zahl in Bytes umrechnen
if str(valuelist[1]).isnumeric():
self.defaultvalue = int(valuelist[1]).to_bytes(
if str(valuelist[1]).isdigit():
self._defaultvalue = int(valuelist[1]).to_bytes(
self._length, byteorder=self._byteorder
)
else:
@@ -254,12 +257,13 @@ class IOBase(object):
if len(valuelist[1]) != self._length:
raise ValueError(
"given bytes for default value must have a length "
"of {}".format(self._length)
"of {} but {} was given"
"".format(self._length, len(valuelist[1]))
)
else:
self.defaultvalue = valuelist[1]
self._defaultvalue = valuelist[1]
else:
self.defaultvalue = bytes(self._length)
self._defaultvalue = bytes(self._length)
else:
# Höhere Bits als 7 auf nächste Bytes umbrechen
@@ -267,11 +271,11 @@ class IOBase(object):
self._slc_address = slice(
int_startaddress, int_startaddress + 1
)
self.defaultvalue = bool(int(valuelist[1]))
self._defaultvalue = bool(int(valuelist[1]))
def __bool__(self):
"""bool()-wert der Klasse.
@return IO-Wert als bool(). Nur False wenn False oder 0 sonst True"""
"""<class 'bool'>-Wert der Klasse.
@return <class 'bool'> Nur False wenn False oder 0 sonst True"""
if self._bitaddress >= 0:
int_byte = int.from_bytes(
self._parentdevice._ba_devdata[self._slc_address],
@@ -282,7 +286,7 @@ class IOBase(object):
return bool(self._parentdevice._ba_devdata[self._slc_address])
def __str__(self):
"""str()-wert der Klasse.
"""<class 'str'>-Wert der Klasse.
@return Namen des IOs"""
return self._name
@@ -293,12 +297,12 @@ class IOBase(object):
def _get_byteorder(self):
"""Gibt konfigurierte Byteorder zurueck.
@return str() Byteorder"""
@return <class 'str'> Byteorder"""
return self._byteorder
def _get_iotype(self):
"""Gibt io.Type zurueck.
@return int() io.Type"""
@return <class 'int'> io.Type"""
return self._iotype
def _get_length(self):
@@ -311,9 +315,14 @@ class IOBase(object):
@return IO Name"""
return self._name
def get_defaultvalue(self):
"""Gibt die Defaultvalue von piCtory zurueck.
@return Defaultvalue als <class 'byte'> oder <class 'bool'>"""
return self._defaultvalue
def get_value(self):
"""Gibt den Wert des IOs als bytes() oder bool() zurueck.
@return IO-Wert"""
"""Gibt den Wert des IOs zurueck.
@return IO-Wert als <class 'bytes'> oder <class 'bool'>"""
if self._bitaddress >= 0:
int_byte = int.from_bytes(
self._parentdevice._ba_devdata[self._slc_address],
@@ -376,10 +385,10 @@ class IOBase(object):
"""Ersetzt bestehenden IO mit Neuem.
@param name Name des neuen Inputs
@param frm struct() formatierung (1 Zeichen)
@param frm struct formatierung (1 Zeichen)
@param kwargs Weitere Parameter:
- bmk: Bezeichnung fuer Input
- bit: Registriert Input als bool() am angegebenen Bit im Byte
- bit: Registriert IO als <class 'bool'> am angegebenen Bit im Byte
- byteorder: Byteorder fuer den Input, Standardwert=little
- defaultvalue: Standardwert fuer Input, Standard ist 0
- event: Funktion fuer Eventhandling registrieren
@@ -387,7 +396,7 @@ class IOBase(object):
- edge: event-Ausfuehren bei RISING, FALLING or BOTH Wertaenderung
@see <a target="_blank"
href="https://docs.python.org/3/library/struct.html#format-characters"
>Python3 struct()</a>
>Python3 struct</a>
"""
if not issubclass(type(self._parentdevice), Gateway):
@@ -396,13 +405,15 @@ class IOBase(object):
"devices only"
)
# StructIO erzeugen und in IO-Liste einfügen
# StructIO erzeugen
io_new = StructIO(
self,
name,
frm,
**kwargs
)
# StructIO in IO-Liste einfügen
self._parentdevice._modio.io._private_register_new_io_object(io_new)
# Optional Event eintragen
@@ -415,8 +426,8 @@ class IOBase(object):
)
def set_value(self, value):
"""Setzt den Wert des IOs mit bytes() oder bool().
@param value IO-Wert als bytes() oder bool()"""
"""Setzt den Wert des IOs.
@param value IO-Wert als <class bytes'> oder <class 'bool'>"""
if self._iotype == Type.OUT:
if self._bitaddress >= 0:
# Versuchen egal welchen Typ in Bool zu konvertieren
@@ -506,15 +517,15 @@ class IOBase(object):
Bei Wertaenderung, wird das Warten mit 0 als Rueckgabewert beendet.
HINWEIS: Wenn ProcimgWriter() keine neuen Daten liefert, wird
HINWEIS: Wenn <class 'ProcimgWriter'> keine neuen Daten liefert, wird
bis in die Ewigkeit gewartet (nicht bei Angabe von "timeout").
Wenn edge mit RISING oder FALLING angegeben wird muss diese Flanke
ausgeloest werden. Sollte der Wert 1 sein beim Eintritt mit Flanke
RISING, wird das Warten erst bei Aenderung von 0 auf 1 beendet.
Als exitevent kann ein threading.Event()-Objekt uebergeben werden,
welches das Warten bei is_set() sofort mit 1 als Rueckgabewert
Als exitevent kann ein <class 'threading.Event'>-Objekt uebergeben
werden, welches das Warten bei is_set() sofort mit 1 als Rueckgabewert
beendet.
Wenn der Wert okvalue an dem IO fuer das Warten anliegt, wird
@@ -526,10 +537,10 @@ class IOBase(object):
angegeben Millisekunden! Es wird immer nach oben gerundet!)
@param edge Flanke RISING, FALLING, BOTH bei der mit True beendet wird
@param exitevent thrading.Event() fuer vorzeitiges Beenden mit False
@param exitevent <class 'thrading.Event'> fuer vorzeitiges Beenden
@param okvalue IO-Wert, bei dem das Warten sofort mit True beendet wird
@param timeout Zeit in ms nach der mit False abgebrochen wird
@return int() erfolgreich Werte <= 0
@return <class 'int'> erfolgreich Werte <= 0
- Erfolgreich gewartet
Wert 0: IO hat den Wert gewechselt
Wert -1: okvalue stimmte mit IO ueberein
@@ -600,6 +611,7 @@ class IOBase(object):
address = property(_get_address)
byteorder = property(_get_byteorder)
defaultvalue = property(get_defaultvalue)
length = property(_get_length)
name = property(_get_name)
type = property(_get_iotype)
@@ -608,19 +620,19 @@ class IOBase(object):
class IntIO(IOBase):
"""Klasse fuer den Zugriff auf die Daten mit Konvertierung in int().
"""Klasse fuer den Zugriff auf die Daten mit Konvertierung in int.
Diese Klasse erweitert die Funktion von IOBase() um Funktionen,
ueber die mit int() Werten gearbeitet werden kann. Fuer die Umwandlung
koennen 'Byteorder' (Default 'little') und 'signed' (Default False) als
Parameter gesetzt werden.
Diese Klasse erweitert die Funktion von <class 'IOBase'> um Funktionen,
ueber die mit <class 'int'> Werten gearbeitet werden kann. Fuer die
Umwandlung koennen 'Byteorder' (Default 'little') und 'signed' (Default
False) als Parameter gesetzt werden.
@see #IOBase IOBase
"""
def __int__(self):
"""Gibt IO als int() Wert zurueck mit Beachtung byteorder/signed.
@return int() ohne Vorzeichen"""
"""Gibt IO-Wert zurueck mit Beachtung byteorder/signed.
@return IO-Wert als <class 'int'>"""
return int.from_bytes(
self._parentdevice._ba_devdata[self._slc_address],
byteorder=self._byteorder,
@@ -633,11 +645,12 @@ class IntIO(IOBase):
return self._signed
def _set_byteorder(self, value):
"""Setzt Byteorder fuer int() Umwandlung.
@param value str() 'little' or 'big'"""
"""Setzt Byteorder fuer <class 'int'> Umwandlung.
@param value <class 'str'> 'little' or 'big'"""
if not (value == "little" or value == "big"):
raise ValueError("byteorder must be 'little' or 'big'")
self._byteorder = value
self._defaultvalue = self._defaultvalue[::-1]
def _set_signed(self, value):
"""Left fest, ob der Wert Vorzeichenbehaftet behandelt werden soll.
@@ -646,9 +659,16 @@ class IntIO(IOBase):
raise ValueError("signed must be <class 'bool'> True or False")
self._signed = value
def get_intdefaultvalue(self):
"""Gibt die Defaultvalue als <class 'int'> zurueck.
@return <class 'int'> Defaultvalue"""
return int.from_bytes(
self._defaultvalue, byteorder=self._byteorder, signed=self._signed
)
def get_int(self):
"""Gibt IO als int() Wert zurueck mit Beachtung byteorder/signed.
@return int() Wert"""
"""Gibt IO-Wert zurueck mit Beachtung byteorder/signed.
@return IO-Wert als <class 'int'>"""
return int.from_bytes(
self._parentdevice._ba_devdata[self._slc_address],
byteorder=self._byteorder,
@@ -657,7 +677,7 @@ class IntIO(IOBase):
def set_int(self, value):
"""Setzt IO mit Beachtung byteorder/signed.
@param value int()"""
@param value <class 'int'> Wert"""
if type(value) == int:
self.set_value(value.to_bytes(
self._length,
@@ -671,16 +691,16 @@ class IntIO(IOBase):
)
byteorder = property(IOBase._get_byteorder, _set_byteorder)
defaultvalue = property(get_intdefaultvalue)
signed = property(_get_signed, _set_signed)
value = property(get_int, set_int)
class StructIO(IOBase):
"""Klasse fuer den Zugriff auf Daten ueber ein definierten struct().
"""Klasse fuer den Zugriff auf Daten ueber ein definierten struct.
Diese Klasse ueberschreibt get_value() und set_value() der IOBase()
Klasse. Sie stellt ueber struct die Werte in der gewuenschten Formatierung
Sie stellt ueber struct die Werte in der gewuenschten Formatierung
bereit. Der struct-Formatwert wird bei der Instantiierung festgelegt.
@see #IOBase IOBase
@@ -691,10 +711,10 @@ class StructIO(IOBase):
@param parentio ParentIO Objekt, welches ersetzt wird
@param name Name des neuen IO
@param frm struct() formatierung (1 Zeichen)
@param frm struct formatierung (1 Zeichen)
@param kwargs Weitere Parameter:
- bmk: Bezeichnung fuer Output
- bit: Registriert Outputs als bool() am angegebenen Bit im Byte
- bit: Registriert IO als <class 'bool'> am angegebenen Bit im Byte
- byteorder: Byteorder fuer den Input, Standardwert=little
- defaultvalue: Standardwert fuer Output, Standard ist 0
@@ -709,7 +729,7 @@ class StructIO(IOBase):
bitaddress = "" if frm != "?" else str(kwargs.get("bit", 0))
if bitaddress == "" or (0 <= int(bitaddress) < 8):
bitlength = "1" if bitaddress.isnumeric() else \
bitlength = "1" if bitaddress.isdigit() else \
struct.calcsize(bofrm + frm) * 8
# [name,default,anzbits,adressbyte,export,adressid,bmk,bitaddress]
@@ -752,8 +772,8 @@ class StructIO(IOBase):
)
def _get_frm(self):
"""Ruft die struct() Formatierung ab.
@return struct() Formatierung"""
"""Ruft die struct Formatierung ab.
@return struct Formatierung"""
return self.__frm
def _get_signed(self):
@@ -761,6 +781,14 @@ class StructIO(IOBase):
@return True, wenn Vorzeichenbehaftet"""
return self._signed
def get_structdefaultvalue(self):
"""Gibt die Defaultvalue mit struct Formatierung zurueck.
@return Defaultvalue vom Typ der struct-Formatierung"""
if self._bitaddress >= 0:
return self._defaultvalue
else:
return struct.unpack(self.__frm, self._defaultvalue)[0]
def get_structvalue(self):
"""Gibt den Wert mit struct Formatierung zurueck.
@return Wert vom Typ der struct-Formatierung"""
@@ -777,6 +805,7 @@ class StructIO(IOBase):
else:
self.set_value(struct.pack(self.__frm, value))
defaultvalue = property(get_structdefaultvalue)
frm = property(_get_frm)
signed = property(_get_signed)
value = property(get_structvalue, set_structvalue)

View File

@@ -1,10 +1,10 @@
# -*- coding: utf-8 -*-
#
# python3-RevPiModIO
#
# Webpage: https://revpimodio.org/
# (c) Sven Sager, License: LGPLv3
#
# -*- coding: utf-8 -*-
"""RevPiModIO Hauptklasse."""
import warnings
from json import load as jload
@@ -33,24 +33,25 @@ class RevPiModIO(object):
"""
def __init__(self, **kwargs):
def __init__(
self, autorefresh=False, monitoring=False, syncoutputs=True,
procimg=None, configrsc=None, simulator=False):
"""Instantiiert die Grundfunktionen.
@param kwargs Weitere Parameter:
- autorefresh: Wenn True, alle Devices zu autorefresh hinzufuegen
- configrsc: Pfad zur piCtory Konfigurationsdatei
- procimg: Pfad zum Prozessabbild
- monitoring: In- und Outputs werden gelesen, niemals geschrieben
- simulator: Laed das Modul als Simulator und vertauscht IOs
- syncoutputs: Aktuell gesetzte Outputs vom Prozessabbild einlesen
@param autorefresh Wenn True, alle Devices zu autorefresh hinzufuegen
@param monitoring In- und Outputs werden gelesen, niemals geschrieben
@param syncoutputs Aktuell gesetzte Outputs vom Prozessabbild einlesen
@param procimg Abweichender Pfad zum Prozessabbild
@param configrsc Abweichender Pfad zur piCtory Konfigurationsdatei
@param simulator Laed das Modul als Simulator und vertauscht IOs
"""
self._autorefresh = kwargs.get("autorefresh", False)
self._configrsc = kwargs.get("configrsc", None)
self._monitoring = kwargs.get("monitoring", False)
self._procimg = kwargs.get("procimg", "/dev/piControl0")
self._simulator = kwargs.get("simulator", False)
self._syncoutputs = kwargs.get("syncoutputs", True)
self._autorefresh = autorefresh
self._configrsc = configrsc
self._monitoring = monitoring
self._procimg = "/dev/piControl0" if procimg is None else procimg
self._simulator = simulator
self._syncoutputs = syncoutputs
# TODO: bei simulator und procimg prüfen ob datei existiert / anlegen?
@@ -123,7 +124,7 @@ class RevPiModIO(object):
if _searchtype is None or dev["type"] == _searchtype:
if dev["name"] in self._lst_devselect:
lst_found.append(dev)
elif dev["position"].isnumeric() \
elif dev["position"].isdigit() \
and int(dev["position"]) in self._lst_devselect:
lst_found.append(dev)
@@ -151,14 +152,6 @@ class RevPiModIO(object):
self, device, simulator=self._simulator
)
self.core = dev_new
# Für RS485 errors defaults laden und schreiben
# NOTE: Soll das wirklich gemacht werden?
for io in dev_new.get_outputs():
io.set_value(io.defaultvalue)
if not self._monitoring:
self.writeprocimg(dev_new)
elif device["type"] == "LEFT_RIGHT":
# IOs
dev_new = devicemodule.Device(
@@ -287,7 +280,7 @@ class RevPiModIO(object):
def _set_cycletime(self, milliseconds):
"""Setzt Aktualisierungsrate der Prozessabbild-Synchronisierung.
@param milliseconds int() in Millisekunden"""
@param milliseconds <class 'int'> in Millisekunden"""
self._imgwriter.refresh = milliseconds
def _set_maxioerrors(self, value):
@@ -413,8 +406,8 @@ class RevPiModIO(object):
self._looprunning = False
def get_jconfigrsc(self):
"""Laed die piCotry Konfiguration und erstellt ein dict().
@return dict() der piCtory Konfiguration"""
"""Laed die piCotry Konfiguration und erstellt ein <class 'dict'>.
@return <class 'dict'> der piCtory Konfiguration"""
# piCtory Konfiguration prüfen
if self._configrsc is not None:
if not access(self._configrsc, F_OK | R_OK):
@@ -681,7 +674,7 @@ class RevPiModIO(object):
for dev in mylist:
for io in dev.get_outputs():
io.set_value(io.defaultvalue)
io.set_value(io._defaultvalue)
def syncoutputs(self, device=None):
"""Lesen aller aktuell gesetzten Outputs im Prozessabbild.
@@ -794,7 +787,9 @@ class RevPiModIOSelected(RevPiModIO):
"""
def __init__(self, deviceselection, **kwargs):
def __init__(
self, deviceselection, autorefresh=False, monitoring=False,
syncoutputs=True, procimg=None, configrsc=None, simulator=False):
"""Instantiiert nur fuer angegebene Devices die Grundfunktionen.
Der Parameter deviceselection kann eine einzelne
@@ -802,11 +797,12 @@ class RevPiModIOSelected(RevPiModIO):
mehreren Positionen / Namen
@param deviceselection Positionsnummer oder Devicename
@param kwargs Weitere Parameter
@see #RevPiModIO.__init__ RevPiModIO.__init__(...)
"""
super().__init__(**kwargs)
super().__init__(
autorefresh, monitoring, syncoutputs, procimg, configrsc, simulator
)
# Device liste erstellen
if type(deviceselection) == list:
@@ -818,7 +814,8 @@ class RevPiModIOSelected(RevPiModIO):
for vdev in self._lst_devselect:
if type(vdev) != int and type(vdev) != str:
raise ValueError(
"need device position as int() or device name as str()"
"need device position as <class 'int'> or device name as "
"<class 'str'>"
)
self._configure()
@@ -854,14 +851,19 @@ class RevPiModIODriver(RevPiModIOSelected):
"""
def __init__(self, vdev, **kwargs):
def __init__(
self, virtdev, autorefresh=False, monitoring=False,
syncoutputs=True, procimg=None, configrsc=None):
"""Instantiiert die Grundfunktionen.
@param vdev Virtuelles Device fuer die Verwendung / oder list()
@param kwargs Weitere Parameter (nicht monitoring und simulator)
Parameter 'monitoring' und 'simulator' stehen hier nicht zur
Verfuegung, da diese automatisch gesetzt werden.
@param virtdev Virtuelles Device oder mehrere als <class 'list'>
@see #RevPiModIO.__init__ RevPiModIO.__init__(...)
"""
kwargs["monitoring"] = False
kwargs["simulator"] = True
super().__init__(vdev, **kwargs)
# Parent mit monitoring=False und simulator=True laden
super().__init__(
virtdev, autorefresh, False, syncoutputs, procimg, configrsc, True
)

View File

@@ -1,10 +1,10 @@
# -*- coding: utf-8 -*-
#
# python3-RevPiModIO
#
# Webpage: https://revpimodio.org/
# (c) Sven Sager, License: LGPLv3
#
# -*- coding: utf-8 -*-
"""Bildet die Summary-Sektion von piCtory ab."""

View File

@@ -1,8 +1,8 @@
#! /usr/bin/env python3
# -*- coding: utf-8 -*-
#
# (c) Sven Sager, License: LGPLv3
#
# -*- coding: utf-8 -*-
"""Setupscript fuer python3-revpimodio."""
from distutils.core import setup
@@ -16,7 +16,7 @@ setup(
license="LGPLv3",
name="revpimodio2",
version="2.0.0",
version="2.0.1",
packages=["revpimodio2"],