TwinCAT-Beispiel für die Diagnose mit der Feldbuskarte FC310x

Über das Bit DiagnoseStation11 wird die Diagnose der Station 11 gemeldet. Die Diagnoseinformationen werden mit dem ADS-Baustein ausgelesen und in das Array strDiagnose kopiert. Dort kann die weitere Bearbeitung erfolgen.

NETID       NetID der FC310x Karte
Port            Diagnose Port Fest 200
IDXGRP    Slave-Adresse im High-Wort und die Konstante 0xF181 im Low-Wort
IDXOFF     immer "0", gesamte Diagnose auslesen
LEN           276 Byte

Aufbau der Diagnosedaten

Offset

Beschreibung

0

Receive-Error-Counter (WORD): Anzahl der fehlerhaften Telegramme bei der Kommunikation mit diesem Slave

2

ab FC310x, Version 1.11:
Repeat-Counter[9] (WORD): Die Repeat-Counter zeigen an, wie oft wie viele Repeats (1..MaxRetryLimit, MaxRetryLimit ohne Antwort) gemacht werden mussten. Repeat-Counter[0] zeigt an, wie oft ein Telegramm zu diesem Slave einmal wiederholt werden musste, Repeat-Counter[1], wie oft ein Telegramm zu diesem Slave zweimal wiederholt werden musste, etc. Der Parameter MaxRetryLimit kann in den Profibus-Parametern eingestellt werden (Wertebereich 0..8) 

20

NoAnswer-Counter (DWORD): Anzahl der Telegramme bei der Kommunikation mit diesem Slave, auf die nicht geantwortet und bei denen kein Repeat durchgeführt wurde. Wenn ein Slave das erste Mal nicht antwortet, wird bis zu MaxRetryLimit mal das Telegramm wiederholt, wenn er auch dann nicht geantwortet hat, wird beim nächsten Mal keine Wiederholung mehr durchgeführt. 

24-31

reserviert

32-37

Profibus-Norm-Diagnose

38-275

Profibus-Norm-Extended-Diagnose (siehe Dokumentation des Herstellers)

Programmbeispiel

VAR
DiagnoseStation11 AT %IX100.0:BOOL;
strDiagnose : ARRAY[0..275] OF BYTE;
fbADSREAD : ADSREAD;
k: INT;
END_VAR

 

CASE k OF
 0: IF DiagnoseStation11 THEN fbADSREAD( NETID:= '172.16.3.106.2.1',
            PORT:=200,
            IDXGRP:=16#BF181,
            IDXOFFS:=16#0,
            LEN:=276,
            DESTADDR:=ADR(strDiagnose),
            READ:= TRUE,
            TMOUT:= t#10s, );
        k:=k+1; 
    END_IF
 1:     fbADSREAD(READ:= FALSE);
    IF NOT fbADSREAD.busy THEN
        k:=0;
    END_IF
END_CASE