Watchdogs

Da die Laufzeit vieler Bildverarbeitungsalgorithmen abhängig ist vom Bildinhalt, können Funktionsaufrufe unter ungünstigen Umständen wesentlich länger dauern als üblich.

Ursachen könnten zum Beispiel sich ändernde Lichtverhältnisse, unerwartete Objekte im Bild und andere Faktoren sein, die die Berechnungszeit von Funktionen wie F_VN_FindContours() drastisch beeinflussen können. Es können z. B. normalerweise nur 10 Konturen gefunden werden, bei anderer Beleuchtung dann plötzlich 100 oder mehr.

Hierdurch kann es zu Zyklusüberschreitungen kommen, die unbedingt zu vermeiden sind, da sie zu undefinierten Verhalten führen.

Hier sind Watchdogs hilfreich. Watchdogs können einzelne Vision-Funktionen oder ganze Codeabschnitte mit mehreren Funktionen nach einer bestimmten Zeit abbrechen. Einige TwinCAT Vision-Funktionen können während der Ausführung abgebrochen werden und liefern die bis dahin berechneten Teilergebnisse zurück. Falls mehrere Funktionen von einem Watchdog überwacht werden, werden alle verbleibenden Funktionen innerhalb des Watchdog-Bereichs übersprungen, wenn die vorgegebene Zeit abgelaufen ist. Die darauffolgenden Funktionen (nach dem Watchdog-Bereich) werden allerdings wieder ganz normal ausgeführt.

Es stehen zwei Funktionen zur Verfügung, um den Start eines Watchdog-überwachten Bereichs zu definieren, die sich dadurch unterscheiden, ab wann die vorgegebene Zeit anfängt zu zählen:

In beiden Fällen wird das Ende des Bereichs durch die Funktion F_VN_StopWatchdog definiert, die optional den Bearbeitungsanteil und die benötigte Zeit zurückgibt.

Hinweis

Watchdog mit relativer Abbruchzeit

Bei der Verwendung der F_VN_StartRelWatchdog ist darauf zu achten, dass die Abbruchzeit nicht zu groß gewählt wird, da es sonst weiterhin zu Zyklusüberschreitungen kommen kann. Beachten Sie daher die Zykluszeit der entsprechenden Task, die bis zum Aufruf der Funktion schon vergangene Zeit, sowie die nach F_VN_StopWatchdog noch benötigte Zeit bis zum Taskende.

Damit Funktionen durch einen Watchdogs überwacht werden können, muss auf der jeweils ausführenden Task die Option „Watchdog stack“ aktiviert sein.

Watchdogs 1:

Beispiel

Im Beispiel unten wird ein Watchdog mit einer Stoppzeit von 10ms relativ zum Aufruf der Watchdog-Funktion gestartet. Angenommen die Zykluszeit beträgt 20ms, beim Aufruf von F_VN_StartRelWatchdog sind bereits 4ms im aktuellen Taskzyklus vergangen und der Watchdog wird mit einer Stoppzeit tStop = 10ms bezogen auf die aktuelle Zeit gestartet, dann stoppt der Watchdog die überwachten Funktionen (d. h. jede Funktion, die zwischen dem Start und Stopp des Watchdogs aufgerufen wird), nachdem 14ms des aktuellen Zyklus verstrichen sind.

VAR
    ipImage    : ITcVnImage := 0;
    ipContours : ITcVnContainer := 0;

    // watchdog runtime info
    nFunctionsMonitored  : ULINT;
    nFractionProcessed   : UDINT;
    tRest                : DINT;
END_VAR

(* imagine some other functions that use 4ms up to here *)

hr := F_VN_StartRelWatchdog(10000, hr); // 10ms
    hr := F_VN_Threshold(ipImage, ipImage, 120, 255, TCVN_TT_BINARY, hr);
    hr := F_VN_FindContours(ipImage, ipContours, hr);
hr := F_VN_StopWatchdog(nFunctionsMonitored => nFunctionsMonitored, nFractionProcessed => nFractionProcessed, tRest => tRest);

Jetzt sind zwei Situationen denkbar:

Angenommen, F_VN_Threshold benötigt 1ms und F_VN_FindContours benötigt 5ms. Beim Aufruf von F_VN_StopWatchdog verbleiben noch 4ms. Die Watchdog-Laufzeitinformation lautet:

nFunctionsMonitored = 2
nFractionProcessed = 100 // in %
tRest = 4000 // in us, equals 4ms

Szenario: Die Funktion F_VN_Threshold ist nicht vom Bildinhalt abhängig (lediglich von der Anzahl Pixel) und benötigt daher wieder nur 1ms, jedoch haben sich die Lichtverhältnisse ungünstig geändert, sodass F_VN_FindContours länger als 9ms benötigen würde. Daher stoppt der Watchdog F_VN_FindContours, die aber trotzdem die bisher gefundenen Konturen zurückgibt. Die Watchdog-Laufzeitinformation könnte dann folgendermaßen lauten:

nFunctionsMonitored = 2
nFractionProcessed = 70
tRest = -50

In diesem Fall wurde ein geschätzter Bearbeitungsanteil von 70% berechnet, bis die Funktion abgebrochen wurde. Die Restzeit ist negativ, d. h. die geplante Stoppzeit wurde um 50us überschritten, sodass nach der Funktion F_VN_StopWatchdog statt der geplanten 14000us nun 14050us seit dem Start des Taskzyklus vergangen sind. Die Überschreitung geschieht deshalb, weil die bereits berechneten Teilergebnisse der Funktion weiterverwendet werden sollen. Daher kann zum einen der Algorithmus nur an dezidierten Stellen abgebrochen werden, zum anderen müssen die bisherigen Ergebnisse organisiert und zurückgegeben werden. Die maximale Überschreitung hängt dabei generell von der konkreten Funktion und dem Bildinhalt ab. In einem Programm sollte die Abbruchzeit daher immer so gewählt werden, dass noch ein Sicherheitspuffer am Ende des Taskzyklus übrigbleibt.

Überwachte Funktionen

Folgende Funktionen liefern bei einem Watchdog-Abbruch Teilergebnisse:

Andere Funktionen können während der Ausführung nicht abgebrochen werden, werden allerdings übersprungen, wenn die Zeit des Watchdogs abgelaufen ist.

Beispiele