mirror of
https://github.com/naruxde/revpipyload.git
synced 2025-11-08 23:23:52 +01:00
cmd == b'EY' vom picontrolserver wurde nicht richtig verarbeitet
Fehlerabfang in picontrolserver, wenn Prozessabbild nicht geöffnet werden kann
This commit is contained in:
@@ -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"/>
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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] ?)*"
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user