mirror of
https://github.com/naruxde/revpipyload.git
synced 2025-11-08 15:13:52 +01:00
Mit default zusammenführen
This commit is contained in:
@@ -1,14 +1,17 @@
|
|||||||
[DEFAULT]
|
[DEFAULT]
|
||||||
autoreload=1
|
autoreload = 1
|
||||||
autostart=1
|
autostart = 1
|
||||||
plcworkdir=/var/lib/revpipyload
|
plcworkdir = /var/lib/revpipyload
|
||||||
plcprogram=program.py
|
plcprogram = program.py
|
||||||
plcarguments=
|
plcarguments=
|
||||||
plcuid=1000
|
plcuid = 1000
|
||||||
plcgid=1000
|
plcgid = 1000
|
||||||
plcslave=0
|
plcslave = 0
|
||||||
pythonversion=3
|
plcslaveacl =
|
||||||
xmlrpc=0
|
plcslaveport = 55234
|
||||||
xmlrpcport=55123
|
pythonversion = 3
|
||||||
zeroonerror=0
|
xmlrpc = 0
|
||||||
zeroonexit=0
|
xmlrpcacl =
|
||||||
|
xmlrpcport = 55123
|
||||||
|
zeroonerror = 0
|
||||||
|
zeroonexit = 0
|
||||||
|
|||||||
@@ -32,21 +32,375 @@ begrenzt werden!
|
|||||||
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||||
Global Attributes</h3>
|
Global Attributes</h3>
|
||||||
<table>
|
<table>
|
||||||
<tr><td>pyloadverion</td></tr>
|
<tr><td>configrsc</td></tr><tr><td>picontrolreset</td></tr><tr><td>procimg</td></tr><tr><td>pyloadverion</td></tr><tr><td>rapcatalog</td></tr><tr><td>re_ipacl</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="#LogReader">LogReader</a></td>
|
||||||
|
<td>Ermoeglicht den Zugriff auf die Logdateien.</td>
|
||||||
|
</tr><tr>
|
||||||
|
<td><a style="color:#0000FF" href="#PipeLogwriter">PipeLogwriter</a></td>
|
||||||
|
<td>File PIPE fuer das Schreiben des APP Log.</td>
|
||||||
|
</tr><tr>
|
||||||
|
<td><a style="color:#0000FF" href="#RevPiPlc">RevPiPlc</a></td>
|
||||||
|
<td>Verwaltet das PLC Python Programm.</td>
|
||||||
|
</tr><tr>
|
||||||
<td><a style="color:#0000FF" href="#RevPiPyLoad">RevPiPyLoad</a></td>
|
<td><a style="color:#0000FF" href="#RevPiPyLoad">RevPiPyLoad</a></td>
|
||||||
<td>Hauptklasse, die alle Funktionen zur Verfuegung stellt.</td>
|
<td>Hauptklasse, die alle Funktionen zur Verfuegung stellt.</td>
|
||||||
|
</tr><tr>
|
||||||
|
<td><a style="color:#0000FF" href="#RevPiSlave">RevPiSlave</a></td>
|
||||||
|
<td>RevPi PLC-Server.</td>
|
||||||
|
</tr><tr>
|
||||||
|
<td><a style="color:#0000FF" href="#RevPiSlaveDev">RevPiSlaveDev</a></td>
|
||||||
|
<td>Klasse um eine RevPiModIO Verbindung zu verwalten.</td>
|
||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||||
Functions</h3>
|
Functions</h3>
|
||||||
<table>
|
<table>
|
||||||
|
<tr>
|
||||||
|
<td><a style="color:#0000FF" href="#_ipmatch">_ipmatch</a></td>
|
||||||
|
<td>Prueft IP gegen ACL List und gibt ACL aus.</td>
|
||||||
|
</tr><tr>
|
||||||
|
<td><a style="color:#0000FF" href="#_zeroprocimg">_zeroprocimg</a></td>
|
||||||
|
<td>Setzt Prozessabbild auf NULL.</td>
|
||||||
|
</tr><tr>
|
||||||
|
<td><a style="color:#0000FF" href="#refullmatch">refullmatch</a></td>
|
||||||
|
<td>re.fullmatch wegen alter python version aus wheezy nachgebaut.</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
<hr /><hr />
|
||||||
|
<a NAME="LogReader" ID="LogReader"></a>
|
||||||
|
<h2 style="background-color:#FFFFFF;color:#0000FF">LogReader</h2>
|
||||||
|
<p>
|
||||||
|
Ermoeglicht den Zugriff auf die Logdateien.
|
||||||
|
</p><p>
|
||||||
|
Beinhaltet Funktionen fuer den Abruf der gesamten Logdatei fuer das
|
||||||
|
RevPiPyLoad-System und die Logdatei der PLC-Anwendung.
|
||||||
|
</p><p>
|
||||||
|
|
||||||
|
</p>
|
||||||
|
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||||
|
Derived from</h3>
|
||||||
|
None
|
||||||
|
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||||
|
Class Attributes</h3>
|
||||||
|
<table>
|
||||||
<tr><td>None</td></tr>
|
<tr><td>None</td></tr>
|
||||||
</table>
|
</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><a style="color:#0000FF" href="#LogReader.__init__">LogReader</a></td>
|
||||||
|
<td>Instantiiert LogReader-Klasse.</td>
|
||||||
|
</tr><tr>
|
||||||
|
<td><a style="color:#0000FF" href="#LogReader.closeall">closeall</a></td>
|
||||||
|
<td>Fuehrt close auf File Handler durch.</td>
|
||||||
|
</tr><tr>
|
||||||
|
<td><a style="color:#0000FF" href="#LogReader.load_applog">load_applog</a></td>
|
||||||
|
<td>Uebertraegt Logdaten des PLC Programms Binaer.</td>
|
||||||
|
</tr><tr>
|
||||||
|
<td><a style="color:#0000FF" href="#LogReader.load_plclog">load_plclog</a></td>
|
||||||
|
<td>Uebertraegt Logdaten des Loaders Binaer.</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||||
|
Static Methods</h3>
|
||||||
|
<table>
|
||||||
|
<tr><td>None</td></tr>
|
||||||
|
</table>
|
||||||
|
<a NAME="LogReader.__init__" ID="LogReader.__init__"></a>
|
||||||
|
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||||
|
LogReader (Constructor)</h3>
|
||||||
|
<b>LogReader</b>(<i></i>)
|
||||||
|
<p>
|
||||||
|
Instantiiert LogReader-Klasse.
|
||||||
|
</p><a NAME="LogReader.closeall" ID="LogReader.closeall"></a>
|
||||||
|
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||||
|
LogReader.closeall</h3>
|
||||||
|
<b>closeall</b>(<i></i>)
|
||||||
|
<p>
|
||||||
|
Fuehrt close auf File Handler durch.
|
||||||
|
</p><a NAME="LogReader.load_applog" ID="LogReader.load_applog"></a>
|
||||||
|
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||||
|
LogReader.load_applog</h3>
|
||||||
|
<b>load_applog</b>(<i>start, count</i>)
|
||||||
|
<p>
|
||||||
|
Uebertraegt Logdaten des PLC Programms Binaer.
|
||||||
|
</p><dl>
|
||||||
|
<dt><i>start</i></dt>
|
||||||
|
<dd>
|
||||||
|
Startbyte
|
||||||
|
</dd><dt><i>count</i></dt>
|
||||||
|
<dd>
|
||||||
|
Max. Byteanzahl zum uebertragen
|
||||||
|
</dd>
|
||||||
|
</dl><dl>
|
||||||
|
<dt>Returns:</dt>
|
||||||
|
<dd>
|
||||||
|
Binary() der Logdatei
|
||||||
|
</dd>
|
||||||
|
</dl><a NAME="LogReader.load_plclog" ID="LogReader.load_plclog"></a>
|
||||||
|
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||||
|
LogReader.load_plclog</h3>
|
||||||
|
<b>load_plclog</b>(<i>start, count</i>)
|
||||||
|
<p>
|
||||||
|
Uebertraegt Logdaten des Loaders Binaer.
|
||||||
|
</p><dl>
|
||||||
|
<dt><i>start</i></dt>
|
||||||
|
<dd>
|
||||||
|
Startbyte
|
||||||
|
</dd><dt><i>count</i></dt>
|
||||||
|
<dd>
|
||||||
|
Max. Byteanzahl zum uebertragen
|
||||||
|
</dd>
|
||||||
|
</dl><dl>
|
||||||
|
<dt>Returns:</dt>
|
||||||
|
<dd>
|
||||||
|
Binary() der Logdatei
|
||||||
|
</dd>
|
||||||
|
</dl>
|
||||||
|
<div align="right"><a style="color:#0000FF" href="#top">Up</a></div>
|
||||||
|
<hr /><hr />
|
||||||
|
<a NAME="PipeLogwriter" ID="PipeLogwriter"></a>
|
||||||
|
<h2 style="background-color:#FFFFFF;color:#0000FF">PipeLogwriter</h2>
|
||||||
|
<p>
|
||||||
|
File PIPE fuer das Schreiben des APP Log.
|
||||||
|
</p><p>
|
||||||
|
Spezieller LogFile-Handler fuer die Ausgabe des subprocess fuer das Python
|
||||||
|
PLC Programm. Die Ausgabe kann nicht auf einen neuen FileHandler
|
||||||
|
umgeschrieben werden. Dadurch waere es nicht moeglich nach einem logrotate
|
||||||
|
die neue Datei zu verwenden. Ueber die PIPE wird dies umgangen.
|
||||||
|
</p><p>
|
||||||
|
|
||||||
|
</p>
|
||||||
|
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||||
|
Derived from</h3>
|
||||||
|
Thread
|
||||||
|
<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><a style="color:#0000FF" href="#PipeLogwriter.__init__">PipeLogwriter</a></td>
|
||||||
|
<td>Instantiiert PipeLogwriter-Klasse.</td>
|
||||||
|
</tr><tr>
|
||||||
|
<td><a style="color:#0000FF" href="#PipeLogwriter.__del__">__del__</a></td>
|
||||||
|
<td>Close file handler.</td>
|
||||||
|
</tr><tr>
|
||||||
|
<td><a style="color:#0000FF" href="#PipeLogwriter._configurefh">_configurefh</a></td>
|
||||||
|
<td>Konfiguriert den FileHandler fuer Ausgaben der PLCAPP.</td>
|
||||||
|
</tr><tr>
|
||||||
|
<td><a style="color:#0000FF" href="#PipeLogwriter.logline">logline</a></td>
|
||||||
|
<td>Schreibt eine Zeile in die Logdatei oder stdout.</td>
|
||||||
|
</tr><tr>
|
||||||
|
<td><a style="color:#0000FF" href="#PipeLogwriter.newlogfile">newlogfile</a></td>
|
||||||
|
<td>Konfiguriert den FileHandler auf eine neue Logdatei.</td>
|
||||||
|
</tr><tr>
|
||||||
|
<td><a style="color:#0000FF" href="#PipeLogwriter.run">run</a></td>
|
||||||
|
<td>Prueft auf neue Logzeilen und schreibt diese.</td>
|
||||||
|
</tr><tr>
|
||||||
|
<td><a style="color:#0000FF" href="#PipeLogwriter.stop">stop</a></td>
|
||||||
|
<td>Beendetden Thread und die FileHandler werden geschlossen.</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||||
|
Static Methods</h3>
|
||||||
|
<table>
|
||||||
|
<tr><td>None</td></tr>
|
||||||
|
</table>
|
||||||
|
<a NAME="PipeLogwriter.__init__" ID="PipeLogwriter.__init__"></a>
|
||||||
|
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||||
|
PipeLogwriter (Constructor)</h3>
|
||||||
|
<b>PipeLogwriter</b>(<i>logfilename</i>)
|
||||||
|
<p>
|
||||||
|
Instantiiert PipeLogwriter-Klasse.
|
||||||
|
</p><dl>
|
||||||
|
<dt><i>logfilename</i></dt>
|
||||||
|
<dd>
|
||||||
|
Dateiname fuer Logdatei
|
||||||
|
</dd>
|
||||||
|
</dl><a NAME="PipeLogwriter.__del__" ID="PipeLogwriter.__del__"></a>
|
||||||
|
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||||
|
PipeLogwriter.__del__</h3>
|
||||||
|
<b>__del__</b>(<i></i>)
|
||||||
|
<p>
|
||||||
|
Close file handler.
|
||||||
|
</p><a NAME="PipeLogwriter._configurefh" ID="PipeLogwriter._configurefh"></a>
|
||||||
|
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||||
|
PipeLogwriter._configurefh</h3>
|
||||||
|
<b>_configurefh</b>(<i></i>)
|
||||||
|
<p>
|
||||||
|
Konfiguriert den FileHandler fuer Ausgaben der PLCAPP.
|
||||||
|
</p><dl>
|
||||||
|
<dt>Returns:</dt>
|
||||||
|
<dd>
|
||||||
|
FileHandler-Objekt
|
||||||
|
</dd>
|
||||||
|
</dl><a NAME="PipeLogwriter.logline" ID="PipeLogwriter.logline"></a>
|
||||||
|
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||||
|
PipeLogwriter.logline</h3>
|
||||||
|
<b>logline</b>(<i>message</i>)
|
||||||
|
<p>
|
||||||
|
Schreibt eine Zeile in die Logdatei oder stdout.
|
||||||
|
</p><dl>
|
||||||
|
<dt><i>message</i></dt>
|
||||||
|
<dd>
|
||||||
|
Logzeile zum Schreiben
|
||||||
|
</dd>
|
||||||
|
</dl><a NAME="PipeLogwriter.newlogfile" ID="PipeLogwriter.newlogfile"></a>
|
||||||
|
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||||
|
PipeLogwriter.newlogfile</h3>
|
||||||
|
<b>newlogfile</b>(<i></i>)
|
||||||
|
<p>
|
||||||
|
Konfiguriert den FileHandler auf eine neue Logdatei.
|
||||||
|
</p><a NAME="PipeLogwriter.run" ID="PipeLogwriter.run"></a>
|
||||||
|
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||||
|
PipeLogwriter.run</h3>
|
||||||
|
<b>run</b>(<i></i>)
|
||||||
|
<p>
|
||||||
|
Prueft auf neue Logzeilen und schreibt diese.
|
||||||
|
</p><a NAME="PipeLogwriter.stop" ID="PipeLogwriter.stop"></a>
|
||||||
|
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||||
|
PipeLogwriter.stop</h3>
|
||||||
|
<b>stop</b>(<i></i>)
|
||||||
|
<p>
|
||||||
|
Beendetden Thread und die FileHandler werden geschlossen.
|
||||||
|
</p>
|
||||||
|
<div align="right"><a style="color:#0000FF" href="#top">Up</a></div>
|
||||||
|
<hr /><hr />
|
||||||
|
<a NAME="RevPiPlc" ID="RevPiPlc"></a>
|
||||||
|
<h2 style="background-color:#FFFFFF;color:#0000FF">RevPiPlc</h2>
|
||||||
|
<p>
|
||||||
|
Verwaltet das PLC Python Programm.
|
||||||
|
</p><p>
|
||||||
|
Dieser Thread startet das PLC Python Programm und ueberwacht es. Sollte es
|
||||||
|
abstuerzen kann es automatisch neu gestartet werden. Die Ausgaben des
|
||||||
|
Programms werden in eine Logdatei umgeleitet, damit der Entwickler sein
|
||||||
|
Programm analysieren und debuggen kann.
|
||||||
|
</p><p>
|
||||||
|
|
||||||
|
</p>
|
||||||
|
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||||
|
Derived from</h3>
|
||||||
|
Thread
|
||||||
|
<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><a style="color:#0000FF" href="#RevPiPlc.__init__">RevPiPlc</a></td>
|
||||||
|
<td>Instantiiert RevPiPlc-Klasse.</td>
|
||||||
|
</tr><tr>
|
||||||
|
<td><a style="color:#0000FF" href="#RevPiPlc._configureplw">_configureplw</a></td>
|
||||||
|
<td>Konfiguriert den PipeLogwriter fuer Ausgaben der PLCAPP.</td>
|
||||||
|
</tr><tr>
|
||||||
|
<td><a style="color:#0000FF" href="#RevPiPlc._setuppopen">_setuppopen</a></td>
|
||||||
|
<td>Setzt UID und GID fuer das PLC Programm.</td>
|
||||||
|
</tr><tr>
|
||||||
|
<td><a style="color:#0000FF" href="#RevPiPlc._spopen">_spopen</a></td>
|
||||||
|
<td>Startet das PLC Programm.</td>
|
||||||
|
</tr><tr>
|
||||||
|
<td><a style="color:#0000FF" href="#RevPiPlc.newlogfile">newlogfile</a></td>
|
||||||
|
<td>Konfiguriert die FileHandler auf neue Logdatei.</td>
|
||||||
|
</tr><tr>
|
||||||
|
<td><a style="color:#0000FF" href="#RevPiPlc.run">run</a></td>
|
||||||
|
<td>Fuehrt PLC-Programm aus und ueberwacht es.</td>
|
||||||
|
</tr><tr>
|
||||||
|
<td><a style="color:#0000FF" href="#RevPiPlc.stop">stop</a></td>
|
||||||
|
<td>Beendet PLC-Programm.</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||||
|
Static Methods</h3>
|
||||||
|
<table>
|
||||||
|
<tr><td>None</td></tr>
|
||||||
|
</table>
|
||||||
|
<a NAME="RevPiPlc.__init__" ID="RevPiPlc.__init__"></a>
|
||||||
|
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||||
|
RevPiPlc (Constructor)</h3>
|
||||||
|
<b>RevPiPlc</b>(<i>program, arguments, pversion</i>)
|
||||||
|
<p>
|
||||||
|
Instantiiert RevPiPlc-Klasse.
|
||||||
|
</p><a NAME="RevPiPlc._configureplw" ID="RevPiPlc._configureplw"></a>
|
||||||
|
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||||
|
RevPiPlc._configureplw</h3>
|
||||||
|
<b>_configureplw</b>(<i></i>)
|
||||||
|
<p>
|
||||||
|
Konfiguriert den PipeLogwriter fuer Ausgaben der PLCAPP.
|
||||||
|
</p><dl>
|
||||||
|
<dt>Returns:</dt>
|
||||||
|
<dd>
|
||||||
|
PipeLogwriter()
|
||||||
|
</dd>
|
||||||
|
</dl><a NAME="RevPiPlc._setuppopen" ID="RevPiPlc._setuppopen"></a>
|
||||||
|
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||||
|
RevPiPlc._setuppopen</h3>
|
||||||
|
<b>_setuppopen</b>(<i></i>)
|
||||||
|
<p>
|
||||||
|
Setzt UID und GID fuer das PLC Programm.
|
||||||
|
</p><a NAME="RevPiPlc._spopen" ID="RevPiPlc._spopen"></a>
|
||||||
|
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||||
|
RevPiPlc._spopen</h3>
|
||||||
|
<b>_spopen</b>(<i>lst_proc</i>)
|
||||||
|
<p>
|
||||||
|
Startet das PLC Programm.
|
||||||
|
</p><dl>
|
||||||
|
<dt><i>lst_proc</i></dt>
|
||||||
|
<dd>
|
||||||
|
Prozessliste
|
||||||
|
</dd>
|
||||||
|
</dl><dl>
|
||||||
|
<dt>Returns:</dt>
|
||||||
|
<dd>
|
||||||
|
subprocess
|
||||||
|
</dd>
|
||||||
|
</dl><a NAME="RevPiPlc.newlogfile" ID="RevPiPlc.newlogfile"></a>
|
||||||
|
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||||
|
RevPiPlc.newlogfile</h3>
|
||||||
|
<b>newlogfile</b>(<i></i>)
|
||||||
|
<p>
|
||||||
|
Konfiguriert die FileHandler auf neue Logdatei.
|
||||||
|
</p><a NAME="RevPiPlc.run" ID="RevPiPlc.run"></a>
|
||||||
|
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||||
|
RevPiPlc.run</h3>
|
||||||
|
<b>run</b>(<i></i>)
|
||||||
|
<p>
|
||||||
|
Fuehrt PLC-Programm aus und ueberwacht es.
|
||||||
|
</p><a NAME="RevPiPlc.stop" ID="RevPiPlc.stop"></a>
|
||||||
|
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||||
|
RevPiPlc.stop</h3>
|
||||||
|
<b>stop</b>(<i></i>)
|
||||||
|
<p>
|
||||||
|
Beendet PLC-Programm.
|
||||||
|
</p>
|
||||||
|
<div align="right"><a style="color:#0000FF" href="#top">Up</a></div>
|
||||||
<hr /><hr />
|
<hr /><hr />
|
||||||
<a NAME="RevPiPyLoad" ID="RevPiPyLoad"></a>
|
<a NAME="RevPiPyLoad" ID="RevPiPyLoad"></a>
|
||||||
<h2 style="background-color:#FFFFFF;color:#0000FF">RevPiPyLoad</h2>
|
<h2 style="background-color:#FFFFFF;color:#0000FF">RevPiPyLoad</h2>
|
||||||
@@ -123,6 +477,12 @@ Methods</h3>
|
|||||||
<td><a style="color:#0000FF" href="#RevPiPyLoad.xml_plcrunning">xml_plcrunning</a></td>
|
<td><a style="color:#0000FF" href="#RevPiPyLoad.xml_plcrunning">xml_plcrunning</a></td>
|
||||||
<td>Prueft ob das PLC Programm noch lauft.</td>
|
<td>Prueft ob das PLC Programm noch lauft.</td>
|
||||||
</tr><tr>
|
</tr><tr>
|
||||||
|
<td><a style="color:#0000FF" href="#RevPiPyLoad.xml_plcslavestart">xml_plcslavestart</a></td>
|
||||||
|
<td>Startet den PLC Slave Server.</td>
|
||||||
|
</tr><tr>
|
||||||
|
<td><a style="color:#0000FF" href="#RevPiPyLoad.xml_plcslavestop">xml_plcslavestop</a></td>
|
||||||
|
<td>Stoppt den PLC Slave Server.</td>
|
||||||
|
</tr><tr>
|
||||||
<td><a style="color:#0000FF" href="#RevPiPyLoad.xml_plcstart">xml_plcstart</a></td>
|
<td><a style="color:#0000FF" href="#RevPiPyLoad.xml_plcstart">xml_plcstart</a></td>
|
||||||
<td>Startet das PLC Programm.</td>
|
<td>Startet das PLC Programm.</td>
|
||||||
</tr><tr>
|
</tr><tr>
|
||||||
@@ -316,6 +676,31 @@ Prueft ob das PLC Programm noch lauft.
|
|||||||
<dd>
|
<dd>
|
||||||
True, wenn das PLC Programm noch lauft
|
True, wenn das PLC Programm noch lauft
|
||||||
</dd>
|
</dd>
|
||||||
|
</dl><a NAME="RevPiPyLoad.xml_plcslavestart" ID="RevPiPyLoad.xml_plcslavestart"></a>
|
||||||
|
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||||
|
RevPiPyLoad.xml_plcslavestart</h3>
|
||||||
|
<b>xml_plcslavestart</b>(<i></i>)
|
||||||
|
<p>
|
||||||
|
Startet den PLC Slave Server.
|
||||||
|
</p><dl>
|
||||||
|
<dt>Returns:</dt>
|
||||||
|
<dd>
|
||||||
|
Statuscode:
|
||||||
|
0: erfolgreich gestartet
|
||||||
|
-1: Nicht aktiv in Konfiguration
|
||||||
|
-2: Laeuft bereits
|
||||||
|
</dd>
|
||||||
|
</dl><a NAME="RevPiPyLoad.xml_plcslavestop" ID="RevPiPyLoad.xml_plcslavestop"></a>
|
||||||
|
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||||
|
RevPiPyLoad.xml_plcslavestop</h3>
|
||||||
|
<b>xml_plcslavestop</b>(<i></i>)
|
||||||
|
<p>
|
||||||
|
Stoppt den PLC Slave Server.
|
||||||
|
</p><dl>
|
||||||
|
<dt>Returns:</dt>
|
||||||
|
<dd>
|
||||||
|
True, wenn stop erfolgreich
|
||||||
|
</dd>
|
||||||
</dl><a NAME="RevPiPyLoad.xml_plcstart" ID="RevPiPyLoad.xml_plcstart"></a>
|
</dl><a NAME="RevPiPyLoad.xml_plcstart" ID="RevPiPyLoad.xml_plcstart"></a>
|
||||||
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||||
RevPiPyLoad.xml_plcstart</h3>
|
RevPiPyLoad.xml_plcstart</h3>
|
||||||
@@ -440,5 +825,211 @@ Statuscode:
|
|||||||
</dd>
|
</dd>
|
||||||
</dl>
|
</dl>
|
||||||
<div align="right"><a style="color:#0000FF" href="#top">Up</a></div>
|
<div align="right"><a style="color:#0000FF" href="#top">Up</a></div>
|
||||||
|
<hr /><hr />
|
||||||
|
<a NAME="RevPiSlave" ID="RevPiSlave"></a>
|
||||||
|
<h2 style="background-color:#FFFFFF;color:#0000FF">RevPiSlave</h2>
|
||||||
|
<p>
|
||||||
|
RevPi PLC-Server.
|
||||||
|
</p><p>
|
||||||
|
Diese Klasste stellt den RevPi PLC-Server zur verfuegung und akzeptiert
|
||||||
|
neue Verbindungen. Dieser werden dann als RevPiSlaveDev abgebildet.
|
||||||
|
</p><p>
|
||||||
|
Ueber die angegebenen ACLs koennen Zugriffsbeschraenkungen vergeben werden.
|
||||||
|
</p><p>
|
||||||
|
|
||||||
|
</p>
|
||||||
|
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||||
|
Derived from</h3>
|
||||||
|
Thread
|
||||||
|
<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><a style="color:#0000FF" href="#RevPiSlave.__init__">RevPiSlave</a></td>
|
||||||
|
<td>Instantiiert RevPiSlave-Klasse.</td>
|
||||||
|
</tr><tr>
|
||||||
|
<td><a style="color:#0000FF" href="#RevPiSlave.newlogfile">newlogfile</a></td>
|
||||||
|
<td>Konfiguriert die FileHandler auf neue Logdatei.</td>
|
||||||
|
</tr><tr>
|
||||||
|
<td><a style="color:#0000FF" href="#RevPiSlave.run">run</a></td>
|
||||||
|
<td>Startet Serverkomponente fuer die Annahme neuer Verbindungen.</td>
|
||||||
|
</tr><tr>
|
||||||
|
<td><a style="color:#0000FF" href="#RevPiSlave.stop">stop</a></td>
|
||||||
|
<td>Beendet Slaveausfuehrung.</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||||
|
Static Methods</h3>
|
||||||
|
<table>
|
||||||
|
<tr><td>None</td></tr>
|
||||||
|
</table>
|
||||||
|
<a NAME="RevPiSlave.__init__" ID="RevPiSlave.__init__"></a>
|
||||||
|
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||||
|
RevPiSlave (Constructor)</h3>
|
||||||
|
<b>RevPiSlave</b>(<i>acl, port=55234</i>)
|
||||||
|
<p>
|
||||||
|
Instantiiert RevPiSlave-Klasse.
|
||||||
|
</p><dl>
|
||||||
|
<dt><i>acl</i></dt>
|
||||||
|
<dd>
|
||||||
|
Stringliste mit Leerstellen getrennt
|
||||||
|
</dd><dt><i>port</i></dt>
|
||||||
|
<dd>
|
||||||
|
Listen Port fuer plc Slaveserver
|
||||||
|
</dd>
|
||||||
|
</dl><a NAME="RevPiSlave.newlogfile" ID="RevPiSlave.newlogfile"></a>
|
||||||
|
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||||
|
RevPiSlave.newlogfile</h3>
|
||||||
|
<b>newlogfile</b>(<i></i>)
|
||||||
|
<p>
|
||||||
|
Konfiguriert die FileHandler auf neue Logdatei.
|
||||||
|
</p><a NAME="RevPiSlave.run" ID="RevPiSlave.run"></a>
|
||||||
|
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||||
|
RevPiSlave.run</h3>
|
||||||
|
<b>run</b>(<i></i>)
|
||||||
|
<p>
|
||||||
|
Startet Serverkomponente fuer die Annahme neuer Verbindungen.
|
||||||
|
</p><a NAME="RevPiSlave.stop" ID="RevPiSlave.stop"></a>
|
||||||
|
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||||
|
RevPiSlave.stop</h3>
|
||||||
|
<b>stop</b>(<i></i>)
|
||||||
|
<p>
|
||||||
|
Beendet Slaveausfuehrung.
|
||||||
|
</p>
|
||||||
|
<div align="right"><a style="color:#0000FF" href="#top">Up</a></div>
|
||||||
|
<hr /><hr />
|
||||||
|
<a NAME="RevPiSlaveDev" ID="RevPiSlaveDev"></a>
|
||||||
|
<h2 style="background-color:#FFFFFF;color:#0000FF">RevPiSlaveDev</h2>
|
||||||
|
<p>
|
||||||
|
Klasse um eine RevPiModIO Verbindung zu verwalten.
|
||||||
|
</p><p>
|
||||||
|
Diese Klasste stellt die Funktionen zur Verfuegung um Daten ueber das
|
||||||
|
Netzwerk mit dem Prozessabbild auszutauschen.
|
||||||
|
</p><p>
|
||||||
|
|
||||||
|
</p>
|
||||||
|
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||||
|
Derived from</h3>
|
||||||
|
Thread
|
||||||
|
<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><a style="color:#0000FF" href="#RevPiSlaveDev.__init__">RevPiSlaveDev</a></td>
|
||||||
|
<td>Init RevPiSlaveDev-Class.</td>
|
||||||
|
</tr><tr>
|
||||||
|
<td><a style="color:#0000FF" href="#RevPiSlaveDev.run">run</a></td>
|
||||||
|
<td>Verarbeitet Anfragen von Remoteteilnehmer.</td>
|
||||||
|
</tr><tr>
|
||||||
|
<td><a style="color:#0000FF" href="#RevPiSlaveDev.stop">stop</a></td>
|
||||||
|
<td>Beendet Verbindungsthread.</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||||
|
Static Methods</h3>
|
||||||
|
<table>
|
||||||
|
<tr><td>None</td></tr>
|
||||||
|
</table>
|
||||||
|
<a NAME="RevPiSlaveDev.__init__" ID="RevPiSlaveDev.__init__"></a>
|
||||||
|
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||||
|
RevPiSlaveDev (Constructor)</h3>
|
||||||
|
<b>RevPiSlaveDev</b>(<i>devcon, acl</i>)
|
||||||
|
<p>
|
||||||
|
Init RevPiSlaveDev-Class.
|
||||||
|
</p><dl>
|
||||||
|
<dt><i>devcon</i></dt>
|
||||||
|
<dd>
|
||||||
|
Tuple der Verbindung
|
||||||
|
</dd><dt><i>deadtime</i></dt>
|
||||||
|
<dd>
|
||||||
|
Timeout der Vararbeitung
|
||||||
|
</dd><dt><i>acl</i></dt>
|
||||||
|
<dd>
|
||||||
|
Berechtigungslevel
|
||||||
|
</dd>
|
||||||
|
</dl><a NAME="RevPiSlaveDev.run" ID="RevPiSlaveDev.run"></a>
|
||||||
|
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||||
|
RevPiSlaveDev.run</h3>
|
||||||
|
<b>run</b>(<i></i>)
|
||||||
|
<p>
|
||||||
|
Verarbeitet Anfragen von Remoteteilnehmer.
|
||||||
|
</p><a NAME="RevPiSlaveDev.stop" ID="RevPiSlaveDev.stop"></a>
|
||||||
|
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||||
|
RevPiSlaveDev.stop</h3>
|
||||||
|
<b>stop</b>(<i></i>)
|
||||||
|
<p>
|
||||||
|
Beendet Verbindungsthread.
|
||||||
|
</p>
|
||||||
|
<div align="right"><a style="color:#0000FF" href="#top">Up</a></div>
|
||||||
|
<hr /><hr />
|
||||||
|
<a NAME="_ipmatch" ID="_ipmatch"></a>
|
||||||
|
<h2 style="background-color:#FFFFFF;color:#0000FF">_ipmatch</h2>
|
||||||
|
<b>_ipmatch</b>(<i>ipaddress, dict_acl</i>)
|
||||||
|
<p>
|
||||||
|
Prueft IP gegen ACL List und gibt ACL aus.
|
||||||
|
</p><dl>
|
||||||
|
<dt><i>ipaddress</i></dt>
|
||||||
|
<dd>
|
||||||
|
zum pruefen
|
||||||
|
</dd><dt><i>dict_acl</i></dt>
|
||||||
|
<dd>
|
||||||
|
ACL Dict gegen die IP zu pruefen ist
|
||||||
|
</dd>
|
||||||
|
</dl><dl>
|
||||||
|
<dt>Returns:</dt>
|
||||||
|
<dd>
|
||||||
|
int() ACL Wert oder -1 wenn nicht gefunden
|
||||||
|
</dd>
|
||||||
|
</dl>
|
||||||
|
<div align="right"><a style="color:#0000FF" href="#top">Up</a></div>
|
||||||
|
<hr /><hr />
|
||||||
|
<a NAME="_zeroprocimg" ID="_zeroprocimg"></a>
|
||||||
|
<h2 style="background-color:#FFFFFF;color:#0000FF">_zeroprocimg</h2>
|
||||||
|
<b>_zeroprocimg</b>(<i></i>)
|
||||||
|
<p>
|
||||||
|
Setzt Prozessabbild auf NULL.
|
||||||
|
</p>
|
||||||
|
<div align="right"><a style="color:#0000FF" href="#top">Up</a></div>
|
||||||
|
<hr /><hr />
|
||||||
|
<a NAME="refullmatch" ID="refullmatch"></a>
|
||||||
|
<h2 style="background-color:#FFFFFF;color:#0000FF">refullmatch</h2>
|
||||||
|
<b>refullmatch</b>(<i>regex, string</i>)
|
||||||
|
<p>
|
||||||
|
re.fullmatch wegen alter python version aus wheezy nachgebaut.
|
||||||
|
</p><dl>
|
||||||
|
<dt><i>regex</i></dt>
|
||||||
|
<dd>
|
||||||
|
RegEx Statement
|
||||||
|
</dd><dt><i>string</i></dt>
|
||||||
|
<dd>
|
||||||
|
Zeichenfolge gegen die getestet wird
|
||||||
|
</dd>
|
||||||
|
</dl><dl>
|
||||||
|
<dt>Returns:</dt>
|
||||||
|
<dd>
|
||||||
|
True, wenn komplett passt sonst False
|
||||||
|
</dd>
|
||||||
|
</dl>
|
||||||
|
<div align="right"><a style="color:#0000FF" href="#top">Up</a></div>
|
||||||
<hr />
|
<hr />
|
||||||
</body></html>
|
</body></html>
|
||||||
@@ -1,21 +1,3 @@
|
|||||||
logsystem.LogReader.closeall?4()
|
|
||||||
logsystem.LogReader.load_applog?4(start, count)
|
|
||||||
logsystem.LogReader.load_plclog?4(start, count)
|
|
||||||
logsystem.LogReader?1()
|
|
||||||
logsystem.PipeLogwriter.__del__?6()
|
|
||||||
logsystem.PipeLogwriter._configurefh?5()
|
|
||||||
logsystem.PipeLogwriter.logline?4(message)
|
|
||||||
logsystem.PipeLogwriter.newlogfile?4()
|
|
||||||
logsystem.PipeLogwriter.run?4()
|
|
||||||
logsystem.PipeLogwriter.stop?4()
|
|
||||||
logsystem.PipeLogwriter?1(logfilename)
|
|
||||||
plcsystem.RevPiPlc._configureplw?5()
|
|
||||||
plcsystem.RevPiPlc._setuppopen?5()
|
|
||||||
plcsystem.RevPiPlc._spopen?5(lst_proc)
|
|
||||||
plcsystem.RevPiPlc.newlogfile?4()
|
|
||||||
plcsystem.RevPiPlc.run?4()
|
|
||||||
plcsystem.RevPiPlc.stop?4()
|
|
||||||
plcsystem.RevPiPlc?1(program, arguments, pversion)
|
|
||||||
procimgserver.ProcimgServer.devices?4()
|
procimgserver.ProcimgServer.devices?4()
|
||||||
procimgserver.ProcimgServer.ios?4(type)
|
procimgserver.ProcimgServer.ios?4(type)
|
||||||
procimgserver.ProcimgServer.loadrevpimodio?4()
|
procimgserver.ProcimgServer.loadrevpimodio?4()
|
||||||
@@ -23,8 +5,7 @@ procimgserver.ProcimgServer.setvalue?4(device, io, value)
|
|||||||
procimgserver.ProcimgServer.start?4()
|
procimgserver.ProcimgServer.start?4()
|
||||||
procimgserver.ProcimgServer.stop?4()
|
procimgserver.ProcimgServer.stop?4()
|
||||||
procimgserver.ProcimgServer.values?4()
|
procimgserver.ProcimgServer.values?4()
|
||||||
procimgserver.ProcimgServer?1(xmlserver, aclmode)
|
procimgserver.ProcimgServer?1(logger, xmlserver, configrsc, procimg, aclmode)
|
||||||
proginit._zeroprocimg?5(self)
|
|
||||||
proginit.cleanup?4()
|
proginit.cleanup?4()
|
||||||
proginit.configure?4()
|
proginit.configure?4()
|
||||||
proginit.forked?7
|
proginit.forked?7
|
||||||
@@ -33,9 +14,25 @@ proginit.logapp?7
|
|||||||
proginit.logger?7
|
proginit.logger?7
|
||||||
proginit.logplc?7
|
proginit.logplc?7
|
||||||
proginit.pargs?7
|
proginit.pargs?7
|
||||||
proginit.picontrolreset?7
|
|
||||||
proginit.rapcatalog?7
|
|
||||||
proginit.startdir?7
|
proginit.startdir?7
|
||||||
|
revpipyload.LogReader.closeall?4()
|
||||||
|
revpipyload.LogReader.load_applog?4(start, count)
|
||||||
|
revpipyload.LogReader.load_plclog?4(start, count)
|
||||||
|
revpipyload.LogReader?1()
|
||||||
|
revpipyload.PipeLogwriter.__del__?6()
|
||||||
|
revpipyload.PipeLogwriter._configurefh?5()
|
||||||
|
revpipyload.PipeLogwriter.logline?4(message)
|
||||||
|
revpipyload.PipeLogwriter.newlogfile?4()
|
||||||
|
revpipyload.PipeLogwriter.run?4()
|
||||||
|
revpipyload.PipeLogwriter.stop?4()
|
||||||
|
revpipyload.PipeLogwriter?1(logfilename)
|
||||||
|
revpipyload.RevPiPlc._configureplw?5()
|
||||||
|
revpipyload.RevPiPlc._setuppopen?5()
|
||||||
|
revpipyload.RevPiPlc._spopen?5(lst_proc)
|
||||||
|
revpipyload.RevPiPlc.newlogfile?4()
|
||||||
|
revpipyload.RevPiPlc.run?4()
|
||||||
|
revpipyload.RevPiPlc.stop?4()
|
||||||
|
revpipyload.RevPiPlc?1(program, arguments, pversion)
|
||||||
revpipyload.RevPiPyLoad._loadconfig?5()
|
revpipyload.RevPiPyLoad._loadconfig?5()
|
||||||
revpipyload.RevPiPyLoad._plcthread?5()
|
revpipyload.RevPiPyLoad._plcthread?5()
|
||||||
revpipyload.RevPiPyLoad._sigexit?5(signum, frame)
|
revpipyload.RevPiPyLoad._sigexit?5(signum, frame)
|
||||||
@@ -52,6 +49,8 @@ revpipyload.RevPiPyLoad.xml_getprocimg?4()
|
|||||||
revpipyload.RevPiPyLoad.xml_plcdownload?4(mode="tar", pictory=False)
|
revpipyload.RevPiPyLoad.xml_plcdownload?4(mode="tar", pictory=False)
|
||||||
revpipyload.RevPiPyLoad.xml_plcexitcode?4()
|
revpipyload.RevPiPyLoad.xml_plcexitcode?4()
|
||||||
revpipyload.RevPiPyLoad.xml_plcrunning?4()
|
revpipyload.RevPiPyLoad.xml_plcrunning?4()
|
||||||
|
revpipyload.RevPiPyLoad.xml_plcslavestart?4()
|
||||||
|
revpipyload.RevPiPyLoad.xml_plcslavestop?4()
|
||||||
revpipyload.RevPiPyLoad.xml_plcstart?4()
|
revpipyload.RevPiPyLoad.xml_plcstart?4()
|
||||||
revpipyload.RevPiPyLoad.xml_plcstop?4()
|
revpipyload.RevPiPyLoad.xml_plcstop?4()
|
||||||
revpipyload.RevPiPyLoad.xml_plcupload?4(filedata, filename)
|
revpipyload.RevPiPyLoad.xml_plcupload?4(filedata, filename)
|
||||||
@@ -62,4 +61,19 @@ revpipyload.RevPiPyLoad.xml_reload?4()
|
|||||||
revpipyload.RevPiPyLoad.xml_setconfig?4(dc, loadnow=False)
|
revpipyload.RevPiPyLoad.xml_setconfig?4(dc, loadnow=False)
|
||||||
revpipyload.RevPiPyLoad.xml_setpictoryrsc?4(filebytes, reset=False)
|
revpipyload.RevPiPyLoad.xml_setpictoryrsc?4(filebytes, reset=False)
|
||||||
revpipyload.RevPiPyLoad?1()
|
revpipyload.RevPiPyLoad?1()
|
||||||
|
revpipyload.RevPiSlave.newlogfile?4()
|
||||||
|
revpipyload.RevPiSlave.run?4()
|
||||||
|
revpipyload.RevPiSlave.stop?4()
|
||||||
|
revpipyload.RevPiSlave?1(acl, port=55234)
|
||||||
|
revpipyload.RevPiSlaveDev.run?4()
|
||||||
|
revpipyload.RevPiSlaveDev.stop?4()
|
||||||
|
revpipyload.RevPiSlaveDev?1(devcon, acl)
|
||||||
|
revpipyload._ipmatch?5(ipaddress, dict_acl)
|
||||||
|
revpipyload._zeroprocimg?5()
|
||||||
|
revpipyload.configrsc?7
|
||||||
|
revpipyload.picontrolreset?7
|
||||||
|
revpipyload.procimg?7
|
||||||
revpipyload.pyloadverion?7
|
revpipyload.pyloadverion?7
|
||||||
|
revpipyload.rapcatalog?7
|
||||||
|
revpipyload.re_ipacl?7
|
||||||
|
revpipyload.refullmatch?4(regex, string)
|
||||||
|
|||||||
@@ -1,2 +1,4 @@
|
|||||||
PipeLogwriter Thread
|
PipeLogwriter Thread
|
||||||
RevPiPlc Thread
|
RevPiPlc Thread
|
||||||
|
RevPiSlave Thread
|
||||||
|
RevPiSlaveDev Thread
|
||||||
|
|||||||
@@ -36,6 +36,7 @@ import plcsystem
|
|||||||
import proginit
|
import proginit
|
||||||
import os
|
import os
|
||||||
import signal
|
import signal
|
||||||
|
import socket
|
||||||
import tarfile
|
import tarfile
|
||||||
import zipfile
|
import zipfile
|
||||||
from concurrent import futures
|
from concurrent import futures
|
||||||
@@ -46,10 +47,396 @@ from shutil import rmtree
|
|||||||
from tempfile import mkstemp
|
from tempfile import mkstemp
|
||||||
from threading import Event
|
from threading import Event
|
||||||
from time import asctime
|
from time import asctime
|
||||||
|
from timeit import default_timer
|
||||||
from xmlrpc.client import Binary
|
from xmlrpc.client import Binary
|
||||||
from xmlrpc.server import SimpleXMLRPCServer
|
from xmlrpc.server import SimpleXMLRPCServer
|
||||||
|
|
||||||
pyloadverion = "0.4.3"
|
pyloadverion = "0.4.3"
|
||||||
|
pyloadverion = "0.5.0"
|
||||||
|
re_ipacl = "(([\\d\\*]{1,3}\\.){3}[\\d\\*]{1,3},[0-1] ?)*"
|
||||||
|
|
||||||
|
|
||||||
|
def _ipmatch(ipaddress, dict_acl):
|
||||||
|
"""Prueft IP gegen ACL List und gibt ACL aus.
|
||||||
|
|
||||||
|
@param ipaddress zum pruefen
|
||||||
|
@param dict_acl ACL Dict gegen die IP zu pruefen ist
|
||||||
|
@return int() ACL Wert oder -1 wenn nicht gefunden
|
||||||
|
|
||||||
|
"""
|
||||||
|
for aclip in sorted(dict_acl, reverse=True):
|
||||||
|
regex = aclip.replace(".", "\\.").replace("*", "\\d{1,3}")
|
||||||
|
if refullmatch(regex, ipaddress):
|
||||||
|
return dict_acl[aclip]
|
||||||
|
return -1
|
||||||
|
|
||||||
|
|
||||||
|
def refullmatch(regex, string):
|
||||||
|
"""re.fullmatch wegen alter python version aus wheezy nachgebaut.
|
||||||
|
|
||||||
|
@param regex RegEx Statement
|
||||||
|
@param string Zeichenfolge gegen die getestet wird
|
||||||
|
@return True, wenn komplett passt sonst False
|
||||||
|
|
||||||
|
"""
|
||||||
|
m = rematch(regex, string)
|
||||||
|
return m is not None and m.end() == len(string)
|
||||||
|
|
||||||
|
|
||||||
|
def _zeroprocimg():
|
||||||
|
"""Setzt Prozessabbild auf NULL."""
|
||||||
|
if os.path.exists(procimg):
|
||||||
|
f = open(procimg, "w+b", 0)
|
||||||
|
f.write(bytes(4096))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class RevPiSlave(Thread):
|
||||||
|
|
||||||
|
"""RevPi PLC-Server.
|
||||||
|
|
||||||
|
Diese Klasste stellt den RevPi PLC-Server zur verfuegung und akzeptiert
|
||||||
|
neue Verbindungen. Dieser werden dann als RevPiSlaveDev abgebildet.
|
||||||
|
|
||||||
|
Ueber die angegebenen ACLs koennen Zugriffsbeschraenkungen vergeben werden.
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
def __init__(self, acl, port=55234):
|
||||||
|
"""Instantiiert RevPiSlave-Klasse.
|
||||||
|
@param acl Stringliste mit Leerstellen getrennt
|
||||||
|
@param port Listen Port fuer plc Slaveserver"""
|
||||||
|
super().__init__()
|
||||||
|
self._evt_exit = Event()
|
||||||
|
self.exitcode = None
|
||||||
|
self._port = port
|
||||||
|
self.so = None
|
||||||
|
self._th_dev = []
|
||||||
|
self.zeroonerror = False
|
||||||
|
self.zeroonexit = False
|
||||||
|
|
||||||
|
# ACLs aufbereiten
|
||||||
|
self.dict_acl = {}
|
||||||
|
for host in acl.split():
|
||||||
|
aclsplit = host.split(",")
|
||||||
|
self.dict_acl[aclsplit[0]] = \
|
||||||
|
0 if len(aclsplit) == 1 else int(aclsplit[1])
|
||||||
|
|
||||||
|
def newlogfile(self):
|
||||||
|
"""Konfiguriert die FileHandler auf neue Logdatei."""
|
||||||
|
pass
|
||||||
|
|
||||||
|
def run(self):
|
||||||
|
"""Startet Serverkomponente fuer die Annahme neuer Verbindungen."""
|
||||||
|
proginit.logger.debug("enter RevPiSlave.run()")
|
||||||
|
|
||||||
|
# Socket öffnen und konfigurieren
|
||||||
|
self.so = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
||||||
|
while not self._evt_exit.is_set():
|
||||||
|
try:
|
||||||
|
self.so.bind(("", self._port))
|
||||||
|
except:
|
||||||
|
proginit.logger.warning("can not bind socket - retry")
|
||||||
|
self._evt_exit.wait(1)
|
||||||
|
else:
|
||||||
|
break
|
||||||
|
self.so.listen(15)
|
||||||
|
|
||||||
|
# Mit Socket arbeiten
|
||||||
|
while not self._evt_exit.is_set():
|
||||||
|
self.exitcode = -1
|
||||||
|
|
||||||
|
# Verbindung annehmen
|
||||||
|
proginit.logger.debug("accept new connection")
|
||||||
|
try:
|
||||||
|
tup_sock = self.so.accept()
|
||||||
|
except:
|
||||||
|
if not self._evt_exit.is_set():
|
||||||
|
proginit.logger.exception("accept exception")
|
||||||
|
continue
|
||||||
|
|
||||||
|
# ACL prüfen
|
||||||
|
aclstatus = _ipmatch(tup_sock[1][0], self.dict_acl)
|
||||||
|
if aclstatus == -1:
|
||||||
|
tup_sock[0].close()
|
||||||
|
proginit.logger.warning(
|
||||||
|
"host ip '{}' does not match revpiacl - disconnect"
|
||||||
|
"".format(tup_sock[1][0])
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
# Thread starten
|
||||||
|
th = RevPiSlaveDev(tup_sock, aclstatus)
|
||||||
|
th.start()
|
||||||
|
self._th_dev.append(th)
|
||||||
|
|
||||||
|
# Liste von toten threads befreien
|
||||||
|
self._th_dev = [
|
||||||
|
th_check for th_check in self._th_dev if th_check.is_alive()
|
||||||
|
]
|
||||||
|
|
||||||
|
# Alle Threads beenden
|
||||||
|
for th in self._th_dev:
|
||||||
|
th.stop()
|
||||||
|
|
||||||
|
# Socket schließen
|
||||||
|
self.so.close()
|
||||||
|
self.so = None
|
||||||
|
|
||||||
|
self.exitcode = 0
|
||||||
|
|
||||||
|
proginit.logger.debug("leave RevPiSlave.run()")
|
||||||
|
|
||||||
|
def stop(self):
|
||||||
|
"""Beendet Slaveausfuehrung."""
|
||||||
|
proginit.logger.debug("enter RevPiSlave.stop()")
|
||||||
|
|
||||||
|
self._evt_exit.set()
|
||||||
|
if self.so is not None:
|
||||||
|
try:
|
||||||
|
self.so.shutdown(socket.SHUT_RDWR)
|
||||||
|
except:
|
||||||
|
pass
|
||||||
|
|
||||||
|
proginit.logger.debug("leave RevPiSlave.stop()")
|
||||||
|
|
||||||
|
|
||||||
|
class RevPiSlaveDev(Thread):
|
||||||
|
|
||||||
|
"""Klasse um eine RevPiModIO Verbindung zu verwalten.
|
||||||
|
|
||||||
|
Diese Klasste stellt die Funktionen zur Verfuegung um Daten ueber das
|
||||||
|
Netzwerk mit dem Prozessabbild auszutauschen.
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
def __init__(self, devcon, acl):
|
||||||
|
"""Init RevPiSlaveDev-Class.
|
||||||
|
|
||||||
|
@param devcon Tuple der Verbindung
|
||||||
|
@param deadtime Timeout der Vararbeitung
|
||||||
|
@param acl Berechtigungslevel
|
||||||
|
|
||||||
|
"""
|
||||||
|
super().__init__()
|
||||||
|
self._acl = acl
|
||||||
|
self.daemon = True
|
||||||
|
self._deadtime = None
|
||||||
|
self._devcon, self._addr = devcon
|
||||||
|
self._evt_exit = Event()
|
||||||
|
self._writeerror = False
|
||||||
|
|
||||||
|
# Sicherheitsbytes
|
||||||
|
self.ey_dict = {}
|
||||||
|
|
||||||
|
def run(self):
|
||||||
|
"""Verarbeitet Anfragen von Remoteteilnehmer."""
|
||||||
|
proginit.logger.debug("enter RevPiSlaveDev.run()")
|
||||||
|
|
||||||
|
proginit.logger.info(
|
||||||
|
"got new connection from host {} with acl {}".format(
|
||||||
|
self._addr, self._acl)
|
||||||
|
)
|
||||||
|
|
||||||
|
# Prozessabbild öffnen
|
||||||
|
fh_proc = open(procimg, "r+b", 0)
|
||||||
|
|
||||||
|
dirty = True
|
||||||
|
while not self._evt_exit.is_set():
|
||||||
|
# Laufzeitberechnung starten
|
||||||
|
ot = default_timer()
|
||||||
|
|
||||||
|
# Meldung erhalten
|
||||||
|
try:
|
||||||
|
netcmd = self._devcon.recv(16)
|
||||||
|
except:
|
||||||
|
break
|
||||||
|
|
||||||
|
# Wenn Meldung ungültig ist aussteigen
|
||||||
|
if netcmd[0:1] != b'\x01' or netcmd[-1:] != b'\x17':
|
||||||
|
if netcmd != b'':
|
||||||
|
proginit.logger.error(
|
||||||
|
"net cmd not valid {}".format(netcmd)
|
||||||
|
)
|
||||||
|
break
|
||||||
|
|
||||||
|
cmd = netcmd[1:3]
|
||||||
|
if cmd == b'DA':
|
||||||
|
# Processabbild übertragen
|
||||||
|
# bCMiiii00000000b = 16
|
||||||
|
|
||||||
|
position = int.from_bytes(netcmd[3:5], byteorder="little")
|
||||||
|
length = int.from_bytes(netcmd[5:7], byteorder="little")
|
||||||
|
|
||||||
|
fh_proc.seek(position)
|
||||||
|
try:
|
||||||
|
self._devcon.sendall(fh_proc.read(length))
|
||||||
|
except:
|
||||||
|
proginit.logger.error("error while send read data")
|
||||||
|
break
|
||||||
|
|
||||||
|
elif cmd == b'SD' and self._acl == 1:
|
||||||
|
# Ausgänge empfangen, wenn acl es erlaubt
|
||||||
|
# bCMiiiic0000000b = 16
|
||||||
|
|
||||||
|
position = int.from_bytes(netcmd[3:5], byteorder="little")
|
||||||
|
length = int.from_bytes(netcmd[5:7], byteorder="little")
|
||||||
|
control = netcmd[7:8]
|
||||||
|
|
||||||
|
if control == b'\x1d' and length > 0:
|
||||||
|
try:
|
||||||
|
block = self._devcon.recv(length)
|
||||||
|
except:
|
||||||
|
proginit.logger.error("error while recv data to write")
|
||||||
|
self._writeerror = True
|
||||||
|
break
|
||||||
|
fh_proc.seek(position)
|
||||||
|
|
||||||
|
# Länge der Daten prüfen
|
||||||
|
if len(block) == length:
|
||||||
|
fh_proc.write(block)
|
||||||
|
else:
|
||||||
|
proginit.logger.error("got wrong length to write")
|
||||||
|
break
|
||||||
|
|
||||||
|
# Record seperator character
|
||||||
|
if control == b'\x1c':
|
||||||
|
if self._writeerror:
|
||||||
|
self._devcon.send(b'\xff')
|
||||||
|
else:
|
||||||
|
self._devcon.send(b'\x1e')
|
||||||
|
self._writeerror = False
|
||||||
|
|
||||||
|
elif cmd == b'\x06\x16':
|
||||||
|
# Just sync
|
||||||
|
self._devcon.send(b'\x06\x16')
|
||||||
|
|
||||||
|
elif cmd == b'CF':
|
||||||
|
# Socket konfigurieren
|
||||||
|
# bCMii0000000000b = 16
|
||||||
|
|
||||||
|
timeoutms = int.from_bytes(netcmd[3:5], byteorder="little")
|
||||||
|
|
||||||
|
self._deadtime = timeoutms / 1000
|
||||||
|
self._devcon.settimeout(self._deadtime)
|
||||||
|
|
||||||
|
# Record seperator character
|
||||||
|
self._devcon.send(b'\x1e')
|
||||||
|
|
||||||
|
elif cmd == b'EY':
|
||||||
|
# Bytes bei Verbindungsabbruch schreiben
|
||||||
|
# bCMiiiix0000000b = 16
|
||||||
|
|
||||||
|
position = int.from_bytes(
|
||||||
|
netcmd[3:5], byteorder="little"
|
||||||
|
)
|
||||||
|
length = int.from_bytes(
|
||||||
|
netcmd[5:7], byteorder="little"
|
||||||
|
)
|
||||||
|
if netcmd[7:8] == b'\xFF':
|
||||||
|
# Dirtybytes löschen
|
||||||
|
if position in self.ey_dict:
|
||||||
|
del self.ey_dict[position]
|
||||||
|
|
||||||
|
# Record seperator character
|
||||||
|
self._devcon.send(b'\x1e')
|
||||||
|
proginit.logger.info(
|
||||||
|
"cleared dirty bytes on position {}"
|
||||||
|
"".format(position)
|
||||||
|
)
|
||||||
|
|
||||||
|
else:
|
||||||
|
# Dirtybytes hinzufügen
|
||||||
|
bytesbuff = bytearray()
|
||||||
|
try:
|
||||||
|
while not self._evt_exit.is_set() \
|
||||||
|
and len(bytesbuff) < length:
|
||||||
|
block = self._devcon.recv(1024)
|
||||||
|
bytesbuff += block
|
||||||
|
if block == b'':
|
||||||
|
break
|
||||||
|
|
||||||
|
except:
|
||||||
|
proginit.logger.error("error while recv dirty bytes")
|
||||||
|
break
|
||||||
|
|
||||||
|
# Länge der Daten prüfen
|
||||||
|
if len(bytesbuff) == length:
|
||||||
|
self.ey_dict[position] = bytesbuff
|
||||||
|
else:
|
||||||
|
proginit.logger.error("got wrong length to write")
|
||||||
|
break
|
||||||
|
|
||||||
|
# Record seperator character
|
||||||
|
self._devcon.send(b'\x1e')
|
||||||
|
proginit.logger.info(
|
||||||
|
"got dirty bytes to write on error on position {}"
|
||||||
|
"".format(position)
|
||||||
|
)
|
||||||
|
|
||||||
|
elif cmd == b'PI':
|
||||||
|
# piCtory Konfiguration senden
|
||||||
|
proginit.logger.debug(
|
||||||
|
"transfair pictory configuration: {}".format(configrsc)
|
||||||
|
)
|
||||||
|
fh_pic = open(configrsc, "rb")
|
||||||
|
while True:
|
||||||
|
data = fh_pic.read(1024)
|
||||||
|
if data:
|
||||||
|
# FIXME: Fehler fangen
|
||||||
|
self._devcon.send(data)
|
||||||
|
else:
|
||||||
|
fh_pic.close()
|
||||||
|
break
|
||||||
|
|
||||||
|
# End-of-Transmission character
|
||||||
|
self._devcon.send(b'\x04')
|
||||||
|
continue
|
||||||
|
|
||||||
|
elif cmd == b'EX':
|
||||||
|
# Sauber Verbindung verlassen
|
||||||
|
dirty = False
|
||||||
|
self._evt_exit.set()
|
||||||
|
continue
|
||||||
|
|
||||||
|
else:
|
||||||
|
# Kein gültiges CMD gefunden, abbruch!
|
||||||
|
break
|
||||||
|
|
||||||
|
# Verarbeitungszeit prüfen
|
||||||
|
if self._deadtime is not None:
|
||||||
|
comtime = default_timer() - ot
|
||||||
|
if comtime > self._deadtime:
|
||||||
|
proginit.logger.warning(
|
||||||
|
"runtime more than {} ms: {}!".format(
|
||||||
|
int(self._deadtime * 1000), comtime
|
||||||
|
)
|
||||||
|
)
|
||||||
|
# TODO: Soll ein Fehler ausgelöst werden?
|
||||||
|
|
||||||
|
# Dirty verlassen
|
||||||
|
if dirty:
|
||||||
|
for pos in self.ey_dict:
|
||||||
|
fh_proc.seek(pos)
|
||||||
|
fh_proc.write(self.ey_dict[pos])
|
||||||
|
|
||||||
|
proginit.logger.error("dirty shutdown of connection")
|
||||||
|
|
||||||
|
fh_proc.close()
|
||||||
|
self._devcon.close()
|
||||||
|
self._devcon = None
|
||||||
|
|
||||||
|
proginit.logger.info("disconnected from {}".format(self._addr))
|
||||||
|
proginit.logger.debug("leave RevPiSlaveDev.run()")
|
||||||
|
|
||||||
|
def stop(self):
|
||||||
|
"""Beendet Verbindungsthread."""
|
||||||
|
proginit.logger.debug("enter RevPiSlaveDev.stop()")
|
||||||
|
|
||||||
|
self._evt_exit.set()
|
||||||
|
if self._devcon is not None:
|
||||||
|
self._devcon.shutdown(socket.SHUT_RDWR)
|
||||||
|
|
||||||
|
proginit.logger.debug("leave RevPiSlaveDev.stop()")
|
||||||
|
|
||||||
|
|
||||||
class RevPiPyLoad():
|
class RevPiPyLoad():
|
||||||
@@ -121,10 +508,33 @@ class RevPiPyLoad():
|
|||||||
self.globalconfig["DEFAULT"].get("plcworkdir", ".")
|
self.globalconfig["DEFAULT"].get("plcworkdir", ".")
|
||||||
self.plcslave = \
|
self.plcslave = \
|
||||||
int(self.globalconfig["DEFAULT"].get("plcslave", 0))
|
int(self.globalconfig["DEFAULT"].get("plcslave", 0))
|
||||||
|
|
||||||
|
# PLC Slave ACL laden und prüfen
|
||||||
|
plcslaveacl = \
|
||||||
|
self.globalconfig["DEFAULT"].get("plcslaveacl", "")
|
||||||
|
if len(plcslaveacl) > 0 and not refullmatch(re_ipacl, plcslaveacl):
|
||||||
|
self.plcslaveacl = ""
|
||||||
|
proginit.logger.warning("can not load plcslaveacl - wrong format")
|
||||||
|
else:
|
||||||
|
self.plcslaveacl = plcslaveacl
|
||||||
|
|
||||||
|
self.plcslaveport = \
|
||||||
|
int(self.globalconfig["DEFAULT"].get("plcslaveport", 55234))
|
||||||
self.pythonver = \
|
self.pythonver = \
|
||||||
int(self.globalconfig["DEFAULT"].get("pythonversion", 3))
|
int(self.globalconfig["DEFAULT"].get("pythonversion", 3))
|
||||||
self.xmlrpc = \
|
self.xmlrpc = \
|
||||||
int(self.globalconfig["DEFAULT"].get("xmlrpc", 0))
|
int(self.globalconfig["DEFAULT"].get("xmlrpc", 0))
|
||||||
|
|
||||||
|
# XML ACL laden und prüfen
|
||||||
|
# TODO: xmlrpcacl auswerten
|
||||||
|
xmlrpcacl = \
|
||||||
|
self.globalconfig["DEFAULT"].get("xmlrpcacl", "")
|
||||||
|
if len(xmlrpcacl) > 0 and not refullmatch(re_ipacl, xmlrpcacl):
|
||||||
|
self.xmlrpcacl = ""
|
||||||
|
proginit.logger.warning("can not load xmlrpcacl - wrong format")
|
||||||
|
else:
|
||||||
|
self.xmlrpcacl = xmlrpcacl
|
||||||
|
|
||||||
self.zeroonerror = \
|
self.zeroonerror = \
|
||||||
int(self.globalconfig["DEFAULT"].get("zeroonerror", 1))
|
int(self.globalconfig["DEFAULT"].get("zeroonerror", 1))
|
||||||
self.zeroonexit = \
|
self.zeroonexit = \
|
||||||
@@ -135,6 +545,10 @@ class RevPiPyLoad():
|
|||||||
|
|
||||||
# PLC Thread konfigurieren
|
# PLC Thread konfigurieren
|
||||||
self.plc = self._plcthread()
|
self.plc = self._plcthread()
|
||||||
|
if self.plcslave:
|
||||||
|
self.th_plcslave = RevPiSlave(self.plcslaveacl, self.plcslaveport)
|
||||||
|
else:
|
||||||
|
self.th_plcslave = None
|
||||||
|
|
||||||
# XMLRPC-Server Instantiieren und konfigurieren
|
# XMLRPC-Server Instantiieren und konfigurieren
|
||||||
if self.xmlrpc >= 1:
|
if self.xmlrpc >= 1:
|
||||||
@@ -198,6 +612,9 @@ class RevPiPyLoad():
|
|||||||
self.xsrv.register_function(
|
self.xsrv.register_function(
|
||||||
lambda: os.system(proginit.picontrolreset),
|
lambda: os.system(proginit.picontrolreset),
|
||||||
"resetpicontrol")
|
"resetpicontrol")
|
||||||
|
self.xml_plcslavestop, "plcslavestop")
|
||||||
|
self.xsrv.register_function(
|
||||||
|
lambda: os.system(picontrolreset), "resetpicontrol")
|
||||||
self.xsrv.register_function(
|
self.xsrv.register_function(
|
||||||
self.xml_setconfig, "set_config")
|
self.xml_setconfig, "set_config")
|
||||||
self.xsrv.register_function(
|
self.xsrv.register_function(
|
||||||
@@ -219,6 +636,7 @@ class RevPiPyLoad():
|
|||||||
"""Konfiguriert den PLC-Thread fuer die Ausfuehrung.
|
"""Konfiguriert den PLC-Thread fuer die Ausfuehrung.
|
||||||
@return PLC-Thread Object or None"""
|
@return PLC-Thread Object or None"""
|
||||||
proginit.logger.debug("enter RevPiPyLoad._plcthread()")
|
proginit.logger.debug("enter RevPiPyLoad._plcthread()")
|
||||||
|
th_plc = None
|
||||||
|
|
||||||
# Prüfen ob Programm existiert
|
# Prüfen ob Programm existiert
|
||||||
if not os.path.exists(os.path.join(self.plcworkdir, self.plcprog)):
|
if not os.path.exists(os.path.join(self.plcworkdir, self.plcprog)):
|
||||||
@@ -334,6 +752,10 @@ class RevPiPyLoad():
|
|||||||
self.tpe = futures.ThreadPoolExecutor(max_workers=1)
|
self.tpe = futures.ThreadPoolExecutor(max_workers=1)
|
||||||
self.tpe.submit(self.xsrv.serve_forever)
|
self.tpe.submit(self.xsrv.serve_forever)
|
||||||
|
|
||||||
|
if self.plcslave:
|
||||||
|
# Slaveausfuehrung übergeben
|
||||||
|
self.th_plcslave.start()
|
||||||
|
|
||||||
if self.autostart:
|
if self.autostart:
|
||||||
proginit.logger.debug("starting revpiplc-thread")
|
proginit.logger.debug("starting revpiplc-thread")
|
||||||
if self.plc is not None:
|
if self.plc is not None:
|
||||||
@@ -342,6 +764,8 @@ class RevPiPyLoad():
|
|||||||
while not self._exit \
|
while not self._exit \
|
||||||
and not self.evt_loadconfig.is_set():
|
and not self.evt_loadconfig.is_set():
|
||||||
|
|
||||||
|
# TODO: Soll hier der PLC Server Thread geprüft werden?
|
||||||
|
|
||||||
# piCtory auf Veränderung prüfen
|
# piCtory auf Veränderung prüfen
|
||||||
if self.pictorymtime != os.path.getmtime(proginit.pargs.configrsc):
|
if self.pictorymtime != os.path.getmtime(proginit.pargs.configrsc):
|
||||||
proginit.logger.warning("piCtory configuration was changed")
|
proginit.logger.warning("piCtory configuration was changed")
|
||||||
@@ -366,8 +790,14 @@ class RevPiPyLoad():
|
|||||||
proginit.logger.info("stopping revpipyload")
|
proginit.logger.info("stopping revpipyload")
|
||||||
self._exit = True
|
self._exit = True
|
||||||
|
|
||||||
|
if self.th_plcslave is not None and self.th_plcslave.is_alive():
|
||||||
|
proginit.logger.debug("stopping revpi slave thread")
|
||||||
|
self.th_plcslave.stop()
|
||||||
|
self.th_plcslave.join()
|
||||||
|
proginit.logger.debug("revpi slave thread successfully closed")
|
||||||
|
|
||||||
if self.plc is not None and self.plc.is_alive():
|
if self.plc is not None and self.plc.is_alive():
|
||||||
proginit.logger.debug("stopping revpiplc-thread")
|
proginit.logger.debug("stopping revpiplc thread")
|
||||||
self.plc.stop()
|
self.plc.stop()
|
||||||
self.plc.join()
|
self.plc.join()
|
||||||
proginit.logger.debug("revpiplc thread successfully closed")
|
proginit.logger.debug("revpiplc thread successfully closed")
|
||||||
@@ -391,8 +821,11 @@ class RevPiPyLoad():
|
|||||||
dc["plcprogram"] = self.plcprog
|
dc["plcprogram"] = self.plcprog
|
||||||
dc["plcarguments"] = self.plcarguments
|
dc["plcarguments"] = self.plcarguments
|
||||||
dc["plcslave"] = self.plcslave
|
dc["plcslave"] = self.plcslave
|
||||||
|
dc["plcslaveacl"] = self.plcslaveacl
|
||||||
|
dc["plcslaveport"] = self.plcslaveport
|
||||||
dc["pythonversion"] = self.pythonver
|
dc["pythonversion"] = self.pythonver
|
||||||
dc["xmlrpc"] = self.xmlrpc
|
dc["xmlrpc"] = self.xmlrpc
|
||||||
|
dc["xmlrpcacl"] = self.xmlrpcacl
|
||||||
dc["xmlrpcport"] = \
|
dc["xmlrpcport"] = \
|
||||||
self.globalconfig["DEFAULT"].get("xmlrpcport", 55123)
|
self.globalconfig["DEFAULT"].get("xmlrpcport", 55123)
|
||||||
dc["zeroonerror"] = self.zeroonerror
|
dc["zeroonerror"] = self.zeroonerror
|
||||||
@@ -564,8 +997,11 @@ class RevPiPyLoad():
|
|||||||
"plcprogram": ".+",
|
"plcprogram": ".+",
|
||||||
"plcarguments": ".*",
|
"plcarguments": ".*",
|
||||||
"plcslave": "[01]",
|
"plcslave": "[01]",
|
||||||
|
"plcslaveacl": re_ipacl,
|
||||||
|
"plcslaveport": "[0-9]{,5}",
|
||||||
"pythonversion": "[23]",
|
"pythonversion": "[23]",
|
||||||
"xmlrpc": "[0-3]",
|
"xmlrpc": "[0-3]",
|
||||||
|
"xmlrpcacl": re_ipacl,
|
||||||
"xmlrpcport": "[0-9]{,5}",
|
"xmlrpcport": "[0-9]{,5}",
|
||||||
"zeroonerror": "[01]",
|
"zeroonerror": "[01]",
|
||||||
"zeroonexit": "[01]"
|
"zeroonexit": "[01]"
|
||||||
@@ -574,7 +1010,7 @@ class RevPiPyLoad():
|
|||||||
# Werte übernehmen
|
# Werte übernehmen
|
||||||
for key in keys:
|
for key in keys:
|
||||||
if key in dc:
|
if key in dc:
|
||||||
if rematch(keys[key], str(dc[key])) is None:
|
if not refullmatch(keys[key], str(dc[key])):
|
||||||
proginit.logger.error(
|
proginit.logger.error(
|
||||||
"got wrong setting '{}' with value '{}'".format(
|
"got wrong setting '{}' with value '{}'".format(
|
||||||
key, dc[key]
|
key, dc[key]
|
||||||
@@ -670,6 +1106,36 @@ class RevPiPyLoad():
|
|||||||
else:
|
else:
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
def xml_plcslavestart(self):
|
||||||
|
"""Startet den PLC Slave Server.
|
||||||
|
|
||||||
|
@return Statuscode:
|
||||||
|
0: erfolgreich gestartet
|
||||||
|
-1: Nicht aktiv in Konfiguration
|
||||||
|
-2: Laeuft bereits
|
||||||
|
|
||||||
|
"""
|
||||||
|
if self.plcslave:
|
||||||
|
if self.th_plcslave is not None and self.th_plcslave.is_alive():
|
||||||
|
return -2
|
||||||
|
else:
|
||||||
|
self.th_plcslave = RevPiSlave(
|
||||||
|
self.plcslaveacl, self.plcslaveport
|
||||||
|
)
|
||||||
|
self.th_plcslave.start()
|
||||||
|
return 0
|
||||||
|
else:
|
||||||
|
return -1
|
||||||
|
|
||||||
|
def xml_plcslavestop(self):
|
||||||
|
"""Stoppt den PLC Slave Server.
|
||||||
|
@return True, wenn stop erfolgreich"""
|
||||||
|
if self.th_plcslave is not None:
|
||||||
|
self.th_plcslave.stop()
|
||||||
|
return True
|
||||||
|
else:
|
||||||
|
return False
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
# Programmeinstellungen konfigurieren
|
# Programmeinstellungen konfigurieren
|
||||||
|
|||||||
Reference in New Issue
Block a user