FC_DiagMsgRead - Allgemeine Informationen

Übersicht

Typ

Funktion

Verfügbar ab

SystemInterface_1.32.6.0

Versionen:

Aktuelle Version

Aufgabe

Diagnoseinformationen lesen.

Beschreibung

Die Funktion liest und löscht den Diagnosepuffer (FIFO-Puffer) der Steuerung einmal.

Dadurch erhalten Sie einen Verlauf der Diagnosemeldungen seit dem letzten Neustart der Steuerung oder dem Flush des Puffers (FC_DiagFlush).

Wenn es im Puffer keine Diagnosemeldung gibt, wartet die Funktion, bis sie eine erhält oder der in i_diTimeout festgelegte Timeout auftritt.

Wenn i_diTimeout = 0, wartet die Funktion ohne Timeout auf eine Meldung und blockiert die entsprechende Task.

Der Diagnosepuffer kann höchstens 200 Meldungen speichern. Die älteste Meldung wird zuerst zum Lesen angezeigt (FIFO). Wenn der Puffer voll ist, ersetzt eine neue Meldung die älteste Meldung.

Durch Lesen des Puffers werden ausstehende Diagnosemeldungen nicht gelöscht, im Gegensatz zu den anderen Meldungen, die nach dem Auslesen gelöscht werden.

Wenn keine Meldung im Puffer vorhanden ist und der Timeout auftritt, gibt die Funktion -3 aus. Wenn eine Meldung ausgelesen wurde, wird 0 ausgegeben.

Es können alle Diagnosemeldungen mit Klasse 1 bis 7 seit dem Einschalten (Neustarten) der Steuerung ausgelesen werden.

Schnittstelle

Eingang

Datentyp

Beschreibung

i_diTimeout

DINT

Maximaler Wartezeitraum in Systemticks.

Der Parameter Systemticks wird auf der Registerkarte Parameter des Geräteeditors der Steuerung angegeben. Systemticks sind in CPU-Ticks (Central Processing Unit) pro Sekunde definiert. Systemticks definieren Sie die Anzahl der Taktunterbrechungen pro Sekunde der CPU. Ein Systemtick ist die minimale Zeit, die eine Task warten kann.

Wenn i_diTimeout = 0, wartet die Funktion ohne Timeout auf eine Meldung und blockiert die entsprechende Task.

Siehe nachstehender Beispielcode.

Ein-/Ausgang

Datentyp

Beschreibung

iq_diNr

DINT

Diagnosenummer

iq_diClass

DINT

Diagnoseklasse

iq_stLogAdr

DINT

Logische Adresse der Steuerung

Rückgabewert

Datentyp

Beschreibung

DINT

0: OK. Eine Meldung konnte aus dem Puffer gelesen werden.

-3: Timeout. Keine Meldung ausgelesen. Siehe nachstehender Beispielcode.

Das Ergebnis wird in einer Struktur abgebildet, die von einem Zeiger zurückgeliefert wird.

Beispielcode

PROGRAM SR_Diag
VAR
   xReadDiag: BOOL := FALSE;   (* Trigger reading process *)
   diReturn: DINT;   (* -3 if in timeout time, no diagnostic could be read *)
   diTimeout: DINT := 4000;   (* Waitingtime for incoming diagnostic message to the queue in Systemticks *)
   diDiagNr: DINT;   (* read diagnostic number *)  
   diClass: DINT;   (* read diagnostic class *)  
   stLogAdr: ST_LogicalAddress;
   arstDiag: ARRAY [1..200] OF stDiag;   (* Diagnostic buffer *)  
   uiIndex: UINT := 0;
   uiState: UINT := 0;
   iTaskRunning: INT;
END_VAR
(* Diagnostic classes:
4 Detected fatal error with complete stop (high priority)
3 Detected error with single shutdown (if the detected error is triggered by one axis)
2 Warning  
1 Message (low priority)
0 deactivated
stLogicalAddress:
udiType UDINT Type, as specified in the lower 12 bits of the module type in the ConnectorMapList.
udiInstance, UDINT: Instance number (based on the module type)
udiParameterId, UDINT: Identification number of the parameter
*)

iTaskRunning := iTaskRunning+1;
IF xReadDiag AND uiState = 0 THEN
   uiState := 1;
   xReadDiag := FALSE;
ELSE
   xReadDiag := FALSE;
END_IF
CASE uiState OF
0:  (* wait and reset *)
   diReturn := -1;
   diDiagNr := 0;
   diClass := 0;
   stLogAdr.udiInstance := 0;
   stLogAdr.udiParameterId := 0;
   stLogAdr.udiType := 0;
1: diReturn := SystemInterface.FC_DiagMsgRead(diTimeout, diDiagNr,diClass, stLogAdr);
   uiState := 2;   (* Keep in mind: using diTimeout 0 the task stops here until a diagnostic can be read from the function *)
2: IF diReturn = 0 THEN
      uiState := 3;
   ELSIF diReturn = -3 THEN
      uiState := 4;
   ELSE
      uiState := 99;
   END_IF
3:(* OK, diagnostic was read *)
   arstDiag[uiIndex].diClass := diClass;
   arstDiag[uiIndex].diDiagNr := diDiagNr;
   arstDiag[uiIndex].stLogAdr := stLogAdr;
   uiIndex := uiIndex+1;
   uiState := 0;
4:  (* Timeout without receiving a diagnostic *)
   uiState := 0;
99:  (* ERROR DETECTED *)
   ;
END_CASE