mirror of
https://github.com/naruxde/revpimodio2.git
synced 2025-11-08 22:03:53 +01:00
Mit net zusammenführen
This commit is contained in:
@@ -86,6 +86,9 @@ Methods</h3>
|
|||||||
<td><a style="color:#0000FF" href="#RevPiModIO._get_configrsc">_get_configrsc</a></td>
|
<td><a style="color:#0000FF" href="#RevPiModIO._get_configrsc">_get_configrsc</a></td>
|
||||||
<td>Getter function.</td>
|
<td>Getter function.</td>
|
||||||
</tr><tr>
|
</tr><tr>
|
||||||
|
<td><a style="color:#0000FF" href="#RevPiModIO._get_cpreplaceio">_get_cpreplaceio</a></td>
|
||||||
|
<td>Laed die replace_io_file Konfiguration und verarbeitet sie.</td>
|
||||||
|
</tr><tr>
|
||||||
<td><a style="color:#0000FF" href="#RevPiModIO._get_cycletime">_get_cycletime</a></td>
|
<td><a style="color:#0000FF" href="#RevPiModIO._get_cycletime">_get_cycletime</a></td>
|
||||||
<td>Gibt Aktualisierungsrate in ms der Prozessabbildsynchronisierung aus.</td>
|
<td>Gibt Aktualisierungsrate in ms der Prozessabbildsynchronisierung aus.</td>
|
||||||
</tr><tr>
|
</tr><tr>
|
||||||
@@ -231,19 +234,27 @@ RevPiModIO._configure</h3>
|
|||||||
<b>_configure</b>(<i>jconfigrsc</i>)
|
<b>_configure</b>(<i>jconfigrsc</i>)
|
||||||
<p>
|
<p>
|
||||||
Verarbeitet die piCtory Konfigurationsdatei.
|
Verarbeitet die piCtory Konfigurationsdatei.
|
||||||
</p><a NAME="RevPiModIO._configure_replace_io" ID="RevPiModIO._configure_replace_io"></a>
|
</p><dl>
|
||||||
|
<dt><i>jconfigrsc:</i></dt>
|
||||||
|
<dd>
|
||||||
|
Data to build IOs as <class 'dict'> of JSON
|
||||||
|
</dd>
|
||||||
|
</dl><a NAME="RevPiModIO._configure_replace_io" ID="RevPiModIO._configure_replace_io"></a>
|
||||||
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||||
RevPiModIO._configure_replace_io</h3>
|
RevPiModIO._configure_replace_io</h3>
|
||||||
<b>_configure_replace_io</b>(<i></i>)
|
<b>_configure_replace_io</b>(<i>creplaceio</i>)
|
||||||
<p>
|
<p>
|
||||||
Importiert ersetzte IOs in diese Instanz.
|
Importiert ersetzte IOs in diese Instanz.
|
||||||
</p><p>
|
</p><p>
|
||||||
Importiert ersetzte IOs, welche vorher mit .export_replaced_ios(...)
|
Importiert ersetzte IOs, welche vorher mit .export_replaced_ios(...)
|
||||||
in eine Datei exportiert worden sind. Diese IOs werden in dieser
|
in eine Datei exportiert worden sind. Diese IOs werden in dieser
|
||||||
Instanz wiederhergestellt.
|
Instanz wiederhergestellt.
|
||||||
</p><p>
|
</p><dl>
|
||||||
|
<dt><i>ireplaceio:</i></dt>
|
||||||
</p><a NAME="RevPiModIO._create_myfh" ID="RevPiModIO._create_myfh"></a>
|
<dd>
|
||||||
|
Data to replace ios as <class 'ConfigParser'>
|
||||||
|
</dd>
|
||||||
|
</dl><a NAME="RevPiModIO._create_myfh" ID="RevPiModIO._create_myfh"></a>
|
||||||
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||||
RevPiModIO._create_myfh</h3>
|
RevPiModIO._create_myfh</h3>
|
||||||
<b>_create_myfh</b>(<i></i>)
|
<b>_create_myfh</b>(<i></i>)
|
||||||
@@ -261,6 +272,17 @@ Getter function.
|
|||||||
<dd>
|
<dd>
|
||||||
Pfad der verwendeten piCtory Konfiguration
|
Pfad der verwendeten piCtory Konfiguration
|
||||||
</dd>
|
</dd>
|
||||||
|
</dl><a NAME="RevPiModIO._get_cpreplaceio" ID="RevPiModIO._get_cpreplaceio"></a>
|
||||||
|
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||||
|
RevPiModIO._get_cpreplaceio</h3>
|
||||||
|
<b>_get_cpreplaceio</b>(<i></i>)
|
||||||
|
<p>
|
||||||
|
Laed die replace_io_file Konfiguration und verarbeitet sie.
|
||||||
|
</p><dl>
|
||||||
|
<dt>Returns:</dt>
|
||||||
|
<dd>
|
||||||
|
<class 'ConfigParser'> der replace io daten
|
||||||
|
</dd>
|
||||||
</dl><a NAME="RevPiModIO._get_cycletime" ID="RevPiModIO._get_cycletime"></a>
|
</dl><a NAME="RevPiModIO._get_cycletime" ID="RevPiModIO._get_cycletime"></a>
|
||||||
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||||
RevPiModIO._get_cycletime</h3>
|
RevPiModIO._get_cycletime</h3>
|
||||||
@@ -483,7 +505,7 @@ Entfernt auch alle Devices aus autorefresh
|
|||||||
</dl><a NAME="RevPiModIO.export_replaced_ios" ID="RevPiModIO.export_replaced_ios"></a>
|
</dl><a NAME="RevPiModIO.export_replaced_ios" ID="RevPiModIO.export_replaced_ios"></a>
|
||||||
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||||
RevPiModIO.export_replaced_ios</h3>
|
RevPiModIO.export_replaced_ios</h3>
|
||||||
<b>export_replaced_ios</b>(<i>filename</i>)
|
<b>export_replaced_ios</b>(<i>filename="replace_ios.conf"</i>)
|
||||||
<p>
|
<p>
|
||||||
Exportiert ersetzte IOs dieser Instanz.
|
Exportiert ersetzte IOs dieser Instanz.
|
||||||
</p><p>
|
</p><p>
|
||||||
|
|||||||
@@ -12,12 +12,18 @@ RevPiModIO Hauptklasse fuer Netzwerkzugriff.
|
|||||||
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||||
Global Attributes</h3>
|
Global Attributes</h3>
|
||||||
<table>
|
<table>
|
||||||
<tr><td>__author__</td></tr><tr><td>__copyright__</td></tr><tr><td>__license__</td></tr><tr><td>_sysdeldirty</td></tr><tr><td>_sysexit</td></tr><tr><td>_sysflush</td></tr><tr><td>_syspictory</td></tr><tr><td>_syssync</td></tr>
|
<tr><td>HASH_FAIL</td></tr><tr><td>__author__</td></tr><tr><td>__copyright__</td></tr><tr><td>__license__</td></tr><tr><td>_sysdeldirty</td></tr><tr><td>_sysexit</td></tr><tr><td>_sysflush</td></tr><tr><td>_syspictory</td></tr><tr><td>_syspictoryh</td></tr><tr><td>_sysreplaceio</td></tr><tr><td>_sysreplaceioh</td></tr><tr><td>_syssync</td></tr>
|
||||||
</table>
|
</table>
|
||||||
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||||
Classes</h3>
|
Classes</h3>
|
||||||
<table>
|
<table>
|
||||||
<tr>
|
<tr>
|
||||||
|
<td><a style="color:#0000FF" href="#AclException">AclException</a></td>
|
||||||
|
<td>Probleme mit Berechtigungen.</td>
|
||||||
|
</tr><tr>
|
||||||
|
<td><a style="color:#0000FF" href="#ConfigChanged">ConfigChanged</a></td>
|
||||||
|
<td>Aenderung der piCtory oder replace_ios Datei.</td>
|
||||||
|
</tr><tr>
|
||||||
<td><a style="color:#0000FF" href="#NetFH">NetFH</a></td>
|
<td><a style="color:#0000FF" href="#NetFH">NetFH</a></td>
|
||||||
<td>Netzwerk File Handler fuer das Prozessabbild.</td>
|
<td>Netzwerk File Handler fuer das Prozessabbild.</td>
|
||||||
</tr><tr>
|
</tr><tr>
|
||||||
@@ -37,6 +43,68 @@ Functions</h3>
|
|||||||
<tr><td>None</td></tr>
|
<tr><td>None</td></tr>
|
||||||
</table>
|
</table>
|
||||||
<hr /><hr />
|
<hr /><hr />
|
||||||
|
<a NAME="AclException" ID="AclException"></a>
|
||||||
|
<h2 style="background-color:#FFFFFF;color:#0000FF">AclException</h2>
|
||||||
|
<p>
|
||||||
|
Probleme mit Berechtigungen.
|
||||||
|
</p>
|
||||||
|
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||||
|
Derived from</h3>
|
||||||
|
Exception
|
||||||
|
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||||
|
Class Attributes</h3>
|
||||||
|
<table>
|
||||||
|
<tr><td>None</td></tr>
|
||||||
|
</table>
|
||||||
|
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||||
|
Class Methods</h3>
|
||||||
|
<table>
|
||||||
|
<tr><td>None</td></tr>
|
||||||
|
</table>
|
||||||
|
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||||
|
Methods</h3>
|
||||||
|
<table>
|
||||||
|
<tr><td>None</td></tr>
|
||||||
|
</table>
|
||||||
|
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||||
|
Static Methods</h3>
|
||||||
|
<table>
|
||||||
|
<tr><td>None</td></tr>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
<div align="right"><a style="color:#0000FF" href="#top">Up</a></div>
|
||||||
|
<hr /><hr />
|
||||||
|
<a NAME="ConfigChanged" ID="ConfigChanged"></a>
|
||||||
|
<h2 style="background-color:#FFFFFF;color:#0000FF">ConfigChanged</h2>
|
||||||
|
<p>
|
||||||
|
Aenderung der piCtory oder replace_ios Datei.
|
||||||
|
</p>
|
||||||
|
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||||
|
Derived from</h3>
|
||||||
|
Exception
|
||||||
|
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||||
|
Class Attributes</h3>
|
||||||
|
<table>
|
||||||
|
<tr><td>None</td></tr>
|
||||||
|
</table>
|
||||||
|
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||||
|
Class Methods</h3>
|
||||||
|
<table>
|
||||||
|
<tr><td>None</td></tr>
|
||||||
|
</table>
|
||||||
|
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||||
|
Methods</h3>
|
||||||
|
<table>
|
||||||
|
<tr><td>None</td></tr>
|
||||||
|
</table>
|
||||||
|
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||||
|
Static Methods</h3>
|
||||||
|
<table>
|
||||||
|
<tr><td>None</td></tr>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
<div align="right"><a style="color:#0000FF" href="#top">Up</a></div>
|
||||||
|
<hr /><hr />
|
||||||
<a NAME="NetFH" ID="NetFH"></a>
|
<a NAME="NetFH" ID="NetFH"></a>
|
||||||
<h2 style="background-color:#FFFFFF;color:#0000FF">NetFH</h2>
|
<h2 style="background-color:#FFFFFF;color:#0000FF">NetFH</h2>
|
||||||
<p>
|
<p>
|
||||||
@@ -54,7 +122,7 @@ Thread
|
|||||||
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||||
Class Attributes</h3>
|
Class Attributes</h3>
|
||||||
<table>
|
<table>
|
||||||
<tr><td>__slots__</td></tr><tr><td>closed</td></tr><tr><td>name</td></tr><tr><td>timeout</td></tr>
|
<tr><td>__slots__</td></tr><tr><td>closed</td></tr><tr><td>config_changed</td></tr><tr><td>name</td></tr><tr><td>reconnecting</td></tr><tr><td>timeout</td></tr>
|
||||||
</table>
|
</table>
|
||||||
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||||
Class Methods</h3>
|
Class Methods</h3>
|
||||||
@@ -95,9 +163,15 @@ Methods</h3>
|
|||||||
<td><a style="color:#0000FF" href="#NetFH.get_closed">get_closed</a></td>
|
<td><a style="color:#0000FF" href="#NetFH.get_closed">get_closed</a></td>
|
||||||
<td>Pruefen ob Verbindung geschlossen ist.</td>
|
<td>Pruefen ob Verbindung geschlossen ist.</td>
|
||||||
</tr><tr>
|
</tr><tr>
|
||||||
|
<td><a style="color:#0000FF" href="#NetFH.get_config_changed">get_config_changed</a></td>
|
||||||
|
<td>Pruefen ob RevPi Konfiguration geaendert wurde.</td>
|
||||||
|
</tr><tr>
|
||||||
<td><a style="color:#0000FF" href="#NetFH.get_name">get_name</a></td>
|
<td><a style="color:#0000FF" href="#NetFH.get_name">get_name</a></td>
|
||||||
<td>Verbindugnsnamen zurueckgeben.</td>
|
<td>Verbindugnsnamen zurueckgeben.</td>
|
||||||
</tr><tr>
|
</tr><tr>
|
||||||
|
<td><a style="color:#0000FF" href="#NetFH.get_reconnecting">get_reconnecting</a></td>
|
||||||
|
<td>Interner reconnect aktiv wegen Netzwerkfehlern.</td>
|
||||||
|
</tr><tr>
|
||||||
<td><a style="color:#0000FF" href="#NetFH.get_timeout">get_timeout</a></td>
|
<td><a style="color:#0000FF" href="#NetFH.get_timeout">get_timeout</a></td>
|
||||||
<td>Gibt aktuellen Timeout zurueck.</td>
|
<td>Gibt aktuellen Timeout zurueck.</td>
|
||||||
</tr><tr>
|
</tr><tr>
|
||||||
@@ -110,6 +184,9 @@ Methods</h3>
|
|||||||
<td><a style="color:#0000FF" href="#NetFH.readpictory">readpictory</a></td>
|
<td><a style="color:#0000FF" href="#NetFH.readpictory">readpictory</a></td>
|
||||||
<td>Ruft die piCtory Konfiguration ab.</td>
|
<td>Ruft die piCtory Konfiguration ab.</td>
|
||||||
</tr><tr>
|
</tr><tr>
|
||||||
|
<td><a style="color:#0000FF" href="#NetFH.readreplaceio">readreplaceio</a></td>
|
||||||
|
<td>Ruft die replace_io Konfiguration ab.</td>
|
||||||
|
</tr><tr>
|
||||||
<td><a style="color:#0000FF" href="#NetFH.run">run</a></td>
|
<td><a style="color:#0000FF" href="#NetFH.run">run</a></td>
|
||||||
<td>Handler fuer Synchronisierung.</td>
|
<td>Handler fuer Synchronisierung.</td>
|
||||||
</tr><tr>
|
</tr><tr>
|
||||||
@@ -137,13 +214,16 @@ Static Methods</h3>
|
|||||||
<a NAME="NetFH.__init__" ID="NetFH.__init__"></a>
|
<a NAME="NetFH.__init__" ID="NetFH.__init__"></a>
|
||||||
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||||
NetFH (Constructor)</h3>
|
NetFH (Constructor)</h3>
|
||||||
<b>NetFH</b>(<i>address, timeout=500</i>)
|
<b>NetFH</b>(<i>address, check_replace_ios, timeout=500</i>)
|
||||||
<p>
|
<p>
|
||||||
Init NetFH-class.
|
Init NetFH-class.
|
||||||
</p><dl>
|
</p><dl>
|
||||||
<dt><i>address</i></dt>
|
<dt><i>address</i></dt>
|
||||||
<dd>
|
<dd>
|
||||||
IP Adresse, Port des RevPi als <class 'tuple'>
|
IP Adresse, Port des RevPi als <class 'tuple'>
|
||||||
|
</dd><dt><i>check_replace_ios</i></dt>
|
||||||
|
<dd>
|
||||||
|
Prueft auf Veraenderungen der Datei
|
||||||
</dd><dt><i>timeout</i></dt>
|
</dd><dt><i>timeout</i></dt>
|
||||||
<dd>
|
<dd>
|
||||||
Timeout in Millisekunden der Verbindung
|
Timeout in Millisekunden der Verbindung
|
||||||
@@ -230,6 +310,17 @@ Pruefen ob Verbindung geschlossen ist.
|
|||||||
<dd>
|
<dd>
|
||||||
True, wenn Verbindung geschlossen ist
|
True, wenn Verbindung geschlossen ist
|
||||||
</dd>
|
</dd>
|
||||||
|
</dl><a NAME="NetFH.get_config_changed" ID="NetFH.get_config_changed"></a>
|
||||||
|
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||||
|
NetFH.get_config_changed</h3>
|
||||||
|
<b>get_config_changed</b>(<i></i>)
|
||||||
|
<p>
|
||||||
|
Pruefen ob RevPi Konfiguration geaendert wurde.
|
||||||
|
</p><dl>
|
||||||
|
<dt>Returns:</dt>
|
||||||
|
<dd>
|
||||||
|
True, wenn RevPi Konfiguration geaendert ist
|
||||||
|
</dd>
|
||||||
</dl><a NAME="NetFH.get_name" ID="NetFH.get_name"></a>
|
</dl><a NAME="NetFH.get_name" ID="NetFH.get_name"></a>
|
||||||
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||||
NetFH.get_name</h3>
|
NetFH.get_name</h3>
|
||||||
@@ -241,6 +332,17 @@ Verbindugnsnamen zurueckgeben.
|
|||||||
<dd>
|
<dd>
|
||||||
<class 'str'> IP:PORT
|
<class 'str'> IP:PORT
|
||||||
</dd>
|
</dd>
|
||||||
|
</dl><a NAME="NetFH.get_reconnecting" ID="NetFH.get_reconnecting"></a>
|
||||||
|
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||||
|
NetFH.get_reconnecting</h3>
|
||||||
|
<b>get_reconnecting</b>(<i></i>)
|
||||||
|
<p>
|
||||||
|
Interner reconnect aktiv wegen Netzwerkfehlern.
|
||||||
|
</p><dl>
|
||||||
|
<dt>Returns:</dt>
|
||||||
|
<dd>
|
||||||
|
True, wenn reconnect aktiv
|
||||||
|
</dd>
|
||||||
</dl><a NAME="NetFH.get_timeout" ID="NetFH.get_timeout"></a>
|
</dl><a NAME="NetFH.get_timeout" ID="NetFH.get_timeout"></a>
|
||||||
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||||
NetFH.get_timeout</h3>
|
NetFH.get_timeout</h3>
|
||||||
@@ -293,6 +395,17 @@ Ruft die piCtory Konfiguration ab.
|
|||||||
<dd>
|
<dd>
|
||||||
<class 'bytes'> piCtory Datei
|
<class 'bytes'> piCtory Datei
|
||||||
</dd>
|
</dd>
|
||||||
|
</dl><a NAME="NetFH.readreplaceio" ID="NetFH.readreplaceio"></a>
|
||||||
|
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||||
|
NetFH.readreplaceio</h3>
|
||||||
|
<b>readreplaceio</b>(<i></i>)
|
||||||
|
<p>
|
||||||
|
Ruft die replace_io Konfiguration ab.
|
||||||
|
</p><dl>
|
||||||
|
<dt>Returns:</dt>
|
||||||
|
<dd>
|
||||||
|
<class 'bytes'> replace_io_file
|
||||||
|
</dd>
|
||||||
</dl><a NAME="NetFH.run" ID="NetFH.run"></a>
|
</dl><a NAME="NetFH.run" ID="NetFH.run"></a>
|
||||||
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||||
NetFH.run</h3>
|
NetFH.run</h3>
|
||||||
@@ -385,7 +498,7 @@ _RevPiModIO
|
|||||||
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||||
Class Attributes</h3>
|
Class Attributes</h3>
|
||||||
<table>
|
<table>
|
||||||
<tr><td>__slots__</td></tr>
|
<tr><td>__slots__</td></tr><tr><td>config_changed</td></tr><tr><td>reconnecting</td></tr>
|
||||||
</table>
|
</table>
|
||||||
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||||
Class Methods</h3>
|
Class Methods</h3>
|
||||||
@@ -402,12 +515,24 @@ Methods</h3>
|
|||||||
<td><a style="color:#0000FF" href="#RevPiNetIO._create_myfh">_create_myfh</a></td>
|
<td><a style="color:#0000FF" href="#RevPiNetIO._create_myfh">_create_myfh</a></td>
|
||||||
<td>Erstellt NetworkFileObject.</td>
|
<td>Erstellt NetworkFileObject.</td>
|
||||||
</tr><tr>
|
</tr><tr>
|
||||||
|
<td><a style="color:#0000FF" href="#RevPiNetIO._get_cpreplaceio">_get_cpreplaceio</a></td>
|
||||||
|
<td>Laed die replace_io Konfiguration ueber das Netzwerk.</td>
|
||||||
|
</tr><tr>
|
||||||
<td><a style="color:#0000FF" href="#RevPiNetIO.disconnect">disconnect</a></td>
|
<td><a style="color:#0000FF" href="#RevPiNetIO.disconnect">disconnect</a></td>
|
||||||
<td>Trennt Verbindungen und beendet autorefresh inkl.</td>
|
<td>Trennt Verbindungen und beendet autorefresh inkl.</td>
|
||||||
</tr><tr>
|
</tr><tr>
|
||||||
|
<td><a style="color:#0000FF" href="#RevPiNetIO.exit">exit</a></td>
|
||||||
|
<td>Beendet mainloop() und optional autorefresh.</td>
|
||||||
|
</tr><tr>
|
||||||
|
<td><a style="color:#0000FF" href="#RevPiNetIO.get_config_changed">get_config_changed</a></td>
|
||||||
|
<td>Pruefen ob RevPi Konfiguration geaendert wurde.</td>
|
||||||
|
</tr><tr>
|
||||||
<td><a style="color:#0000FF" href="#RevPiNetIO.get_jconfigrsc">get_jconfigrsc</a></td>
|
<td><a style="color:#0000FF" href="#RevPiNetIO.get_jconfigrsc">get_jconfigrsc</a></td>
|
||||||
<td>Laedt die piCotry Konfiguration und erstellt ein <class 'dict'>.</td>
|
<td>Laedt die piCotry Konfiguration und erstellt ein <class 'dict'>.</td>
|
||||||
</tr><tr>
|
</tr><tr>
|
||||||
|
<td><a style="color:#0000FF" href="#RevPiNetIO.get_reconnecting">get_reconnecting</a></td>
|
||||||
|
<td>Interner reconnect aktiv wegen Netzwerkfehlern.</td>
|
||||||
|
</tr><tr>
|
||||||
<td><a style="color:#0000FF" href="#RevPiNetIO.net_cleardefaultvalues">net_cleardefaultvalues</a></td>
|
<td><a style="color:#0000FF" href="#RevPiNetIO.net_cleardefaultvalues">net_cleardefaultvalues</a></td>
|
||||||
<td>Loescht Defaultwerte vom PLC Slave.</td>
|
<td>Loescht Defaultwerte vom PLC Slave.</td>
|
||||||
</tr><tr>
|
</tr><tr>
|
||||||
@@ -459,13 +584,49 @@ RevPiNetIO._create_myfh</h3>
|
|||||||
<p>
|
<p>
|
||||||
Erstellt NetworkFileObject.
|
Erstellt NetworkFileObject.
|
||||||
return FileObject
|
return FileObject
|
||||||
</p><a NAME="RevPiNetIO.disconnect" ID="RevPiNetIO.disconnect"></a>
|
</p><a NAME="RevPiNetIO._get_cpreplaceio" ID="RevPiNetIO._get_cpreplaceio"></a>
|
||||||
|
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||||
|
RevPiNetIO._get_cpreplaceio</h3>
|
||||||
|
<b>_get_cpreplaceio</b>(<i></i>)
|
||||||
|
<p>
|
||||||
|
Laed die replace_io Konfiguration ueber das Netzwerk.
|
||||||
|
</p><dl>
|
||||||
|
<dt>Returns:</dt>
|
||||||
|
<dd>
|
||||||
|
<class 'ConfigParser'> der replace io daten
|
||||||
|
</dd>
|
||||||
|
</dl><a NAME="RevPiNetIO.disconnect" ID="RevPiNetIO.disconnect"></a>
|
||||||
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||||
RevPiNetIO.disconnect</h3>
|
RevPiNetIO.disconnect</h3>
|
||||||
<b>disconnect</b>(<i></i>)
|
<b>disconnect</b>(<i></i>)
|
||||||
<p>
|
<p>
|
||||||
Trennt Verbindungen und beendet autorefresh inkl. alle Threads.
|
Trennt Verbindungen und beendet autorefresh inkl. alle Threads.
|
||||||
</p><a NAME="RevPiNetIO.get_jconfigrsc" ID="RevPiNetIO.get_jconfigrsc"></a>
|
</p><a NAME="RevPiNetIO.exit" ID="RevPiNetIO.exit"></a>
|
||||||
|
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||||
|
RevPiNetIO.exit</h3>
|
||||||
|
<b>exit</b>(<i>full=True</i>)
|
||||||
|
<p>
|
||||||
|
Beendet mainloop() und optional autorefresh.
|
||||||
|
</p><dl>
|
||||||
|
<dt><b>See Also:</b></dt>
|
||||||
|
<dd>
|
||||||
|
<a style="color:#0000FF" href="#RevPiModIO.exit(...)">#RevPiModIO.exit(...)</a>
|
||||||
|
</dd>
|
||||||
|
</dl><a NAME="RevPiNetIO.get_config_changed" ID="RevPiNetIO.get_config_changed"></a>
|
||||||
|
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||||
|
RevPiNetIO.get_config_changed</h3>
|
||||||
|
<b>get_config_changed</b>(<i></i>)
|
||||||
|
<p>
|
||||||
|
Pruefen ob RevPi Konfiguration geaendert wurde.
|
||||||
|
</p><p>
|
||||||
|
In diesem Fall ist die Verbindung geschlossen und RevPiNetIO muss
|
||||||
|
neu instanziert werden.
|
||||||
|
</p><dl>
|
||||||
|
<dt>Returns:</dt>
|
||||||
|
<dd>
|
||||||
|
True, wenn RevPi Konfiguration geaendert ist
|
||||||
|
</dd>
|
||||||
|
</dl><a NAME="RevPiNetIO.get_jconfigrsc" ID="RevPiNetIO.get_jconfigrsc"></a>
|
||||||
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||||
RevPiNetIO.get_jconfigrsc</h3>
|
RevPiNetIO.get_jconfigrsc</h3>
|
||||||
<b>get_jconfigrsc</b>(<i></i>)
|
<b>get_jconfigrsc</b>(<i></i>)
|
||||||
@@ -476,6 +637,20 @@ Laedt die piCotry Konfiguration und erstellt ein <class 'dict'>.
|
|||||||
<dd>
|
<dd>
|
||||||
<class 'dict'> der piCtory Konfiguration
|
<class 'dict'> der piCtory Konfiguration
|
||||||
</dd>
|
</dd>
|
||||||
|
</dl><a NAME="RevPiNetIO.get_reconnecting" ID="RevPiNetIO.get_reconnecting"></a>
|
||||||
|
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||||
|
RevPiNetIO.get_reconnecting</h3>
|
||||||
|
<b>get_reconnecting</b>(<i></i>)
|
||||||
|
<p>
|
||||||
|
Interner reconnect aktiv wegen Netzwerkfehlern.
|
||||||
|
</p><p>
|
||||||
|
Das Modul versucht intern die Verbindung neu herzustellen. Es ist
|
||||||
|
kein weiteres Zutun noetig.
|
||||||
|
</p><dl>
|
||||||
|
<dt>Returns:</dt>
|
||||||
|
<dd>
|
||||||
|
True, wenn reconnect aktiv
|
||||||
|
</dd>
|
||||||
</dl><a NAME="RevPiNetIO.net_cleardefaultvalues" ID="RevPiNetIO.net_cleardefaultvalues"></a>
|
</dl><a NAME="RevPiNetIO.net_cleardefaultvalues" ID="RevPiNetIO.net_cleardefaultvalues"></a>
|
||||||
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||||
RevPiNetIO.net_cleardefaultvalues</h3>
|
RevPiNetIO.net_cleardefaultvalues</h3>
|
||||||
|
|||||||
@@ -142,9 +142,10 @@ revpimodio2.io.StructIO.signed?7
|
|||||||
revpimodio2.io.StructIO.value?7
|
revpimodio2.io.StructIO.value?7
|
||||||
revpimodio2.io.StructIO?1(parentio, name, frm, **kwargs)
|
revpimodio2.io.StructIO?1(parentio, name, frm, **kwargs)
|
||||||
revpimodio2.modio.RevPiModIO._configure?5(jconfigrsc)
|
revpimodio2.modio.RevPiModIO._configure?5(jconfigrsc)
|
||||||
revpimodio2.modio.RevPiModIO._configure_replace_io?5()
|
revpimodio2.modio.RevPiModIO._configure_replace_io?5(creplaceio)
|
||||||
revpimodio2.modio.RevPiModIO._create_myfh?5()
|
revpimodio2.modio.RevPiModIO._create_myfh?5()
|
||||||
revpimodio2.modio.RevPiModIO._get_configrsc?5()
|
revpimodio2.modio.RevPiModIO._get_configrsc?5()
|
||||||
|
revpimodio2.modio.RevPiModIO._get_cpreplaceio?5()
|
||||||
revpimodio2.modio.RevPiModIO._get_cycletime?5()
|
revpimodio2.modio.RevPiModIO._get_cycletime?5()
|
||||||
revpimodio2.modio.RevPiModIO._get_debug?5()
|
revpimodio2.modio.RevPiModIO._get_debug?5()
|
||||||
revpimodio2.modio.RevPiModIO._get_ioerrors?5()
|
revpimodio2.modio.RevPiModIO._get_ioerrors?5()
|
||||||
@@ -165,7 +166,7 @@ revpimodio2.modio.RevPiModIO.cycleloop?4(func, cycletime=50)
|
|||||||
revpimodio2.modio.RevPiModIO.cycletime?7
|
revpimodio2.modio.RevPiModIO.cycletime?7
|
||||||
revpimodio2.modio.RevPiModIO.debug?7
|
revpimodio2.modio.RevPiModIO.debug?7
|
||||||
revpimodio2.modio.RevPiModIO.exit?4(full=True)
|
revpimodio2.modio.RevPiModIO.exit?4(full=True)
|
||||||
revpimodio2.modio.RevPiModIO.export_replaced_ios?4(filename)
|
revpimodio2.modio.RevPiModIO.export_replaced_ios?4(filename="replace_ios.conf")
|
||||||
revpimodio2.modio.RevPiModIO.get_jconfigrsc?4()
|
revpimodio2.modio.RevPiModIO.get_jconfigrsc?4()
|
||||||
revpimodio2.modio.RevPiModIO.handlesignalend?4(cleanupfunc=None)
|
revpimodio2.modio.RevPiModIO.handlesignalend?4(cleanupfunc=None)
|
||||||
revpimodio2.modio.RevPiModIO.ioerrors?7
|
revpimodio2.modio.RevPiModIO.ioerrors?7
|
||||||
@@ -184,19 +185,25 @@ revpimodio2.modio.RevPiModIO.writeprocimg?4(device=None)
|
|||||||
revpimodio2.modio.RevPiModIO?1(autorefresh=False, monitoring=False, syncoutputs=True, procimg=None, configrsc=None, simulator=False, debug=False, replace_io_file=None, direct_output=False)
|
revpimodio2.modio.RevPiModIO?1(autorefresh=False, monitoring=False, syncoutputs=True, procimg=None, configrsc=None, simulator=False, debug=False, replace_io_file=None, direct_output=False)
|
||||||
revpimodio2.modio.RevPiModIODriver?1(virtdev, autorefresh=False, monitoring=False, syncoutputs=True, procimg=None, configrsc=None, debug=False, replace_io_file=None, direct_output=False)
|
revpimodio2.modio.RevPiModIODriver?1(virtdev, autorefresh=False, monitoring=False, syncoutputs=True, procimg=None, configrsc=None, debug=False, replace_io_file=None, direct_output=False)
|
||||||
revpimodio2.modio.RevPiModIOSelected?1(deviceselection, autorefresh=False, monitoring=False, syncoutputs=True, procimg=None, configrsc=None, simulator=False, debug=False, replace_io_file=None, direct_output=False)
|
revpimodio2.modio.RevPiModIOSelected?1(deviceselection, autorefresh=False, monitoring=False, syncoutputs=True, procimg=None, configrsc=None, simulator=False, debug=False, replace_io_file=None, direct_output=False)
|
||||||
|
revpimodio2.netio.HASH_FAIL?7
|
||||||
revpimodio2.netio.NetFH._connect?5()
|
revpimodio2.netio.NetFH._connect?5()
|
||||||
revpimodio2.netio.NetFH._direct_send?5(send_bytes, recv_count)
|
revpimodio2.netio.NetFH._direct_send?5(send_bytes, recv_count)
|
||||||
revpimodio2.netio.NetFH.clear_dirtybytes?4(position=None)
|
revpimodio2.netio.NetFH.clear_dirtybytes?4(position=None)
|
||||||
revpimodio2.netio.NetFH.close?4()
|
revpimodio2.netio.NetFH.close?4()
|
||||||
revpimodio2.netio.NetFH.closed?7
|
revpimodio2.netio.NetFH.closed?7
|
||||||
|
revpimodio2.netio.NetFH.config_changed?7
|
||||||
revpimodio2.netio.NetFH.flush?4()
|
revpimodio2.netio.NetFH.flush?4()
|
||||||
revpimodio2.netio.NetFH.get_closed?4()
|
revpimodio2.netio.NetFH.get_closed?4()
|
||||||
|
revpimodio2.netio.NetFH.get_config_changed?4()
|
||||||
revpimodio2.netio.NetFH.get_name?4()
|
revpimodio2.netio.NetFH.get_name?4()
|
||||||
|
revpimodio2.netio.NetFH.get_reconnecting?4()
|
||||||
revpimodio2.netio.NetFH.get_timeout?4()
|
revpimodio2.netio.NetFH.get_timeout?4()
|
||||||
revpimodio2.netio.NetFH.ioctl?4(request, arg=b'')
|
revpimodio2.netio.NetFH.ioctl?4(request, arg=b'')
|
||||||
revpimodio2.netio.NetFH.name?7
|
revpimodio2.netio.NetFH.name?7
|
||||||
revpimodio2.netio.NetFH.read?4(length)
|
revpimodio2.netio.NetFH.read?4(length)
|
||||||
revpimodio2.netio.NetFH.readpictory?4()
|
revpimodio2.netio.NetFH.readpictory?4()
|
||||||
|
revpimodio2.netio.NetFH.readreplaceio?4()
|
||||||
|
revpimodio2.netio.NetFH.reconnecting?7
|
||||||
revpimodio2.netio.NetFH.run?4()
|
revpimodio2.netio.NetFH.run?4()
|
||||||
revpimodio2.netio.NetFH.seek?4(position)
|
revpimodio2.netio.NetFH.seek?4(position)
|
||||||
revpimodio2.netio.NetFH.set_dirtybytes?4(position, dirtybytes)
|
revpimodio2.netio.NetFH.set_dirtybytes?4(position, dirtybytes)
|
||||||
@@ -204,12 +211,18 @@ revpimodio2.netio.NetFH.set_timeout?4(value)
|
|||||||
revpimodio2.netio.NetFH.tell?4()
|
revpimodio2.netio.NetFH.tell?4()
|
||||||
revpimodio2.netio.NetFH.timeout?7
|
revpimodio2.netio.NetFH.timeout?7
|
||||||
revpimodio2.netio.NetFH.write?4(bytebuff)
|
revpimodio2.netio.NetFH.write?4(bytebuff)
|
||||||
revpimodio2.netio.NetFH?1(address, timeout=500)
|
revpimodio2.netio.NetFH?1(address, check_replace_ios, timeout=500)
|
||||||
revpimodio2.netio.RevPiNetIO._create_myfh?5()
|
revpimodio2.netio.RevPiNetIO._create_myfh?5()
|
||||||
|
revpimodio2.netio.RevPiNetIO._get_cpreplaceio?5()
|
||||||
|
revpimodio2.netio.RevPiNetIO.config_changed?7
|
||||||
revpimodio2.netio.RevPiNetIO.disconnect?4()
|
revpimodio2.netio.RevPiNetIO.disconnect?4()
|
||||||
|
revpimodio2.netio.RevPiNetIO.exit?4(full=True)
|
||||||
|
revpimodio2.netio.RevPiNetIO.get_config_changed?4()
|
||||||
revpimodio2.netio.RevPiNetIO.get_jconfigrsc?4()
|
revpimodio2.netio.RevPiNetIO.get_jconfigrsc?4()
|
||||||
|
revpimodio2.netio.RevPiNetIO.get_reconnecting?4()
|
||||||
revpimodio2.netio.RevPiNetIO.net_cleardefaultvalues?4(device=None)
|
revpimodio2.netio.RevPiNetIO.net_cleardefaultvalues?4(device=None)
|
||||||
revpimodio2.netio.RevPiNetIO.net_setdefaultvalues?4(device=None)
|
revpimodio2.netio.RevPiNetIO.net_setdefaultvalues?4(device=None)
|
||||||
|
revpimodio2.netio.RevPiNetIO.reconnecting?7
|
||||||
revpimodio2.netio.RevPiNetIO?1(address, autorefresh=False, monitoring=False, syncoutputs=True, simulator=False, debug=False, replace_io_file=None, direct_output=False)
|
revpimodio2.netio.RevPiNetIO?1(address, autorefresh=False, monitoring=False, syncoutputs=True, simulator=False, debug=False, replace_io_file=None, direct_output=False)
|
||||||
revpimodio2.netio.RevPiNetIODriver?1(address, virtdev, autorefresh=False, monitoring=False, syncoutputs=True, debug=False, replace_io_file=None, direct_output=False)
|
revpimodio2.netio.RevPiNetIODriver?1(address, virtdev, autorefresh=False, monitoring=False, syncoutputs=True, debug=False, replace_io_file=None, direct_output=False)
|
||||||
revpimodio2.netio.RevPiNetIOSelected?1(address, deviceselection, autorefresh=False, monitoring=False, syncoutputs=True, simulator=False, debug=False, replace_io_file=None, direct_output=False)
|
revpimodio2.netio.RevPiNetIOSelected?1(address, deviceselection, autorefresh=False, monitoring=False, syncoutputs=True, simulator=False, debug=False, replace_io_file=None, direct_output=False)
|
||||||
@@ -217,5 +230,8 @@ revpimodio2.netio._sysdeldirty?8
|
|||||||
revpimodio2.netio._sysexit?8
|
revpimodio2.netio._sysexit?8
|
||||||
revpimodio2.netio._sysflush?8
|
revpimodio2.netio._sysflush?8
|
||||||
revpimodio2.netio._syspictory?8
|
revpimodio2.netio._syspictory?8
|
||||||
|
revpimodio2.netio._syspictoryh?8
|
||||||
|
revpimodio2.netio._sysreplaceio?8
|
||||||
|
revpimodio2.netio._sysreplaceioh?8
|
||||||
revpimodio2.netio._syssync?8
|
revpimodio2.netio._syssync?8
|
||||||
revpimodio2.summary.Summary?1(summary)
|
revpimodio2.summary.Summary?1(summary)
|
||||||
|
|||||||
@@ -1,4 +1,6 @@
|
|||||||
|
AclException Exception
|
||||||
Base Device
|
Base Device
|
||||||
|
ConfigChanged Exception
|
||||||
Connect Core
|
Connect Core
|
||||||
Core Base
|
Core Base
|
||||||
DeviceNotFoundError Exception
|
DeviceNotFoundError Exception
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<!DOCTYPE Project SYSTEM "Project-5.1.dtd">
|
<!DOCTYPE Project SYSTEM "Project-5.1.dtd">
|
||||||
<!-- eric project file for project revpimodio2 -->
|
<!-- eric project file for project revpimodio2 -->
|
||||||
<!-- Saved: 2019-08-01, 15:38:23 -->
|
<!-- Saved: 2019-08-26, 13:09:46 -->
|
||||||
<!-- Copyright (C) 2019 Sven Sager, akira@narux.de -->
|
<!-- Copyright (C) 2019 Sven Sager, akira@narux.de -->
|
||||||
<Project version="5.1">
|
<Project version="5.1">
|
||||||
<Language>en_US</Language>
|
<Language>en_US</Language>
|
||||||
@@ -9,7 +9,7 @@
|
|||||||
<ProgLanguage mixed="0">Python3</ProgLanguage>
|
<ProgLanguage mixed="0">Python3</ProgLanguage>
|
||||||
<ProjectType>Console</ProjectType>
|
<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>
|
<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.4.0</Version>
|
<Version>2.4.1</Version>
|
||||||
<Author>Sven Sager</Author>
|
<Author>Sven Sager</Author>
|
||||||
<Email>akira@narux.de</Email>
|
<Email>akira@narux.de</Email>
|
||||||
<Eol index="1"/>
|
<Eol index="1"/>
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ __author__ = "Sven Sager <akira@revpimodio.org>"
|
|||||||
__copyright__ = "Copyright (C) 2018 Sven Sager"
|
__copyright__ = "Copyright (C) 2018 Sven Sager"
|
||||||
__license__ = "LGPLv3"
|
__license__ = "LGPLv3"
|
||||||
__name__ = "revpimodio2"
|
__name__ = "revpimodio2"
|
||||||
__version__ = "2.4.0"
|
__version__ = "2.4.1"
|
||||||
|
|
||||||
# Global package values
|
# Global package values
|
||||||
OFF = 0
|
OFF = 0
|
||||||
|
|||||||
@@ -289,7 +289,7 @@ class ProcimgWriter(Thread):
|
|||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
__slots__ = "__dict_delay", "__eventth", "__eventqth", "__eventwork", \
|
__slots__ = "__dict_delay", "__eventth", "_eventqth", "__eventwork", \
|
||||||
"_adjwait", "_eventq", "_ioerror", "_maxioerrors", "_modio", \
|
"_adjwait", "_eventq", "_ioerror", "_maxioerrors", "_modio", \
|
||||||
"_refresh", "_work", "daemon", "lck_refresh", "newdata"
|
"_refresh", "_work", "daemon", "lck_refresh", "newdata"
|
||||||
|
|
||||||
@@ -299,7 +299,7 @@ class ProcimgWriter(Thread):
|
|||||||
super().__init__()
|
super().__init__()
|
||||||
self.__dict_delay = {}
|
self.__dict_delay = {}
|
||||||
self.__eventth = Thread(target=self.__exec_th)
|
self.__eventth = Thread(target=self.__exec_th)
|
||||||
self.__eventqth = queue.Queue()
|
self._eventqth = queue.Queue()
|
||||||
self.__eventwork = False
|
self.__eventwork = False
|
||||||
self._adjwait = 0
|
self._adjwait = 0
|
||||||
self._eventq = queue.Queue()
|
self._eventq = queue.Queue()
|
||||||
@@ -340,7 +340,7 @@ class ProcimgWriter(Thread):
|
|||||||
or regfunc.edge == FALLING and not boolor:
|
or regfunc.edge == FALLING and not boolor:
|
||||||
if regfunc.delay == 0:
|
if regfunc.delay == 0:
|
||||||
if regfunc.as_thread:
|
if regfunc.as_thread:
|
||||||
self.__eventqth.put(
|
self._eventqth.put(
|
||||||
(regfunc, io_event._name, io_event.value),
|
(regfunc, io_event._name, io_event.value),
|
||||||
False
|
False
|
||||||
)
|
)
|
||||||
@@ -363,7 +363,7 @@ class ProcimgWriter(Thread):
|
|||||||
for regfunc in dev._dict_events[io_event]:
|
for regfunc in dev._dict_events[io_event]:
|
||||||
if regfunc.delay == 0:
|
if regfunc.delay == 0:
|
||||||
if regfunc.as_thread:
|
if regfunc.as_thread:
|
||||||
self.__eventqth.put(
|
self._eventqth.put(
|
||||||
(regfunc, io_event._name, io_event.value),
|
(regfunc, io_event._name, io_event.value),
|
||||||
False
|
False
|
||||||
)
|
)
|
||||||
@@ -390,7 +390,7 @@ class ProcimgWriter(Thread):
|
|||||||
"""Laeuft als Thread, der Events als Thread startet."""
|
"""Laeuft als Thread, der Events als Thread startet."""
|
||||||
while self.__eventwork:
|
while self.__eventwork:
|
||||||
try:
|
try:
|
||||||
tup_fireth = self.__eventqth.get(timeout=1)
|
tup_fireth = self._eventqth.get(timeout=1)
|
||||||
th = EventCallback(
|
th = EventCallback(
|
||||||
tup_fireth[0].func, tup_fireth[1], tup_fireth[2]
|
tup_fireth[0].func, tup_fireth[1], tup_fireth[2]
|
||||||
)
|
)
|
||||||
@@ -415,7 +415,7 @@ class ProcimgWriter(Thread):
|
|||||||
self.__eventwork = value
|
self.__eventwork = value
|
||||||
if not value:
|
if not value:
|
||||||
# Nur leeren beim deaktivieren
|
# Nur leeren beim deaktivieren
|
||||||
self.__eventqth = queue.Queue()
|
self._eventqth = queue.Queue()
|
||||||
self._eventq = queue.Queue()
|
self._eventq = queue.Queue()
|
||||||
self.__dict_delay = {}
|
self.__dict_delay = {}
|
||||||
|
|
||||||
@@ -533,7 +533,7 @@ class ProcimgWriter(Thread):
|
|||||||
if self.__dict_delay[tup_fire] <= 0:
|
if self.__dict_delay[tup_fire] <= 0:
|
||||||
# Verzögertes Event übernehmen und löschen
|
# Verzögertes Event übernehmen und löschen
|
||||||
if tup_fire[0].as_thread:
|
if tup_fire[0].as_thread:
|
||||||
self.__eventqth.put(tup_fire, False)
|
self._eventqth.put(tup_fire, False)
|
||||||
else:
|
else:
|
||||||
self._eventq.put(tup_fire, False)
|
self._eventq.put(tup_fire, False)
|
||||||
del self.__dict_delay[tup_fire]
|
del self.__dict_delay[tup_fire]
|
||||||
|
|||||||
@@ -1000,13 +1000,6 @@ class IntIOReplaceable(IntIO):
|
|||||||
>Python3 struct</a>
|
>Python3 struct</a>
|
||||||
|
|
||||||
"""
|
"""
|
||||||
# Sperre prüfen
|
|
||||||
if self._parentdevice._modio._lck_replace_io:
|
|
||||||
raise RuntimeError(
|
|
||||||
"can not use this function while using an external "
|
|
||||||
"replace_io_file"
|
|
||||||
)
|
|
||||||
|
|
||||||
# StructIO erzeugen
|
# StructIO erzeugen
|
||||||
io_new = StructIO(
|
io_new = StructIO(
|
||||||
self,
|
self,
|
||||||
|
|||||||
@@ -37,7 +37,7 @@ class RevPiModIO(object):
|
|||||||
"_maxioerrors", "_myfh", "_myfh_lck", "_monitoring", "_procimg", \
|
"_maxioerrors", "_myfh", "_myfh_lck", "_monitoring", "_procimg", \
|
||||||
"_simulator", "_syncoutputs", "_th_mainloop", "_waitexit", \
|
"_simulator", "_syncoutputs", "_th_mainloop", "_waitexit", \
|
||||||
"core", "app", "device", "exitsignal", "io", "summary", "_debug", \
|
"core", "app", "device", "exitsignal", "io", "summary", "_debug", \
|
||||||
"_lck_replace_io", "_replace_io_file", "_run_on_pi"
|
"_replace_io_file", "_run_on_pi"
|
||||||
|
|
||||||
def __init__(
|
def __init__(
|
||||||
self, autorefresh=False, monitoring=False, syncoutputs=True,
|
self, autorefresh=False, monitoring=False, syncoutputs=True,
|
||||||
@@ -85,7 +85,6 @@ class RevPiModIO(object):
|
|||||||
self._imgwriter = None
|
self._imgwriter = None
|
||||||
self._ioerror = 0
|
self._ioerror = 0
|
||||||
self._length = 0
|
self._length = 0
|
||||||
self._lck_replace_io = False
|
|
||||||
self._looprunning = False
|
self._looprunning = False
|
||||||
self._lst_devselect = []
|
self._lst_devselect = []
|
||||||
self._lst_refresh = []
|
self._lst_refresh = []
|
||||||
@@ -116,6 +115,7 @@ class RevPiModIO(object):
|
|||||||
# Nur Konfigurieren, wenn nicht vererbt
|
# Nur Konfigurieren, wenn nicht vererbt
|
||||||
if type(self) == RevPiModIO:
|
if type(self) == RevPiModIO:
|
||||||
self._configure(self.get_jconfigrsc())
|
self._configure(self.get_jconfigrsc())
|
||||||
|
self._configure_replace_io(self._get_cpreplaceio())
|
||||||
|
|
||||||
def __del__(self):
|
def __del__(self):
|
||||||
"""Zerstoert alle Klassen um aufzuraeumen."""
|
"""Zerstoert alle Klassen um aufzuraeumen."""
|
||||||
@@ -138,7 +138,8 @@ class RevPiModIO(object):
|
|||||||
self.writeprocimg()
|
self.writeprocimg()
|
||||||
|
|
||||||
def _configure(self, jconfigrsc):
|
def _configure(self, jconfigrsc):
|
||||||
"""Verarbeitet die piCtory Konfigurationsdatei."""
|
"""Verarbeitet die piCtory Konfigurationsdatei.
|
||||||
|
@param jconfigrsc: Data to build IOs as <class 'dict'> of JSON"""
|
||||||
|
|
||||||
# Filehandler konfigurieren, wenn er noch nicht existiert
|
# Filehandler konfigurieren, wenn er noch nicht existiert
|
||||||
if self._myfh is None:
|
if self._myfh is None:
|
||||||
@@ -262,11 +263,6 @@ class RevPiModIO(object):
|
|||||||
Warning
|
Warning
|
||||||
)
|
)
|
||||||
|
|
||||||
# Replace IO aus Datei verarbeiten
|
|
||||||
if self._replace_io_file is not None:
|
|
||||||
self._configure_replace_io()
|
|
||||||
self._lck_replace_io = True
|
|
||||||
|
|
||||||
# ImgWriter erstellen
|
# ImgWriter erstellen
|
||||||
self._imgwriter = helpermodule.ProcimgWriter(self)
|
self._imgwriter = helpermodule.ProcimgWriter(self)
|
||||||
|
|
||||||
@@ -301,85 +297,74 @@ class RevPiModIO(object):
|
|||||||
# Summary Klasse instantiieren
|
# Summary Klasse instantiieren
|
||||||
self.summary = summarymodule.Summary(jconfigrsc["Summary"])
|
self.summary = summarymodule.Summary(jconfigrsc["Summary"])
|
||||||
|
|
||||||
def _configure_replace_io(self):
|
def _configure_replace_io(self, creplaceio):
|
||||||
"""Importiert ersetzte IOs in diese Instanz.
|
"""Importiert ersetzte IOs in diese Instanz.
|
||||||
|
|
||||||
Importiert ersetzte IOs, welche vorher mit .export_replaced_ios(...)
|
Importiert ersetzte IOs, welche vorher mit .export_replaced_ios(...)
|
||||||
in eine Datei exportiert worden sind. Diese IOs werden in dieser
|
in eine Datei exportiert worden sind. Diese IOs werden in dieser
|
||||||
Instanz wiederhergestellt.
|
Instanz wiederhergestellt.
|
||||||
|
|
||||||
|
@param ireplaceio: Data to replace ios as <class 'ConfigParser'>
|
||||||
|
|
||||||
"""
|
"""
|
||||||
cp = ConfigParser()
|
for io in creplaceio:
|
||||||
|
|
||||||
try:
|
|
||||||
with open(self._replace_io_file, "r") as fh:
|
|
||||||
cp.read_file(fh)
|
|
||||||
except Exception as e:
|
|
||||||
raise RuntimeError(
|
|
||||||
"replace_io_file: could not read file '{0}' | {1}"
|
|
||||||
"".format(self._replace_io_file, e)
|
|
||||||
)
|
|
||||||
|
|
||||||
for io in cp:
|
|
||||||
if io == "DEFAULT":
|
if io == "DEFAULT":
|
||||||
continue
|
continue
|
||||||
|
|
||||||
# IO prüfen
|
# IO prüfen
|
||||||
parentio = cp[io].get("replace", "")
|
parentio = creplaceio[io].get("replace", "")
|
||||||
|
|
||||||
# Funktionsaufruf vorbereiten
|
# Funktionsaufruf vorbereiten
|
||||||
dict_replace = {
|
dict_replace = {
|
||||||
"frm": cp[io].get("frm"),
|
"frm": creplaceio[io].get("frm"),
|
||||||
|
"byteorder": creplaceio[io].get("byteorder", "little"),
|
||||||
|
"bmk": creplaceio[io].get("bmk", ""),
|
||||||
}
|
}
|
||||||
|
|
||||||
# Convert defaultvalue from config file
|
|
||||||
if "defaultvalue" in cp[io]:
|
|
||||||
if dict_replace["frm"] == "?":
|
|
||||||
try:
|
|
||||||
dict_replace["defaultvalue"] = \
|
|
||||||
cp[io].getboolean("defaultvalue")
|
|
||||||
except Exception:
|
|
||||||
raise ValueError(
|
|
||||||
"replace_io_file: could not convert '{0}' "
|
|
||||||
"defaultvalue '{1}' to boolean"
|
|
||||||
"".format(io, cp[io].get("defaultvalue"))
|
|
||||||
)
|
|
||||||
else:
|
|
||||||
try:
|
|
||||||
dict_replace["defaultvalue"] = \
|
|
||||||
cp[io].getint("defaultvalue")
|
|
||||||
except Exception:
|
|
||||||
raise ValueError(
|
|
||||||
"replace_io_file: could not convert '{0}' "
|
|
||||||
"defaultvalue '{1}' to integer"
|
|
||||||
"".format(io, cp[io].get("bit"))
|
|
||||||
)
|
|
||||||
|
|
||||||
# Get bitaddress from config file
|
# Get bitaddress from config file
|
||||||
if "bit" in cp[io]:
|
if "bit" in creplaceio[io]:
|
||||||
try:
|
try:
|
||||||
dict_replace["bit"] = cp[io].getint("bit", 0)
|
dict_replace["bit"] = creplaceio[io].getint("bit")
|
||||||
except Exception:
|
except Exception:
|
||||||
raise ValueError(
|
raise ValueError(
|
||||||
"replace_io_file: could not convert '{0}' "
|
"replace_io_file: could not convert '{0}' "
|
||||||
"bit '{1}' to integer"
|
"bit '{1}' to integer"
|
||||||
"".format(io, cp[io].get("bit"))
|
"".format(io, creplaceio[io]["bit"])
|
||||||
)
|
)
|
||||||
|
|
||||||
# Sonstige Werte laden, wenn vorhanden
|
# Convert defaultvalue from config file
|
||||||
if "bmk" in cp[io]:
|
if "defaultvalue" in creplaceio[io]:
|
||||||
dict_replace["bmk"] = cp[io].get("bmk")
|
if dict_replace["frm"] == "?":
|
||||||
if "byteorder" in cp[io]:
|
try:
|
||||||
dict_replace["byteorder"] = cp[io].get("byteorder")
|
dict_replace["defaultvalue"] = \
|
||||||
|
creplaceio[io].getboolean("defaultvalue")
|
||||||
|
except Exception:
|
||||||
|
raise ValueError(
|
||||||
|
"replace_io_file: could not convert '{0}' "
|
||||||
|
"defaultvalue '{1}' to boolean"
|
||||||
|
"".format(io, creplaceio[io]["defaultvalue"])
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
try:
|
||||||
|
dict_replace["defaultvalue"] = \
|
||||||
|
creplaceio[io].getint("defaultvalue")
|
||||||
|
except Exception:
|
||||||
|
raise ValueError(
|
||||||
|
"replace_io_file: could not convert '{0}' "
|
||||||
|
"defaultvalue '{1}' to integer"
|
||||||
|
"".format(io, creplaceio[io]["defaultvalue"])
|
||||||
|
)
|
||||||
|
|
||||||
# IO ersetzen
|
# IO ersetzen
|
||||||
try:
|
try:
|
||||||
self.io[parentio].replace_io(name=io, **dict_replace)
|
self.io[parentio].replace_io(name=io, **dict_replace)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
raise RuntimeError(
|
# NOTE: Bei Selected/Driver kann nicht geprüft werden
|
||||||
"replace_io_file: can not replace '{0}' with '{1}' "
|
if len(self._lst_devselect) == 0:
|
||||||
"| RevPiModIO message: {2}".format(parentio, io, e)
|
raise RuntimeError(
|
||||||
)
|
"replace_io_file: can not replace '{0}' with '{1}' "
|
||||||
|
"| RevPiModIO message: {2}".format(parentio, io, e)
|
||||||
|
)
|
||||||
|
|
||||||
def _create_myfh(self):
|
def _create_myfh(self):
|
||||||
"""Erstellt FileObject mit Pfad zum procimg.
|
"""Erstellt FileObject mit Pfad zum procimg.
|
||||||
@@ -392,6 +377,25 @@ class RevPiModIO(object):
|
|||||||
@return Pfad der verwendeten piCtory Konfiguration"""
|
@return Pfad der verwendeten piCtory Konfiguration"""
|
||||||
return self._configrsc
|
return self._configrsc
|
||||||
|
|
||||||
|
def _get_cpreplaceio(self):
|
||||||
|
"""Laed die replace_io_file Konfiguration und verarbeitet sie.
|
||||||
|
@return <class 'ConfigParser'> der replace io daten"""
|
||||||
|
cp = ConfigParser()
|
||||||
|
|
||||||
|
# TODO: verfeinern!
|
||||||
|
|
||||||
|
if self._replace_io_file:
|
||||||
|
try:
|
||||||
|
with open(self._replace_io_file, "r") as fh:
|
||||||
|
cp.read_file(fh)
|
||||||
|
except Exception as e:
|
||||||
|
raise RuntimeError(
|
||||||
|
"replace_io_file: could not read/parse file '{0}' | {1}"
|
||||||
|
"".format(self._replace_io_file, e)
|
||||||
|
)
|
||||||
|
|
||||||
|
return cp
|
||||||
|
|
||||||
def _get_cycletime(self):
|
def _get_cycletime(self):
|
||||||
"""Gibt Aktualisierungsrate in ms der Prozessabbildsynchronisierung aus.
|
"""Gibt Aktualisierungsrate in ms der Prozessabbildsynchronisierung aus.
|
||||||
@return Millisekunden"""
|
@return Millisekunden"""
|
||||||
@@ -681,7 +685,7 @@ class RevPiModIO(object):
|
|||||||
if not self._monitoring:
|
if not self._monitoring:
|
||||||
self.writeprocimg(dev)
|
self.writeprocimg(dev)
|
||||||
|
|
||||||
def export_replaced_ios(self, filename):
|
def export_replaced_ios(self, filename="replace_ios.conf"):
|
||||||
"""Exportiert ersetzte IOs dieser Instanz.
|
"""Exportiert ersetzte IOs dieser Instanz.
|
||||||
|
|
||||||
Exportiert alle ersetzten IOs, welche mit .replace_io(...) angelegt
|
Exportiert alle ersetzten IOs, welche mit .replace_io(...) angelegt
|
||||||
@@ -704,8 +708,10 @@ class RevPiModIO(object):
|
|||||||
# Optional values
|
# Optional values
|
||||||
if io._bitaddress >= 0:
|
if io._bitaddress >= 0:
|
||||||
cp[io.name]["bit"] = str(io._bitaddress)
|
cp[io.name]["bit"] = str(io._bitaddress)
|
||||||
cp[io.name]["byteorder"] = io._byteorder
|
if io._byteorder != "little":
|
||||||
cp[io.name]["defaultvalue"] = str(io.defaultvalue)
|
cp[io.name]["byteorder"] = io._byteorder
|
||||||
|
if io.defaultvalue != 0:
|
||||||
|
cp[io.name]["defaultvalue"] = str(io.defaultvalue)
|
||||||
if io.bmk != "":
|
if io.bmk != "":
|
||||||
cp[io.name]["bmk"] = io.bmk
|
cp[io.name]["bmk"] = io.bmk
|
||||||
|
|
||||||
@@ -846,7 +852,7 @@ class RevPiModIO(object):
|
|||||||
or regfunc.edge == RISING and io.value \
|
or regfunc.edge == RISING and io.value \
|
||||||
or regfunc.edge == FALLING and not io.value:
|
or regfunc.edge == FALLING and not io.value:
|
||||||
if regfunc.as_thread:
|
if regfunc.as_thread:
|
||||||
self._imgwriter.__eventqth.put(
|
self._imgwriter._eventqth.put(
|
||||||
(regfunc, io._name, io.value), False
|
(regfunc, io._name, io.value), False
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
@@ -1141,6 +1147,7 @@ class RevPiModIOSelected(RevPiModIO):
|
|||||||
)
|
)
|
||||||
|
|
||||||
self._configure(self.get_jconfigrsc())
|
self._configure(self.get_jconfigrsc())
|
||||||
|
self._configure_replace_io(self._get_cpreplaceio())
|
||||||
|
|
||||||
if len(self.device) == 0:
|
if len(self.device) == 0:
|
||||||
if type(self) == RevPiModIODriver:
|
if type(self) == RevPiModIODriver:
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ __copyright__ = "Copyright (C) 2018 Sven Sager"
|
|||||||
__license__ = "LGPLv3"
|
__license__ = "LGPLv3"
|
||||||
import socket
|
import socket
|
||||||
import warnings
|
import warnings
|
||||||
|
from configparser import ConfigParser
|
||||||
from json import loads as jloads
|
from json import loads as jloads
|
||||||
from re import compile
|
from re import compile
|
||||||
from revpimodio2 import DeviceNotFoundError
|
from revpimodio2 import DeviceNotFoundError
|
||||||
@@ -21,8 +22,28 @@ _sysexit = b'\x01EX\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x17'
|
|||||||
_sysdeldirty = b'\x01EY\x00\x00\x00\x00\xFF\x00\x00\x00\x00\x00\x00\x00\x17'
|
_sysdeldirty = b'\x01EY\x00\x00\x00\x00\xFF\x00\x00\x00\x00\x00\x00\x00\x17'
|
||||||
# piCtory Konfiguration laden
|
# piCtory Konfiguration laden
|
||||||
_syspictory = b'\x01PI\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x17'
|
_syspictory = b'\x01PI\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x17'
|
||||||
|
_syspictoryh = b'\x01PH\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x17'
|
||||||
|
# ReplaceIO Konfiguration laden
|
||||||
|
_sysreplaceio = b'\x01RP\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x17'
|
||||||
|
_sysreplaceioh = b'\x01RH\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x17'
|
||||||
# Übertragene Bytes schreiben
|
# Übertragene Bytes schreiben
|
||||||
_sysflush = b'\x01SD\x00\x00\x00\x00\x1c\x00\x00\x00\x00\x00\x00\x00\x17'
|
_sysflush = b'\x01SD\x00\x00\x00\x00\x1c\x00\x00\x00\x00\x00\x00\x00\x17'
|
||||||
|
# Hashvalues
|
||||||
|
HASH_FAIL = b'\xff' * 16
|
||||||
|
|
||||||
|
|
||||||
|
class AclException(Exception):
|
||||||
|
|
||||||
|
"""Probleme mit Berechtigungen."""
|
||||||
|
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class ConfigChanged(Exception):
|
||||||
|
|
||||||
|
"""Aenderung der piCtory oder replace_ios Datei."""
|
||||||
|
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
class NetFH(Thread):
|
class NetFH(Thread):
|
||||||
@@ -35,26 +56,34 @@ class NetFH(Thread):
|
|||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
__slots__ = "__by_buff", "__int_buff", "__dictdirty", "__flusherr", \
|
__slots__ = "__by_buff", "__check_replace_ios", "__config_changed", \
|
||||||
"__position", "__sockact", "__sockerr", "__sockend", "__socklock", \
|
"__int_buff", "__dictdirty", "__flusherr", "__replace_ios_h", \
|
||||||
"__timeout", "__trigger", "__waitsync", \
|
"__pictory_h", "__position", "__sockact", "__sockerr", "__sockend", \
|
||||||
"_address", "_slavesock", \
|
"__socklock", "__timeout", "__trigger", "__waitsync", "_address", \
|
||||||
"daemon"
|
"_slavesock", "daemon"
|
||||||
|
|
||||||
def __init__(self, address, timeout=500):
|
def __init__(self, address, check_replace_ios, timeout=500):
|
||||||
"""Init NetFH-class.
|
"""Init NetFH-class.
|
||||||
|
|
||||||
@param address IP Adresse, Port des RevPi als <class 'tuple'>
|
@param address IP Adresse, Port des RevPi als <class 'tuple'>
|
||||||
@param timeout Timeout in Millisekunden der Verbindung"""
|
@param check_replace_ios Prueft auf Veraenderungen der Datei
|
||||||
|
@param timeout Timeout in Millisekunden der Verbindung
|
||||||
|
|
||||||
|
"""
|
||||||
super().__init__()
|
super().__init__()
|
||||||
self.daemon = True
|
self.daemon = True
|
||||||
|
|
||||||
self.__by_buff = b''
|
self.__by_buff = b''
|
||||||
|
self.__check_replace_ios = check_replace_ios
|
||||||
|
self.__config_changed = False
|
||||||
self.__int_buff = 0
|
self.__int_buff = 0
|
||||||
self.__dictdirty = {}
|
self.__dictdirty = {}
|
||||||
self.__flusherr = False
|
self.__flusherr = False
|
||||||
|
self.__replace_ios_h = b''
|
||||||
|
self.__pictory_h = b''
|
||||||
self.__sockact = False
|
self.__sockact = False
|
||||||
self.__sockerr = Event()
|
self.__sockerr = Event()
|
||||||
self.__sockend = False
|
self.__sockend = Event()
|
||||||
self.__socklock = Lock()
|
self.__socklock = Lock()
|
||||||
self.__timeout = None
|
self.__timeout = None
|
||||||
self.__trigger = False
|
self.__trigger = False
|
||||||
@@ -90,10 +119,10 @@ class NetFH(Thread):
|
|||||||
if bytecode == b'\x18':
|
if bytecode == b'\x18':
|
||||||
|
|
||||||
# Alles beenden, wenn nicht erlaubt
|
# Alles beenden, wenn nicht erlaubt
|
||||||
self.__sockend = True
|
self.__sockend.set()
|
||||||
self.__sockerr.set()
|
self.__sockerr.set()
|
||||||
self._slavesock.close()
|
self._slavesock.close()
|
||||||
raise RuntimeError(
|
raise AclException(
|
||||||
"write access to the process image is not permitted - use "
|
"write access to the process image is not permitted - use "
|
||||||
"monitoring=True or check aclplcslave.conf on RevPi and "
|
"monitoring=True or check aclplcslave.conf on RevPi and "
|
||||||
"reload revpipyload!"
|
"reload revpipyload!"
|
||||||
@@ -124,6 +153,45 @@ class NetFH(Thread):
|
|||||||
so = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
so = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
||||||
try:
|
try:
|
||||||
so.connect(self._address)
|
so.connect(self._address)
|
||||||
|
|
||||||
|
# Hashwerte anfordern
|
||||||
|
recv_len = 16
|
||||||
|
so.sendall(_syspictoryh)
|
||||||
|
if self.__check_replace_ios:
|
||||||
|
so.sendall(_sysreplaceioh)
|
||||||
|
recv_len += 16
|
||||||
|
|
||||||
|
# Hashwerte empfangen
|
||||||
|
byte_buff = bytearray()
|
||||||
|
zero_byte = 0
|
||||||
|
while not self.__sockend.is_set() and zero_byte < 100 \
|
||||||
|
and len(byte_buff) < recv_len:
|
||||||
|
data = so.recv(recv_len)
|
||||||
|
if data == b'':
|
||||||
|
zero_byte += 1
|
||||||
|
byte_buff += data
|
||||||
|
|
||||||
|
# Änderung an piCtory prüfen
|
||||||
|
if self.__pictory_h and byte_buff[:16] != self.__pictory_h:
|
||||||
|
self.__config_changed = True
|
||||||
|
self.close()
|
||||||
|
raise ConfigChanged(
|
||||||
|
"configuration on revolution pi was changed")
|
||||||
|
else:
|
||||||
|
self.__pictory_h = byte_buff[:16]
|
||||||
|
|
||||||
|
# Änderung an replace_ios prüfen
|
||||||
|
if self.__check_replace_ios and self.__replace_ios_h \
|
||||||
|
and byte_buff[16:] != self.__replace_ios_h:
|
||||||
|
self.__config_changed = True
|
||||||
|
self.close()
|
||||||
|
raise ConfigChanged(
|
||||||
|
"configuration on revolution pi was changed")
|
||||||
|
else:
|
||||||
|
self.__replace_ios_h = byte_buff[16:]
|
||||||
|
except ConfigChanged:
|
||||||
|
so.close()
|
||||||
|
raise
|
||||||
except Exception:
|
except Exception:
|
||||||
so.close()
|
so.close()
|
||||||
else:
|
else:
|
||||||
@@ -151,11 +219,12 @@ class NetFH(Thread):
|
|||||||
@returns Empfangende Bytes
|
@returns Empfangende Bytes
|
||||||
|
|
||||||
"""
|
"""
|
||||||
if self.__sockend:
|
if self.__sockend.is_set():
|
||||||
raise ValueError("I/O operation on closed file")
|
raise ValueError("I/O operation on closed file")
|
||||||
|
|
||||||
with self.__socklock:
|
with self.__socklock:
|
||||||
self._slavesock.sendall(send_bytes)
|
self._slavesock.sendall(send_bytes)
|
||||||
|
# FIXME: Schleife bis Daten empfangen sind einbauen
|
||||||
recv = self._slavesock.recv(recv_count)
|
recv = self._slavesock.recv(recv_count)
|
||||||
self.__trigger = True
|
self.__trigger = True
|
||||||
return recv
|
return recv
|
||||||
@@ -163,10 +232,15 @@ class NetFH(Thread):
|
|||||||
def clear_dirtybytes(self, position=None):
|
def clear_dirtybytes(self, position=None):
|
||||||
"""Entfernt die konfigurierten Dirtybytes vom RevPi Slave.
|
"""Entfernt die konfigurierten Dirtybytes vom RevPi Slave.
|
||||||
@param position Startposition der Dirtybytes"""
|
@param position Startposition der Dirtybytes"""
|
||||||
if self.__sockend:
|
if self.__config_changed:
|
||||||
|
raise ConfigChanged("configuration on revolution pi was changed")
|
||||||
|
if self.__sockend.is_set():
|
||||||
raise ValueError("I/O operation on closed file")
|
raise ValueError("I/O operation on closed file")
|
||||||
|
|
||||||
with self.__socklock:
|
error = False
|
||||||
|
try:
|
||||||
|
self.__socklock.acquire()
|
||||||
|
|
||||||
if position is None:
|
if position is None:
|
||||||
# Alle Dirtybytes löschen
|
# Alle Dirtybytes löschen
|
||||||
self._slavesock.sendall(_sysdeldirty)
|
self._slavesock.sendall(_sysdeldirty)
|
||||||
@@ -184,40 +258,54 @@ class NetFH(Thread):
|
|||||||
# ACL prüfen und ggf Fehler werfen
|
# ACL prüfen und ggf Fehler werfen
|
||||||
self.__check_acl(check)
|
self.__check_acl(check)
|
||||||
|
|
||||||
self.__sockerr.set()
|
|
||||||
raise IOError("clear dirtybytes error on network")
|
raise IOError("clear dirtybytes error on network")
|
||||||
|
except AclException:
|
||||||
|
raise
|
||||||
|
except Exception:
|
||||||
|
error = True
|
||||||
|
finally:
|
||||||
|
self.__socklock.release()
|
||||||
|
|
||||||
# Daten bei Erfolg übernehmen
|
# Daten immer übernehmen
|
||||||
if position is None:
|
if position is None:
|
||||||
self.__dictdirty = {}
|
self.__dictdirty = {}
|
||||||
elif position in self.__dictdirty:
|
elif position in self.__dictdirty:
|
||||||
del self.__dictdirty[position]
|
del self.__dictdirty[position]
|
||||||
|
|
||||||
|
if error:
|
||||||
|
# Fehler nach übernahme der Daten auslösen um diese zu setzen
|
||||||
|
self.__sockerr.set()
|
||||||
|
|
||||||
self.__trigger = True
|
self.__trigger = True
|
||||||
|
|
||||||
def close(self):
|
def close(self):
|
||||||
"""Verbindung trennen."""
|
"""Verbindung trennen."""
|
||||||
if self.__sockend:
|
if self.__sockend.is_set():
|
||||||
return
|
return
|
||||||
|
|
||||||
self.__sockend = True
|
self.__sockend.set()
|
||||||
self.__sockerr.set()
|
self.__sockerr.set()
|
||||||
|
|
||||||
# Vom Socket sauber trennen
|
# Vom Socket sauber trennen
|
||||||
if self._slavesock is not None:
|
if self._slavesock is not None:
|
||||||
with self.__socklock:
|
try:
|
||||||
try:
|
self.__socklock.acquire()
|
||||||
if self.__sockend:
|
self._slavesock.send(_sysexit)
|
||||||
self._slavesock.send(_sysexit)
|
|
||||||
else:
|
# NOTE: Wird das benötigt?
|
||||||
self._slavesock.shutdown(socket.SHUT_RDWR)
|
self._slavesock.shutdown(socket.SHUT_RDWR)
|
||||||
except Exception:
|
except Exception:
|
||||||
pass
|
pass
|
||||||
|
finally:
|
||||||
|
self.__socklock.release()
|
||||||
|
|
||||||
self._slavesock.close()
|
self._slavesock.close()
|
||||||
|
|
||||||
def flush(self):
|
def flush(self):
|
||||||
"""Schreibpuffer senden."""
|
"""Schreibpuffer senden."""
|
||||||
if self.__sockend:
|
if self.__config_changed:
|
||||||
|
raise ConfigChanged("configuration on revolution pi was changed")
|
||||||
|
if self.__sockend.is_set():
|
||||||
raise ValueError("flush of closed file")
|
raise ValueError("flush of closed file")
|
||||||
|
|
||||||
with self.__socklock:
|
with self.__socklock:
|
||||||
@@ -248,13 +336,23 @@ class NetFH(Thread):
|
|||||||
def get_closed(self):
|
def get_closed(self):
|
||||||
"""Pruefen ob Verbindung geschlossen ist.
|
"""Pruefen ob Verbindung geschlossen ist.
|
||||||
@return True, wenn Verbindung geschlossen ist"""
|
@return True, wenn Verbindung geschlossen ist"""
|
||||||
return self.__sockend
|
return self.__sockend.is_set()
|
||||||
|
|
||||||
|
def get_config_changed(self):
|
||||||
|
"""Pruefen ob RevPi Konfiguration geaendert wurde.
|
||||||
|
@return True, wenn RevPi Konfiguration geaendert ist"""
|
||||||
|
return self.__config_changed
|
||||||
|
|
||||||
def get_name(self):
|
def get_name(self):
|
||||||
"""Verbindugnsnamen zurueckgeben.
|
"""Verbindugnsnamen zurueckgeben.
|
||||||
@return <class 'str'> IP:PORT"""
|
@return <class 'str'> IP:PORT"""
|
||||||
return "{0}:{1}".format(*self._address)
|
return "{0}:{1}".format(*self._address)
|
||||||
|
|
||||||
|
def get_reconnecting(self):
|
||||||
|
"""Interner reconnect aktiv wegen Netzwerkfehlern.
|
||||||
|
@return True, wenn reconnect aktiv"""
|
||||||
|
return self.__sockerr.is_set()
|
||||||
|
|
||||||
def get_timeout(self):
|
def get_timeout(self):
|
||||||
"""Gibt aktuellen Timeout zurueck.
|
"""Gibt aktuellen Timeout zurueck.
|
||||||
@return <class 'int'> in Millisekunden"""
|
@return <class 'int'> in Millisekunden"""
|
||||||
@@ -264,7 +362,9 @@ class NetFH(Thread):
|
|||||||
"""IOCTL Befehle ueber das Netzwerk senden.
|
"""IOCTL Befehle ueber das Netzwerk senden.
|
||||||
@param request Request as <class 'int'>
|
@param request Request as <class 'int'>
|
||||||
@param arg Argument as <class 'byte'>"""
|
@param arg Argument as <class 'byte'>"""
|
||||||
if self.__sockend:
|
if self.__config_changed:
|
||||||
|
raise ConfigChanged("configuration on revolution pi was changed")
|
||||||
|
if self.__sockend.is_set():
|
||||||
raise ValueError("read of closed file")
|
raise ValueError("read of closed file")
|
||||||
|
|
||||||
if not (isinstance(arg, bytes) and len(arg) <= 1024):
|
if not (isinstance(arg, bytes) and len(arg) <= 1024):
|
||||||
@@ -295,7 +395,9 @@ class NetFH(Thread):
|
|||||||
"""Daten ueber das Netzwerk lesen.
|
"""Daten ueber das Netzwerk lesen.
|
||||||
@param length Anzahl der Bytes
|
@param length Anzahl der Bytes
|
||||||
@return Gelesene <class 'bytes'>"""
|
@return Gelesene <class 'bytes'>"""
|
||||||
if self.__sockend:
|
if self.__config_changed:
|
||||||
|
raise ConfigChanged("configuration on revolution pi was changed")
|
||||||
|
if self.__sockend.is_set():
|
||||||
raise ValueError("read of closed file")
|
raise ValueError("read of closed file")
|
||||||
|
|
||||||
with self.__socklock:
|
with self.__socklock:
|
||||||
@@ -307,8 +409,8 @@ class NetFH(Thread):
|
|||||||
)
|
)
|
||||||
|
|
||||||
bytesbuff = bytearray()
|
bytesbuff = bytearray()
|
||||||
while not self.__sockend and len(bytesbuff) < length:
|
while not self.__sockend.is_set() and len(bytesbuff) < length:
|
||||||
rbytes = self._slavesock.recv(1024)
|
rbytes = self._slavesock.recv(256)
|
||||||
|
|
||||||
if rbytes == b'':
|
if rbytes == b'':
|
||||||
self.__sockerr.set()
|
self.__sockerr.set()
|
||||||
@@ -323,33 +425,75 @@ class NetFH(Thread):
|
|||||||
def readpictory(self):
|
def readpictory(self):
|
||||||
"""Ruft die piCtory Konfiguration ab.
|
"""Ruft die piCtory Konfiguration ab.
|
||||||
@return <class 'bytes'> piCtory Datei"""
|
@return <class 'bytes'> piCtory Datei"""
|
||||||
if self.__sockend:
|
if self.__sockend.is_set():
|
||||||
raise ValueError("read of closed file")
|
raise ValueError("read of closed file")
|
||||||
|
|
||||||
|
if self.__pictory_h == HASH_FAIL:
|
||||||
|
raise RuntimeError(
|
||||||
|
"could not read/parse piCtory configuration over network"
|
||||||
|
)
|
||||||
|
|
||||||
with self.__socklock:
|
with self.__socklock:
|
||||||
self._slavesock.send(_syspictory)
|
self._slavesock.send(_syspictory)
|
||||||
|
|
||||||
byte_buff = bytearray()
|
byte_buff = bytearray()
|
||||||
while not self.__sockend:
|
zero_byte = 0
|
||||||
data = self._slavesock.recv(1024)
|
while not self.__sockend.is_set() and zero_byte < 100:
|
||||||
|
data = self._slavesock.recv(128)
|
||||||
|
if data == b'':
|
||||||
|
zero_byte += 1
|
||||||
|
|
||||||
byte_buff += data
|
byte_buff += data
|
||||||
if data.find(b'\x04') >= 0:
|
if data.find(b'\x04') >= 0:
|
||||||
|
self.__trigger = True
|
||||||
|
|
||||||
# NOTE: Nur suchen oder Ende prüfen?
|
# NOTE: Nur suchen oder Ende prüfen?
|
||||||
return byte_buff[:-1]
|
return bytes(byte_buff[:-1])
|
||||||
|
|
||||||
self.__sockerr.set()
|
self.__sockerr.set()
|
||||||
raise IOError("readpictory error on network")
|
raise IOError("readpictory error on network")
|
||||||
|
|
||||||
self.__trigger = True
|
def readreplaceio(self):
|
||||||
|
"""Ruft die replace_io Konfiguration ab.
|
||||||
|
@return <class 'bytes'> replace_io_file"""
|
||||||
|
if self.__sockend.is_set():
|
||||||
|
raise ValueError("read of closed file")
|
||||||
|
|
||||||
|
if self.__replace_ios_h == HASH_FAIL:
|
||||||
|
raise RuntimeError(
|
||||||
|
"replace_io_file: could not read/parse over network"
|
||||||
|
)
|
||||||
|
|
||||||
|
with self.__socklock:
|
||||||
|
self._slavesock.send(_sysreplaceio)
|
||||||
|
|
||||||
|
byte_buff = bytearray()
|
||||||
|
zero_byte = 0
|
||||||
|
while not self.__sockend.is_set() and zero_byte < 100:
|
||||||
|
data = self._slavesock.recv(128)
|
||||||
|
if data == b'':
|
||||||
|
zero_byte += 1
|
||||||
|
|
||||||
|
byte_buff += data
|
||||||
|
if data.find(b'\x04') >= 0:
|
||||||
|
self.__trigger = True
|
||||||
|
|
||||||
|
# NOTE: Nur suchen oder Ende prüfen?
|
||||||
|
return bytes(byte_buff[:-1])
|
||||||
|
|
||||||
|
self.__sockerr.set()
|
||||||
|
raise IOError("readreplaceio error on network")
|
||||||
|
|
||||||
def run(self):
|
def run(self):
|
||||||
"""Handler fuer Synchronisierung."""
|
"""Handler fuer Synchronisierung."""
|
||||||
while not self.__sockend:
|
while not self.__sockend.is_set():
|
||||||
|
|
||||||
# Bei Fehlermeldung neu verbinden
|
# Bei Fehlermeldung neu verbinden
|
||||||
if self.__sockerr.is_set():
|
if self.__sockerr.is_set():
|
||||||
self._connect()
|
self._connect()
|
||||||
|
if self.__sockerr.is_set():
|
||||||
|
# Verhindert bei Scheitern 100% CPU last
|
||||||
|
self.__sockend.wait(self.__waitsync)
|
||||||
|
|
||||||
else:
|
else:
|
||||||
# Kein Fehler aufgetreten, sync durchführen wenn socket frei
|
# Kein Fehler aufgetreten, sync durchführen wenn socket frei
|
||||||
@@ -380,7 +524,9 @@ class NetFH(Thread):
|
|||||||
def seek(self, position):
|
def seek(self, position):
|
||||||
"""Springt an angegebene Position.
|
"""Springt an angegebene Position.
|
||||||
@param position An diese Position springen"""
|
@param position An diese Position springen"""
|
||||||
if self.__sockend:
|
if self.__config_changed:
|
||||||
|
raise ConfigChanged("configuration on revolution pi was changed")
|
||||||
|
if self.__sockend.is_set():
|
||||||
raise ValueError("seek of closed file")
|
raise ValueError("seek of closed file")
|
||||||
self.__position = int(position)
|
self.__position = int(position)
|
||||||
|
|
||||||
@@ -388,10 +534,15 @@ class NetFH(Thread):
|
|||||||
"""Konfiguriert Dirtybytes fuer Prozessabbild bei Verbindungsfehler.
|
"""Konfiguriert Dirtybytes fuer Prozessabbild bei Verbindungsfehler.
|
||||||
@param positon Startposition zum Schreiben
|
@param positon Startposition zum Schreiben
|
||||||
@param dirtybytes <class 'bytes'> die geschrieben werden sollen"""
|
@param dirtybytes <class 'bytes'> die geschrieben werden sollen"""
|
||||||
if self.__sockend:
|
if self.__config_changed:
|
||||||
|
raise ConfigChanged("configuration on revolution pi was changed")
|
||||||
|
if self.__sockend.is_set():
|
||||||
raise ValueError("I/O operation on closed file")
|
raise ValueError("I/O operation on closed file")
|
||||||
|
|
||||||
with self.__socklock:
|
error = False
|
||||||
|
try:
|
||||||
|
self.__socklock.acquire()
|
||||||
|
|
||||||
self._slavesock.sendall(
|
self._slavesock.sendall(
|
||||||
b'\x01EY' +
|
b'\x01EY' +
|
||||||
position.to_bytes(length=2, byteorder="little") +
|
position.to_bytes(length=2, byteorder="little") +
|
||||||
@@ -406,24 +557,35 @@ class NetFH(Thread):
|
|||||||
# ACL prüfen und ggf Fehler werfen
|
# ACL prüfen und ggf Fehler werfen
|
||||||
self.__check_acl(check)
|
self.__check_acl(check)
|
||||||
|
|
||||||
self.__sockerr.set()
|
|
||||||
raise IOError("set dirtybytes error on network")
|
raise IOError("set dirtybytes error on network")
|
||||||
|
except AclException:
|
||||||
|
raise
|
||||||
|
except Exception:
|
||||||
|
error = True
|
||||||
|
finally:
|
||||||
|
self.__socklock.release()
|
||||||
|
|
||||||
# Daten erfolgreich übernehmen
|
# Daten immer übernehmen
|
||||||
self.__dictdirty[position] = dirtybytes
|
self.__dictdirty[position] = dirtybytes
|
||||||
|
|
||||||
self.__trigger = True
|
if error:
|
||||||
|
# Fehler nach übernahme der Daten auslösen um diese zu setzen
|
||||||
|
self.__sockerr.set()
|
||||||
|
|
||||||
|
self.__trigger = True
|
||||||
|
|
||||||
def set_timeout(self, value):
|
def set_timeout(self, value):
|
||||||
"""Setzt Timeoutwert fuer Verbindung.
|
"""Setzt Timeoutwert fuer Verbindung.
|
||||||
@param value Timeout in Millisekunden"""
|
@param value Timeout in Millisekunden"""
|
||||||
if self.__sockend:
|
if self.__sockend.is_set():
|
||||||
raise ValueError("I/O operation on closed file")
|
raise ValueError("I/O operation on closed file")
|
||||||
|
|
||||||
# Timeoutwert verarbeiten (könnte Exception auslösen)
|
# Timeoutwert verarbeiten (könnte Exception auslösen)
|
||||||
self.__set_systimeout(value)
|
self.__set_systimeout(value)
|
||||||
|
|
||||||
with self.__socklock:
|
try:
|
||||||
|
self.__socklock.acquire()
|
||||||
|
|
||||||
self._slavesock.send(
|
self._slavesock.send(
|
||||||
b'\x01CF' +
|
b'\x01CF' +
|
||||||
value.to_bytes(length=2, byteorder="little") +
|
value.to_bytes(length=2, byteorder="little") +
|
||||||
@@ -431,15 +593,20 @@ class NetFH(Thread):
|
|||||||
)
|
)
|
||||||
check = self._slavesock.recv(1)
|
check = self._slavesock.recv(1)
|
||||||
if check != b'\x1e':
|
if check != b'\x1e':
|
||||||
self.__sockerr.set()
|
|
||||||
raise IOError("set timeout error on network")
|
raise IOError("set timeout error on network")
|
||||||
|
except Exception:
|
||||||
|
self.__sockerr.set()
|
||||||
|
finally:
|
||||||
|
self.__socklock.release()
|
||||||
|
|
||||||
self.__trigger = True
|
self.__trigger = True
|
||||||
|
|
||||||
def tell(self):
|
def tell(self):
|
||||||
"""Gibt aktuelle Position zurueck.
|
"""Gibt aktuelle Position zurueck.
|
||||||
@return int aktuelle Position"""
|
@return int aktuelle Position"""
|
||||||
if self.__sockend:
|
if self.__config_changed:
|
||||||
|
raise ConfigChanged("configuration on revolution pi was changed")
|
||||||
|
if self.__sockend.is_set():
|
||||||
raise ValueError("I/O operation on closed file")
|
raise ValueError("I/O operation on closed file")
|
||||||
return self.__position
|
return self.__position
|
||||||
|
|
||||||
@@ -447,7 +614,9 @@ class NetFH(Thread):
|
|||||||
"""Daten ueber das Netzwerk schreiben.
|
"""Daten ueber das Netzwerk schreiben.
|
||||||
@param bytebuff Bytes zum schreiben
|
@param bytebuff Bytes zum schreiben
|
||||||
@return <class 'int'> Anzahl geschriebener bytes"""
|
@return <class 'int'> Anzahl geschriebener bytes"""
|
||||||
if self.__sockend:
|
if self.__config_changed:
|
||||||
|
raise ConfigChanged("configuration on revolution pi was changed")
|
||||||
|
if self.__sockend.is_set():
|
||||||
raise ValueError("write to closed file")
|
raise ValueError("write to closed file")
|
||||||
|
|
||||||
if self.__flusherr:
|
if self.__flusherr:
|
||||||
@@ -468,7 +637,9 @@ class NetFH(Thread):
|
|||||||
return len(bytebuff)
|
return len(bytebuff)
|
||||||
|
|
||||||
closed = property(get_closed)
|
closed = property(get_closed)
|
||||||
|
config_changed = property(get_config_changed)
|
||||||
name = property(get_name)
|
name = property(get_name)
|
||||||
|
reconnecting = property(get_reconnecting)
|
||||||
timeout = property(get_timeout, set_timeout)
|
timeout = property(get_timeout, set_timeout)
|
||||||
|
|
||||||
|
|
||||||
@@ -543,15 +714,15 @@ class RevPiNetIO(_RevPiModIO):
|
|||||||
|
|
||||||
# Vererben
|
# Vererben
|
||||||
super().__init__(
|
super().__init__(
|
||||||
autorefresh,
|
autorefresh=autorefresh,
|
||||||
monitoring,
|
monitoring=monitoring,
|
||||||
syncoutputs,
|
syncoutputs=syncoutputs,
|
||||||
"{0}:{1}".format(*self._address),
|
procimg="{0}:{1}".format(*self._address),
|
||||||
None,
|
configrsc=None,
|
||||||
simulator,
|
simulator=simulator,
|
||||||
debug,
|
debug=debug,
|
||||||
replace_io_file,
|
replace_io_file=replace_io_file,
|
||||||
direct_output
|
direct_output=direct_output,
|
||||||
)
|
)
|
||||||
|
|
||||||
# Netzwerkfilehandler anlegen
|
# Netzwerkfilehandler anlegen
|
||||||
@@ -560,25 +731,73 @@ class RevPiNetIO(_RevPiModIO):
|
|||||||
# Nur Konfigurieren, wenn nicht vererbt
|
# Nur Konfigurieren, wenn nicht vererbt
|
||||||
if type(self) == RevPiNetIO:
|
if type(self) == RevPiNetIO:
|
||||||
self._configure(self.get_jconfigrsc())
|
self._configure(self.get_jconfigrsc())
|
||||||
|
self._configure_replace_io(self._get_cpreplaceio())
|
||||||
|
|
||||||
def _create_myfh(self):
|
def _create_myfh(self):
|
||||||
"""Erstellt NetworkFileObject.
|
"""Erstellt NetworkFileObject.
|
||||||
return FileObject"""
|
return FileObject"""
|
||||||
self._buffedwrite = True
|
self._buffedwrite = True
|
||||||
return NetFH(self._address)
|
return NetFH(self._address, self._replace_io_file == ":network:")
|
||||||
|
|
||||||
|
def _get_cpreplaceio(self):
|
||||||
|
"""Laed die replace_io Konfiguration ueber das Netzwerk.
|
||||||
|
@return <class 'ConfigParser'> der replace io daten"""
|
||||||
|
|
||||||
|
# Normale Verwendung über Elternklasse erledigen
|
||||||
|
if self._replace_io_file != ":network:":
|
||||||
|
return super()._get_cpreplaceio()
|
||||||
|
|
||||||
|
# Replace IO Daten über das Netzwerk beziehen
|
||||||
|
byte_buff = self._myfh.readreplaceio()
|
||||||
|
|
||||||
|
cp = ConfigParser()
|
||||||
|
try:
|
||||||
|
cp.read_string(byte_buff.decode("utf-8"))
|
||||||
|
except Exception as e:
|
||||||
|
raise RuntimeError(
|
||||||
|
"replace_io_file: could not read/parse network data | {0}"
|
||||||
|
"".format(e)
|
||||||
|
)
|
||||||
|
return cp
|
||||||
|
|
||||||
def disconnect(self):
|
def disconnect(self):
|
||||||
"""Trennt Verbindungen und beendet autorefresh inkl. alle Threads."""
|
"""Trennt Verbindungen und beendet autorefresh inkl. alle Threads."""
|
||||||
self.cleanup()
|
self.cleanup()
|
||||||
|
|
||||||
|
def exit(self, full=True):
|
||||||
|
"""Beendet mainloop() und optional autorefresh.
|
||||||
|
@see #RevPiModIO.exit(...)"""
|
||||||
|
try:
|
||||||
|
super().exit(full)
|
||||||
|
except ConfigChanged:
|
||||||
|
pass
|
||||||
|
|
||||||
|
def get_config_changed(self):
|
||||||
|
"""Pruefen ob RevPi Konfiguration geaendert wurde.
|
||||||
|
|
||||||
|
In diesem Fall ist die Verbindung geschlossen und RevPiNetIO muss
|
||||||
|
neu instanziert werden.
|
||||||
|
|
||||||
|
@return True, wenn RevPi Konfiguration geaendert ist"""
|
||||||
|
return self._myfh.config_changed
|
||||||
|
|
||||||
def get_jconfigrsc(self):
|
def get_jconfigrsc(self):
|
||||||
"""Laedt die piCotry Konfiguration und erstellt ein <class 'dict'>.
|
"""Laedt die piCotry Konfiguration und erstellt ein <class 'dict'>.
|
||||||
@return <class 'dict'> der piCtory Konfiguration"""
|
@return <class 'dict'> der piCtory Konfiguration"""
|
||||||
mynh = NetFH(self._address)
|
mynh = NetFH(self._address, False)
|
||||||
byte_buff = mynh.readpictory()
|
byte_buff = mynh.readpictory()
|
||||||
mynh.close()
|
mynh.close()
|
||||||
return jloads(byte_buff.decode("utf-8"))
|
return jloads(byte_buff.decode("utf-8"))
|
||||||
|
|
||||||
|
def get_reconnecting(self):
|
||||||
|
"""Interner reconnect aktiv wegen Netzwerkfehlern.
|
||||||
|
|
||||||
|
Das Modul versucht intern die Verbindung neu herzustellen. Es ist
|
||||||
|
kein weiteres Zutun noetig.
|
||||||
|
|
||||||
|
@return True, wenn reconnect aktiv"""
|
||||||
|
return self._myfh.reconnecting
|
||||||
|
|
||||||
def net_cleardefaultvalues(self, device=None):
|
def net_cleardefaultvalues(self, device=None):
|
||||||
"""Loescht Defaultwerte vom PLC Slave.
|
"""Loescht Defaultwerte vom PLC Slave.
|
||||||
@param device nur auf einzelnes Device anwenden, sonst auf Alle"""
|
@param device nur auf einzelnes Device anwenden, sonst auf Alle"""
|
||||||
@@ -646,6 +865,9 @@ class RevPiNetIO(_RevPiModIO):
|
|||||||
dev._offset + dev._slc_out.start, dirtybytes
|
dev._offset + dev._slc_out.start, dirtybytes
|
||||||
)
|
)
|
||||||
|
|
||||||
|
config_changed = property(get_config_changed)
|
||||||
|
reconnecting = property(get_reconnecting)
|
||||||
|
|
||||||
|
|
||||||
class RevPiNetIOSelected(RevPiNetIO):
|
class RevPiNetIOSelected(RevPiNetIO):
|
||||||
|
|
||||||
@@ -695,6 +917,7 @@ class RevPiNetIOSelected(RevPiNetIO):
|
|||||||
)
|
)
|
||||||
|
|
||||||
self._configure(self.get_jconfigrsc())
|
self._configure(self.get_jconfigrsc())
|
||||||
|
self._configure_replace_io(self._get_cpreplaceio())
|
||||||
|
|
||||||
if len(self.device) == 0:
|
if len(self.device) == 0:
|
||||||
if type(self) == RevPiNetIODriver:
|
if type(self) == RevPiNetIODriver:
|
||||||
|
|||||||
Reference in New Issue
Block a user