Exception Handling - Ausnahmebehandlung
Bei der Abarbeitung eines mithilfe des TE1420 genierten TcCom-Moduls in TwinCAT kann es während der Laufzeit zu Floating Point Exceptions kommen. Dieses kann zum Beispiel erfolgen, wenn einer Funktion ein unerwarteter Wert (z.B. Anfangswert) übergeben wird. Die Behandlung von solchen Exceptions wird im folgenden Kapitel beschrieben.
Was ist eine Floating Point Exception?
Eine Floating Point Exception tritt dann auf, wenn eine arithmetisch nicht exakt ausführbare Rechenoperation in der Floating Point Unit der CPU beauftragt wird. IEEE 754 definiert diese Fälle: inexact, underflow, overflow, divide-by-zero, invalid-operation. Tritt einer dieser Fälle auf, wird ein Status Flag gesetzt, welches auf die nicht exakt ausführbare Rechenoperation hinweist. Es wird des Weiteren definiert, dass jede Rechenoperation ein Ergebnis liefern muss, und zwar ein solches, das in der Mehrzahl der Fälle dazu führt, dass man die Exception ignorieren kann.
Beispielsweise ergibt eine Division durch Null +inf oder -inf. Wird im weiteren Code ein Wert durch inf geteilt, ergibt dies Null, sodass keine Folgeprobleme zu erwarten sind. Wird inf allerdings multipliziert, oder werden andere Rechenoperationen mit inf ausgeführt, sind dies invalid operations, deren Ergebnis als Not-a-Number (NaN) dargestellt wird.
Wie reagiert die TwinCAT-Laufzeit bei Exceptions?
![]() | TwinCAT C++ Debugger nicht aktiv Folgende Ausführungen gelten nur für den Fall, dass der C++ Debugger nicht auf dem TwinCAT-Laufzeitsystem aktiviert ist. Bei aktiviertem C++ Debugger werden Exceptions vom Debugger abgefangen und können behandelt werden, siehe Debugging. |
Standard Verhalten
Default-Einstellung in TwinCAT ist, dass bei divide-by-zero und invalid-operation die Ausführung des Programms gestoppt wird und TwinCAT eine Fehlermeldung ausgibt.
Task-Einstellung: Floating Point Exceptions
Diese Default-Einstellung lässt sich auf Ebene einer jeden TwinCAT Task verändern. Wird die Checkbox „Floating Point Exception“ deaktiviert, führt eine Exception nicht zu einem TwinCAT-Stopp und es wird keine Fehlermeldung ausgegeben. Diese Einstellung ist dann gültig für alle Objekte, die durch eben diese Task aufgerufen werden. In der Folge ist in der Applikation darauf zu achten, dass NaN und inf-Werte entsprechend im Programmcode behandelt werden.
Prüfen auf NaN und Inf
Wird beispielsweise ein NaN per Mapping an ein TwinCAT-Objekt weitergegeben, welches Floating Point Exceptions aktiviert hat, führt eine Rechenoperation mit NaN natürlich in diesem Objekt zu einer Exception und in der Folge zu einem TwinCAT-Stopp. Daher muss direkt nach dem Mapping auf NaN bzw. inf geprüft werden. In der SPS stehen dazu entsprechende Funktionen in der Tc2_Utilities Bibliothek zur Verfügung, bspw. LrealIsNaN.
Try-Catch-Anweisung
Eine weitere Möglichkeit zum Umgang mit Exceptions ist die Einbettung in eine Try-Catch-Anweisung. In der SPS stehen dazu die Anweisungen __TRY, __CATCH, __FINALLY, __ENDTRY zur Verfügung. Sind auf der aufrufenden Task Floating Point Exceptions aktiviert und tritt innerhalb des Try-Catch eine Exception auf, so wird diese im Catch-Zweig gefangen und kann behandelt werden. Entsprechend werden bei dieser Vorgehensweise keine Variablen auf inf oder NaN gesetzt. Wichtig ist aber auch, zu bemerken, dass der Code in Try-Zweig nur bis zu der Stelle der Exception durchlaufen wird und dann ein Sprung zum Catch-Zweig erfolgt. Im Applikationscode ist entsprechend zu beachten, dass interne Zustände im Try-Zweig ggf. nicht konsistent sind.
Dump Files
Ab TwinCAT 3.1.4024.22 (XAR) können zur Laufzeit Dump Files im Falle von Exceptions im TcCOM-Objekt erstellt werden.
Definition des Objektverhaltens bei auftretenden Exceptions
Das Verhalten eines TcCOM-Objekts bei auftretenden Exceptions können Sie unter dem Reiter TcCOM>General in den Code Generation Settings in Simulink® definieren. Sie müssen dabei das Verhalten getrennt für die Initialisierungsphase des TcCOM und für die Laufzeitphase (update phase) definieren.

Es stehen insgesamt 9 unterschiedliche Einstellungen zur Verfügung.
- CallerExceptions (default): Exceptions werden so ausgelöst, wie an der aufrufenden Task konfiguriert.
- ThrowExceptions: Exceptions im TwinCAT-Objekt werden in jedem Fall ausgelöst, unabhängig davon, wie die Task konfiguriert ist.
- Eine Exception verursacht eine TwinCAT-Fehlermeldung und einen TwinCAT-Stopp.
- SuppressExceptions: Exceptions werden nicht ausgelöst, unabhängig davon, wie die Task konfiguriert ist.
- Eine Exception verursacht keinen TwinCAT-Stopp.
- Ausgänge oder interne Zustände können NaN oder inf sein.
- LogExceptions: Exceptions werden ausgelöst, führen aber nicht zu einem TwinCAT-Stopp.
- Eine Exception verursacht keinen TwinCAT-Stopp.
- Ausgänge oder interne Zustände können NaN oder inf sein.
- Der Ausgang
ExecutionInfo
wird mit Informationen über eine Exception im aktuellen Zyklus gefüllt. Treten mehrere Exceptions in einem Zyklus auf, wird nur die erste Exception am Ausgang angezeigt. Beim erneuten Aufruf des TwinCAT-Objekts werden die Informationen zurückgesetzt. - LogAndHold: Exceptions werden ausgelöst. Die Ausführung des TwinCAT-Objekts wird gestoppt.
- Eine Exception verursacht keinen TwinCAT-Stopp.
- Ausgänge oder interne Zustände können NaN oder inf sein.
- Der Ausgang
ExecutionInfo
wird mit Informationen über eine Exception im aktuellen Zyklus gefüllt. Treten mehrere Exceptions in einem Zyklus auf, wird nur die erste Exception am Ausgang angezeigt. Beim erneuten Aufruf des TwinCAT-Objekts werden die Informationen zurückgesetzt. - Die Ausführung des TwinCAT-Objekts wird nach Auftreten einer Exception gestoppt. TwinCAT selbst bleibt im Run-Modus.
Ausführung wieder starten: ReleaseObjectStop. - LogAndCatch: Exceptions werden mit try-catch im TwinCAT-Objekt gefangen. Die Ausführung des TwinCAT-Objekts wird gestoppt.
- Eine Exception verursacht keinen TwinCAT-Stopp.
- Ausgänge oder interne Zustände können keine NaN oder inf enthalten.
- Der Ausgang
ExecutionInfo
wird mit Informationen über eine Exception im aktuellen Zyklus gefüllt. - Die Ausführung des Codes endet an der Stelle der Exception. Von dort wird in den Catch-Zweig gesprungen, d. h. interne Zustände können inkonsistent sein.
- Die Ausführung des TwinCAT-Objekts wird nach Auftreten einer Exception gestoppt. TwinCAT selbst bleibt im Run-Modus. Ausführung wieder starten: ReleaseObjectStop.
- LogAndDump, LogHoldAndDump und LogCatchAndDump
- Verhalten bei LogExceptions
- Zusätzlich wird ein Dump File auf dem Laufzeitsystem im TwinCAT-Ordner Boot abgelegt. Weiteres zu Dump Files sehen Sie hier.