diff --git a/doc/revpimodio2.helper.html b/doc/revpimodio2.helper.html index ee90dfb..5859e23 100644 --- a/doc/revpimodio2.helper.html +++ b/doc/revpimodio2.helper.html @@ -513,6 +513,11 @@ Aktiviert oder Deaktiviert die Eventueberwachung.
True aktiviert / False deaktiviert
+
+
Returns:
+
+True, wenn Anforderung erfolgreich war +

ProcimgWriter._get_ioerrors

diff --git a/revpimodio2/device.py b/revpimodio2/device.py index 7754ecc..14e4d36 100644 --- a/revpimodio2/device.py +++ b/revpimodio2/device.py @@ -284,9 +284,8 @@ class Device(object): self._modio.readprocimg(self) # Datenkopie anlegen - self._filelock.acquire() - self._ba_datacp = self._ba_devdata[:] - self._filelock.release() + with self._filelock: + self._ba_datacp = self._ba_devdata[:] self._selfupdate = True diff --git a/revpimodio2/helper.py b/revpimodio2/helper.py index b79c2df..24b67de 100644 --- a/revpimodio2/helper.py +++ b/revpimodio2/helper.py @@ -384,10 +384,16 @@ class ProcimgWriter(Thread): def _collect_events(self, value): """Aktiviert oder Deaktiviert die Eventueberwachung. - @param value True aktiviert / False deaktiviert""" + @param value True aktiviert / False deaktiviert + @return True, wenn Anforderung erfolgreich war""" if type(value) != bool: raise ValueError("value must be ") + # Nur starten, wenn System läuft + if not self.is_alive(): + self.__eventwork = False + return False + if self.__eventwork != value: with self.lck_refresh: self.__eventwork = value @@ -401,6 +407,8 @@ class ProcimgWriter(Thread): self.__eventth.daemon = True self.__eventth.start() + return True + def _get_ioerrors(self): """Ruft aktuelle Anzahl der Fehler ab. @return Aktuelle Fehleranzahl""" @@ -456,13 +464,13 @@ class ProcimgWriter(Thread): if self._modio._monitoring: # Inputs und Outputs in Puffer for dev in self._modio._lst_refresh: - dev._filelock.acquire() - dev._ba_devdata[:] = bytesbuff[dev._slc_devoff] - if self.__eventwork \ - and len(dev._dict_events) > 0 \ - and dev._ba_datacp != dev._ba_devdata: - self.__check_change(dev) - dev._filelock.release() + with dev._filelock: + dev._ba_devdata[:] = bytesbuff[dev._slc_devoff] + if self.__eventwork \ + and len(dev._dict_events) > 0 \ + and dev._ba_datacp != dev._ba_devdata: + self.__check_change(dev) + else: # Inputs in Puffer, Outputs in Prozessabbild for dev in self._modio._lst_refresh: @@ -493,7 +501,7 @@ class ProcimgWriter(Thread): finally: # Verzögerte Events prüfen if self.__eventwork: - for tup_fire in list(self.__dict_delay.keys()): + for tup_fire in tuple(self.__dict_delay.keys()): if tup_fire[0].overwrite and \ getattr(self._modio.io, tup_fire[1]).value != \ tup_fire[2]: diff --git a/revpimodio2/io.py b/revpimodio2/io.py index 839efe3..05adbbd 100644 --- a/revpimodio2/io.py +++ b/revpimodio2/io.py @@ -377,8 +377,9 @@ class IOBase(object): ) if self not in self._parentdevice._dict_events: - self._parentdevice._dict_events[self] = \ - [IOEvent(func, edge, as_thread, delay, overwrite)] + with self._parentdevice._filelock: + self._parentdevice._dict_events[self] = \ + [IOEvent(func, edge, as_thread, delay, overwrite)] else: # Prüfen ob Funktion schon registriert ist for regfunc in self._parentdevice._dict_events[self]: @@ -410,9 +411,10 @@ class IOBase(object): ) # Eventfunktion einfügen - self._parentdevice._dict_events[self].append( - IOEvent(func, edge, as_thread, delay, overwrite) - ) + with self._parentdevice._filelock: + self._parentdevice._dict_events[self].append( + IOEvent(func, edge, as_thread, delay, overwrite) + ) def _get_address(self): """Gibt die absolute Byteadresse im Prozessabbild zurueck. @@ -619,7 +621,8 @@ class IOBase(object): """ if self in self._parentdevice._dict_events: if func is None: - del self._parentdevice._dict_events[self] + with self._parentdevice._filelock: + del self._parentdevice._dict_events[self] else: newlist = [] for regfunc in self._parentdevice._dict_events[self]: @@ -629,10 +632,11 @@ class IOBase(object): newlist.append(regfunc) # Wenn Funktionen übrig bleiben, diese übernehmen - if len(newlist) > 0: - self._parentdevice._dict_events[self] = newlist - else: - del self._parentdevice._dict_events[self] + with self._parentdevice._filelock: + if len(newlist) > 0: + self._parentdevice._dict_events[self] = newlist + else: + del self._parentdevice._dict_events[self] def wait(self, edge=BOTH, exitevent=None, okvalue=None, timeout=0): """Wartet auf Wertaenderung eines IOs. diff --git a/revpimodio2/modio.py b/revpimodio2/modio.py index 737ac5b..a871ef2 100644 --- a/revpimodio2/modio.py +++ b/revpimodio2/modio.py @@ -312,7 +312,7 @@ class RevPiModIO(object): @param milliseconds in Millisekunden""" if self._looprunning: raise RuntimeError( - "can not change cycletime when cycleloop or mainloop are " + "can not change cycletime when cycleloop or mainloop is " "running" ) else: @@ -580,9 +580,8 @@ class RevPiModIO(object): # Beim Eintritt in mainloop Bytecopy erstellen for dev in self._lst_refresh: - dev._filelock.acquire() - dev._ba_datacp = dev._ba_devdata[:] - dev._filelock.release() + with dev._filelock: + dev._ba_datacp = dev._ba_devdata[:] # ImgWriter mit Eventüberwachung aktivieren self._imgwriter._collect_events(True)