FC_DiagMsgRead - Allgemeine Informationen
Typ |
Funktion |
Verfügbar ab |
SystemInterface_1.32.6.0 |
Versionen: |
Aktuelle Version |
Diagnoseinformationen lesen.
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.
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 |
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.
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