Fehlerauswertung

Über den Interface-Pointer ipResultMessage vom Typ I_TcMessage werden Informationen zu einem aktuellen Ereignis (Laufzeitmeldung) bereitgestellt. Es folgen die wichtigsten Methoden und Eigenschaften:

Methoden

Name

Beschreibung

EqualsToEventEntryEx

Vergleicht die Ereignisdefinition des Ereignisses mit einer anderen Ereignisdefinition.

RequestEventText

Liefert den Text zum Ereignis.

Eigenschaften

Name

Typ

Beschreibung

eSeverity

TcEventSeverity

Liefert die Severity.

EventClass

GUID

Liefert die eindeutige ID der Ereignisklasse.

nEventId

UDINT

Liefert die ID des Ereignisses.

stEventEntry

TcEventEntry

Liefert die Ereignisdefinition.

Details zu dem Interface I_TCMessage finden Sie in der Dokumentation zu der Tc3_EventLogger-Bibliothek.

Jedes Ereignis wird eindeutig durch die Struktur TcEventEntry beschrieben. Diese enthält drei Struktur-Elemente:

Mehrere Ereignisse werden in eine Event-Class zusammengelegt. So kann z.B. in der Event-Class für DALI, und in der Event-Class für EnOcean die Event-ID 100 enthalten sein. Die vollständige Beschreibung eines Ereignisses besteht immer aus der Event-Class und der Event-ID. Doppeldeutigkeiten aufgrund von gleichen IDs innerhalb verschiedener Libraries werden somit vermieden.

Um die Ereignisse der SPS zugänglich zu machen, legt TwinCAT im Typsystem für jede Event-Class automatisch eine Struktur an.

Fehlerauswertung 1:

Dieses geschieht für alle SPS-Bibliotheken, die in dem Projekt referenziert werden. Über die Tc3_DALI-Bibliothek wird die Struktur ST_DALIEventClass hinzugefügt.

Fehlerauswertung 2:

Diese Struktur enthält alle Ereignisse der Event-Class für die Tc3_DALI-Bibliothek. Dabei wird jedes Element der Struktur durch eine Variable vom Typ TcEventEntry abgebildet. Der Name des Elements gibt Aufschluss über die Bedeutung des Ereignisses.

TYPE ST_TcDALIEventClass:
  STRUCT
    NoResponseFromDALITerminal: TcEventEntry := ( …
    NoResponseFromDALIDevice: TcEventEntry := ( …
    CommandBufferOverflow: TcEventEntry := ( …
    […]
  END_STRUCT
END_TYPE

Alle Event-Classes sind wiederum in der globalen Variablenliste TC_Events abgelegt, die ebenfalls von TwinCAT automatisch erzeugt wird.

VAR_GLOBAL CONSTANT
  […]
  TcRTimeEventClass: ST_TcRTimeEventClass;
  Win32EventClass: ST_Win32EventClass;
  TcDALIEventClass: ST_TcDALIEventClass;
END_VAR

Somit stehen im SPS-Programm alle Meldungen aller Event-Classes zur Verfügung.

FAQ

Wie kann ich abfragen, ob ein FB einen Fehler zurückliefert?

In allen Bibliotheken ist die Event-ID für eine fehlerfreie Ausführung mit 0 fest vorgegeben. Da die Event-ID nicht nur Fehler, sondern auch Hinweise und Warnungen ausgibt, besitzen die meisten Bausteine den Ausgang bError. Dieser Ausgang ist TRUE, sobald ein Fehler vorliegt.

IF (fbDALI.bError) THEN
  …
END_IF

Bei Warnungen oder Hinweisen bleibt dieser Ausgang FALSE. Daher kann es vorkommen das die Event-ID (fbDALI.ipResultMessage.nEventID) ungleich 0 ist, bError aber FALSE bleibt.

Wie kann ich abfragen, ob ein FB ein bestimmtes Ereignis zurückliefert?

Die Methode

ipResultMessage.EqualsToEventEntryEx(stOther TcEventEntry)

vergleicht ob das Ereignis gleich dem übergebenen Ereignis stOther entspricht. Da es automatisch für jedes Ereignis eine Variable vom Typ TcEventEntry gibt, kann die Abfrage auf ein bestimmtes Ereignis wie folgt durchgeführt werden.

IF (fbDALI.ipResultMessage.EqualsToEventEntryEx(
  TC_EVENTS.TcDALIEventClass.NoResponseFromTheDALIDevice)) THEN
  …
END_IF

Alternativ kann auch die Event-ID direkt abgefragt werden.

IF (fbDALI.ipResultMessage.nEventId = 2) THEN
  …
END_IF

Für jedes Ereignis existiert eine Struktur vom Datentyp TcEventEntry. Diese befindet sich innerhalb der Struktur TcDALIEventClass (Datentyp ST_TcDALIEventClass). Aus den Namen der einzelnen Ereignisse ist auch die Bedeutung der Meldung erkennbar. Somit kann durch die Verwendung dieser Struktur die Lesbarkeit des SPS-Programms verbessert werden:

IF (fbDALI.ipResultMessage.nEventId =
  TC_EVENTS.TcDALIEventClass.NoResponseFromTheDALIDevice.nEventId) then
  …
END_IF

Eine Auflistung aller Ereignisse, die einen Fehler darstellen finden Sie unter Laufzeitmeldungen.

Wie kann ich den Text eines Ereignisses abfragen?

Der Text, der im Fenster TwinCAT Logged Events ausgegeben wird, kann auch im SPS-Programm mit der Methode

ipResultMessage.RequestEventText(nLangId DINT, sResult REFERENCE TO STRING, nResultSize UDINT)

abgefragt werden.

Liegt ein Ereignis an, dann liefert das folgende Beispiel den Ereignis-Text:

sTxt       :  STRING(255);
sEventText :  STRING(255);
IF (fbDALI.ipResultMessage.RequestEventText(1031, sTxt, SIZEOF(sTxt))) THEN
  UTF8_TO_STRING(ADR(sEventText), ADR(sTxt), SIZEOF(sTxt));
END_IF

Der erste Parameter gibt die Sprache vor, in der der Text ausgelesen werden soll. Die Tc3_DALI-Bibliothek enthält alle Texte in Englisch (1033) und Deutsch (1031).