diff --git a/doc/revpimodio2.helper.html b/doc/revpimodio2.helper.html index 4868bdb..5859e23 100644 --- a/doc/revpimodio2.helper.html +++ b/doc/revpimodio2.helper.html @@ -26,9 +26,6 @@ Classes ProcimgWriter Klasse fuer Synchroniseriungs-Thread. - -Var -

@@ -68,7 +65,7 @@ None

Class Attributes

- +
__slots__
None

Class Methods

@@ -354,7 +351,7 @@ Thread

Class Attributes

- +
__slots__
None

Class Methods

@@ -429,7 +426,7 @@ Thread

Class Attributes

- +
__slots__
ioerrors
maxioerrors
refresh
ioerrors
maxioerrors
refresh

Class Methods

@@ -516,6 +513,11 @@ Aktiviert oder Deaktiviert die Eventueberwachung.
True aktiviert / False deaktiviert
+
+
Returns:
+
+True, wenn Anforderung erfolgreich war +

ProcimgWriter._get_ioerrors

@@ -590,35 +592,6 @@ ProcimgWriter.stop

Beendet die automatische Prozessabbildsynchronisierung.

-
Up
-

- -

Var

- -

-Derived from

-None -

-Class Attributes

- - -
None
-

-Class Methods

- - -
None
-

-Methods

- - -
None
-

-Static Methods

- - -
None
-
Up

\ No newline at end of file diff --git a/revpimodio2/device.py b/revpimodio2/device.py index 72b0d6a..859bed7 100644 --- a/revpimodio2/device.py +++ b/revpimodio2/device.py @@ -299,9 +299,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 b48ea94..6a68e93 100644 --- a/revpimodio2/helper.py +++ b/revpimodio2/helper.py @@ -400,10 +400,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 @@ -417,6 +423,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""" @@ -472,13 +480,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: @@ -509,7 +517,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 b100cd4..05f781a 100644 --- a/revpimodio2/io.py +++ b/revpimodio2/io.py @@ -385,8 +385,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]: @@ -418,9 +419,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. @@ -627,7 +629,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]: @@ -637,10 +640,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 2d73bac..1363877 100644 --- a/revpimodio2/modio.py +++ b/revpimodio2/modio.py @@ -319,7 +319,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: @@ -587,9 +587,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)