slave funktion begonnen

This commit is contained in:
2017-03-27 16:55:02 +02:00
parent 7c08751c8a
commit 8b46383ba1
3 changed files with 138 additions and 32 deletions

View File

@@ -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: 2017-03-22, 12:24:46 --> <!-- Saved: 2017-03-27, 10:26:18 -->
<!-- Copyright (C) 2017 Sven Sager, akira@narux.de --> <!-- Copyright (C) 2017 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.2.10</Version> <Version>0.3.0</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"/>

View File

@@ -33,8 +33,10 @@ begrenzt werden!
import gzip import gzip
import proginit import proginit
import os import os
import pickle
import shlex import shlex
import signal import signal
import socket
import subprocess import subprocess
import tarfile import tarfile
import zipfile import zipfile
@@ -53,7 +55,14 @@ from xmlrpc.server import SimpleXMLRPCServer
configrsc = "/opt/KUNBUS/config.rsc" configrsc = "/opt/KUNBUS/config.rsc"
picontrolreset = "/opt/KUNBUS/piControlReset" picontrolreset = "/opt/KUNBUS/piControlReset"
procimg = "/dev/piControl0" procimg = "/dev/piControl0"
pyloadverion = "0.2.10" pyloadverion = "0.3.0"
def _zeroprocimg():
"""Setzt Prozessabbild auf NULL."""
if os.path.exists(procimg):
f = open(procimg, "w+b", 0)
f.write(bytes(4096))
class LogReader(): class LogReader():
@@ -304,7 +313,7 @@ class RevPiPlc(Thread):
elif proginit.pargs.logfile is not None: elif proginit.pargs.logfile is not None:
logfile = proginit.pargs.logfile logfile = proginit.pargs.logfile
if not logfile is None: if logfile is not None:
logfile = PipeLogwriter(logfile) logfile = PipeLogwriter(logfile)
proginit.logger.debug("leave RevPiPlc._configureplw()") proginit.logger.debug("leave RevPiPlc._configureplw()")
@@ -333,12 +342,6 @@ class RevPiPlc(Thread):
proginit.logger.debug("leave RevPiPlc._spopen()") proginit.logger.debug("leave RevPiPlc._spopen()")
return sp return sp
def _zeroprocimg(self):
"""Setzt Prozessabbild auf NULL."""
if os.path.exists("/dev/piControl0"):
f = open("/dev/piControl0", "w+b", 0)
f.write(bytes(4096))
def newlogfile(self): def newlogfile(self):
"""Konfiguriert die FileHandler auf neue Logdatei.""" """Konfiguriert die FileHandler auf neue Logdatei."""
proginit.logger.debug("enter RevPiPlc.newlogfile()") proginit.logger.debug("enter RevPiPlc.newlogfile()")
@@ -387,7 +390,7 @@ class RevPiPlc(Thread):
) )
) )
if self.zeroonerror: if self.zeroonerror:
self._zeroprocimg() _zeroprocimg()
proginit.logger.warning( proginit.logger.warning(
"set piControl0 to ZERO after PLC program error") "set piControl0 to ZERO after PLC program error")
@@ -395,7 +398,7 @@ class RevPiPlc(Thread):
# PLC Python Programm sauber beendet # PLC Python Programm sauber beendet
proginit.logger.info("plc program did a clean exit") proginit.logger.info("plc program did a clean exit")
if self.zeroonexit: if self.zeroonexit:
self._zeroprocimg() _zeroprocimg()
proginit.logger.info( proginit.logger.info(
"set piControl0 to ZERO after PLC program returns " "set piControl0 to ZERO after PLC program returns "
"clean exitcode") "clean exitcode")
@@ -457,7 +460,7 @@ class RevPiPlc(Thread):
self.exitcode = self._procplc.poll() self.exitcode = self._procplc.poll()
if self.zeroonexit and self.exitcode == 0 \ if self.zeroonexit and self.exitcode == 0 \
or self.zeroonerror and self.exitcode != 0: or self.zeroonerror and self.exitcode != 0:
self._zeroprocimg() _zeroprocimg()
if self._plw is not None: if self._plw is not None:
self._plw.stop() self._plw.stop()
@@ -468,6 +471,100 @@ class RevPiPlc(Thread):
proginit.logger.debug("leave RevPiPlc.stop()") proginit.logger.debug("leave RevPiPlc.stop()")
class RevPiSlave(Thread):
def __init__(self):
"""Instantiiert RevPiSlave-Klasse."""
super().__init__()
self._evt_exit = Event()
self.zeroonerror = False
self.zeroonexit = False
def run(self):
proginit.logger.debug("enter RevPiSlave.run()")
msgcli = [b'DATA', b'PICT', b'SEND']
# Socket öffnen und konfigurieren
self.so = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.so.bind(("", 55234))
self.so.listen(1)
self.rpi = None
while not self._evt_exit.is_set():
# Verbindung annehmen
proginit.logger.info("starte accept")
try:
self.rpi, addr = self.so.accept()
except:
proginit.logger.exception("after accept")
continue
# Prozessabbild öffnen
fh_proc = open(procimg, "r+b", 0)
# Erste Meldung erhalten
meldung = self.rpi.recv(4)
while meldung in msgcli:
if meldung == b'PICT':
# piCtory Konfiguration senden
fh_pic = open(configrsc, "rb")
while True:
data = fh_pic.read(1024)
if data:
self.rpi.send(data)
else:
fh_pic.close()
break
# Abschlussmeldung
self.rpi.send(b'PICOK')
proginit.logger.debug("pictory ende")
if meldung == b'DATA':
# Processabbild übertragen
block = 0
fh_proc.seek(0)
while block < 4:
self.rpi.send(fh_proc.read(1024))
block += 1
proginit.logger.debug("procimg ende")
if meldung == b'SEND':
# Ausgänge empfangen
block = self.rpi.recv(1024)
test = pickle.loads(block)
fh_proc.seek(test[0])
fh_proc.write(test[1])
proginit.logger.debug(test)
# Nächste Meldung erhalten
meldung = self.rpi.recv(4)
fh_proc.close()
self.rpi.shutdown(socket.SHUT_RDWR)
self.rpi.close()
# Socket schließen
self.so.close()
proginit.logger.debug("leave RevPiSlave.run()")
def stop(self):
"""Beendet Slaveausfuehrung."""
proginit.logger.debug("enter RevPiSlave.stop()")
self._evt_exit.set()
if self.rpi is not None:
self.rpi.close()
self.so.shutdown(socket.SHUT_RDWR)
proginit.logger.debug("leave RevPiSlave.stop()")
class RevPiPyLoad(): class RevPiPyLoad():
"""Hauptklasse, die alle Funktionen zur Verfuegung stellt. """Hauptklasse, die alle Funktionen zur Verfuegung stellt.
@@ -606,26 +703,35 @@ class RevPiPyLoad():
def _plcthread(self): def _plcthread(self):
"""Konfiguriert den PLC-Thread fuer die Ausfuehrung. """Konfiguriert den PLC-Thread fuer die Ausfuehrung.
@returns: PLC-Thread Object or None""" @returns: PLC-Thread Object or None"""
th_plc = None
# Prüfen ob Programm existiert if self.plcslave:
if not os.path.exists(os.path.join(self.plcworkdir, self.plcprog)): # Slaveausfuehrung übergeben
proginit.logger.error("plc file does not exists {}".format( th_plc = RevPiSlave()
os.path.join(self.plcworkdir, self.plcprog) th_plc.zeroonerror = self.zerooneerror
)) th_plc.zeroonexit = self.zeroonexit
return None
else:
# Prüfen ob Programm existiert
if not os.path.exists(os.path.join(self.plcworkdir, self.plcprog)):
proginit.logger.error("plc file does not exists {}".format(
os.path.join(self.plcworkdir, self.plcprog)
))
return None
proginit.logger.debug("create PLC watcher")
th_plc = RevPiPlc(
os.path.join(self.plcworkdir, self.plcprog),
self.plcarguments,
self.pythonver
)
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.zeroonerror = self.zerooneerror
th_plc.zeroonexit = self.zeroonexit
proginit.logger.debug("created PLC watcher")
proginit.logger.debug("create PLC watcher")
th_plc = RevPiPlc(
os.path.join(self.plcworkdir, self.plcprog),
self.plcarguments,
self.pythonver
)
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.zeroonerror = self.zerooneerror
th_plc.zeroonexit = self.zeroonexit
proginit.logger.debug("created PLC watcher")
return th_plc return th_plc
def _sigexit(self, signum, frame): def _sigexit(self, signum, frame):

View File

@@ -27,7 +27,7 @@ setup(
license="LGPLv3", license="LGPLv3",
name="revpipyload", name="revpipyload",
version="0.2.10", version="0.3.0",
scripts=["data/revpipyload"], scripts=["data/revpipyload"],