mirror of
https://github.com/naruxde/revpipyload.git
synced 2025-11-08 15:13:52 +01:00
Saved eric-project file
aclx.conf in etc übernehmen (setup.py) shared übernehmen (setup.py) Dynamisches Neuladen der Konfiguraiton
This commit is contained in:
@@ -46,7 +46,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>None</td></tr>
|
<tr><td>autoreloaddelay</td></tr>
|
||||||
</table>
|
</table>
|
||||||
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||||
Class Methods</h3>
|
Class Methods</h3>
|
||||||
@@ -60,6 +60,12 @@ Methods</h3>
|
|||||||
<td><a style="color:#0000FF" href="#RevPiPlc.__init__">RevPiPlc</a></td>
|
<td><a style="color:#0000FF" href="#RevPiPlc.__init__">RevPiPlc</a></td>
|
||||||
<td>Instantiiert RevPiPlc-Klasse.</td>
|
<td>Instantiiert RevPiPlc-Klasse.</td>
|
||||||
</tr><tr>
|
</tr><tr>
|
||||||
|
<td><a style="color:#0000FF" href="#RevPiPlc.__get_autoreloaddelay">__get_autoreloaddelay</a></td>
|
||||||
|
<td>Getter fuer autoreloaddelay.</td>
|
||||||
|
</tr><tr>
|
||||||
|
<td><a style="color:#0000FF" href="#RevPiPlc.__set_autoreloaddelay">__set_autoreloaddelay</a></td>
|
||||||
|
<td>Setter fuer autoreloaddelay.</td>
|
||||||
|
</tr><tr>
|
||||||
<td><a style="color:#0000FF" href="#RevPiPlc._configureplw">_configureplw</a></td>
|
<td><a style="color:#0000FF" href="#RevPiPlc._configureplw">_configureplw</a></td>
|
||||||
<td>Konfiguriert den PipeLogwriter fuer Ausgaben der PLCAPP.</td>
|
<td>Konfiguriert den PipeLogwriter fuer Ausgaben der PLCAPP.</td>
|
||||||
</tr><tr>
|
</tr><tr>
|
||||||
@@ -90,6 +96,23 @@ RevPiPlc (Constructor)</h3>
|
|||||||
<b>RevPiPlc</b>(<i>program, arguments, pversion</i>)
|
<b>RevPiPlc</b>(<i>program, arguments, pversion</i>)
|
||||||
<p>
|
<p>
|
||||||
Instantiiert RevPiPlc-Klasse.
|
Instantiiert RevPiPlc-Klasse.
|
||||||
|
</p><a NAME="RevPiPlc.__get_autoreloaddelay" ID="RevPiPlc.__get_autoreloaddelay"></a>
|
||||||
|
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||||
|
RevPiPlc.__get_autoreloaddelay</h3>
|
||||||
|
<b>__get_autoreloaddelay</b>(<i></i>)
|
||||||
|
<p>
|
||||||
|
Getter fuer autoreloaddelay.
|
||||||
|
</p><dl>
|
||||||
|
<dt>Returns:</dt>
|
||||||
|
<dd>
|
||||||
|
Delayzeit in Sekunden <class 'int'>
|
||||||
|
</dd>
|
||||||
|
</dl><a NAME="RevPiPlc.__set_autoreloaddelay" ID="RevPiPlc.__set_autoreloaddelay"></a>
|
||||||
|
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||||
|
RevPiPlc.__set_autoreloaddelay</h3>
|
||||||
|
<b>__set_autoreloaddelay</b>(<i>value</i>)
|
||||||
|
<p>
|
||||||
|
Setter fuer autoreloaddelay.
|
||||||
</p><a NAME="RevPiPlc._configureplw" ID="RevPiPlc._configureplw"></a>
|
</p><a NAME="RevPiPlc._configureplw" ID="RevPiPlc._configureplw"></a>
|
||||||
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||||
RevPiPlc._configureplw</h3>
|
RevPiPlc._configureplw</h3>
|
||||||
|
|||||||
@@ -78,6 +78,12 @@ Methods</h3>
|
|||||||
<td><a style="color:#0000FF" href="#RevPiPyLoad.__init__">RevPiPyLoad</a></td>
|
<td><a style="color:#0000FF" href="#RevPiPyLoad.__init__">RevPiPyLoad</a></td>
|
||||||
<td>Instantiiert RevPiPyLoad-Klasse.</td>
|
<td>Instantiiert RevPiPyLoad-Klasse.</td>
|
||||||
</tr><tr>
|
</tr><tr>
|
||||||
|
<td><a style="color:#0000FF" href="#RevPiPyLoad._check_mustrestart_plcprogram">_check_mustrestart_plcprogram</a></td>
|
||||||
|
<td>Prueft ob sich kritische Werte veraendert haben.</td>
|
||||||
|
</tr><tr>
|
||||||
|
<td><a style="color:#0000FF" href="#RevPiPyLoad._check_mustrestart_plcslave">_check_mustrestart_plcslave</a></td>
|
||||||
|
<td>Prueft ob sich kritische Werte veraendert haben.</td>
|
||||||
|
</tr><tr>
|
||||||
<td><a style="color:#0000FF" href="#RevPiPyLoad._loadconfig">_loadconfig</a></td>
|
<td><a style="color:#0000FF" href="#RevPiPyLoad._loadconfig">_loadconfig</a></td>
|
||||||
<td>Load configuration file and setup modul.</td>
|
<td>Load configuration file and setup modul.</td>
|
||||||
</tr><tr>
|
</tr><tr>
|
||||||
@@ -105,6 +111,15 @@ Methods</h3>
|
|||||||
<td><a style="color:#0000FF" href="#RevPiPyLoad.stop">stop</a></td>
|
<td><a style="color:#0000FF" href="#RevPiPyLoad.stop">stop</a></td>
|
||||||
<td>Stop revpipyload.</td>
|
<td>Stop revpipyload.</td>
|
||||||
</tr><tr>
|
</tr><tr>
|
||||||
|
<td><a style="color:#0000FF" href="#RevPiPyLoad.stop_plcprogram">stop_plcprogram</a></td>
|
||||||
|
<td>Beendet PLC Programm.</td>
|
||||||
|
</tr><tr>
|
||||||
|
<td><a style="color:#0000FF" href="#RevPiPyLoad.stop_plcslave">stop_plcslave</a></td>
|
||||||
|
<td>Beendet PLC Slave.</td>
|
||||||
|
</tr><tr>
|
||||||
|
<td><a style="color:#0000FF" href="#RevPiPyLoad.stop_xmlrpcserver">stop_xmlrpcserver</a></td>
|
||||||
|
<td>Beendet XML-RPC.</td>
|
||||||
|
</tr><tr>
|
||||||
<td><a style="color:#0000FF" href="#RevPiPyLoad.xml_getconfig">xml_getconfig</a></td>
|
<td><a style="color:#0000FF" href="#RevPiPyLoad.xml_getconfig">xml_getconfig</a></td>
|
||||||
<td>Uebertraegt die RevPiPyLoad Konfiguration.</td>
|
<td>Uebertraegt die RevPiPyLoad Konfiguration.</td>
|
||||||
</tr><tr>
|
</tr><tr>
|
||||||
@@ -174,7 +189,29 @@ RevPiPyLoad (Constructor)</h3>
|
|||||||
<b>RevPiPyLoad</b>(<i></i>)
|
<b>RevPiPyLoad</b>(<i></i>)
|
||||||
<p>
|
<p>
|
||||||
Instantiiert RevPiPyLoad-Klasse.
|
Instantiiert RevPiPyLoad-Klasse.
|
||||||
</p><a NAME="RevPiPyLoad._loadconfig" ID="RevPiPyLoad._loadconfig"></a>
|
</p><a NAME="RevPiPyLoad._check_mustrestart_plcprogram" ID="RevPiPyLoad._check_mustrestart_plcprogram"></a>
|
||||||
|
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||||
|
RevPiPyLoad._check_mustrestart_plcprogram</h3>
|
||||||
|
<b>_check_mustrestart_plcprogram</b>(<i></i>)
|
||||||
|
<p>
|
||||||
|
Prueft ob sich kritische Werte veraendert haben.
|
||||||
|
</p><dl>
|
||||||
|
<dt>Returns:</dt>
|
||||||
|
<dd>
|
||||||
|
True, wenn Subsystemneustart noetig ist
|
||||||
|
</dd>
|
||||||
|
</dl><a NAME="RevPiPyLoad._check_mustrestart_plcslave" ID="RevPiPyLoad._check_mustrestart_plcslave"></a>
|
||||||
|
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||||
|
RevPiPyLoad._check_mustrestart_plcslave</h3>
|
||||||
|
<b>_check_mustrestart_plcslave</b>(<i></i>)
|
||||||
|
<p>
|
||||||
|
Prueft ob sich kritische Werte veraendert haben.
|
||||||
|
</p><dl>
|
||||||
|
<dt>Returns:</dt>
|
||||||
|
<dd>
|
||||||
|
True, wenn Subsystemneustart noetig ist
|
||||||
|
</dd>
|
||||||
|
</dl><a NAME="RevPiPyLoad._loadconfig" ID="RevPiPyLoad._loadconfig"></a>
|
||||||
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||||
RevPiPyLoad._loadconfig</h3>
|
RevPiPyLoad._loadconfig</h3>
|
||||||
<b>_loadconfig</b>(<i></i>)
|
<b>_loadconfig</b>(<i></i>)
|
||||||
@@ -251,6 +288,24 @@ RevPiPyLoad.stop</h3>
|
|||||||
<b>stop</b>(<i></i>)
|
<b>stop</b>(<i></i>)
|
||||||
<p>
|
<p>
|
||||||
Stop revpipyload.
|
Stop revpipyload.
|
||||||
|
</p><a NAME="RevPiPyLoad.stop_plcprogram" ID="RevPiPyLoad.stop_plcprogram"></a>
|
||||||
|
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||||
|
RevPiPyLoad.stop_plcprogram</h3>
|
||||||
|
<b>stop_plcprogram</b>(<i></i>)
|
||||||
|
<p>
|
||||||
|
Beendet PLC Programm.
|
||||||
|
</p><a NAME="RevPiPyLoad.stop_plcslave" ID="RevPiPyLoad.stop_plcslave"></a>
|
||||||
|
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||||
|
RevPiPyLoad.stop_plcslave</h3>
|
||||||
|
<b>stop_plcslave</b>(<i></i>)
|
||||||
|
<p>
|
||||||
|
Beendet PLC Slave.
|
||||||
|
</p><a NAME="RevPiPyLoad.stop_xmlrpcserver" ID="RevPiPyLoad.stop_xmlrpcserver"></a>
|
||||||
|
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||||
|
RevPiPyLoad.stop_xmlrpcserver</h3>
|
||||||
|
<b>stop_xmlrpcserver</b>(<i></i>)
|
||||||
|
<p>
|
||||||
|
Beendet XML-RPC.
|
||||||
</p><a NAME="RevPiPyLoad.xml_getconfig" ID="RevPiPyLoad.xml_getconfig"></a>
|
</p><a NAME="RevPiPyLoad.xml_getconfig" ID="RevPiPyLoad.xml_getconfig"></a>
|
||||||
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||||
RevPiPyLoad.xml_getconfig</h3>
|
RevPiPyLoad.xml_getconfig</h3>
|
||||||
|
|||||||
@@ -19,9 +19,12 @@ picontrolserver.RevPiSlave?1(ipacl, port=55234)
|
|||||||
picontrolserver.RevPiSlaveDev.run?4()
|
picontrolserver.RevPiSlaveDev.run?4()
|
||||||
picontrolserver.RevPiSlaveDev.stop?4()
|
picontrolserver.RevPiSlaveDev.stop?4()
|
||||||
picontrolserver.RevPiSlaveDev?1(devcon, acl)
|
picontrolserver.RevPiSlaveDev?1(devcon, acl)
|
||||||
|
plcsystem.RevPiPlc.__get_autoreloaddelay?6()
|
||||||
|
plcsystem.RevPiPlc.__set_autoreloaddelay?6(value)
|
||||||
plcsystem.RevPiPlc._configureplw?5()
|
plcsystem.RevPiPlc._configureplw?5()
|
||||||
plcsystem.RevPiPlc._setuppopen?5()
|
plcsystem.RevPiPlc._setuppopen?5()
|
||||||
plcsystem.RevPiPlc._spopen?5(lst_proc)
|
plcsystem.RevPiPlc._spopen?5(lst_proc)
|
||||||
|
plcsystem.RevPiPlc.autoreloaddelay?7
|
||||||
plcsystem.RevPiPlc.newlogfile?4()
|
plcsystem.RevPiPlc.newlogfile?4()
|
||||||
plcsystem.RevPiPlc.run?4()
|
plcsystem.RevPiPlc.run?4()
|
||||||
plcsystem.RevPiPlc.stop?4()
|
plcsystem.RevPiPlc.stop?4()
|
||||||
@@ -45,6 +48,8 @@ proginit.pargs?7
|
|||||||
proginit.picontrolreset?7
|
proginit.picontrolreset?7
|
||||||
proginit.rapcatalog?7
|
proginit.rapcatalog?7
|
||||||
proginit.startdir?7
|
proginit.startdir?7
|
||||||
|
revpipyload.RevPiPyLoad._check_mustrestart_plcprogram?5()
|
||||||
|
revpipyload.RevPiPyLoad._check_mustrestart_plcslave?5()
|
||||||
revpipyload.RevPiPyLoad._loadconfig?5()
|
revpipyload.RevPiPyLoad._loadconfig?5()
|
||||||
revpipyload.RevPiPyLoad._plcslave?5()
|
revpipyload.RevPiPyLoad._plcslave?5()
|
||||||
revpipyload.RevPiPyLoad._plcthread?5()
|
revpipyload.RevPiPyLoad._plcthread?5()
|
||||||
@@ -55,6 +60,9 @@ revpipyload.RevPiPyLoad.packapp?4(mode="tar", pictory=False)
|
|||||||
revpipyload.RevPiPyLoad.root?7
|
revpipyload.RevPiPyLoad.root?7
|
||||||
revpipyload.RevPiPyLoad.start?4()
|
revpipyload.RevPiPyLoad.start?4()
|
||||||
revpipyload.RevPiPyLoad.stop?4()
|
revpipyload.RevPiPyLoad.stop?4()
|
||||||
|
revpipyload.RevPiPyLoad.stop_plcprogram?4()
|
||||||
|
revpipyload.RevPiPyLoad.stop_plcslave?4()
|
||||||
|
revpipyload.RevPiPyLoad.stop_xmlrpcserver?4()
|
||||||
revpipyload.RevPiPyLoad.xml_getconfig?4()
|
revpipyload.RevPiPyLoad.xml_getconfig?4()
|
||||||
revpipyload.RevPiPyLoad.xml_getfilelist?4()
|
revpipyload.RevPiPyLoad.xml_getfilelist?4()
|
||||||
revpipyload.RevPiPyLoad.xml_getpictoryrsc?4()
|
revpipyload.RevPiPyLoad.xml_getpictoryrsc?4()
|
||||||
|
|||||||
@@ -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 revpipyload -->
|
<!-- eric project file for project revpipyload -->
|
||||||
<!-- Saved: 2018-04-04, 13:23:14 -->
|
<!-- Saved: 2018-04-05, 14:14:27 -->
|
||||||
<!-- Copyright (C) 2018 Sven Sager, akira@narux.de -->
|
<!-- Copyright (C) 2018 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>Dieser Loader wird über das Init-System geladen und führt das angegebene Pythonprogramm aus. Es ist für den RevolutionPi gedacht um automatisch das SPS-Programm zu starten.</Description>
|
<Description>Dieser Loader wird über das Init-System geladen und führt das angegebene Pythonprogramm aus. Es ist für den RevolutionPi gedacht um automatisch das SPS-Programm zu starten.</Description>
|
||||||
<Version>0.6.2</Version>
|
<Version>0.6.3</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"/>
|
||||||
@@ -23,6 +23,8 @@
|
|||||||
<Source>revpipyload/picontrolserver.py</Source>
|
<Source>revpipyload/picontrolserver.py</Source>
|
||||||
<Source>revpipyload/helper.py</Source>
|
<Source>revpipyload/helper.py</Source>
|
||||||
<Source>revpipyload/xrpcserver.py</Source>
|
<Source>revpipyload/xrpcserver.py</Source>
|
||||||
|
<Source>revpipyload/shared/ipaclmanager.py</Source>
|
||||||
|
<Source>revpipyload/shared/__init__.py</Source>
|
||||||
</Sources>
|
</Sources>
|
||||||
<Forms/>
|
<Forms/>
|
||||||
<Translations/>
|
<Translations/>
|
||||||
@@ -215,6 +217,7 @@
|
|||||||
<string>data</string>
|
<string>data</string>
|
||||||
<string>deb</string>
|
<string>deb</string>
|
||||||
<string>dist</string>
|
<string>dist</string>
|
||||||
|
<string>demo</string>
|
||||||
</list>
|
</list>
|
||||||
</value>
|
</value>
|
||||||
<key>
|
<key>
|
||||||
|
|||||||
@@ -69,7 +69,7 @@ class RevPiSlave(Thread):
|
|||||||
self.exitcode = -1
|
self.exitcode = -1
|
||||||
|
|
||||||
# Verbindung annehmen
|
# Verbindung annehmen
|
||||||
proginit.logger.debug("accept new connection")
|
proginit.logger.info("accept new connection for revpinetio")
|
||||||
try:
|
try:
|
||||||
tup_sock = self.so.accept()
|
tup_sock = self.so.accept()
|
||||||
except:
|
except:
|
||||||
|
|||||||
@@ -33,6 +33,8 @@ class RevPiPlc(Thread):
|
|||||||
super().__init__()
|
super().__init__()
|
||||||
|
|
||||||
self._arguments = arguments
|
self._arguments = arguments
|
||||||
|
self._autoreloaddelay = 5 * 2
|
||||||
|
self._delaycounter = 5 * 2
|
||||||
self._evt_exit = Event()
|
self._evt_exit = Event()
|
||||||
self._plw = self._configureplw()
|
self._plw = self._configureplw()
|
||||||
self._program = program
|
self._program = program
|
||||||
@@ -47,6 +49,18 @@ class RevPiPlc(Thread):
|
|||||||
self.zeroonerror = False
|
self.zeroonerror = False
|
||||||
self.zeroonexit = False
|
self.zeroonexit = False
|
||||||
|
|
||||||
|
def __get_autoreloaddelay(self):
|
||||||
|
"""Getter fuer autoreloaddelay.
|
||||||
|
@return Delayzeit in Sekunden <class 'int'>"""
|
||||||
|
return int(self._autoreloaddelay / 2)
|
||||||
|
|
||||||
|
def __set_autoreloaddelay(self, value):
|
||||||
|
"""Setter fuer autoreloaddelay."""
|
||||||
|
if type(value) != int:
|
||||||
|
raise RuntimeError("parameter value must be <class 'int'>")
|
||||||
|
self._autoreloaddelay = value * 2
|
||||||
|
self._delaycounter = value * 2
|
||||||
|
|
||||||
def _configureplw(self):
|
def _configureplw(self):
|
||||||
"""Konfiguriert den PipeLogwriter fuer Ausgaben der PLCAPP.
|
"""Konfiguriert den PipeLogwriter fuer Ausgaben der PLCAPP.
|
||||||
@return PipeLogwriter()"""
|
@return PipeLogwriter()"""
|
||||||
@@ -132,14 +146,13 @@ class RevPiPlc(Thread):
|
|||||||
_setuprt(self._procplc.pid, self._evt_exit)
|
_setuprt(self._procplc.pid, self._evt_exit)
|
||||||
|
|
||||||
# Überwachung starten
|
# Überwachung starten
|
||||||
delaycounter = self.autoreloaddelay
|
|
||||||
while not self._evt_exit.is_set():
|
while not self._evt_exit.is_set():
|
||||||
|
|
||||||
# Auswerten
|
# Auswerten
|
||||||
self.exitcode = self._procplc.poll()
|
self.exitcode = self._procplc.poll()
|
||||||
|
|
||||||
if self.exitcode is not None:
|
if self.exitcode is not None:
|
||||||
if delaycounter == self.autoreloaddelay:
|
if self._delaycounter == self.autoreloaddelay:
|
||||||
if self.exitcode > 0:
|
if self.exitcode > 0:
|
||||||
# PLC Python Programm abgestürzt
|
# PLC Python Programm abgestürzt
|
||||||
proginit.logger.error(
|
proginit.logger.error(
|
||||||
@@ -165,10 +178,10 @@ class RevPiPlc(Thread):
|
|||||||
)
|
)
|
||||||
|
|
||||||
if not self._evt_exit.is_set() and self.autoreload:
|
if not self._evt_exit.is_set() and self.autoreload:
|
||||||
if delaycounter > 0:
|
if self._delaycounter > 0:
|
||||||
delaycounter -= 1
|
self._delaycounter -= 1
|
||||||
else:
|
else:
|
||||||
delaycounter = self.autoreloaddelay
|
self._delaycounter = self.autoreloaddelay
|
||||||
|
|
||||||
# Prozess neu starten
|
# Prozess neu starten
|
||||||
self._procplc = self._spopen(lst_proc)
|
self._procplc = self._spopen(lst_proc)
|
||||||
@@ -240,3 +253,5 @@ class RevPiPlc(Thread):
|
|||||||
proginit.logger.debug("log pipes successfully closed")
|
proginit.logger.debug("log pipes successfully closed")
|
||||||
|
|
||||||
proginit.logger.debug("leave RevPiPlc.stop()")
|
proginit.logger.debug("leave RevPiPlc.stop()")
|
||||||
|
|
||||||
|
autoreloaddelay = property(__get_autoreloaddelay, __set_autoreloaddelay)
|
||||||
|
|||||||
@@ -50,7 +50,7 @@ from time import asctime
|
|||||||
from xmlrpc.client import Binary
|
from xmlrpc.client import Binary
|
||||||
from xrpcserver import SaveXMLRPCServer
|
from xrpcserver import SaveXMLRPCServer
|
||||||
|
|
||||||
pyloadversion = "0.6.2"
|
pyloadversion = "0.6.3"
|
||||||
|
|
||||||
|
|
||||||
class RevPiPyLoad():
|
class RevPiPyLoad():
|
||||||
@@ -72,12 +72,18 @@ class RevPiPyLoad():
|
|||||||
self.evt_loadconfig = Event()
|
self.evt_loadconfig = Event()
|
||||||
self.globalconfig = ConfigParser()
|
self.globalconfig = ConfigParser()
|
||||||
self.logr = logsystem.LogReader()
|
self.logr = logsystem.LogReader()
|
||||||
self.plc = None
|
|
||||||
self.plc_pause = False
|
|
||||||
self.tfile = {}
|
self.tfile = {}
|
||||||
self.xsrv = None
|
self.xsrv = None
|
||||||
self.xml_ps = None
|
self.xml_ps = None
|
||||||
|
|
||||||
|
# Berechtigungsmanger
|
||||||
|
self.plcslaveacl = IpAclManager(minlevel=0, maxlevel=1)
|
||||||
|
self.xmlrpcacl = IpAclManager(minlevel=0, maxlevel=4)
|
||||||
|
|
||||||
|
# Threads/Prozesse
|
||||||
|
self.th_plcslave = None
|
||||||
|
self.plc = None
|
||||||
|
|
||||||
# Konfiguration laden
|
# Konfiguration laden
|
||||||
self._loadconfig()
|
self._loadconfig()
|
||||||
|
|
||||||
@@ -89,19 +95,59 @@ class RevPiPyLoad():
|
|||||||
|
|
||||||
proginit.logger.debug("leave RevPiPyLoad.__init__()")
|
proginit.logger.debug("leave RevPiPyLoad.__init__()")
|
||||||
|
|
||||||
|
def _check_mustrestart_plcslave(self):
|
||||||
|
"""Prueft ob sich kritische Werte veraendert haben.
|
||||||
|
@return True, wenn Subsystemneustart noetig ist"""
|
||||||
|
if self.th_plcslave is None:
|
||||||
|
return True
|
||||||
|
elif "PLCSLAVE" not in self.globalconfig:
|
||||||
|
return True
|
||||||
|
else:
|
||||||
|
ip = self.globalconfig["PLCSLAVE"].get("bindip", "127.0.0.1")
|
||||||
|
if ip == "*":
|
||||||
|
ip = ""
|
||||||
|
elif ip == "":
|
||||||
|
ip = "127.0.0.1"
|
||||||
|
port = int(self.globalconfig["PLCSLAVE"].get("port", 55234))
|
||||||
|
|
||||||
|
return (
|
||||||
|
self.plcslave !=
|
||||||
|
int(self.globalconfig["PLCSLAVE"].get("plcslave", 0))
|
||||||
|
or self.plcslavebindip != ip
|
||||||
|
or self.plcslaveport != port
|
||||||
|
)
|
||||||
|
|
||||||
|
def _check_mustrestart_plcprogram(self):
|
||||||
|
"""Prueft ob sich kritische Werte veraendert haben.
|
||||||
|
@return True, wenn Subsystemneustart noetig ist"""
|
||||||
|
if self.plc is None:
|
||||||
|
return True
|
||||||
|
elif "XMLRPC" not in self.globalconfig:
|
||||||
|
return True
|
||||||
|
else:
|
||||||
|
return (
|
||||||
|
self.plcworkdir !=
|
||||||
|
self.globalconfig["DEFAULT"].get("plcworkdir", ".")
|
||||||
|
or self.plcprogram !=
|
||||||
|
self.globalconfig["DEFAULT"].get("plcprogram", "none.py")
|
||||||
|
or self.plcarguments !=
|
||||||
|
self.globalconfig["DEFAULT"].get("plcarguments", "")
|
||||||
|
or self.plcuid !=
|
||||||
|
int(self.globalconfig["DEFAULT"].get("plcuid", 65534))
|
||||||
|
or self.plcgid !=
|
||||||
|
int(self.globalconfig["DEFAULT"].get("plcgid", 65534))
|
||||||
|
or self.pythonversion !=
|
||||||
|
int(self.globalconfig["DEFAULT"].get("pythonversion", 3))
|
||||||
|
or self.rtlevel !=
|
||||||
|
int(self.globalconfig["DEFAULT"].get("rtlevel", 0))
|
||||||
|
)
|
||||||
|
|
||||||
def _loadconfig(self):
|
def _loadconfig(self):
|
||||||
"""Load configuration file and setup modul."""
|
"""Load configuration file and setup modul."""
|
||||||
proginit.logger.debug("enter RevPiPyLoad._loadconfig()")
|
proginit.logger.debug("enter RevPiPyLoad._loadconfig()")
|
||||||
|
|
||||||
self.evt_loadconfig.clear()
|
# Subsysteme herunterfahren
|
||||||
pauseproc = False
|
self.stop_xmlrpcserver()
|
||||||
|
|
||||||
if not self._exit:
|
|
||||||
proginit.logger.info(
|
|
||||||
"shutdown revpipyload while getting new config"
|
|
||||||
)
|
|
||||||
self.stop()
|
|
||||||
pauseproc = True
|
|
||||||
|
|
||||||
# Konfigurationsdatei laden
|
# Konfigurationsdatei laden
|
||||||
proginit.logger.info(
|
proginit.logger.info(
|
||||||
@@ -109,6 +155,10 @@ class RevPiPyLoad():
|
|||||||
)
|
)
|
||||||
self.globalconfig.read(proginit.globalconffile)
|
self.globalconfig.read(proginit.globalconffile)
|
||||||
|
|
||||||
|
# Merker für Subsystem-Neustart nach laden, vor setzen
|
||||||
|
restart_plcslave = self._check_mustrestart_plcslave()
|
||||||
|
restart_plcprogram = self._check_mustrestart_plcprogram()
|
||||||
|
|
||||||
# Konfiguration verarbeiten [DEFAULT]
|
# Konfiguration verarbeiten [DEFAULT]
|
||||||
self.autoreload = \
|
self.autoreload = \
|
||||||
int(self.globalconfig["DEFAULT"].get("autoreload", 1))
|
int(self.globalconfig["DEFAULT"].get("autoreload", 1))
|
||||||
@@ -140,12 +190,15 @@ class RevPiPyLoad():
|
|||||||
if "PLCSLAVE" in self.globalconfig:
|
if "PLCSLAVE" in self.globalconfig:
|
||||||
self.plcslave = \
|
self.plcslave = \
|
||||||
int(self.globalconfig["PLCSLAVE"].get("plcslave", 0))
|
int(self.globalconfig["PLCSLAVE"].get("plcslave", 0))
|
||||||
self.plcslaveacl = IpAclManager(minlevel=0, maxlevel=1)
|
|
||||||
|
# Berechtigungen laden, wenn aktiv ist
|
||||||
if not self.plcslaveacl.loadaclfile(
|
if not self.plcslaveacl.loadaclfile(
|
||||||
self.globalconfig["PLCSLAVE"].get("aclfile", "")):
|
self.globalconfig["PLCSLAVE"].get("aclfile", "")):
|
||||||
proginit.logger.warning(
|
proginit.logger.warning(
|
||||||
"can not load plcslave acl - wrong format"
|
"can not load plcslave acl - wrong format"
|
||||||
)
|
)
|
||||||
|
if self.plcslave != 1:
|
||||||
|
self.stop_plcslave()
|
||||||
|
|
||||||
# Bind IP lesen und anpassen
|
# Bind IP lesen und anpassen
|
||||||
self.plcslavebindip = \
|
self.plcslavebindip = \
|
||||||
@@ -163,7 +216,7 @@ class RevPiPyLoad():
|
|||||||
if "XMLRPC" in self.globalconfig:
|
if "XMLRPC" in self.globalconfig:
|
||||||
self.xmlrpc = \
|
self.xmlrpc = \
|
||||||
int(self.globalconfig["XMLRPC"].get("xmlrpc", 0))
|
int(self.globalconfig["XMLRPC"].get("xmlrpc", 0))
|
||||||
self.xmlrpcacl = IpAclManager(minlevel=0, maxlevel=4)
|
|
||||||
if not self.xmlrpcacl.loadaclfile(
|
if not self.xmlrpcacl.loadaclfile(
|
||||||
self.globalconfig["XMLRPC"].get("aclfile", "")):
|
self.globalconfig["XMLRPC"].get("aclfile", "")):
|
||||||
proginit.logger.warning(
|
proginit.logger.warning(
|
||||||
@@ -188,12 +241,37 @@ class RevPiPyLoad():
|
|||||||
)
|
)
|
||||||
os.chdir(self.plcworkdir)
|
os.chdir(self.plcworkdir)
|
||||||
|
|
||||||
# PLC Threads konfigurieren
|
# PLC Programm konfigurieren
|
||||||
self.plc = self._plcthread()
|
if restart_plcprogram:
|
||||||
self.th_plcslave = self._plcslave()
|
self.stop_plcprogram()
|
||||||
|
self.plc = self._plcthread()
|
||||||
|
|
||||||
|
if not self._exit and self.plc is not None and self.autostart:
|
||||||
|
proginit.logger.info("restart plc program after reload")
|
||||||
|
self.plc.start()
|
||||||
|
|
||||||
|
else:
|
||||||
|
proginit.logger.info(
|
||||||
|
"configure plc program parameters after reload"
|
||||||
|
)
|
||||||
|
self.plc.autoreload = self.autoreload
|
||||||
|
self.plc.autoreloaddelay = self.autoreloaddelay
|
||||||
|
self.plc.zeroonerror = self.zeroonerror
|
||||||
|
self.plc.zeroonexit = self.zeroonexit
|
||||||
|
|
||||||
|
# PLC-Slave konfigurieren
|
||||||
|
if restart_plcslave:
|
||||||
|
self.stop_plcslave()
|
||||||
|
self.th_plcslave = self._plcslave()
|
||||||
|
|
||||||
|
if not self._exit and self.th_plcslave is not None:
|
||||||
|
proginit.logger.info("restart plc slave after reload")
|
||||||
|
self.th_plcslave.start()
|
||||||
|
|
||||||
# XMLRPC-Server Instantiieren und konfigurieren
|
# XMLRPC-Server Instantiieren und konfigurieren
|
||||||
if self.xmlrpc == 1:
|
if self.xmlrpc == 0:
|
||||||
|
self.xmlrpc = None
|
||||||
|
else:
|
||||||
proginit.logger.debug("create xmlrpc server")
|
proginit.logger.debug("create xmlrpc server")
|
||||||
self.xsrv = SaveXMLRPCServer(
|
self.xsrv = SaveXMLRPCServer(
|
||||||
(self.xmlrpcbindip, self.xmlrpcport),
|
(self.xmlrpcbindip, self.xmlrpcport),
|
||||||
@@ -276,11 +354,13 @@ class RevPiPyLoad():
|
|||||||
|
|
||||||
proginit.logger.debug("created xmlrpc server")
|
proginit.logger.debug("created xmlrpc server")
|
||||||
|
|
||||||
if pauseproc:
|
# Neustart bei reload
|
||||||
proginit.logger.info(
|
if not self._exit:
|
||||||
"start revpipyload after getting new config"
|
proginit.logger.info("start xmlrpc-server")
|
||||||
)
|
self.xsrv.start()
|
||||||
self.start()
|
|
||||||
|
# Konfiguration abschließen
|
||||||
|
self.evt_loadconfig.clear()
|
||||||
|
|
||||||
proginit.logger.debug("leave RevPiPyLoad._loadconfig()")
|
proginit.logger.debug("leave RevPiPyLoad._loadconfig()")
|
||||||
|
|
||||||
@@ -297,7 +377,7 @@ class RevPiPyLoad():
|
|||||||
))
|
))
|
||||||
return None
|
return None
|
||||||
|
|
||||||
proginit.logger.debug("create PLC watcher")
|
proginit.logger.debug("create PLC program watcher")
|
||||||
th_plc = plcsystem.RevPiPlc(
|
th_plc = plcsystem.RevPiPlc(
|
||||||
os.path.join(self.plcworkdir, self.plcprogram),
|
os.path.join(self.plcworkdir, self.plcprogram),
|
||||||
self.plcarguments,
|
self.plcarguments,
|
||||||
@@ -423,17 +503,21 @@ class RevPiPyLoad():
|
|||||||
# Slaveausfuehrung übergeben
|
# Slaveausfuehrung übergeben
|
||||||
self.th_plcslave.start()
|
self.th_plcslave.start()
|
||||||
|
|
||||||
if self.autostart:
|
# PLC Programm automatisch starten
|
||||||
proginit.logger.debug("starting revpiplc-thread")
|
if self.autostart and self.plc is not None:
|
||||||
if self.plc is not None:
|
self.plc.start()
|
||||||
self.plc.start()
|
|
||||||
|
|
||||||
while not self._exit \
|
# mainloop
|
||||||
and not self.evt_loadconfig.is_set():
|
while not self._exit:
|
||||||
|
|
||||||
|
# Neue Konfiguration laden
|
||||||
|
if self.evt_loadconfig.is_set():
|
||||||
|
proginit.logger.info("got reqeust to reload config")
|
||||||
|
self._loadconfig()
|
||||||
|
|
||||||
# PLC Server Thread prüfen
|
# PLC Server Thread prüfen
|
||||||
if self.plcslave \
|
if self.plcslave and self.th_plcslave is not None \
|
||||||
and not (self.plc_pause or self.th_plcslave.is_alive()):
|
and not self.th_plcslave.is_alive():
|
||||||
proginit.logger.warning(
|
proginit.logger.warning(
|
||||||
"restart plc slave after thread was not running"
|
"restart plc slave after thread was not running"
|
||||||
)
|
)
|
||||||
@@ -452,39 +536,57 @@ class RevPiPyLoad():
|
|||||||
|
|
||||||
self.evt_loadconfig.wait(1)
|
self.evt_loadconfig.wait(1)
|
||||||
|
|
||||||
if not self._exit:
|
proginit.logger.info("stopping revpipyload")
|
||||||
proginit.logger.info("exit python plc program to reload config")
|
|
||||||
self._loadconfig()
|
# Alle Sub-Systeme beenden
|
||||||
|
self.stop_plcslave()
|
||||||
|
self.stop_plcprogram()
|
||||||
|
self.stop_xmlrpcserver()
|
||||||
|
|
||||||
|
# Logreader schließen
|
||||||
|
self.logr.closeall()
|
||||||
|
|
||||||
proginit.logger.debug("leave RevPiPyLoad.start()")
|
proginit.logger.debug("leave RevPiPyLoad.start()")
|
||||||
|
|
||||||
def stop(self):
|
def stop(self):
|
||||||
"""Stop revpipyload."""
|
"""Stop revpipyload."""
|
||||||
proginit.logger.debug("enter RevPiPyLoad.stop()")
|
proginit.logger.debug("enter RevPiPyLoad.stop()")
|
||||||
|
|
||||||
proginit.logger.info("stopping revpipyload")
|
|
||||||
self._exit = True
|
self._exit = True
|
||||||
|
proginit.logger.debug("leave RevPiPyLoad.stop()")
|
||||||
|
|
||||||
if self.th_plcslave is not None and self.th_plcslave.is_alive():
|
def stop_plcprogram(self):
|
||||||
proginit.logger.debug("stopping revpi slave thread")
|
"""Beendet PLC Programm."""
|
||||||
self.th_plcslave.stop()
|
proginit.logger.debug("enter RevPiPyLoad.stop_plcprogram()")
|
||||||
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.info("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")
|
||||||
|
|
||||||
if self.xmlrpc >= 1:
|
proginit.logger.debug("leave RevPiPyLoad.stop_plcprogram()")
|
||||||
|
|
||||||
|
def stop_plcslave(self):
|
||||||
|
"""Beendet PLC Slave."""
|
||||||
|
proginit.logger.debug("enter RevPiPyLoad.stop_plcslave()")
|
||||||
|
|
||||||
|
if self.th_plcslave is not None and self.th_plcslave.is_alive():
|
||||||
|
proginit.logger.info("stopping revpi slave thread")
|
||||||
|
self.th_plcslave.stop()
|
||||||
|
self.th_plcslave.join()
|
||||||
|
proginit.logger.debug("revpi slave thread successfully closed")
|
||||||
|
|
||||||
|
proginit.logger.debug("leave RevPiPyLoad.stop_plcslave()")
|
||||||
|
|
||||||
|
def stop_xmlrpcserver(self):
|
||||||
|
"""Beendet XML-RPC."""
|
||||||
|
proginit.logger.debug("enter RevPiPyLoad.stop_xmlrpcserver()")
|
||||||
|
|
||||||
|
if self.xsrv is not None:
|
||||||
proginit.logger.info("shutting down xmlrpc-server")
|
proginit.logger.info("shutting down xmlrpc-server")
|
||||||
self.xsrv.stop()
|
self.xsrv.stop()
|
||||||
|
|
||||||
# Logreader schließen
|
proginit.logger.debug("leave RevPiPyLoad.stop_xmlrpcserver()")
|
||||||
self.logr.closeall()
|
|
||||||
|
|
||||||
proginit.logger.debug("leave RevPiPyLoad.stop()")
|
|
||||||
|
|
||||||
def xml_getconfig(self):
|
def xml_getconfig(self):
|
||||||
"""Uebertraegt die RevPiPyLoad Konfiguration.
|
"""Uebertraegt die RevPiPyLoad Konfiguration.
|
||||||
@@ -618,9 +720,7 @@ class RevPiPyLoad():
|
|||||||
"""
|
"""
|
||||||
proginit.logger.debug("xmlrpc call plcstop")
|
proginit.logger.debug("xmlrpc call plcstop")
|
||||||
if self.plc is not None and self.plc.is_alive():
|
if self.plc is not None and self.plc.is_alive():
|
||||||
self.plc.stop()
|
self.stop_plcprogram()
|
||||||
self.plc.join()
|
|
||||||
proginit.logger.debug("revpiplc thread successfully closed")
|
|
||||||
return self.plc.exitcode
|
return self.plc.exitcode
|
||||||
else:
|
else:
|
||||||
return -1
|
return -1
|
||||||
@@ -725,6 +825,13 @@ class RevPiPyLoad():
|
|||||||
str(dc[key])
|
str(dc[key])
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# conf-Datei schreiben
|
||||||
|
with open(proginit.globalconffile, "w") as fh:
|
||||||
|
self.globalconfig.write(fh)
|
||||||
|
proginit.logger.info(
|
||||||
|
"got new config and wrote it to {}".format(proginit.globalconffile)
|
||||||
|
)
|
||||||
|
|
||||||
# ACLs sofort übernehmen und schreiben
|
# ACLs sofort übernehmen und schreiben
|
||||||
str_acl = dc.get("plcslaveacl", None)
|
str_acl = dc.get("plcslaveacl", None)
|
||||||
if str_acl is not None and self.plcslaveacl.acl != str_acl:
|
if str_acl is not None and self.plcslaveacl.acl != str_acl:
|
||||||
@@ -759,16 +866,8 @@ class RevPiPyLoad():
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
# conf-Datei schreiben
|
# RevPiPyLoad neu konfigurieren
|
||||||
with open(proginit.globalconffile, "w") as fh:
|
self.evt_loadconfig.set()
|
||||||
self.globalconfig.write(fh)
|
|
||||||
proginit.logger.info(
|
|
||||||
"got new config and wrote it to {}".format(proginit.globalconffile)
|
|
||||||
)
|
|
||||||
|
|
||||||
if loadnow:
|
|
||||||
# RevPiPyLoad neu konfigurieren
|
|
||||||
self.evt_loadconfig.set()
|
|
||||||
|
|
||||||
return True
|
return True
|
||||||
|
|
||||||
@@ -862,7 +961,6 @@ class RevPiPyLoad():
|
|||||||
-2: Laeuft bereits
|
-2: Laeuft bereits
|
||||||
|
|
||||||
"""
|
"""
|
||||||
self.plc_pause = False
|
|
||||||
if self.th_plcslave is not None and self.th_plcslave.is_alive():
|
if self.th_plcslave is not None and self.th_plcslave.is_alive():
|
||||||
return -2
|
return -2
|
||||||
else:
|
else:
|
||||||
@@ -876,9 +974,9 @@ class RevPiPyLoad():
|
|||||||
def xml_plcslavestop(self):
|
def xml_plcslavestop(self):
|
||||||
"""Stoppt den PLC Slave Server.
|
"""Stoppt den PLC Slave Server.
|
||||||
@return True, wenn stop erfolgreich"""
|
@return True, wenn stop erfolgreich"""
|
||||||
self.plc_pause = True
|
|
||||||
if self.th_plcslave is not None:
|
if self.th_plcslave is not None:
|
||||||
self.th_plcslave.stop()
|
self.stop_plcslave()
|
||||||
|
self.th_plcslave = None
|
||||||
return True
|
return True
|
||||||
else:
|
else:
|
||||||
return False
|
return False
|
||||||
|
|||||||
5
setup.py
5
setup.py
@@ -27,7 +27,7 @@ setup(
|
|||||||
|
|
||||||
license="LGPLv3",
|
license="LGPLv3",
|
||||||
name="revpipyload",
|
name="revpipyload",
|
||||||
version="0.6.2",
|
version="0.6.3",
|
||||||
|
|
||||||
scripts=["data/revpipyload"],
|
scripts=["data/revpipyload"],
|
||||||
|
|
||||||
@@ -39,9 +39,12 @@ setup(
|
|||||||
"data/etc/avahi/services/revpipyload.service",
|
"data/etc/avahi/services/revpipyload.service",
|
||||||
]),
|
]),
|
||||||
("/etc/revpipyload", [
|
("/etc/revpipyload", [
|
||||||
|
"data/etc/revpipyload/aclplcslave.conf",
|
||||||
|
"data/etc/revpipyload/aclxmlrpc.conf",
|
||||||
"data/etc/revpipyload/revpipyload.conf",
|
"data/etc/revpipyload/revpipyload.conf",
|
||||||
]),
|
]),
|
||||||
("share/revpipyload", glob("revpipyload/*.*")),
|
("share/revpipyload", glob("revpipyload/*.*")),
|
||||||
|
("share/revpipyload/shared", glob("revpipyload/shared/*.*")),
|
||||||
("/var/lib/revpipyload", [
|
("/var/lib/revpipyload", [
|
||||||
"data/var/lib/revpipyload/.placeholder",
|
"data/var/lib/revpipyload/.placeholder",
|
||||||
])
|
])
|
||||||
|
|||||||
Reference in New Issue
Block a user