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)