From fcec3df5e9c419f9bffcd7d7211f159345fe61e5 Mon Sep 17 00:00:00 2001 From: NaruX Date: Tue, 19 Sep 2017 14:07:18 +0200 Subject: [PATCH] =?UTF-8?q?Konfigurationsparameter=20rtlevel=20mit=20Defau?= =?UTF-8?q?lt=201=20hinzugef=C3=BCgt=20PythonPLC=20Programm=20kann=20?= =?UTF-8?q?=C3=BCber=20chrt=20scheduling=20policy=20erhalten=20PythonPLC?= =?UTF-8?q?=20Programm=20wird=20it=20-OO=20aufgerufen=20Modul=20procimgser?= =?UTF-8?q?ver=20auf=20revpimodio2=20umgestellt=20xml-standardport=20auf?= =?UTF-8?q?=2055123=20belassen=20xmlserver=20port=20nicht=20mehr=20=C3=BCb?= =?UTF-8?q?er=20GUI=20konfigurierbar?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- data/etc/avahi/services/revpipyload.service | 2 +- data/etc/revpipyload/revpipyload.conf | 3 +- revpipyload/plcsystem.py | 30 +++++++++++----- revpipyload/procimgserver.py | 38 ++++++++++----------- revpipyload/revpipyload.py | 16 +++++---- setup.py | 6 +++- stdeb.cfg | 2 +- 7 files changed, 58 insertions(+), 39 deletions(-) diff --git a/data/etc/avahi/services/revpipyload.service b/data/etc/avahi/services/revpipyload.service index 666966a..280aaad 100644 --- a/data/etc/avahi/services/revpipyload.service +++ b/data/etc/avahi/services/revpipyload.service @@ -4,6 +4,6 @@ %h _revpipyload._tcp - 55239 + 55123 diff --git a/data/etc/revpipyload/revpipyload.conf b/data/etc/revpipyload/revpipyload.conf index 3731ac9..8bc228d 100644 --- a/data/etc/revpipyload/revpipyload.conf +++ b/data/etc/revpipyload/revpipyload.conf @@ -3,11 +3,12 @@ autoreload = 1 autostart = 1 plcworkdir = /var/lib/revpipyload plcprogram = program.py -plcarguments = +plcarguments = plcuid = 1000 plcgid = 1000 plcslave = 0 pythonversion = 3 +rtlevel = 1 xmlrpc = 0 zeroonerror = 0 zeroonexit = 0 diff --git a/revpipyload/plcsystem.py b/revpipyload/plcsystem.py index bc3ae2c..d2a0037 100644 --- a/revpipyload/plcsystem.py +++ b/revpipyload/plcsystem.py @@ -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) diff --git a/revpipyload/procimgserver.py b/revpipyload/procimgserver.py index 627c801..a2cb0b7 100644 --- a/revpipyload/procimgserver.py +++ b/revpipyload/procimgserver.py @@ -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: diff --git a/revpipyload/revpipyload.py b/revpipyload/revpipyload.py index e14b899..8703150 100755 --- a/revpipyload/revpipyload.py +++ b/revpipyload/revpipyload.py @@ -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]" } diff --git a/setup.py b/setup.py index e365178..37cae22 100644 --- a/setup.py +++ b/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}, ) diff --git a/stdeb.cfg b/stdeb.cfg index b6c3754..191693a 100644 --- a/stdeb.cfg +++ b/stdeb.cfg @@ -1,6 +1,6 @@ [DEFAULT] Debian-Version: 1 -Depends3: python3-revpimodio (>= 0.11.0) +Depends3: python3-revpimodio2 (>= 2.0.0) Package: revpipyload Suite: stable X-Python3-Version: >=3.2