mirror of
https://github.com/naruxde/revpipyload.git
synced 2025-11-08 15:13:52 +01:00
Replaces Master-Slave with Client-Server
Expunging all occurrences of inappropriate language of the query and response paradigm of PLC communications. We are familiar with the Modbus terminology and fully support this change. https://www.modbus.org/docs/Client-ServerPR-07-2020-final.docx.pdf
This commit is contained in:
3
data/etc/revpipyload/aclplcserver.conf
Normal file
3
data/etc/revpipyload/aclplcserver.conf
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
# PLC-SERVER Access Control List (acl)
|
||||||
|
# One entry per Line IPADRESS,LEVEL
|
||||||
|
#
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
# PLC-SLAVE Access Control List (acl)
|
|
||||||
# One entry per Line IPADRESS,LEVEL
|
|
||||||
#
|
|
||||||
@@ -17,9 +17,9 @@ rtlevel = 0
|
|||||||
zeroonerror = 1
|
zeroonerror = 1
|
||||||
zeroonexit = 0
|
zeroonexit = 0
|
||||||
|
|
||||||
[PLCSLAVE]
|
[PLCSERVER]
|
||||||
plcslave = 0
|
plcserver = 0
|
||||||
aclfile = /etc/revpipyload/aclplcslave.conf
|
aclfile = /etc/revpipyload/aclplcserver.conf
|
||||||
bindip = *
|
bindip = *
|
||||||
port = 55234
|
port = 55234
|
||||||
watchdog = 1
|
watchdog = 1
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
"""Modul fuer die Verwaltung der PLC-Slave Funktionen."""
|
"""Modul fuer die Verwaltung der PLC-Server Funktionen."""
|
||||||
__author__ = "Sven Sager"
|
__author__ = "Sven Sager"
|
||||||
__copyright__ = "Copyright (C) 2023 Sven Sager"
|
__copyright__ = "Copyright (C) 2023 Sven Sager"
|
||||||
__license__ = "GPLv2"
|
__license__ = "GPLv2"
|
||||||
@@ -20,21 +20,21 @@ HASH_PICT = HASH_FAIL
|
|||||||
HASH_RPIO = HASH_NULL
|
HASH_RPIO = HASH_NULL
|
||||||
|
|
||||||
|
|
||||||
class RevPiSlave(Thread):
|
class RevPiPlcServer(Thread):
|
||||||
"""RevPi PLC-Server.
|
"""RevPi PLC-Server.
|
||||||
|
|
||||||
Diese Klasste stellt den RevPi PLC-Server zur verfuegung und akzeptiert
|
Diese Klasste stellt den RevPi PLC-Server zur verfuegung und akzeptiert
|
||||||
neue Verbindungen. Diese werden dann als RevPiSlaveDev abgebildet.
|
neue Verbindungen. Diese werden dann als RevPiPlcServerDev abgebildet.
|
||||||
|
|
||||||
Ueber die angegebenen ACLs koennen Zugriffsbeschraenkungen vergeben werden.
|
Ueber die angegebenen ACLs koennen Zugriffsbeschraenkungen vergeben werden.
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(self, ipacl, port=55234, bindip="", watchdog=True):
|
def __init__(self, ipacl, port=55234, bindip="", watchdog=True):
|
||||||
"""Instantiiert RevPiSlave-Klasse.
|
"""Instantiiert RevPiPlcServer-Klasse.
|
||||||
|
|
||||||
@param ipacl AclManager <class 'IpAclManager'>
|
@param ipacl AclManager <class 'IpAclManager'>
|
||||||
@param port Listen Port fuer plc Slaveserver
|
@param port Listen Port fuer plc server
|
||||||
@param bindip IP-Adresse an die der Dienst gebunden wird (leer=alle)
|
@param bindip IP-Adresse an die der Dienst gebunden wird (leer=alle)
|
||||||
@param watchdog Trennen, wenn Verarbeitungszeit zu lang
|
@param watchdog Trennen, wenn Verarbeitungszeit zu lang
|
||||||
|
|
||||||
@@ -98,7 +98,7 @@ class RevPiSlave(Thread):
|
|||||||
|
|
||||||
def run(self):
|
def run(self):
|
||||||
"""Startet Serverkomponente fuer die Annahme neuer Verbindungen."""
|
"""Startet Serverkomponente fuer die Annahme neuer Verbindungen."""
|
||||||
proginit.logger.debug("enter RevPiSlave.run()")
|
proginit.logger.debug("enter RevPiPlcServer.run()")
|
||||||
|
|
||||||
# Socket öffnen und konfigurieren bis Erfolg oder Ende
|
# Socket öffnen und konfigurieren bis Erfolg oder Ende
|
||||||
self.so = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
self.so = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
||||||
@@ -149,7 +149,7 @@ class RevPiSlave(Thread):
|
|||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
# Thread starten
|
# Thread starten
|
||||||
th = RevPiSlaveDev(tup_sock, aclstatus, self._watchdog)
|
th = RevPiPlcServerDev(tup_sock, aclstatus, self._watchdog)
|
||||||
th.start()
|
th.start()
|
||||||
self._th_dev.append(th)
|
self._th_dev.append(th)
|
||||||
|
|
||||||
@@ -160,9 +160,9 @@ class RevPiSlave(Thread):
|
|||||||
|
|
||||||
# Disconnect all clients and wait some time, because they are daemons
|
# Disconnect all clients and wait some time, because they are daemons
|
||||||
th_close_err = False
|
th_close_err = False
|
||||||
for th in self._th_dev: # type: RevPiSlaveDev
|
for th in self._th_dev: # type: RevPiPlcServerDev
|
||||||
th.stop()
|
th.stop()
|
||||||
for th in self._th_dev: # type: RevPiSlaveDev
|
for th in self._th_dev: # type: RevPiPlcServerDev
|
||||||
th.join(2.0)
|
th.join(2.0)
|
||||||
if th.is_alive():
|
if th.is_alive():
|
||||||
th_close_err = True
|
th_close_err = True
|
||||||
@@ -177,11 +177,11 @@ class RevPiSlave(Thread):
|
|||||||
|
|
||||||
self.exitcode = 0
|
self.exitcode = 0
|
||||||
|
|
||||||
proginit.logger.debug("leave RevPiSlave.run()")
|
proginit.logger.debug("leave RevPiPlcServer.run()")
|
||||||
|
|
||||||
def stop(self):
|
def stop(self):
|
||||||
"""Beendet Slaveausfuehrung."""
|
"""Beendet Serverausfuehrung."""
|
||||||
proginit.logger.debug("enter RevPiSlave.stop()")
|
proginit.logger.debug("enter RevPiPlcServer.stop()")
|
||||||
|
|
||||||
self._evt_exit.set()
|
self._evt_exit.set()
|
||||||
if self.so is not None:
|
if self.so is not None:
|
||||||
@@ -190,7 +190,7 @@ class RevPiSlave(Thread):
|
|||||||
except Exception:
|
except Exception:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
proginit.logger.debug("leave RevPiSlave.stop()")
|
proginit.logger.debug("leave RevPiPlcServer.stop()")
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def watchdog(self):
|
def watchdog(self):
|
||||||
@@ -199,11 +199,11 @@ class RevPiSlave(Thread):
|
|||||||
@watchdog.setter
|
@watchdog.setter
|
||||||
def watchdog(self, value):
|
def watchdog(self, value):
|
||||||
self._watchdog = value
|
self._watchdog = value
|
||||||
for th in self._th_dev: # type: RevPiSlaveDev
|
for th in self._th_dev: # type: RevPiPlcServerDev
|
||||||
th.watchdog = value
|
th.watchdog = value
|
||||||
|
|
||||||
|
|
||||||
class RevPiSlaveDev(Thread):
|
class RevPiPlcServerDev(Thread):
|
||||||
"""Klasse um eine RevPiModIO Verbindung zu verwalten.
|
"""Klasse um eine RevPiModIO Verbindung zu verwalten.
|
||||||
|
|
||||||
Diese Klasste stellt die Funktionen zur Verfuegung um Daten ueber das
|
Diese Klasste stellt die Funktionen zur Verfuegung um Daten ueber das
|
||||||
@@ -211,7 +211,7 @@ class RevPiSlaveDev(Thread):
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(self, devcon, acl, watchdog):
|
def __init__(self, devcon, acl, watchdog):
|
||||||
"""Init RevPiSlaveDev-Class.
|
"""Init RevPiPlcServerDev-Class.
|
||||||
|
|
||||||
@param devcon Tuple der Verbindung
|
@param devcon Tuple der Verbindung
|
||||||
@param acl Berechtigungslevel
|
@param acl Berechtigungslevel
|
||||||
@@ -232,7 +232,7 @@ class RevPiSlaveDev(Thread):
|
|||||||
|
|
||||||
def run(self):
|
def run(self):
|
||||||
"""Verarbeitet Anfragen von Remoteteilnehmer."""
|
"""Verarbeitet Anfragen von Remoteteilnehmer."""
|
||||||
proginit.logger.debug("enter RevPiSlaveDev.run()")
|
proginit.logger.debug("enter RevPiPlcServerDev.run()")
|
||||||
|
|
||||||
proginit.logger.info(
|
proginit.logger.info(
|
||||||
"got new connection from host {0} with acl {1}".format(
|
"got new connection from host {0} with acl {1}".format(
|
||||||
@@ -615,7 +615,7 @@ class RevPiSlaveDev(Thread):
|
|||||||
self._devcon = None
|
self._devcon = None
|
||||||
|
|
||||||
proginit.logger.info("disconnected from {0}".format(self._addr))
|
proginit.logger.info("disconnected from {0}".format(self._addr))
|
||||||
proginit.logger.debug("leave RevPiSlaveDev.run()")
|
proginit.logger.debug("leave RevPiPlcServerDev.run()")
|
||||||
|
|
||||||
def stop(self):
|
def stop(self):
|
||||||
"""
|
"""
|
||||||
@@ -625,10 +625,10 @@ class RevPiSlaveDev(Thread):
|
|||||||
the connection. Call .join() to give the thread some time, it is a
|
the connection. Call .join() to give the thread some time, it is a
|
||||||
daemon!
|
daemon!
|
||||||
"""
|
"""
|
||||||
proginit.logger.debug("enter RevPiSlaveDev.stop()")
|
proginit.logger.debug("enter RevPiPlcServerDev.stop()")
|
||||||
|
|
||||||
self._evt_exit.set()
|
self._evt_exit.set()
|
||||||
if self._devcon is not None:
|
if self._devcon is not None:
|
||||||
self._devcon.shutdown(socket.SHUT_RDWR)
|
self._devcon.shutdown(socket.SHUT_RDWR)
|
||||||
|
|
||||||
proginit.logger.debug("leave RevPiSlaveDev.stop()")
|
proginit.logger.debug("leave RevPiPlcServerDev.stop()")
|
||||||
|
|||||||
@@ -89,15 +89,15 @@ class RevPiPyLoad:
|
|||||||
|
|
||||||
# Berechtigungsmanger
|
# Berechtigungsmanger
|
||||||
if proginit.pargs.developermode:
|
if proginit.pargs.developermode:
|
||||||
self.plcslaveacl = IpAclManager(minlevel=0, maxlevel=9)
|
self.plcserveracl = IpAclManager(minlevel=0, maxlevel=9)
|
||||||
self.xmlrpcacl = IpAclManager(minlevel=0, maxlevel=9)
|
self.xmlrpcacl = IpAclManager(minlevel=0, maxlevel=9)
|
||||||
else:
|
else:
|
||||||
self.plcslaveacl = IpAclManager(minlevel=0, maxlevel=1)
|
self.plcserveracl = IpAclManager(minlevel=0, maxlevel=1)
|
||||||
self.xmlrpcacl = IpAclManager(minlevel=0, maxlevel=4)
|
self.xmlrpcacl = IpAclManager(minlevel=0, maxlevel=4)
|
||||||
|
|
||||||
# Threads/Prozesse
|
# Threads/Prozesse
|
||||||
self.th_plcmqtt = None
|
self.th_plcmqtt = None
|
||||||
self.th_plcslave = None
|
self.th_plcserver = None
|
||||||
self.plc = None
|
self.plc = None
|
||||||
|
|
||||||
# Konfiguration laden
|
# Konfiguration laden
|
||||||
@@ -132,24 +132,24 @@ class RevPiPyLoad:
|
|||||||
or self.mqttsend_on_event != self.globalconfig["MQTT"].getboolean("send_on_event", False) \
|
or self.mqttsend_on_event != self.globalconfig["MQTT"].getboolean("send_on_event", False) \
|
||||||
or self.mqttwrite_outputs != self.globalconfig["MQTT"].getboolean("write_outputs", False)
|
or self.mqttwrite_outputs != self.globalconfig["MQTT"].getboolean("write_outputs", False)
|
||||||
|
|
||||||
def _check_mustrestart_plcslave(self):
|
def _check_mustrestart_plcserver(self):
|
||||||
"""Prueft ob sich kritische Werte veraendert haben.
|
"""Prueft ob sich kritische Werte veraendert haben.
|
||||||
@return True, wenn Subsystemneustart noetig ist"""
|
@return True, wenn Subsystemneustart noetig ist"""
|
||||||
if self.th_plcslave is None:
|
if self.th_plcserver is None:
|
||||||
return True
|
return True
|
||||||
elif "PLCSLAVE" not in self.globalconfig:
|
elif "PLCSERVER" not in self.globalconfig:
|
||||||
return True
|
return True
|
||||||
else:
|
else:
|
||||||
ip = self.globalconfig["PLCSLAVE"].get("bindip", "127.0.0.1")
|
ip = self.globalconfig["PLCSERVER"].get("bindip", "127.0.0.1")
|
||||||
if ip == "*":
|
if ip == "*":
|
||||||
ip = ""
|
ip = ""
|
||||||
elif ip == "":
|
elif ip == "":
|
||||||
ip = "127.0.0.1"
|
ip = "127.0.0.1"
|
||||||
port = self.globalconfig["PLCSLAVE"].getint("port", 55234)
|
port = self.globalconfig["PLCSERVER"].getint("port", 55234)
|
||||||
|
|
||||||
return self.plcslave != self.globalconfig["PLCSLAVE"].getboolean("plcslave", False) \
|
return self.plcserver != self.globalconfig["PLCSERVER"].getboolean("plcserver", False) \
|
||||||
or self.plcslavebindip != ip \
|
or self.plcserverbindip != ip \
|
||||||
or self.plcslaveport != port
|
or self.plcserverport != port
|
||||||
|
|
||||||
def _check_mustrestart_plcprogram(self):
|
def _check_mustrestart_plcprogram(self):
|
||||||
"""Prueft ob sich kritische Werte veraendert haben.
|
"""Prueft ob sich kritische Werte veraendert haben.
|
||||||
@@ -186,7 +186,7 @@ class RevPiPyLoad:
|
|||||||
|
|
||||||
# Merker für Subsystem-Neustart nach laden, vor setzen
|
# Merker für Subsystem-Neustart nach laden, vor setzen
|
||||||
restart_plcmqtt = self._check_mustrestart_mqtt()
|
restart_plcmqtt = self._check_mustrestart_mqtt()
|
||||||
restart_plcslave = self._check_mustrestart_plcslave()
|
restart_plcserver = self._check_mustrestart_plcserver()
|
||||||
restart_plcprogram = self._check_mustrestart_plcprogram()
|
restart_plcprogram = self._check_mustrestart_plcprogram()
|
||||||
|
|
||||||
# Konfiguration verarbeiten [DEFAULT]
|
# Konfiguration verarbeiten [DEFAULT]
|
||||||
@@ -234,7 +234,7 @@ class RevPiPyLoad:
|
|||||||
file_changed = True
|
file_changed = True
|
||||||
if file_changed:
|
if file_changed:
|
||||||
restart_plcmqtt = True
|
restart_plcmqtt = True
|
||||||
restart_plcslave = True
|
restart_plcserver = True
|
||||||
restart_plcprogram = True
|
restart_plcprogram = True
|
||||||
|
|
||||||
# Konfiguration verarbeiten [MQTT]
|
# Konfiguration verarbeiten [MQTT]
|
||||||
@@ -263,33 +263,33 @@ class RevPiPyLoad:
|
|||||||
self.mqttwrite_outputs = \
|
self.mqttwrite_outputs = \
|
||||||
self.globalconfig["MQTT"].getboolean("write_outputs", False)
|
self.globalconfig["MQTT"].getboolean("write_outputs", False)
|
||||||
|
|
||||||
# Konfiguration verarbeiten [PLCSLAVE]
|
# Konfiguration verarbeiten [PLCSERVER]
|
||||||
self.plcslave = False
|
self.plcserver = False
|
||||||
if "PLCSLAVE" in self.globalconfig:
|
if "PLCSERVER" in self.globalconfig:
|
||||||
self.plcslave = \
|
self.plcserver = \
|
||||||
self.globalconfig["PLCSLAVE"].getboolean("plcslave", False)
|
self.globalconfig["PLCSERVER"].getboolean("plcserver", False)
|
||||||
|
|
||||||
# Berechtigungen laden
|
# Berechtigungen laden
|
||||||
if not self.plcslaveacl.loadaclfile(
|
if not self.plcserveracl.loadaclfile(
|
||||||
self.globalconfig["PLCSLAVE"].get("aclfile", "")):
|
self.globalconfig["PLCSERVER"].get("aclfile", "")):
|
||||||
proginit.logger.warning(
|
proginit.logger.warning(
|
||||||
"can not load plcslave acl - wrong format"
|
"can not load plcserver acl - wrong format"
|
||||||
)
|
)
|
||||||
if not self.plcslave:
|
if not self.plcserver:
|
||||||
self.stop_plcslave()
|
self.stop_plcserver()
|
||||||
|
|
||||||
# Bind IP lesen und anpassen
|
# Bind IP lesen und anpassen
|
||||||
self.plcslavebindip = \
|
self.plcserverbindip = \
|
||||||
self.globalconfig["PLCSLAVE"].get("bindip", "127.0.0.1")
|
self.globalconfig["PLCSERVER"].get("bindip", "127.0.0.1")
|
||||||
if self.plcslavebindip == "*":
|
if self.plcserverbindip == "*":
|
||||||
self.plcslavebindip = ""
|
self.plcserverbindip = ""
|
||||||
elif self.plcslavebindip == "":
|
elif self.plcserverbindip == "":
|
||||||
self.plcslavebindip = "127.0.0.1"
|
self.plcserverbindip = "127.0.0.1"
|
||||||
|
|
||||||
self.plcslaveport = \
|
self.plcserverport = \
|
||||||
self.globalconfig["PLCSLAVE"].getint("port", 55234)
|
self.globalconfig["PLCSERVER"].getint("port", 55234)
|
||||||
self.plcwatchdog = self.globalconfig.getboolean(
|
self.plcwatchdog = self.globalconfig.getboolean(
|
||||||
"PLCSLAVE", "watchdog", fallback=True
|
"PLCSERVER", "watchdog", fallback=True
|
||||||
)
|
)
|
||||||
|
|
||||||
# Konfiguration verarbeiten [XMLRPC]
|
# Konfiguration verarbeiten [XMLRPC]
|
||||||
@@ -362,19 +362,19 @@ class RevPiPyLoad:
|
|||||||
self.plc.zeroonerror = self.zeroonerror
|
self.plc.zeroonerror = self.zeroonerror
|
||||||
self.plc.zeroonexit = self.zeroonexit
|
self.plc.zeroonexit = self.zeroonexit
|
||||||
|
|
||||||
# PLC-Slave konfigurieren
|
# PLC-Server konfigurieren
|
||||||
if restart_plcslave:
|
if restart_plcserver:
|
||||||
self.stop_plcslave()
|
self.stop_plcserver()
|
||||||
self.th_plcslave = self._plcslave()
|
self.th_plcserver = self._plcserver()
|
||||||
|
|
||||||
if not self._exit and self.th_plcslave is not None:
|
if not self._exit and self.th_plcserver is not None:
|
||||||
proginit.logger.info("restart plc slave after reload")
|
proginit.logger.info("restart plc server after reload")
|
||||||
self.th_plcslave.start()
|
self.th_plcserver.start()
|
||||||
|
|
||||||
# PLC-Slave ACL und Einstellungen prüfen
|
# PLC-Server ACL und Einstellungen prüfen
|
||||||
if self.th_plcslave is not None:
|
if self.th_plcserver is not None:
|
||||||
self.th_plcslave.check_connectedacl()
|
self.th_plcserver.check_connectedacl()
|
||||||
self.th_plcslave.watchdog = self.plcwatchdog
|
self.th_plcserver.watchdog = self.plcwatchdog
|
||||||
|
|
||||||
# XMLRPC-Server Instantiieren und konfigurieren
|
# XMLRPC-Server Instantiieren und konfigurieren
|
||||||
if not self.xmlrpc:
|
if not self.xmlrpc:
|
||||||
@@ -413,7 +413,7 @@ class RevPiPyLoad:
|
|||||||
self.xsrv.register_function(
|
self.xsrv.register_function(
|
||||||
0, self.xml_mqttrunning, "mqttrunning")
|
0, self.xml_mqttrunning, "mqttrunning")
|
||||||
self.xsrv.register_function(
|
self.xsrv.register_function(
|
||||||
0, self.xml_plcslaverunning, "plcslaverunning")
|
0, self.xml_plcserverrunning, "plcserverrunning")
|
||||||
|
|
||||||
# Erweiterte Funktionen anmelden
|
# Erweiterte Funktionen anmelden
|
||||||
try:
|
try:
|
||||||
@@ -461,9 +461,9 @@ class RevPiPyLoad:
|
|||||||
self.xsrv.register_function(
|
self.xsrv.register_function(
|
||||||
3, self.xml_mqttstop, "mqttstop")
|
3, self.xml_mqttstop, "mqttstop")
|
||||||
self.xsrv.register_function(
|
self.xsrv.register_function(
|
||||||
3, self.xml_plcslavestart, "plcslavestart")
|
3, self.xml_plcserverstart, "plcserverstart")
|
||||||
self.xsrv.register_function(
|
self.xsrv.register_function(
|
||||||
3, self.xml_plcslavestop, "plcslavestop")
|
3, self.xml_plcserverstop, "plcserverstop")
|
||||||
self.xsrv.register_function(
|
self.xsrv.register_function(
|
||||||
3, self.xml_plcdelete_file, "plcdeletefile")
|
3, self.xml_plcdelete_file, "plcdeletefile")
|
||||||
self.xsrv.register_function(
|
self.xsrv.register_function(
|
||||||
@@ -568,19 +568,19 @@ class RevPiPyLoad:
|
|||||||
proginit.logger.debug("leave RevPiPyLoad._plcthread()")
|
proginit.logger.debug("leave RevPiPyLoad._plcthread()")
|
||||||
return th_plc
|
return th_plc
|
||||||
|
|
||||||
def _plcslave(self):
|
def _plcserver(self):
|
||||||
"""Erstellt den PlcSlave-Server Thread.
|
"""Erstellt den PLC-Server Thread.
|
||||||
@return PLC-Server-Thread Object or None"""
|
@return PLC-Server-Thread Object or None"""
|
||||||
proginit.logger.debug("enter RevPiPyLoad._plcslave()")
|
proginit.logger.debug("enter RevPiPyLoad._plcserver()")
|
||||||
th_plc = None
|
th_plc = None
|
||||||
|
|
||||||
if self.plcslave:
|
if self.plcserver:
|
||||||
th_plc = picontrolserver.RevPiSlave(
|
th_plc = picontrolserver.RevPiPlcServer(
|
||||||
self.plcslaveacl, self.plcslaveport, self.plcslavebindip,
|
self.plcserveracl, self.plcserverport, self.plcserverbindip,
|
||||||
self.plcwatchdog
|
self.plcwatchdog
|
||||||
)
|
)
|
||||||
|
|
||||||
proginit.logger.debug("leave RevPiPyLoad._plcslave()")
|
proginit.logger.debug("leave RevPiPyLoad._plcserver()")
|
||||||
return th_plc
|
return th_plc
|
||||||
|
|
||||||
def _sigexit(self, signum, frame):
|
def _sigexit(self, signum, frame):
|
||||||
@@ -766,9 +766,9 @@ class RevPiPyLoad:
|
|||||||
if self.th_plcmqtt is not None:
|
if self.th_plcmqtt is not None:
|
||||||
self.th_plcmqtt.start()
|
self.th_plcmqtt.start()
|
||||||
|
|
||||||
# Slaveausfuehrung übergeben
|
# Serverausfuehrung übergeben
|
||||||
if self.th_plcslave is not None:
|
if self.th_plcserver is not None:
|
||||||
self.th_plcslave.start()
|
self.th_plcserver.start()
|
||||||
|
|
||||||
# PLC Programm automatisch starten
|
# PLC Programm automatisch starten
|
||||||
if self.autostart and self.plc is not None:
|
if self.autostart and self.plc is not None:
|
||||||
@@ -795,16 +795,16 @@ class RevPiPyLoad:
|
|||||||
file_changed = True
|
file_changed = True
|
||||||
|
|
||||||
# Alle Verbindungen von ProcImgServer trennen
|
# Alle Verbindungen von ProcImgServer trennen
|
||||||
if self.plcslave and self.th_plcslave is not None:
|
if self.plcserver and self.th_plcserver is not None:
|
||||||
self.th_plcslave.disconnect_all()
|
self.th_plcserver.disconnect_all()
|
||||||
|
|
||||||
proginit.logger.warning("piCtory configuration was changed")
|
proginit.logger.warning("piCtory configuration was changed")
|
||||||
|
|
||||||
if self.check_replace_ios_changed():
|
if self.check_replace_ios_changed():
|
||||||
if not file_changed:
|
if not file_changed:
|
||||||
# Verbindungen von ProcImgServer trennen mit replace_ios
|
# Verbindungen von ProcImgServer trennen mit replace_ios
|
||||||
if self.plcslave and self.th_plcslave is not None:
|
if self.plcserver and self.th_plcserver is not None:
|
||||||
self.th_plcslave.disconnect_replace_ios()
|
self.th_plcserver.disconnect_replace_ios()
|
||||||
|
|
||||||
file_changed = True
|
file_changed = True
|
||||||
proginit.logger.warning("replace ios file was changed")
|
proginit.logger.warning("replace ios file was changed")
|
||||||
@@ -846,15 +846,15 @@ class RevPiPyLoad:
|
|||||||
self.th_plcmqtt.start()
|
self.th_plcmqtt.start()
|
||||||
|
|
||||||
# PLC Server Thread prüfen
|
# PLC Server Thread prüfen
|
||||||
if self.plcslave and self.th_plcslave is not None \
|
if self.plcserver and self.th_plcserver is not None \
|
||||||
and not self.th_plcslave.is_alive():
|
and not self.th_plcserver.is_alive():
|
||||||
if not file_changed:
|
if not file_changed:
|
||||||
proginit.logger.warning(
|
proginit.logger.warning(
|
||||||
"restart plc slave after thread was not running"
|
"restart plc server after thread was not running"
|
||||||
)
|
)
|
||||||
self.th_plcslave = self._plcslave()
|
self.th_plcserver = self._plcserver()
|
||||||
if self.th_plcslave is not None:
|
if self.th_plcserver is not None:
|
||||||
self.th_plcslave.start()
|
self.th_plcserver.start()
|
||||||
|
|
||||||
if self.xmlrpc and self.xsrv is not None:
|
if self.xmlrpc and self.xsrv is not None:
|
||||||
# Work multiple xml calls in same thread until timeout
|
# Work multiple xml calls in same thread until timeout
|
||||||
@@ -869,7 +869,7 @@ class RevPiPyLoad:
|
|||||||
# Alle Sub-Systeme beenden
|
# Alle Sub-Systeme beenden
|
||||||
self.stop_plcprogram()
|
self.stop_plcprogram()
|
||||||
self.stop_plcmqtt()
|
self.stop_plcmqtt()
|
||||||
self.stop_plcslave()
|
self.stop_plcserver()
|
||||||
self.stop_xmlrpcserver()
|
self.stop_xmlrpcserver()
|
||||||
|
|
||||||
# Logreader schließen
|
# Logreader schließen
|
||||||
@@ -910,17 +910,17 @@ class RevPiPyLoad:
|
|||||||
|
|
||||||
proginit.logger.debug("leave RevPiPyLoad.stop_plcprogram()")
|
proginit.logger.debug("leave RevPiPyLoad.stop_plcprogram()")
|
||||||
|
|
||||||
def stop_plcslave(self):
|
def stop_plcserver(self):
|
||||||
"""Beendet PLC Slave."""
|
"""Beendet PLC Server."""
|
||||||
proginit.logger.debug("enter RevPiPyLoad.stop_plcslave()")
|
proginit.logger.debug("enter RevPiPyLoad.stop_plcserver()")
|
||||||
|
|
||||||
if self.th_plcslave is not None and self.th_plcslave.is_alive():
|
if self.th_plcserver is not None and self.th_plcserver.is_alive():
|
||||||
proginit.logger.info("stopping revpi slave thread")
|
proginit.logger.info("stopping revpi server thread")
|
||||||
self.th_plcslave.stop()
|
self.th_plcserver.stop()
|
||||||
self.th_plcslave.join()
|
self.th_plcserver.join()
|
||||||
proginit.logger.debug("revpi slave thread successfully closed")
|
proginit.logger.debug("revpi server thread successfully closed")
|
||||||
|
|
||||||
proginit.logger.debug("leave RevPiPyLoad.stop_plcslave()")
|
proginit.logger.debug("leave RevPiPyLoad.stop_plcserver()")
|
||||||
|
|
||||||
def stop_xmlrpcserver(self):
|
def stop_xmlrpcserver(self):
|
||||||
"""Beendet XML-RPC."""
|
"""Beendet XML-RPC."""
|
||||||
@@ -971,12 +971,12 @@ class RevPiPyLoad:
|
|||||||
dc["mqttsend_on_event"] = int(self.mqttsend_on_event)
|
dc["mqttsend_on_event"] = int(self.mqttsend_on_event)
|
||||||
dc["mqttwrite_outputs"] = int(self.mqttwrite_outputs)
|
dc["mqttwrite_outputs"] = int(self.mqttwrite_outputs)
|
||||||
|
|
||||||
# PLCSLAVE Sektion
|
# PLCSERVER Sektion
|
||||||
dc["plcslave"] = int(self.plcslave)
|
dc["plcserver"] = int(self.plcserver)
|
||||||
dc["plcslaveacl"] = self.plcslaveacl.acl
|
dc["plcserveracl"] = self.plcserveracl.acl
|
||||||
dc["plcslavebindip"] = self.plcslavebindip
|
dc["plcserverbindip"] = self.plcserverbindip
|
||||||
dc["plcslaveport"] = self.plcslaveport
|
dc["plcserverport"] = self.plcserverport
|
||||||
dc["plcslavewatchdog"] = int(self.plcwatchdog)
|
dc["plcserverwatchdog"] = int(self.plcwatchdog)
|
||||||
|
|
||||||
# XMLRPC Sektion
|
# XMLRPC Sektion
|
||||||
dc["xmlrpc"] = int(self.xmlrpc)
|
dc["xmlrpc"] = int(self.xmlrpc)
|
||||||
@@ -1261,18 +1261,18 @@ class RevPiPyLoad:
|
|||||||
"mqttsend_on_event": "[01]",
|
"mqttsend_on_event": "[01]",
|
||||||
"mqttwrite_outputs": "[01]",
|
"mqttwrite_outputs": "[01]",
|
||||||
},
|
},
|
||||||
"PLCSLAVE": {
|
"PLCSERVER": {
|
||||||
"plcslave": "[01]",
|
"plcserver": "[01]",
|
||||||
"plcslaveacl": self.plcslaveacl.regex_acl,
|
"plcserveracl": self.plcserveracl.regex_acl,
|
||||||
# "plcslavebindip": "^((([\\d]{1,3}\\.){3}[\\d]{1,3})|\\*)+$",
|
# "plcserverbindip": "^((([\\d]{1,3}\\.){3}[\\d]{1,3})|\\*)+$",
|
||||||
"plcslaveport": "[0-9]{,5}",
|
"plcserverport": "[0-9]{,5}",
|
||||||
"plcslavewatchdog": "[01]",
|
"plcserverwatchdog": "[01]",
|
||||||
},
|
},
|
||||||
"XMLRPC": {
|
"XMLRPC": {
|
||||||
"xmlrpc": "[01]",
|
"xmlrpc": "[01]",
|
||||||
"xmlrpcacl": self.xmlrpcacl.regex_acl,
|
"xmlrpcacl": self.xmlrpcacl.regex_acl,
|
||||||
# "xmlrpcbindip": "^((([\\d]{1,3}\\.){3}[\\d]{1,3})|\\*)+$",
|
# "xmlrpcbindip": "^((([\\d]{1,3}\\.){3}[\\d]{1,3})|\\*)+$",
|
||||||
# "xmlslaveport": "[0-9]{,5}",
|
# "xmlrpcport": "[0-9]{,5}",
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1311,19 +1311,19 @@ class RevPiPyLoad:
|
|||||||
)
|
)
|
||||||
|
|
||||||
# ACLs sofort übernehmen und schreiben
|
# ACLs sofort übernehmen und schreiben
|
||||||
str_acl = dc.get("plcslaveacl", None)
|
str_acl = dc.get("plcserveracl", None)
|
||||||
if str_acl is not None and self.plcslaveacl.acl != str_acl:
|
if str_acl is not None and self.plcserveracl.acl != str_acl:
|
||||||
self.plcslaveacl.acl = str_acl
|
self.plcserveracl.acl = str_acl
|
||||||
if not self.plcslaveacl.writeaclfile(aclname="PLC-SLAVE"):
|
if not self.plcserveracl.writeaclfile(aclname="PLC-SERVER"):
|
||||||
proginit.logger.error(
|
proginit.logger.error(
|
||||||
"can not write acl file '{0}' for PLC-SLAVE"
|
"can not write acl file '{0}' for PLC-SERVER"
|
||||||
"".format(self.plcslaveacl.filename)
|
"".format(self.plcserveracl.filename)
|
||||||
)
|
)
|
||||||
return False
|
return False
|
||||||
else:
|
else:
|
||||||
proginit.logger.info(
|
proginit.logger.info(
|
||||||
"wrote new acl file '{0}' for PLC-SLAVE"
|
"wrote new acl file '{0}' for PLC-SERVER"
|
||||||
"".format(self.plcslaveacl.filename)
|
"".format(self.plcserveracl.filename)
|
||||||
)
|
)
|
||||||
str_acl = dc.get("xmlrpcacl", None)
|
str_acl = dc.get("xmlrpcacl", None)
|
||||||
if str_acl is not None and self.xmlrpcacl.acl != str_acl:
|
if str_acl is not None and self.xmlrpcacl.acl != str_acl:
|
||||||
@@ -1420,15 +1420,15 @@ class RevPiPyLoad:
|
|||||||
else:
|
else:
|
||||||
return False
|
return False
|
||||||
|
|
||||||
def xml_plcslaverunning(self):
|
def xml_plcserverrunning(self):
|
||||||
"""Prueft ob PLC-Slave noch lauft.
|
"""Prueft ob PLC-Server noch lauft.
|
||||||
@return True, wenn PLC-Slave noch lauft"""
|
@return True, wenn PLC-Server noch lauft"""
|
||||||
proginit.logger.debug("xmlrpc call plcslaverunning")
|
proginit.logger.debug("xmlrpc call plcserverrunning")
|
||||||
return False if self.th_plcslave is None \
|
return False if self.th_plcserver is None \
|
||||||
else self.th_plcslave.is_alive()
|
else self.th_plcserver.is_alive()
|
||||||
|
|
||||||
def xml_plcslavestart(self):
|
def xml_plcserverstart(self):
|
||||||
"""Startet den PLC Slave Server.
|
"""Startet den PLC Server.
|
||||||
|
|
||||||
@return Statuscode:
|
@return Statuscode:
|
||||||
0: erfolgreich gestartet
|
0: erfolgreich gestartet
|
||||||
@@ -1436,22 +1436,22 @@ class RevPiPyLoad:
|
|||||||
-2: Laeuft bereits
|
-2: Laeuft bereits
|
||||||
|
|
||||||
"""
|
"""
|
||||||
if self.th_plcslave is not None and self.th_plcslave.is_alive():
|
if self.th_plcserver is not None and self.th_plcserver.is_alive():
|
||||||
return -2
|
return -2
|
||||||
else:
|
else:
|
||||||
self.th_plcslave = self._plcslave()
|
self.th_plcserver = self._plcserver()
|
||||||
if self.th_plcslave is None:
|
if self.th_plcserver is None:
|
||||||
return -1
|
return -1
|
||||||
else:
|
else:
|
||||||
self.th_plcslave.start()
|
self.th_plcserver.start()
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
def xml_plcslavestop(self):
|
def xml_plcserverstop(self):
|
||||||
"""Stoppt den PLC Slave Server.
|
"""Stoppt den PLC Server.
|
||||||
@return True, wenn stop erfolgreich"""
|
@return True, wenn stop erfolgreich"""
|
||||||
if self.th_plcslave is not None:
|
if self.th_plcserver is not None:
|
||||||
self.stop_plcslave()
|
self.stop_plcserver()
|
||||||
self.th_plcslave = None
|
self.th_plcserver = None
|
||||||
return True
|
return True
|
||||||
else:
|
else:
|
||||||
return False
|
return False
|
||||||
|
|||||||
@@ -63,7 +63,7 @@ class TestSystem:
|
|||||||
@return 0 if successful testet"""
|
@return 0 if successful testet"""
|
||||||
print("Parse config file:")
|
print("Parse config file:")
|
||||||
print("\tSection DEFAULT : {0}".format("DEFAULT" in self.gc))
|
print("\tSection DEFAULT : {0}".format("DEFAULT" in self.gc))
|
||||||
print("\tSection PLCSLAVE: {0}".format("PLCSLAVE" in self.gc))
|
print("\tSection PLCSERVER: {0}".format("PLCSERVER" in self.gc))
|
||||||
print("\tSection XMLRPC : {0}".format("XMLRPC" in self.gc))
|
print("\tSection XMLRPC : {0}".format("XMLRPC" in self.gc))
|
||||||
print("\tSection MQTT : {0}".format("MQTT" in self.gc))
|
print("\tSection MQTT : {0}".format("MQTT" in self.gc))
|
||||||
return 0
|
return 0
|
||||||
|
|||||||
Reference in New Issue
Block a user