Mit default zusammenführen

This commit is contained in:
2018-08-14 11:40:01 +02:00
5 changed files with 44 additions and 61 deletions

View File

@@ -26,9 +26,6 @@ Classes</h3>
</tr><tr> </tr><tr>
<td><a style="color:#0000FF" href="#ProcimgWriter">ProcimgWriter</a></td> <td><a style="color:#0000FF" href="#ProcimgWriter">ProcimgWriter</a></td>
<td>Klasse fuer Synchroniseriungs-Thread.</td> <td>Klasse fuer Synchroniseriungs-Thread.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#Var">Var</a></td>
<td></td>
</tr> </tr>
</table> </table>
<h3 style="background-color:#FFFFFF;color:#FF0000"> <h3 style="background-color:#FFFFFF;color:#FF0000">
@@ -68,7 +65,7 @@ None
<h3 style="background-color:#FFFFFF;color:#FF0000"> <h3 style="background-color:#FFFFFF;color:#FF0000">
Class Attributes</h3> Class Attributes</h3>
<table> <table>
<tr><td>__slots__</td></tr> <tr><td>None</td></tr>
</table> </table>
<h3 style="background-color:#FFFFFF;color:#FF0000"> <h3 style="background-color:#FFFFFF;color:#FF0000">
Class Methods</h3> Class Methods</h3>
@@ -354,7 +351,7 @@ Thread
<h3 style="background-color:#FFFFFF;color:#FF0000"> <h3 style="background-color:#FFFFFF;color:#FF0000">
Class Attributes</h3> Class Attributes</h3>
<table> <table>
<tr><td>__slots__</td></tr> <tr><td>None</td></tr>
</table> </table>
<h3 style="background-color:#FFFFFF;color:#FF0000"> <h3 style="background-color:#FFFFFF;color:#FF0000">
Class Methods</h3> Class Methods</h3>
@@ -429,7 +426,7 @@ Thread
<h3 style="background-color:#FFFFFF;color:#FF0000"> <h3 style="background-color:#FFFFFF;color:#FF0000">
Class Attributes</h3> Class Attributes</h3>
<table> <table>
<tr><td>__slots__</td></tr><tr><td>ioerrors</td></tr><tr><td>maxioerrors</td></tr><tr><td>refresh</td></tr> <tr><td>ioerrors</td></tr><tr><td>maxioerrors</td></tr><tr><td>refresh</td></tr>
</table> </table>
<h3 style="background-color:#FFFFFF;color:#FF0000"> <h3 style="background-color:#FFFFFF;color:#FF0000">
Class Methods</h3> Class Methods</h3>
@@ -516,6 +513,11 @@ Aktiviert oder Deaktiviert die Eventueberwachung.
<dd> <dd>
True aktiviert / False deaktiviert True aktiviert / False deaktiviert
</dd> </dd>
</dl><dl>
<dt>Returns:</dt>
<dd>
True, wenn Anforderung erfolgreich war
</dd>
</dl><a NAME="ProcimgWriter._get_ioerrors" ID="ProcimgWriter._get_ioerrors"></a> </dl><a NAME="ProcimgWriter._get_ioerrors" ID="ProcimgWriter._get_ioerrors"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000"> <h3 style="background-color:#FFFFFF;color:#FF0000">
ProcimgWriter._get_ioerrors</h3> ProcimgWriter._get_ioerrors</h3>
@@ -590,35 +592,6 @@ ProcimgWriter.stop</h3>
<p> <p>
Beendet die automatische Prozessabbildsynchronisierung. Beendet die automatische Prozessabbildsynchronisierung.
</p> </p>
<div align="right"><a style="color:#0000FF" href="#top">Up</a></div>
<hr /><hr />
<a NAME="Var" ID="Var"></a>
<h2 style="background-color:#FFFFFF;color:#0000FF">Var</h2>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Derived from</h3>
None
<h3 style="background-color:#FFFFFF;color:#FF0000">
Class Attributes</h3>
<table>
<tr><td>None</td></tr>
</table>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Class Methods</h3>
<table>
<tr><td>None</td></tr>
</table>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Methods</h3>
<table>
<tr><td>None</td></tr>
</table>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Static Methods</h3>
<table>
<tr><td>None</td></tr>
</table>
<div align="right"><a style="color:#0000FF" href="#top">Up</a></div> <div align="right"><a style="color:#0000FF" href="#top">Up</a></div>
<hr /> <hr />
</body></html> </body></html>

View File

@@ -299,9 +299,8 @@ class Device(object):
self._modio.readprocimg(self) self._modio.readprocimg(self)
# Datenkopie anlegen # Datenkopie anlegen
self._filelock.acquire() with self._filelock:
self._ba_datacp = self._ba_devdata[:] self._ba_datacp = self._ba_devdata[:]
self._filelock.release()
self._selfupdate = True self._selfupdate = True

View File

@@ -400,10 +400,16 @@ class ProcimgWriter(Thread):
def _collect_events(self, value): def _collect_events(self, value):
"""Aktiviert oder Deaktiviert die Eventueberwachung. """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: if type(value) != bool:
raise ValueError("value must be <class 'bool'>") raise ValueError("value must be <class 'bool'>")
# Nur starten, wenn System läuft
if not self.is_alive():
self.__eventwork = False
return False
if self.__eventwork != value: if self.__eventwork != value:
with self.lck_refresh: with self.lck_refresh:
self.__eventwork = value self.__eventwork = value
@@ -417,6 +423,8 @@ class ProcimgWriter(Thread):
self.__eventth.daemon = True self.__eventth.daemon = True
self.__eventth.start() self.__eventth.start()
return True
def _get_ioerrors(self): def _get_ioerrors(self):
"""Ruft aktuelle Anzahl der Fehler ab. """Ruft aktuelle Anzahl der Fehler ab.
@return Aktuelle Fehleranzahl""" @return Aktuelle Fehleranzahl"""
@@ -472,13 +480,13 @@ class ProcimgWriter(Thread):
if self._modio._monitoring: if self._modio._monitoring:
# Inputs und Outputs in Puffer # Inputs und Outputs in Puffer
for dev in self._modio._lst_refresh: for dev in self._modio._lst_refresh:
dev._filelock.acquire() with dev._filelock:
dev._ba_devdata[:] = bytesbuff[dev._slc_devoff] dev._ba_devdata[:] = bytesbuff[dev._slc_devoff]
if self.__eventwork \ if self.__eventwork \
and len(dev._dict_events) > 0 \ and len(dev._dict_events) > 0 \
and dev._ba_datacp != dev._ba_devdata: and dev._ba_datacp != dev._ba_devdata:
self.__check_change(dev) self.__check_change(dev)
dev._filelock.release()
else: else:
# Inputs in Puffer, Outputs in Prozessabbild # Inputs in Puffer, Outputs in Prozessabbild
for dev in self._modio._lst_refresh: for dev in self._modio._lst_refresh:
@@ -509,7 +517,7 @@ class ProcimgWriter(Thread):
finally: finally:
# Verzögerte Events prüfen # Verzögerte Events prüfen
if self.__eventwork: 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 \ if tup_fire[0].overwrite and \
getattr(self._modio.io, tup_fire[1]).value != \ getattr(self._modio.io, tup_fire[1]).value != \
tup_fire[2]: tup_fire[2]:

View File

@@ -385,8 +385,9 @@ class IOBase(object):
) )
if self not in self._parentdevice._dict_events: if self not in self._parentdevice._dict_events:
self._parentdevice._dict_events[self] = \ with self._parentdevice._filelock:
[IOEvent(func, edge, as_thread, delay, overwrite)] self._parentdevice._dict_events[self] = \
[IOEvent(func, edge, as_thread, delay, overwrite)]
else: else:
# Prüfen ob Funktion schon registriert ist # Prüfen ob Funktion schon registriert ist
for regfunc in self._parentdevice._dict_events[self]: for regfunc in self._parentdevice._dict_events[self]:
@@ -418,9 +419,10 @@ class IOBase(object):
) )
# Eventfunktion einfügen # Eventfunktion einfügen
self._parentdevice._dict_events[self].append( with self._parentdevice._filelock:
IOEvent(func, edge, as_thread, delay, overwrite) self._parentdevice._dict_events[self].append(
) IOEvent(func, edge, as_thread, delay, overwrite)
)
def _get_address(self): def _get_address(self):
"""Gibt die absolute Byteadresse im Prozessabbild zurueck. """Gibt die absolute Byteadresse im Prozessabbild zurueck.
@@ -627,7 +629,8 @@ class IOBase(object):
""" """
if self in self._parentdevice._dict_events: if self in self._parentdevice._dict_events:
if func is None: if func is None:
del self._parentdevice._dict_events[self] with self._parentdevice._filelock:
del self._parentdevice._dict_events[self]
else: else:
newlist = [] newlist = []
for regfunc in self._parentdevice._dict_events[self]: for regfunc in self._parentdevice._dict_events[self]:
@@ -637,10 +640,11 @@ class IOBase(object):
newlist.append(regfunc) newlist.append(regfunc)
# Wenn Funktionen übrig bleiben, diese übernehmen # Wenn Funktionen übrig bleiben, diese übernehmen
if len(newlist) > 0: with self._parentdevice._filelock:
self._parentdevice._dict_events[self] = newlist if len(newlist) > 0:
else: self._parentdevice._dict_events[self] = newlist
del self._parentdevice._dict_events[self] else:
del self._parentdevice._dict_events[self]
def wait(self, edge=BOTH, exitevent=None, okvalue=None, timeout=0): def wait(self, edge=BOTH, exitevent=None, okvalue=None, timeout=0):
"""Wartet auf Wertaenderung eines IOs. """Wartet auf Wertaenderung eines IOs.

View File

@@ -319,7 +319,7 @@ class RevPiModIO(object):
@param milliseconds <class 'int'> in Millisekunden""" @param milliseconds <class 'int'> in Millisekunden"""
if self._looprunning: if self._looprunning:
raise RuntimeError( raise RuntimeError(
"can not change cycletime when cycleloop or mainloop are " "can not change cycletime when cycleloop or mainloop is "
"running" "running"
) )
else: else:
@@ -587,9 +587,8 @@ class RevPiModIO(object):
# Beim Eintritt in mainloop Bytecopy erstellen # Beim Eintritt in mainloop Bytecopy erstellen
for dev in self._lst_refresh: for dev in self._lst_refresh:
dev._filelock.acquire() with dev._filelock:
dev._ba_datacp = dev._ba_devdata[:] dev._ba_datacp = dev._ba_devdata[:]
dev._filelock.release()
# ImgWriter mit Eventüberwachung aktivieren # ImgWriter mit Eventüberwachung aktivieren
self._imgwriter._collect_events(True) self._imgwriter._collect_events(True)