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:
2017-07-25 17:10:59 +02:00
parent 423397c40f
commit f0eecb8930

View File

@@ -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")