mirror of
https://github.com/naruxde/revpipyload.git
synced 2025-11-08 15:13:52 +01:00
Konfigurationsparameter rtlevel mit Default 1 hinzugefügt
PythonPLC Programm kann über chrt scheduling policy erhalten PythonPLC Programm wird it -OO aufgerufen Modul procimgserver auf revpimodio2 umgestellt xml-standardport auf 55123 belassen xmlserver port nicht mehr über GUI konfigurierbar
This commit is contained in:
@@ -4,6 +4,6 @@
|
|||||||
<name replace-wildcards="yes">%h</name>
|
<name replace-wildcards="yes">%h</name>
|
||||||
<service protocol="ipv4">
|
<service protocol="ipv4">
|
||||||
<type>_revpipyload._tcp</type>
|
<type>_revpipyload._tcp</type>
|
||||||
<port>55239</port>
|
<port>55123</port>
|
||||||
</service>
|
</service>
|
||||||
</service-group>
|
</service-group>
|
||||||
|
|||||||
@@ -3,11 +3,12 @@ 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
|
pythonversion = 3
|
||||||
|
rtlevel = 1
|
||||||
xmlrpc = 0
|
xmlrpc = 0
|
||||||
zeroonerror = 0
|
zeroonerror = 0
|
||||||
zeroonexit = 0
|
zeroonexit = 0
|
||||||
|
|||||||
@@ -41,6 +41,7 @@ class RevPiPlc(Thread):
|
|||||||
self.exitcode = None
|
self.exitcode = None
|
||||||
self.gid = 65534
|
self.gid = 65534
|
||||||
self.uid = 65534
|
self.uid = 65534
|
||||||
|
self.rtlevel = 1
|
||||||
self.zeroonerror = False
|
self.zeroonerror = False
|
||||||
self.zeroonexit = False
|
self.zeroonexit = False
|
||||||
|
|
||||||
@@ -103,19 +104,32 @@ class RevPiPlc(Thread):
|
|||||||
"""Fuehrt PLC-Programm aus und ueberwacht es."""
|
"""Fuehrt PLC-Programm aus und ueberwacht es."""
|
||||||
proginit.logger.debug("enter RevPiPlc.run()")
|
proginit.logger.debug("enter RevPiPlc.run()")
|
||||||
|
|
||||||
if self._pversion == 2:
|
# Befehlstliste aufbauen
|
||||||
lst_proc = shlex.split("/usr/bin/env python2 -u {} {}".format(
|
lst_proc = shlex.split("/usr/bin/env {} -OO -u {} {}".format(
|
||||||
self._program, self._arguments
|
"python2" if self._pversion == 2 else "python3",
|
||||||
))
|
self._program,
|
||||||
else:
|
self._arguments
|
||||||
lst_proc = shlex.split("/usr/bin/env python3 -u {} {}".format(
|
))
|
||||||
self._program, self._arguments
|
|
||||||
))
|
|
||||||
|
|
||||||
# Prozess erstellen
|
# Prozess erstellen
|
||||||
proginit.logger.info("start plc program {}".format(self._program))
|
proginit.logger.info("start plc program {}".format(self._program))
|
||||||
self._procplc = self._spopen(lst_proc)
|
self._procplc = self._spopen(lst_proc)
|
||||||
|
|
||||||
|
# RealTime Scheduler nutzen
|
||||||
|
if self.rtlevel > 0 and self._procplc.poll() is None:
|
||||||
|
proginit.logger.info(
|
||||||
|
"set scheduler profile of pid {}".format(self._procplc.pid)
|
||||||
|
)
|
||||||
|
ec = os.system("/usr/bin/env chrt -p {} {}".format(
|
||||||
|
20 if self.rtlevel == 2 else 1,
|
||||||
|
self._procplc.pid
|
||||||
|
))
|
||||||
|
if ec != 0:
|
||||||
|
proginit.logger.error(
|
||||||
|
"could not set scheduler profile of pid {}"
|
||||||
|
"".format(self._procplc.pid)
|
||||||
|
)
|
||||||
|
|
||||||
# LogWriter starten und Logausgaben schreiben
|
# LogWriter starten und Logausgaben schreiben
|
||||||
if self._plw is not None:
|
if self._plw is not None:
|
||||||
self._plw.logline("-" * 55)
|
self._plw.logline("-" * 55)
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ IO-Check bei Inbetriebname durchzufuehren.
|
|||||||
"""
|
"""
|
||||||
import pickle
|
import pickle
|
||||||
import proginit
|
import proginit
|
||||||
import revpimodio
|
import revpimodio2
|
||||||
from xmlrpc.client import Binary
|
from xmlrpc.client import Binary
|
||||||
|
|
||||||
|
|
||||||
@@ -47,7 +47,6 @@ class ProcimgServer():
|
|||||||
"ps_devices": self.devices,
|
"ps_devices": self.devices,
|
||||||
"ps_inps": lambda: self.ios("inp"),
|
"ps_inps": lambda: self.ios("inp"),
|
||||||
"ps_outs": lambda: self.ios("out"),
|
"ps_outs": lambda: self.ios("out"),
|
||||||
"ps_mems": lambda: self.ios("mem"),
|
|
||||||
"ps_values": self.values,
|
"ps_values": self.values,
|
||||||
}
|
}
|
||||||
self.xmlwritefuncs = {
|
self.xmlwritefuncs = {
|
||||||
@@ -62,7 +61,7 @@ class ProcimgServer():
|
|||||||
"""Generiert Deviceliste mit Position und Namen.
|
"""Generiert Deviceliste mit Position und Namen.
|
||||||
@return list() mit Tuple (pos, name)"""
|
@return list() mit Tuple (pos, name)"""
|
||||||
return [
|
return [
|
||||||
(dev.position, dev.name) for dev in self.rpi.devices
|
(dev.position, dev.name) for dev in self.rpi.device
|
||||||
]
|
]
|
||||||
|
|
||||||
def ios(self, type):
|
def ios(self, type):
|
||||||
@@ -70,16 +69,14 @@ class ProcimgServer():
|
|||||||
@param type IO Typ inp/out
|
@param type IO Typ inp/out
|
||||||
@return pickled dict()"""
|
@return pickled dict()"""
|
||||||
dict_ios = {}
|
dict_ios = {}
|
||||||
for dev in self.rpi.devices:
|
for dev in self.rpi.device:
|
||||||
dict_ios[dev.position] = []
|
dict_ios[dev.position] = []
|
||||||
|
|
||||||
# IO Typen auswerten
|
# IO Typen auswerten
|
||||||
if type == "inp":
|
if type == "inp":
|
||||||
lst_io = dev.get_inps()
|
lst_io = dev.get_inputs()
|
||||||
elif type == "out":
|
elif type == "out":
|
||||||
lst_io = dev.get_outs()
|
lst_io = dev.get_outputs()
|
||||||
elif type == "mem":
|
|
||||||
lst_io = dev.get_mems()
|
|
||||||
else:
|
else:
|
||||||
lst_io = []
|
lst_io = []
|
||||||
|
|
||||||
@@ -87,7 +84,7 @@ class ProcimgServer():
|
|||||||
dict_ios[dev.position].append([
|
dict_ios[dev.position].append([
|
||||||
io.name,
|
io.name,
|
||||||
1 if io._bitlength == 1 else int(io._bitlength / 8),
|
1 if io._bitlength == 1 else int(io._bitlength / 8),
|
||||||
io.slc_address.start + dev.offset,
|
io._slc_address.start + dev.offset,
|
||||||
io.bmk,
|
io.bmk,
|
||||||
io._bitaddress,
|
io._bitaddress,
|
||||||
])
|
])
|
||||||
@@ -100,9 +97,9 @@ class ProcimgServer():
|
|||||||
if self.rpi is not None:
|
if self.rpi is not None:
|
||||||
self.rpi.cleanup()
|
self.rpi.cleanup()
|
||||||
|
|
||||||
proginit.logger.debug("create revpimodio class")
|
proginit.logger.debug("create revpimodio2 object")
|
||||||
try:
|
try:
|
||||||
self.rpi = revpimodio.RevPiModIO(
|
self.rpi = revpimodio2.RevPiModIO(
|
||||||
configrsc=proginit.pargs.configrsc,
|
configrsc=proginit.pargs.configrsc,
|
||||||
procimg=proginit.pargs.procimg
|
procimg=proginit.pargs.procimg
|
||||||
)
|
)
|
||||||
@@ -111,8 +108,8 @@ class ProcimgServer():
|
|||||||
proginit.logger.error("piCtory configuration not loadable")
|
proginit.logger.error("piCtory configuration not loadable")
|
||||||
return False
|
return False
|
||||||
|
|
||||||
self.rpi.devices.syncoutputs(device=0)
|
self.rpi.syncoutputs(device=0)
|
||||||
proginit.logger.debug("created revpimodio class")
|
proginit.logger.debug("created revpimodio2 object")
|
||||||
return True
|
return True
|
||||||
|
|
||||||
def setvalue(self, device, io, value):
|
def setvalue(self, device, io, value):
|
||||||
@@ -135,30 +132,31 @@ class ProcimgServer():
|
|||||||
if type(value) == Binary:
|
if type(value) == Binary:
|
||||||
value = value.data
|
value = value.data
|
||||||
|
|
||||||
self.rpi.devices.syncoutputs(device=device)
|
self.rpi.syncoutputs(device=device)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
# Neuen Wert übernehmen
|
# Neuen Wert übernehmen
|
||||||
if type(value) == bytes or type(value) == bool:
|
if type(value) == bytes or type(value) == bool:
|
||||||
self.rpi.devices[device][io].set_value(value)
|
self.rpi.io[io].set_value(value)
|
||||||
else:
|
else:
|
||||||
self.rpi.devices[device][io].set_value(
|
self.rpi.io[io].set_value(
|
||||||
value.to_bytes(
|
value.to_bytes(
|
||||||
self.rpi.devices[device][io].length, byteorder="little"
|
self.rpi.io[io].length,
|
||||||
|
byteorder=self.rpi.io[io].byteorder
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
return [device, io, False, str(e)]
|
return [device, io, False, str(e)]
|
||||||
|
|
||||||
self.rpi.devices.writeprocimg(device=device)
|
self.rpi.writeprocimg(device=device)
|
||||||
return [device, io, True, ""]
|
return [device, io, True, ""]
|
||||||
|
|
||||||
def values(self):
|
def values(self):
|
||||||
"""Liefert Prozessabbild an Client.
|
"""Liefert Prozessabbild an Client.
|
||||||
@return Binary() bytes or None"""
|
@return Binary() bytes or None"""
|
||||||
if self.rpi.devices.readprocimg() and self.rpi.devices.syncoutputs():
|
if self.rpi.readprocimg() and self.rpi.syncoutputs():
|
||||||
bytebuff = b''
|
bytebuff = b''
|
||||||
for dev in self.rpi.devices:
|
for dev in self.rpi.device:
|
||||||
bytebuff += bytes(dev)
|
bytebuff += bytes(dev)
|
||||||
return Binary(bytebuff)
|
return Binary(bytebuff)
|
||||||
else:
|
else:
|
||||||
|
|||||||
@@ -123,6 +123,8 @@ class RevPiPyLoad():
|
|||||||
int(self.globalconfig["DEFAULT"].get("plcslave", 0))
|
int(self.globalconfig["DEFAULT"].get("plcslave", 0))
|
||||||
self.pythonver = \
|
self.pythonver = \
|
||||||
int(self.globalconfig["DEFAULT"].get("pythonversion", 3))
|
int(self.globalconfig["DEFAULT"].get("pythonversion", 3))
|
||||||
|
self.rtlevel = \
|
||||||
|
int(self.globalconfig["DEFAULT"].get("rtlevel", 1))
|
||||||
self.xmlrpc = \
|
self.xmlrpc = \
|
||||||
int(self.globalconfig["DEFAULT"].get("xmlrpc", 0))
|
int(self.globalconfig["DEFAULT"].get("xmlrpc", 0))
|
||||||
self.zeroonerror = \
|
self.zeroonerror = \
|
||||||
@@ -142,7 +144,7 @@ class RevPiPyLoad():
|
|||||||
self.xsrv = SimpleXMLRPCServer(
|
self.xsrv = SimpleXMLRPCServer(
|
||||||
(
|
(
|
||||||
"",
|
"",
|
||||||
int(self.globalconfig["DEFAULT"].get("xmlrpcport", 55239))
|
int(self.globalconfig["DEFAULT"].get("xmlrpcport", 55123))
|
||||||
),
|
),
|
||||||
logRequests=False,
|
logRequests=False,
|
||||||
allow_none=True
|
allow_none=True
|
||||||
@@ -170,10 +172,10 @@ class RevPiPyLoad():
|
|||||||
except:
|
except:
|
||||||
self.xml_ps = None
|
self.xml_ps = None
|
||||||
proginit.logger.warning(
|
proginit.logger.warning(
|
||||||
"can not load revpimodio module. maybe its not installed "
|
"can not load revpimodio2 module. maybe its not installed "
|
||||||
"or an old version (required at least 0.15.0). if you "
|
"or an old version (required at least 2.0.5). if you "
|
||||||
"like to use the process monitor feature, update/install "
|
"like to use the process monitor feature, update/install "
|
||||||
"revpimodio: 'apt-get install python3-revpimodio'"
|
"revpimodio2: 'apt-get install python3-revpimodio2'"
|
||||||
)
|
)
|
||||||
|
|
||||||
# XML Modus 2 Einstellungen lesen und Programm herunterladen
|
# XML Modus 2 Einstellungen lesen und Programm herunterladen
|
||||||
@@ -236,6 +238,7 @@ class RevPiPyLoad():
|
|||||||
th_plc.autoreload = self.autoreload
|
th_plc.autoreload = self.autoreload
|
||||||
th_plc.gid = int(self.globalconfig["DEFAULT"].get("plcgid", 65534))
|
th_plc.gid = int(self.globalconfig["DEFAULT"].get("plcgid", 65534))
|
||||||
th_plc.uid = int(self.globalconfig["DEFAULT"].get("plcuid", 65534))
|
th_plc.uid = int(self.globalconfig["DEFAULT"].get("plcuid", 65534))
|
||||||
|
th_plc.rtlevel = self.rtlevel
|
||||||
th_plc.zeroonerror = self.zeroonerror
|
th_plc.zeroonerror = self.zeroonerror
|
||||||
th_plc.zeroonexit = self.zeroonexit
|
th_plc.zeroonexit = self.zeroonexit
|
||||||
|
|
||||||
@@ -395,9 +398,8 @@ class RevPiPyLoad():
|
|||||||
dc["plcarguments"] = self.plcarguments
|
dc["plcarguments"] = self.plcarguments
|
||||||
dc["plcslave"] = self.plcslave
|
dc["plcslave"] = self.plcslave
|
||||||
dc["pythonversion"] = self.pythonver
|
dc["pythonversion"] = self.pythonver
|
||||||
|
dc["rtlevel"] = self.rtlevel
|
||||||
dc["xmlrpc"] = self.xmlrpc
|
dc["xmlrpc"] = self.xmlrpc
|
||||||
dc["xmlrpcport"] = \
|
|
||||||
self.globalconfig["DEFAULT"].get("xmlrpcport", 55239)
|
|
||||||
dc["zeroonerror"] = self.zeroonerror
|
dc["zeroonerror"] = self.zeroonerror
|
||||||
dc["zeroonexit"] = self.zeroonexit
|
dc["zeroonexit"] = self.zeroonexit
|
||||||
return dc
|
return dc
|
||||||
@@ -567,8 +569,8 @@ class RevPiPyLoad():
|
|||||||
"plcarguments": ".*",
|
"plcarguments": ".*",
|
||||||
"plcslave": "[01]",
|
"plcslave": "[01]",
|
||||||
"pythonversion": "[23]",
|
"pythonversion": "[23]",
|
||||||
|
"rtlevel": "[0-2]",
|
||||||
"xmlrpc": "[0-3]",
|
"xmlrpc": "[0-3]",
|
||||||
"xmlrpcport": "[0-9]{,5}",
|
|
||||||
"zeroonerror": "[01]",
|
"zeroonerror": "[01]",
|
||||||
"zeroonexit": "[01]"
|
"zeroonexit": "[01]"
|
||||||
}
|
}
|
||||||
|
|||||||
6
setup.py
6
setup.py
@@ -31,7 +31,7 @@ setup(
|
|||||||
|
|
||||||
scripts=["data/revpipyload"],
|
scripts=["data/revpipyload"],
|
||||||
|
|
||||||
install_requires=["revpimodio"],
|
install_requires=["revpimodio2"],
|
||||||
|
|
||||||
data_files=[
|
data_files=[
|
||||||
("/etc/avahi/services", [
|
("/etc/avahi/services", [
|
||||||
@@ -56,9 +56,13 @@ setup(
|
|||||||
"Tool zur Laufzeit überwacht werden.",
|
"Tool zur Laufzeit überwacht werden.",
|
||||||
|
|
||||||
classifiers=[
|
classifiers=[
|
||||||
|
"Development Status :: 5 - Production/Stable",
|
||||||
|
"Environment :: No Input/Output (Daemon)",
|
||||||
|
"Intended Audience :: Manufacturing",
|
||||||
"License :: OSI Approved :: "
|
"License :: OSI Approved :: "
|
||||||
"GNU Lesser General Public License v3 (LGPLv3)",
|
"GNU Lesser General Public License v3 (LGPLv3)",
|
||||||
"Operating System :: POSIX :: Linux",
|
"Operating System :: POSIX :: Linux",
|
||||||
|
"Topic :: System :: Operating System",
|
||||||
],
|
],
|
||||||
cmdclass={"install_egg_info": MyEggInfo},
|
cmdclass={"install_egg_info": MyEggInfo},
|
||||||
)
|
)
|
||||||
|
|||||||
Reference in New Issue
Block a user