mirror of
https://github.com/naruxde/revpipyload.git
synced 2025-11-08 23:23:52 +01:00
Sicherheitsbytes, die bei unsauberer Trennung geschrieben werden sollen
Mehrere Byteblöcke mit Startpositionen definierbar Einzelne oder alle Sicherheitsbytes löschbar
This commit is contained in:
@@ -598,6 +598,9 @@ class RevPiSlaveDev(Thread):
|
|||||||
self._devcon, self._addr = devcon
|
self._devcon, self._addr = devcon
|
||||||
self._evt_exit = Event()
|
self._evt_exit = Event()
|
||||||
|
|
||||||
|
# Sicherheitsbytes
|
||||||
|
self.ey_dict = {}
|
||||||
|
|
||||||
def run(self):
|
def run(self):
|
||||||
"""Verarbeitet Anfragen von Remoteteilnehmer."""
|
"""Verarbeitet Anfragen von Remoteteilnehmer."""
|
||||||
proginit.logger.debug("enter RevPiSlaveDev.run()")
|
proginit.logger.debug("enter RevPiSlaveDev.run()")
|
||||||
@@ -610,6 +613,7 @@ class RevPiSlaveDev(Thread):
|
|||||||
# Prozessabbild öffnen
|
# Prozessabbild öffnen
|
||||||
fh_proc = open(procimg, "r+b", 0)
|
fh_proc = open(procimg, "r+b", 0)
|
||||||
|
|
||||||
|
dirty = True
|
||||||
while not self._evt_exit.is_set():
|
while not self._evt_exit.is_set():
|
||||||
# Laufzeitberechnung starten
|
# Laufzeitberechnung starten
|
||||||
ot = default_timer()
|
ot = default_timer()
|
||||||
@@ -683,6 +687,57 @@ class RevPiSlaveDev(Thread):
|
|||||||
# Record seperator character
|
# Record seperator character
|
||||||
self._devcon.send(b'\x1e')
|
self._devcon.send(b'\x1e')
|
||||||
|
|
||||||
|
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
|
||||||
|
if position in self.ey_dict:
|
||||||
|
del self.ey_dict[position]
|
||||||
|
|
||||||
|
# Record seperator character
|
||||||
|
self._devcon.send(b'\x1e')
|
||||||
|
proginit.logger.info(
|
||||||
|
"cleared dirty bytes on position {}"
|
||||||
|
"".format(position)
|
||||||
|
)
|
||||||
|
|
||||||
|
else:
|
||||||
|
# Dirtybytes hinzufügen
|
||||||
|
bytesbuff = bytearray()
|
||||||
|
try:
|
||||||
|
while not self._evt_exit.is_set() \
|
||||||
|
and len(bytesbuff) < length:
|
||||||
|
block = self._devcon.recv(1024)
|
||||||
|
bytesbuff += block
|
||||||
|
if block == b'':
|
||||||
|
break
|
||||||
|
|
||||||
|
except:
|
||||||
|
proginit.logger.error("error while recv dirty bytes")
|
||||||
|
break
|
||||||
|
|
||||||
|
# Länge der Daten prüfen
|
||||||
|
if len(bytesbuff) == length:
|
||||||
|
self.ey_dict[position] = bytesbuff
|
||||||
|
else:
|
||||||
|
proginit.logger.error("got wrong length to write")
|
||||||
|
break
|
||||||
|
|
||||||
|
# Record seperator character
|
||||||
|
self._devcon.send(b'\x1e')
|
||||||
|
proginit.logger.info(
|
||||||
|
"got dirty bytes to write on error on position {}"
|
||||||
|
"".format(position)
|
||||||
|
)
|
||||||
|
|
||||||
elif cmd == b'PI':
|
elif cmd == b'PI':
|
||||||
# piCtory Konfiguration senden
|
# piCtory Konfiguration senden
|
||||||
proginit.logger.debug(
|
proginit.logger.debug(
|
||||||
@@ -701,6 +756,12 @@ class RevPiSlaveDev(Thread):
|
|||||||
self._devcon.send(b'\x04')
|
self._devcon.send(b'\x04')
|
||||||
continue
|
continue
|
||||||
|
|
||||||
|
elif cmd == b'EX':
|
||||||
|
# Sauber Verbindung verlassen
|
||||||
|
dirty = False
|
||||||
|
self._evt_exit.set()
|
||||||
|
continue
|
||||||
|
|
||||||
else:
|
else:
|
||||||
# Kein gültiges CMD gefunden, abbruch!
|
# Kein gültiges CMD gefunden, abbruch!
|
||||||
break
|
break
|
||||||
@@ -716,6 +777,16 @@ class RevPiSlaveDev(Thread):
|
|||||||
)
|
)
|
||||||
# TODO: Soll ein Fehler ausgelöst werden?
|
# TODO: Soll ein Fehler ausgelöst werden?
|
||||||
|
|
||||||
|
# Dirty verlassen
|
||||||
|
if dirty:
|
||||||
|
for pos in self.ey_dict:
|
||||||
|
fh_proc.seek(pos)
|
||||||
|
fh_proc.write(self.ey_dict[pos])
|
||||||
|
|
||||||
|
proginit.logger.error(
|
||||||
|
"dirty shutdown of connection"
|
||||||
|
)
|
||||||
|
|
||||||
fh_proc.close()
|
fh_proc.close()
|
||||||
self._devcon.close()
|
self._devcon.close()
|
||||||
self._devcon = None
|
self._devcon = None
|
||||||
@@ -1090,6 +1161,8 @@ class RevPiPyLoad():
|
|||||||
while not self._exit \
|
while not self._exit \
|
||||||
and not self.evt_loadconfig.is_set():
|
and not self.evt_loadconfig.is_set():
|
||||||
|
|
||||||
|
# TODO: Soll hier der PLC Server Thread geprüft werden?
|
||||||
|
|
||||||
# piCtory auf Veränderung prüfen
|
# piCtory auf Veränderung prüfen
|
||||||
if self.pictorymtime != os.path.getmtime(configrsc):
|
if self.pictorymtime != os.path.getmtime(configrsc):
|
||||||
proginit.logger.warning("piCtory configuration was changed")
|
proginit.logger.warning("piCtory configuration was changed")
|
||||||
|
|||||||
Reference in New Issue
Block a user