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>
|
||||
<service protocol="ipv4">
|
||||
<type>_revpipyload._tcp</type>
|
||||
<port>55239</port>
|
||||
<port>55123</port>
|
||||
</service>
|
||||
</service-group>
|
||||
|
||||
@@ -8,6 +8,7 @@ plcuid = 1000
|
||||
plcgid = 1000
|
||||
plcslave = 0
|
||||
pythonversion = 3
|
||||
rtlevel = 1
|
||||
xmlrpc = 0
|
||||
zeroonerror = 0
|
||||
zeroonexit = 0
|
||||
|
||||
@@ -41,6 +41,7 @@ class RevPiPlc(Thread):
|
||||
self.exitcode = None
|
||||
self.gid = 65534
|
||||
self.uid = 65534
|
||||
self.rtlevel = 1
|
||||
self.zeroonerror = False
|
||||
self.zeroonexit = False
|
||||
|
||||
@@ -103,19 +104,32 @@ class RevPiPlc(Thread):
|
||||
"""Fuehrt PLC-Programm aus und ueberwacht es."""
|
||||
proginit.logger.debug("enter RevPiPlc.run()")
|
||||
|
||||
if self._pversion == 2:
|
||||
lst_proc = shlex.split("/usr/bin/env python2 -u {} {}".format(
|
||||
self._program, self._arguments
|
||||
))
|
||||
else:
|
||||
lst_proc = shlex.split("/usr/bin/env python3 -u {} {}".format(
|
||||
self._program, self._arguments
|
||||
# Befehlstliste aufbauen
|
||||
lst_proc = shlex.split("/usr/bin/env {} -OO -u {} {}".format(
|
||||
"python2" if self._pversion == 2 else "python3",
|
||||
self._program,
|
||||
self._arguments
|
||||
))
|
||||
|
||||
# Prozess erstellen
|
||||
proginit.logger.info("start plc program {}".format(self._program))
|
||||
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
|
||||
if self._plw is not None:
|
||||
self._plw.logline("-" * 55)
|
||||
|
||||
@@ -13,7 +13,7 @@ IO-Check bei Inbetriebname durchzufuehren.
|
||||
"""
|
||||
import pickle
|
||||
import proginit
|
||||
import revpimodio
|
||||
import revpimodio2
|
||||
from xmlrpc.client import Binary
|
||||
|
||||
|
||||
@@ -47,7 +47,6 @@ class ProcimgServer():
|
||||
"ps_devices": self.devices,
|
||||
"ps_inps": lambda: self.ios("inp"),
|
||||
"ps_outs": lambda: self.ios("out"),
|
||||
"ps_mems": lambda: self.ios("mem"),
|
||||
"ps_values": self.values,
|
||||
}
|
||||
self.xmlwritefuncs = {
|
||||
@@ -62,7 +61,7 @@ class ProcimgServer():
|
||||
"""Generiert Deviceliste mit Position und Namen.
|
||||
@return list() mit Tuple (pos, name)"""
|
||||
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):
|
||||
@@ -70,16 +69,14 @@ class ProcimgServer():
|
||||
@param type IO Typ inp/out
|
||||
@return pickled dict()"""
|
||||
dict_ios = {}
|
||||
for dev in self.rpi.devices:
|
||||
for dev in self.rpi.device:
|
||||
dict_ios[dev.position] = []
|
||||
|
||||
# IO Typen auswerten
|
||||
if type == "inp":
|
||||
lst_io = dev.get_inps()
|
||||
lst_io = dev.get_inputs()
|
||||
elif type == "out":
|
||||
lst_io = dev.get_outs()
|
||||
elif type == "mem":
|
||||
lst_io = dev.get_mems()
|
||||
lst_io = dev.get_outputs()
|
||||
else:
|
||||
lst_io = []
|
||||
|
||||
@@ -87,7 +84,7 @@ class ProcimgServer():
|
||||
dict_ios[dev.position].append([
|
||||
io.name,
|
||||
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._bitaddress,
|
||||
])
|
||||
@@ -100,9 +97,9 @@ class ProcimgServer():
|
||||
if self.rpi is not None:
|
||||
self.rpi.cleanup()
|
||||
|
||||
proginit.logger.debug("create revpimodio class")
|
||||
proginit.logger.debug("create revpimodio2 object")
|
||||
try:
|
||||
self.rpi = revpimodio.RevPiModIO(
|
||||
self.rpi = revpimodio2.RevPiModIO(
|
||||
configrsc=proginit.pargs.configrsc,
|
||||
procimg=proginit.pargs.procimg
|
||||
)
|
||||
@@ -111,8 +108,8 @@ class ProcimgServer():
|
||||
proginit.logger.error("piCtory configuration not loadable")
|
||||
return False
|
||||
|
||||
self.rpi.devices.syncoutputs(device=0)
|
||||
proginit.logger.debug("created revpimodio class")
|
||||
self.rpi.syncoutputs(device=0)
|
||||
proginit.logger.debug("created revpimodio2 object")
|
||||
return True
|
||||
|
||||
def setvalue(self, device, io, value):
|
||||
@@ -135,30 +132,31 @@ class ProcimgServer():
|
||||
if type(value) == Binary:
|
||||
value = value.data
|
||||
|
||||
self.rpi.devices.syncoutputs(device=device)
|
||||
self.rpi.syncoutputs(device=device)
|
||||
|
||||
try:
|
||||
# Neuen Wert übernehmen
|
||||
if type(value) == bytes or type(value) == bool:
|
||||
self.rpi.devices[device][io].set_value(value)
|
||||
self.rpi.io[io].set_value(value)
|
||||
else:
|
||||
self.rpi.devices[device][io].set_value(
|
||||
self.rpi.io[io].set_value(
|
||||
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:
|
||||
return [device, io, False, str(e)]
|
||||
|
||||
self.rpi.devices.writeprocimg(device=device)
|
||||
self.rpi.writeprocimg(device=device)
|
||||
return [device, io, True, ""]
|
||||
|
||||
def values(self):
|
||||
"""Liefert Prozessabbild an Client.
|
||||
@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''
|
||||
for dev in self.rpi.devices:
|
||||
for dev in self.rpi.device:
|
||||
bytebuff += bytes(dev)
|
||||
return Binary(bytebuff)
|
||||
else:
|
||||
|
||||
@@ -123,6 +123,8 @@ class RevPiPyLoad():
|
||||
int(self.globalconfig["DEFAULT"].get("plcslave", 0))
|
||||
self.pythonver = \
|
||||
int(self.globalconfig["DEFAULT"].get("pythonversion", 3))
|
||||
self.rtlevel = \
|
||||
int(self.globalconfig["DEFAULT"].get("rtlevel", 1))
|
||||
self.xmlrpc = \
|
||||
int(self.globalconfig["DEFAULT"].get("xmlrpc", 0))
|
||||
self.zeroonerror = \
|
||||
@@ -142,7 +144,7 @@ class RevPiPyLoad():
|
||||
self.xsrv = SimpleXMLRPCServer(
|
||||
(
|
||||
"",
|
||||
int(self.globalconfig["DEFAULT"].get("xmlrpcport", 55239))
|
||||
int(self.globalconfig["DEFAULT"].get("xmlrpcport", 55123))
|
||||
),
|
||||
logRequests=False,
|
||||
allow_none=True
|
||||
@@ -170,10 +172,10 @@ class RevPiPyLoad():
|
||||
except:
|
||||
self.xml_ps = None
|
||||
proginit.logger.warning(
|
||||
"can not load revpimodio module. maybe its not installed "
|
||||
"or an old version (required at least 0.15.0). if you "
|
||||
"can not load revpimodio2 module. maybe its not installed "
|
||||
"or an old version (required at least 2.0.5). if you "
|
||||
"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
|
||||
@@ -236,6 +238,7 @@ class RevPiPyLoad():
|
||||
th_plc.autoreload = self.autoreload
|
||||
th_plc.gid = int(self.globalconfig["DEFAULT"].get("plcgid", 65534))
|
||||
th_plc.uid = int(self.globalconfig["DEFAULT"].get("plcuid", 65534))
|
||||
th_plc.rtlevel = self.rtlevel
|
||||
th_plc.zeroonerror = self.zeroonerror
|
||||
th_plc.zeroonexit = self.zeroonexit
|
||||
|
||||
@@ -395,9 +398,8 @@ class RevPiPyLoad():
|
||||
dc["plcarguments"] = self.plcarguments
|
||||
dc["plcslave"] = self.plcslave
|
||||
dc["pythonversion"] = self.pythonver
|
||||
dc["rtlevel"] = self.rtlevel
|
||||
dc["xmlrpc"] = self.xmlrpc
|
||||
dc["xmlrpcport"] = \
|
||||
self.globalconfig["DEFAULT"].get("xmlrpcport", 55239)
|
||||
dc["zeroonerror"] = self.zeroonerror
|
||||
dc["zeroonexit"] = self.zeroonexit
|
||||
return dc
|
||||
@@ -567,8 +569,8 @@ class RevPiPyLoad():
|
||||
"plcarguments": ".*",
|
||||
"plcslave": "[01]",
|
||||
"pythonversion": "[23]",
|
||||
"rtlevel": "[0-2]",
|
||||
"xmlrpc": "[0-3]",
|
||||
"xmlrpcport": "[0-9]{,5}",
|
||||
"zeroonerror": "[01]",
|
||||
"zeroonexit": "[01]"
|
||||
}
|
||||
|
||||
6
setup.py
6
setup.py
@@ -31,7 +31,7 @@ setup(
|
||||
|
||||
scripts=["data/revpipyload"],
|
||||
|
||||
install_requires=["revpimodio"],
|
||||
install_requires=["revpimodio2"],
|
||||
|
||||
data_files=[
|
||||
("/etc/avahi/services", [
|
||||
@@ -56,9 +56,13 @@ setup(
|
||||
"Tool zur Laufzeit überwacht werden.",
|
||||
|
||||
classifiers=[
|
||||
"Development Status :: 5 - Production/Stable",
|
||||
"Environment :: No Input/Output (Daemon)",
|
||||
"Intended Audience :: Manufacturing",
|
||||
"License :: OSI Approved :: "
|
||||
"GNU Lesser General Public License v3 (LGPLv3)",
|
||||
"Operating System :: POSIX :: Linux",
|
||||
"Topic :: System :: Operating System",
|
||||
],
|
||||
cmdclass={"install_egg_info": MyEggInfo},
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user