FUNCTION_BLOCK FB126 // UP Profibus/ProfiNet-Diagnose
TITLE = 'UP Profibus/ProfiNet-Diagnose' // UP Profibus/ProfiNet-Diagnose
AUTHOR : 'Larry'
VERSION : '2.1' // 01.06.2012
FAMILY : 'LL_Std'
KNOW_HOW_PROTECT
VAR_IN_OUT
OBxx_Trigger : BOOL ;
END_VAR
VAR_OUTPUT
Auswertung_aktiv : BOOL ;
ProfiBus_vorh : BOOL ;
ProfiBus_IO : BOOL ;
ProfiNet_vorh : BOOL ;
ProfiNet_IO : BOOL ;
END_VAR
VAR
PB_Slaves : STRUCT
Anzahl : INT ;
Status : ARRAY[0..255] OF BYTE ; // Bit0 : projektiert, Bit1: nicht in Funktion, Bit2: Störung
END_STRUCT ;
PN_Slaves : STRUCT
Anzahl : INT ;
Status : ARRAY[0..2047] OF BYTE ; // Bit0 : projektiert, Bit1: nicht in Funktion, Bit2: Störung
END_STRUCT ;
intern : STRUCT
Ablauf_Check : INT := 0 ; // Schrittkette für die Abfrage der Diagnose-Info's
erster_Start : BOOL := true ; // Init-HM für die erste Erkennung, ob es PN oder PB nicht gibt
Fn_x092_Aktiv : BOOL ;
Fn_x292_Aktiv : BOOL ;
Fn_x692_Aktiv : BOOL ;
Fn_x094_Aktiv : BOOL ;
Fn_x294_Aktiv : BOOL ;
Fn_x694_Aktiv : BOOL ;
END_STRUCT ;
Abfrage_PB_Slaves : STRUCT
projektiert : ARRAY[0..255] OF BOOL ;
in_Funktion : ARRAY[0..255] OF BOOL ;
mit_Stoerung : ARRAY[0..255] OF BOOL ;
END_STRUCT ;
Abfrage_PN_Slaves : STRUCT
projektiert_Status : WORD ;
projektiert : ARRAY[0..2047] OF BOOL ;
in_Funktion_Status : WORD ;
in_Funktion : ARRAY[0..2047] OF BOOL ;
mit_Stoerung_Status : WORD ;
mit_Stoerung : ARRAY[0..2047] OF BOOL ;
END_STRUCT ;
at_Abfrage_PN_Slaves AT Abfrage_PN_Slaves : STRUCT
projektiert : ARRAY[0..128] OF WORD ;
in_Funktion : ARRAY[0..128] OF WORD ;
mit_Stoerung : ARRAY[0..128] OF WORD ;
END_STRUCT ;
Timer_ReTrigger : SFB4 ;
END_VAR
VAR_TEMP
Fehler , i , j : INT ;
Trigger_SFC51 : BOOL ;
mySZL_Header : STRUCT
LenthDR : WORD ;
n_DR : WORD ;
END_STRUCT ;
hm_ProfiBus_IO , hm_ProfiNet_IO : BOOL ;
END_VAR
BEGIN
IF (intern.Ablauf_Check <= 0) AND (OBxx_Trigger OR Timer_ReTrigger.Q OR intern.erster_Start) THEN
OBxx_Trigger := false ;
IF intern.erster_Start OR (PB_Slaves.Anzahl <> 0) THEN
intern.Ablauf_Check := 1 ; // auch Profibus überprüfen
ELSE
intern.Ablauf_Check := 7 ; // nur Profinet überprüfen
END_IF ;
END_IF ;
Auswertung_aktiv := (intern.Ablauf_Check > 0) ;
// ----------------
Trigger_SFC51 := (intern.Ablauf_Check = 1) OR (intern.Ablauf_Check = 2) ;
Fehler := RDSYSST (REQ := Trigger_SFC51
,SZL_ID := w#16#0092 // Abfrage der projektierten ProfiBus-Stationen
,INDEX := 1 // Mastersystem-ID
,BUSY := intern.Fn_x092_Aktiv
,SZL_HEADER := mySZL_Header
,DR := Abfrage_PB_Slaves.projektiert // Ziel-Datenbereich für die abgefragten Daten
) ;
IF (intern.Ablauf_Check = 1) AND (intern.Fn_x092_Aktiv OR (Fehler = 0)) THEN intern.Ablauf_Check := 2 ; END_IF ;
IF (intern.Ablauf_Check = 2) AND NOT intern.Fn_x092_Aktiv THEN intern.Ablauf_Check := 3 ; END_IF ;
Trigger_SFC51 := (intern.Ablauf_Check = 3) OR (intern.Ablauf_Check = 4) ;
Fehler := RDSYSST (REQ := Trigger_SFC51
,SZL_ID := w#16#0292 // Abfrage der nicht ausgefallenen ProfiBus-Stationen
,INDEX := 1 // Mastersystem-ID
,BUSY := intern.Fn_x292_Aktiv
,SZL_HEADER := mySZL_Header
,DR := Abfrage_PB_Slaves.in_Funktion // Ziel-Datenbereich für die abgefragten Daten
) ;
IF (intern.Ablauf_Check = 3) AND (intern.Fn_x292_Aktiv OR (Fehler = 0)) THEN intern.Ablauf_Check := 4 ; END_IF ;
IF (intern.Ablauf_Check = 4) AND NOT intern.Fn_x292_Aktiv THEN intern.Ablauf_Check := 5 ; END_IF ;
Trigger_SFC51 := (intern.Ablauf_Check = 5) OR (intern.Ablauf_Check = 6) ;
Fehler := RDSYSST (REQ := Trigger_SFC51
,SZL_ID := w#16#0692 // Abfrage der gestörten ProfiBus-Stationen
,INDEX := 1 // Mastersystem-ID
,BUSY := intern.Fn_x692_Aktiv
,SZL_HEADER := mySZL_Header
,DR := Abfrage_PB_Slaves.mit_Stoerung // Ziel-Datenbereich für die abgefragten Daten
) ;
IF (intern.Ablauf_Check = 5) AND (intern.Fn_x692_Aktiv OR (Fehler = 0)) THEN intern.Ablauf_Check := 6 ; END_IF ;
IF (intern.Ablauf_Check = 6) AND NOT intern.Fn_x692_Aktiv THEN intern.Ablauf_Check := 7 ; END_IF ;
// ----------------
IF (intern.Ablauf_Check = 7) THEN
IF intern.erster_Start OR (PN_Slaves.Anzahl <> 0) THEN
intern.Ablauf_Check := 8 ; // auch Profinet überprüfen
ELSE
intern.Ablauf_Check := 14 ; // Ende
END_IF ;
END_IF ;
Trigger_SFC51 := (intern.Ablauf_Check = 8) OR (intern.Ablauf_Check = 9) ;
Fehler := RDSYSST (REQ := Trigger_SFC51
,SZL_ID := w#16#0094 // Abfrage der projektierten ProfiNet-Stationen
,INDEX := 100 // Mastersystem-ID
,BUSY := intern.Fn_x094_Aktiv
,SZL_HEADER := mySZL_Header
,DR := at_Abfrage_PN_Slaves.projektiert // Ziel-Datenbereich für die abgefragten Daten
) ;
IF (intern.Ablauf_Check = 8) AND (intern.Fn_x094_Aktiv OR (Fehler = 0)) THEN intern.Ablauf_Check := 9 ; END_IF ;
IF (intern.Ablauf_Check = 9) AND NOT intern.Fn_x094_Aktiv THEN intern.Ablauf_Check := 10 ; END_IF ;
Trigger_SFC51 := (intern.Ablauf_Check = 10) OR (intern.Ablauf_Check = 11) ;
Fehler := RDSYSST (REQ := Trigger_SFC51
,SZL_ID := w#16#0294 // Abfrage der nicht ausgefallenen ProfiNet-Stationen
,INDEX := 100 // Mastersystem-ID
,BUSY := intern.Fn_x294_Aktiv
,SZL_HEADER := mySZL_Header
,DR := at_Abfrage_PN_Slaves.in_Funktion // Ziel-Datenbereich für die abgefragten Daten
) ;
IF (intern.Ablauf_Check = 10) AND (intern.Fn_x294_Aktiv OR (Fehler = 0)) THEN intern.Ablauf_Check := 11 ; END_IF ;
IF (intern.Ablauf_Check = 11) AND NOT intern.Fn_x294_Aktiv THEN intern.Ablauf_Check := 12 ; END_IF ;
Trigger_SFC51 := (intern.Ablauf_Check = 12) OR (intern.Ablauf_Check = 13) ;
Fehler := RDSYSST (REQ := Trigger_SFC51
,SZL_ID := w#16#0694 // Abfrage der gestörten ProfiNet-Stationen
,INDEX := 100 // Mastersystem-ID
,BUSY := intern.Fn_x694_Aktiv
,SZL_HEADER := mySZL_Header
,DR := at_Abfrage_PN_Slaves.mit_Stoerung // Ziel-Datenbereich für die abgefragten Daten
) ;
IF (intern.Ablauf_Check = 12) AND (intern.Fn_x694_Aktiv OR (Fehler = 0)) THEN intern.Ablauf_Check := 13 ; END_IF ;
IF (intern.Ablauf_Check = 13) AND NOT intern.Fn_x694_Aktiv THEN intern.Ablauf_Check := 14 ; END_IF ;
// ----------------
hm_ProfiBus_IO := true ;
PB_Slaves.Anzahl := 0 ;
FOR i := 0 TO 254 BY 1 DO
j := i + 1 ;
PB_Slaves.Status[j] := 0 ;
IF Abfrage_PB_Slaves.projektiert[i] THEN
PB_Slaves.Status[j] := PB_Slaves.Status[j] OR 1 ;
PB_Slaves.Anzahl := PB_Slaves.Anzahl +1 ;
IF NOT Abfrage_PB_Slaves.in_Funktion[i] THEN PB_Slaves.Status[j] := PB_Slaves.Status[j] OR 2 ; hm_ProfiBus_IO := false ; END_IF ;
IF Abfrage_PB_Slaves.mit_Stoerung[i] THEN PB_Slaves.Status[j] := PB_Slaves.Status[j] OR 4 ; hm_ProfiBus_IO := false ; END_IF ;
END_IF ;
END_FOR ;
ProfiBus_vorh := (PB_Slaves.Anzahl > 0) ;
ProfiBus_IO := ProfiBus_vorh AND hm_ProfiBus_IO ;
// ----------------
hm_ProfiNet_IO := true ;
PN_Slaves.Anzahl := 0 ;
FOR i := 0 TO 2047 BY 1 DO
PN_Slaves.Status[i] := 0 ;
IF Abfrage_PN_Slaves.projektiert[i] THEN
PN_Slaves.Status[i] := PN_Slaves.Status[i] OR 1 ;
PN_Slaves.Anzahl := PN_Slaves.Anzahl +1 ;
IF NOT Abfrage_PN_Slaves.in_Funktion[i] THEN PN_Slaves.Status[i] := PN_Slaves.Status[i] OR 2 ; hm_ProfiNet_IO := false ; END_IF ;
IF Abfrage_PN_Slaves.mit_Stoerung[i] THEN PN_Slaves.Status[i] := PN_Slaves.Status[i] OR 4 ; hm_ProfiNet_IO := false ; END_IF ;
END_IF ;
END_FOR ;
ProfiNet_vorh := (PN_Slaves.Anzahl > 0) ;
ProfiNet_IO := ProfiNet_vorh AND hm_ProfiNet_IO ;
// ----------------
IF (intern.Ablauf_Check >= 14) THEN
intern.erster_Start := false ;
intern.Ablauf_Check := -2 ;
END_IF ;
Timer_ReTrigger (IN:= (intern.Ablauf_Check = -2) ,
PT:= T#60s ) ;
END_FUNCTION_BLOCK