cmd == b'EY' vom picontrolserver wurde nicht richtig verarbeitet

Fehlerabfang in picontrolserver, wenn Prozessabbild nicht geöffnet werden kann
This commit is contained in:
2017-12-03 15:23:54 +01:00
parent 9502f8daf0
commit afcbe9d754
4 changed files with 53 additions and 27 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-09-20, 18:10:38 --> <!-- Saved: 2017-12-03, 15:22:22 -->
<!-- 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.5.2</Version> <Version>0.5.3</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

@@ -156,11 +156,19 @@ class RevPiSlaveDev(Thread):
proginit.logger.info( proginit.logger.info(
"got new connection from host {} with acl {}".format( "got new connection from host {} with acl {}".format(
self._addr, self._acl) self._addr, self._acl
)
) )
# Prozessabbild öffnen # Prozessabbild öffnen
fh_proc = open(proginit.pargs.procimg, "r+b", 0) try:
fh_proc = open(proginit.pargs.procimg, "r+b", 0)
except:
fh_proc = None
self._evt_exit.set()
proginit.logger.error(
"can not open process image {}".format(proginit.pargs.procimg)
)
dirty = True dirty = True
while not self._evt_exit.is_set(): while not self._evt_exit.is_set():
@@ -197,7 +205,7 @@ class RevPiSlaveDev(Thread):
break break
elif cmd == b'SD' and self._acl == 1: elif cmd == b'SD' and self._acl == 1:
# Ausgänge empfangen, wenn acl es erlaubt # Ausgänge setzen, wenn acl es erlaubt
# bCMiiiic0000000b = 16 # bCMiiiic0000000b = 16
position = int.from_bytes(netcmd[3:5], byteorder="little") position = int.from_bytes(netcmd[3:5], byteorder="little")
@@ -205,6 +213,7 @@ class RevPiSlaveDev(Thread):
control = netcmd[7:8] control = netcmd[7:8]
if control == b'\x1d' and length > 0: if control == b'\x1d' and length > 0:
# Empfange Datenblock zu schreiben nach Meldung
try: try:
block = self._devcon.recv(length) block = self._devcon.recv(length)
except: except:
@@ -222,6 +231,7 @@ class RevPiSlaveDev(Thread):
# Record seperator character # Record seperator character
if control == b'\x1c': if control == b'\x1c':
# Bestätige Schreibvorgang aller Datenblöcke
if self._writeerror: if self._writeerror:
self._devcon.send(b'\xff') self._devcon.send(b'\xff')
else: else:
@@ -236,35 +246,50 @@ class RevPiSlaveDev(Thread):
# Socket konfigurieren # Socket konfigurieren
# bCMii0000000000b = 16 # bCMii0000000000b = 16
timeoutms = int.from_bytes(netcmd[3:5], byteorder="little") try:
timeoutms = int.from_bytes(netcmd[3:5], byteorder="little")
except:
proginit.logger.error("can not convert timeout value")
break
self._deadtime = timeoutms / 1000 if 0 < timeoutms < 65535:
self._devcon.settimeout(self._deadtime) self._deadtime = timeoutms / 1000
self._devcon.settimeout(self._deadtime)
# Record seperator character # Record seperator character
self._devcon.send(b'\x1e') self._devcon.send(b'\x1e')
else:
proginit.logger.error("timeout value must be 0 to 65535")
break
elif cmd == b'EY': elif cmd == b'EY':
# Bytes bei Verbindungsabbruch schreiben # Bytes bei Verbindungsabbruch schreiben
# bCMiiiix0000000b = 16 # bCMiiiix0000000b = 16
position = int.from_bytes( position = int.from_bytes(netcmd[3:5], byteorder="little")
netcmd[3:5], byteorder="little" length = int.from_bytes(netcmd[5:7], byteorder="little")
) control = netcmd[7:8]
length = int.from_bytes(
netcmd[5:7], byteorder="little" if control == b'\xFF':
) # Alle Dirtybytes löschen
if netcmd[7:8] == b'\xFF': self.ey_dict = {}
# Dirtybytes löschen
# Record seperator character
self._devcon.send(b'\x1e')
proginit.logger.info("cleared all dirty bytes")
elif control == b'\xFE':
# Bestimmte Dirtybytes löschen
if position in self.ey_dict: if position in self.ey_dict:
del self.ey_dict[position] del self.ey_dict[position]
# Record seperator character # Record seperator character
self._devcon.send(b'\x1e') self._devcon.send(b'\x1e')
proginit.logger.info( proginit.logger.info(
"cleared dirty bytes on position {}" "cleared dirty bytes on position {}"
"".format(position) "".format(position)
) )
else: else:
# Dirtybytes hinzufügen # Dirtybytes hinzufügen
@@ -344,7 +369,8 @@ class RevPiSlaveDev(Thread):
proginit.logger.error("dirty shutdown of connection") proginit.logger.error("dirty shutdown of connection")
fh_proc.close() if fh_proc is not None:
fh_proc.close()
self._devcon.close() self._devcon.close()
self._devcon = None self._devcon = None

View File

@@ -50,7 +50,7 @@ from time import asctime
from xmlrpc.client import Binary from xmlrpc.client import Binary
from xmlrpc.server import SimpleXMLRPCServer from xmlrpc.server import SimpleXMLRPCServer
pyloadversion = "0.5.2" pyloadversion = "0.5.3"
re_ipacl = "(([\\d\\*]{1,3}\\.){3}[\\d\\*]{1,3},[0-1] ?)*" re_ipacl = "(([\\d\\*]{1,3}\\.){3}[\\d\\*]{1,3},[0-1] ?)*"

View File

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