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"?>
<!DOCTYPE Project SYSTEM "Project-5.1.dtd">
<!-- 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 -->
<Project version="5.1">
<Language>en_US</Language>
@@ -9,7 +9,7 @@
<ProgLanguage mixed="0">Python3</ProgLanguage>
<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>
<Version>0.5.2</Version>
<Version>0.5.3</Version>
<Author>Sven Sager</Author>
<Email>akira@narux.de</Email>
<Eol index="1"/>

View File

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

View File

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

View File

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