From 485aad020f49fc29c263dd29cc7fff22e008968e Mon Sep 17 00:00:00 2001 From: NaruX Date: Sat, 31 Aug 2019 16:40:36 +0200 Subject: [PATCH] =?UTF-8?q?Ausgabe=20der=20Warnungen=20optimiert=20no=5Fwa?= =?UTF-8?q?rn=20parameter=20aus=20mainloop=20entfernt=20(jetzt=20=C3=BCber?= =?UTF-8?q?=20debug=20einstellbar)=20Kein=20Warnungsspam=20mehr=20-=20debu?= =?UTF-8?q?g=20ist=20True=20als=20Vorbelegung?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/revpimodio2.modio.html | 20 ++++++++++---------- doc/revpimodio2.netio.html | 6 +++--- eric-revpimodio2.api | 16 ++++++++-------- revpimodio2/helper.py | 15 +++++++++++++-- revpimodio2/modio.py | 30 ++++++++++++++++++------------ revpimodio2/netio.py | 22 ++++++++++++++++------ 6 files changed, 68 insertions(+), 41 deletions(-) diff --git a/doc/revpimodio2.modio.html b/doc/revpimodio2.modio.html index fe4839a..0ef4b11 100644 --- a/doc/revpimodio2.modio.html +++ b/doc/revpimodio2.modio.html @@ -179,7 +179,7 @@ Static Methods

RevPiModIO (Constructor)

-RevPiModIO(autorefresh=False, monitoring=False, syncoutputs=True, procimg=None, configrsc=None, simulator=False, debug=False, replace_io_file=None, direct_output=False) +RevPiModIO(autorefresh=False, monitoring=False, syncoutputs=True, procimg=None, configrsc=None, simulator=False, debug=True, replace_io_file=None, direct_output=False)

Instantiiert die Grundfunktionen.

@@ -203,7 +203,7 @@ Abweichender Pfad zur piCtory Konfigurationsdatei Laedt das Modul als Simulator und vertauscht IOs
debug
-Gibt bei allen Fehlern komplette Meldungen aus +Gibt alle Warnungen inkl. Zyklusprobleme aus
replace_io_file
Replace IO Konfiguration aus Datei laden @@ -388,7 +388,7 @@ True, wenn als Simulator gestartet

RevPiModIO._gotioerror

-_gotioerror(action, e=None) +_gotioerror(action, e=None, show_warn=True)

IOError Verwaltung fuer Prozessabbildzugriff.

@@ -398,6 +398,9 @@ Zusatzinformationen zum loggen
e
Exception to log if debug is enabled +
show_warn
+
+Warnung anzeigen

@@ -573,7 +576,7 @@ Funktion wird nach dem letzten Lesen der Inputs

RevPiModIO.mainloop

-mainloop(blocking=True, no_warn=False) +mainloop(blocking=True)

Startet den Mainloop mit Eventueberwachung.

@@ -591,10 +594,7 @@ Startet den Mainloop mit Eventueberwachung.

blocking
-Wenn False, blockiert das Programm NICHT -
no_warn
-
-Keine Warnungen bei langsamen Funktionen ausgeben +Wenn False, blockiert das Programm hier NICHT
Returns:
@@ -716,7 +716,7 @@ Static Methods

RevPiModIODriver (Constructor)

-RevPiModIODriver(virtdev, autorefresh=False, monitoring=False, syncoutputs=True, procimg=None, configrsc=None, debug=False, replace_io_file=None, direct_output=False) +RevPiModIODriver(virtdev, autorefresh=False, monitoring=False, syncoutputs=True, procimg=None, configrsc=None, debug=True, replace_io_file=None, direct_output=False)

Instantiiert die Grundfunktionen.

@@ -776,7 +776,7 @@ Static Methods

RevPiModIOSelected (Constructor)

-RevPiModIOSelected(deviceselection, autorefresh=False, monitoring=False, syncoutputs=True, procimg=None, configrsc=None, simulator=False, debug=False, replace_io_file=None, direct_output=False) +RevPiModIOSelected(deviceselection, autorefresh=False, monitoring=False, syncoutputs=True, procimg=None, configrsc=None, simulator=False, debug=True, replace_io_file=None, direct_output=False)

Instantiiert nur fuer angegebene Devices die Grundfunktionen.

diff --git a/doc/revpimodio2.netio.html b/doc/revpimodio2.netio.html index 33a96e6..356e041 100644 --- a/doc/revpimodio2.netio.html +++ b/doc/revpimodio2.netio.html @@ -548,7 +548,7 @@ Static Methods

RevPiNetIO (Constructor)

-RevPiNetIO(address, autorefresh=False, monitoring=False, syncoutputs=True, simulator=False, debug=False, replace_io_file=None, direct_output=False) +RevPiNetIO(address, autorefresh=False, monitoring=False, syncoutputs=True, simulator=False, debug=True, replace_io_file=None, direct_output=False)

Instantiiert die Grundfunktionen.

@@ -717,7 +717,7 @@ Static Methods

RevPiNetIODriver (Constructor)

-RevPiNetIODriver(address, virtdev, autorefresh=False, monitoring=False, syncoutputs=True, debug=False, replace_io_file=None, direct_output=False) +RevPiNetIODriver(address, virtdev, autorefresh=False, monitoring=False, syncoutputs=True, debug=True, replace_io_file=None, direct_output=False)

Instantiiert die Grundfunktionen.

@@ -780,7 +780,7 @@ Static Methods

RevPiNetIOSelected (Constructor)

-RevPiNetIOSelected(address, deviceselection, autorefresh=False, monitoring=False, syncoutputs=True, simulator=False, debug=False, replace_io_file=None, direct_output=False) +RevPiNetIOSelected(address, deviceselection, autorefresh=False, monitoring=False, syncoutputs=True, simulator=False, debug=True, replace_io_file=None, direct_output=False)

Instantiiert nur fuer angegebene Devices die Grundfunktionen.

diff --git a/eric-revpimodio2.api b/eric-revpimodio2.api index aa88805..7625b79 100644 --- a/eric-revpimodio2.api +++ b/eric-revpimodio2.api @@ -149,7 +149,7 @@ revpimodio2.modio.RevPiModIO._get_monitoring?5() revpimodio2.modio.RevPiModIO._get_procimg?5() revpimodio2.modio.RevPiModIO._get_replace_io_file?5() revpimodio2.modio.RevPiModIO._get_simulator?5() -revpimodio2.modio.RevPiModIO._gotioerror?5(action, e=None) +revpimodio2.modio.RevPiModIO._gotioerror?5(action, e=None, show_warn=True) revpimodio2.modio.RevPiModIO._set_cycletime?5(milliseconds) revpimodio2.modio.RevPiModIO._set_debug?5(value) revpimodio2.modio.RevPiModIO._set_maxioerrors?5(value) @@ -166,7 +166,7 @@ revpimodio2.modio.RevPiModIO.get_jconfigrsc?4() revpimodio2.modio.RevPiModIO.handlesignalend?4(cleanupfunc=None) revpimodio2.modio.RevPiModIO.ioerrors?7 revpimodio2.modio.RevPiModIO.length?7 -revpimodio2.modio.RevPiModIO.mainloop?4(blocking=True, no_warn=False) +revpimodio2.modio.RevPiModIO.mainloop?4(blocking=True) revpimodio2.modio.RevPiModIO.maxioerrors?7 revpimodio2.modio.RevPiModIO.monitoring?7 revpimodio2.modio.RevPiModIO.procimg?7 @@ -177,9 +177,9 @@ revpimodio2.modio.RevPiModIO.setdefaultvalues?4(device=None) revpimodio2.modio.RevPiModIO.simulator?7 revpimodio2.modio.RevPiModIO.syncoutputs?4(device=None) revpimodio2.modio.RevPiModIO.writeprocimg?4(device=None) -revpimodio2.modio.RevPiModIO?1(autorefresh=False, monitoring=False, syncoutputs=True, procimg=None, configrsc=None, simulator=False, debug=False, replace_io_file=None, direct_output=False) -revpimodio2.modio.RevPiModIODriver?1(virtdev, autorefresh=False, monitoring=False, syncoutputs=True, procimg=None, configrsc=None, debug=False, replace_io_file=None, direct_output=False) -revpimodio2.modio.RevPiModIOSelected?1(deviceselection, autorefresh=False, monitoring=False, syncoutputs=True, procimg=None, configrsc=None, simulator=False, debug=False, replace_io_file=None, direct_output=False) +revpimodio2.modio.RevPiModIO?1(autorefresh=False, monitoring=False, syncoutputs=True, procimg=None, configrsc=None, simulator=False, debug=True, replace_io_file=None, direct_output=False) +revpimodio2.modio.RevPiModIODriver?1(virtdev, autorefresh=False, monitoring=False, syncoutputs=True, procimg=None, configrsc=None, debug=True, replace_io_file=None, direct_output=False) +revpimodio2.modio.RevPiModIOSelected?1(deviceselection, autorefresh=False, monitoring=False, syncoutputs=True, procimg=None, configrsc=None, simulator=False, debug=True, replace_io_file=None, direct_output=False) revpimodio2.netio.HASH_FAIL?7 revpimodio2.netio.NetFH._connect?5() revpimodio2.netio.NetFH._direct_send?5(send_bytes, recv_count) @@ -218,9 +218,9 @@ revpimodio2.netio.RevPiNetIO.get_reconnecting?4() revpimodio2.netio.RevPiNetIO.net_cleardefaultvalues?4(device=None) revpimodio2.netio.RevPiNetIO.net_setdefaultvalues?4(device=None) revpimodio2.netio.RevPiNetIO.reconnecting?7 -revpimodio2.netio.RevPiNetIO?1(address, autorefresh=False, monitoring=False, syncoutputs=True, simulator=False, debug=False, replace_io_file=None, direct_output=False) -revpimodio2.netio.RevPiNetIODriver?1(address, virtdev, autorefresh=False, monitoring=False, syncoutputs=True, debug=False, replace_io_file=None, direct_output=False) -revpimodio2.netio.RevPiNetIOSelected?1(address, deviceselection, autorefresh=False, monitoring=False, syncoutputs=True, simulator=False, debug=False, replace_io_file=None, direct_output=False) +revpimodio2.netio.RevPiNetIO?1(address, autorefresh=False, monitoring=False, syncoutputs=True, simulator=False, debug=True, replace_io_file=None, direct_output=False) +revpimodio2.netio.RevPiNetIODriver?1(address, virtdev, autorefresh=False, monitoring=False, syncoutputs=True, debug=True, replace_io_file=None, direct_output=False) +revpimodio2.netio.RevPiNetIOSelected?1(address, deviceselection, autorefresh=False, monitoring=False, syncoutputs=True, simulator=False, debug=True, replace_io_file=None, direct_output=False) revpimodio2.netio._sysdeldirty?8 revpimodio2.netio._sysexit?8 revpimodio2.netio._sysflush?8 diff --git a/revpimodio2/helper.py b/revpimodio2/helper.py index 6b132a7..873c120 100644 --- a/revpimodio2/helper.py +++ b/revpimodio2/helper.py @@ -437,6 +437,8 @@ class ProcimgWriter(Thread): fh = self._modio._create_myfh() self._adjwait = self._refresh + mrk_warn = True + while not self._work.is_set(): ot = default_timer() @@ -447,7 +449,7 @@ class ProcimgWriter(Thread): "".format(int(self._refresh * 1000)), RuntimeWarning ) - # Verzögerte Events pausieren an dieser Stelle + # Nur durch cycleloop erreichbar - keine verzögerten Events continue try: @@ -482,11 +484,20 @@ class ProcimgWriter(Thread): fh.flush() except IOError as e: - self._modio._gotioerror("autorefresh", e) + self._modio._gotioerror("autorefresh", e, mrk_warn) + mrk_warn = False self.lck_refresh.release() continue else: + if not mrk_warn: + warnings.warn( + "recover io errors on process image - total count " + "of {0} errors now".format(self._modio._ioerror), + RuntimeWarning + ) + mrk_warn = True + # Alle aufwecken self.lck_refresh.release() self.newdata.set() diff --git a/revpimodio2/modio.py b/revpimodio2/modio.py index c438bb3..1c3ed29 100644 --- a/revpimodio2/modio.py +++ b/revpimodio2/modio.py @@ -41,7 +41,7 @@ class RevPiModIO(object): def __init__( self, autorefresh=False, monitoring=False, syncoutputs=True, - procimg=None, configrsc=None, simulator=False, debug=False, + procimg=None, configrsc=None, simulator=False, debug=True, replace_io_file=None, direct_output=False): """Instantiiert die Grundfunktionen. @@ -51,7 +51,7 @@ class RevPiModIO(object): @param procimg Abweichender Pfad zum Prozessabbild @param configrsc Abweichender Pfad zur piCtory Konfigurationsdatei @param simulator Laedt das Modul als Simulator und vertauscht IOs - @param debug Gibt bei allen Fehlern komplette Meldungen aus + @param debug Gibt alle Warnungen inkl. Zyklusprobleme aus @param replace_io_file Replace IO Konfiguration aus Datei laden @param direct_output Write outputs immediately to process image (slow) @@ -445,11 +445,12 @@ class RevPiModIO(object): @return True, wenn als Simulator gestartet""" return self._simulator - def _gotioerror(self, action, e=None): + def _gotioerror(self, action, e=None, show_warn=True): """IOError Verwaltung fuer Prozessabbildzugriff. @param action Zusatzinformationen zum loggen @param e Exception to log if debug is enabled + @param show_warn Warnung anzeigen """ self._ioerror += 1 @@ -459,6 +460,9 @@ class RevPiModIO(object): "".format(self._maxioerrors) ) + if not show_warn: + return + if self._debug: warnings.warn( "got io error during '{0}' and count {1} errors now | {2}" @@ -466,7 +470,10 @@ class RevPiModIO(object): RuntimeWarning ) else: - warnings.warn("got io error on process image", RuntimeWarning) + warnings.warn( + "got io error on process image", + RuntimeWarning + ) def _set_cycletime(self, milliseconds): """Setzt Aktualisierungsrate der Prozessabbild-Synchronisierung. @@ -803,7 +810,7 @@ class RevPiModIO(object): signal(SIGINT, self.__evt_exit) signal(SIGTERM, self.__evt_exit) - def mainloop(self, blocking=True, no_warn=False): + def mainloop(self, blocking=True): """Startet den Mainloop mit Eventueberwachung. Der aktuelle Programmthread wird hier bis Aufruf von @@ -818,8 +825,7 @@ class RevPiModIO(object): Events vom RevPi benoetigt werden, aber das Programm weiter ausgefuehrt werden soll. - @param blocking Wenn False, blockiert das Programm NICHT - @param no_warn Keine Warnungen bei langsamen Funktionen ausgeben + @param blocking Wenn False, blockiert das Programm hier NICHT @return None """ @@ -877,13 +883,13 @@ class RevPiModIO(object): # ImgWriter mit Eventüberwachung aktivieren self._imgwriter._collect_events(True) e = None - runtime = -1 if no_warn else 0 + runtime = 0 while not self._exit.is_set(): # Laufzeit der Eventqueue auf 0 setzen if self._imgwriter._eventq.qsize() == 0: - runtime = -1 if no_warn else 0 + runtime = 0 try: tup_fire = self._imgwriter._eventq.get(timeout=1) @@ -901,7 +907,7 @@ class RevPiModIO(object): runtime = -1 warnings.warn( "can not execute all event functions in one cycle - " - "rise .cycletime or optimize your event functions", + "optimize your event functions or rise .cycletime", RuntimeWarning ) except Empty: @@ -1128,7 +1134,7 @@ class RevPiModIOSelected(RevPiModIO): def __init__( self, deviceselection, autorefresh=False, monitoring=False, syncoutputs=True, procimg=None, configrsc=None, - simulator=False, debug=False, replace_io_file=None, + simulator=False, debug=True, replace_io_file=None, direct_output=False): """Instantiiert nur fuer angegebene Devices die Grundfunktionen. @@ -1197,7 +1203,7 @@ class RevPiModIODriver(RevPiModIOSelected): def __init__( self, virtdev, autorefresh=False, monitoring=False, - syncoutputs=True, procimg=None, configrsc=None, debug=False, + syncoutputs=True, procimg=None, configrsc=None, debug=True, replace_io_file=None, direct_output=False): """Instantiiert die Grundfunktionen. diff --git a/revpimodio2/netio.py b/revpimodio2/netio.py index ea00e8d..40085f4 100644 --- a/revpimodio2/netio.py +++ b/revpimodio2/netio.py @@ -487,14 +487,27 @@ class NetFH(Thread): def run(self): """Handler fuer Synchronisierung.""" + state_reconnect = False while not self.__sockend.is_set(): # Bei Fehlermeldung neu verbinden if self.__sockerr.is_set(): + if not state_reconnect: + state_reconnect = True + warnings.warn( + "got a network error and try to reconnect", + RuntimeWarning + ) self._connect() if self.__sockerr.is_set(): # Verhindert bei Scheitern 100% CPU last self.__sockend.wait(self.__waitsync) + else: + state_reconnect = False + warnings.warn( + "successfully reconnected after network error", + RuntimeWarning + ) else: # Kein Fehler aufgetreten, sync durchführen wenn socket frei @@ -504,9 +517,6 @@ class NetFH(Thread): self._slavesock.send(_syssync) data = self._slavesock.recv(2) except IOError as e: - warnings.warn( - "network error in sync of NetFH", RuntimeWarning - ) self.__sockerr.set() else: if data != b'\x06\x16': @@ -661,7 +671,7 @@ class RevPiNetIO(_RevPiModIO): def __init__( self, address, autorefresh=False, monitoring=False, - syncoutputs=True, simulator=False, debug=False, + syncoutputs=True, simulator=False, debug=True, replace_io_file=None, direct_output=False): """Instantiiert die Grundfunktionen. @@ -885,7 +895,7 @@ class RevPiNetIOSelected(RevPiNetIO): def __init__( self, address, deviceselection, autorefresh=False, - monitoring=False, syncoutputs=True, simulator=False, debug=False, + monitoring=False, syncoutputs=True, simulator=False, debug=True, replace_io_file=None, direct_output=False): """Instantiiert nur fuer angegebene Devices die Grundfunktionen. @@ -955,7 +965,7 @@ class RevPiNetIODriver(RevPiNetIOSelected): def __init__( self, address, virtdev, autorefresh=False, monitoring=False, - syncoutputs=True, debug=False, replace_io_file=None, + syncoutputs=True, debug=True, replace_io_file=None, direct_output=False): """Instantiiert die Grundfunktionen.