FUNCTION_BLOCK FB123
TITLE = 'BG_OK'
NAME : BG_OK
FAMILY : xxx
AUTHOR : xxx
VERSION : '0.1'
// Baustein zur Überprüfung einer zentralen oder dezentralen I/O-Baugruppe
// Typical-Attribute
{
// S7_tasklist:='OB100';
// S7_m_c:='true';
S7_blockview:='big'
}
// Parameterattribute
// S7_visible visible/unvisible (default='true')
// S7_m_c WinCC - Tag (default='false')
// S7_dynamic Test mode (default='false')
// S7_link Connection linkable (default='true')
// S7_archive:='shortterm'
// S7_shortcut:='Setpoint'
// S7_unit:='unit'
VAR_INPUT
REQ {S7_dynamic:='true'} :BOOL :=TRUE; //1=Anstoss der Bearbeitung
SZL_ID {S7_dynamic:='true'; S7_visible:='false'} :WORD := 16#0C91; //SZL-ID der Teilliste oder des Teillistenauszuges
OUT_BG {S7_dynamic:='true'} :BOOL :=FALSE; //0=Eingabebaugruppe 1=Ausgabebaugruppe
ADR {S7_dynamic:='true'} :INT :=100; //erste Adresse der Baugruppe
END_VAR
VAR_OUTPUT
BG_OK {S7_dynamic:='true'} :BOOL :=FALSE; //Baugruppe OK
BG_ERR {S7_dynamic:='true'} :BOOL :=FALSE; //Baugruppe gestört
ERR_CODE {S7_dynamic:='true'} :WORD :=0; //Fehlercode des SFC51
BUSY {S7_dynamic:='true'} :BOOL :=FALSE; //1: Lesevorgang noch nicht abgeschlossen
LENTHDR {S7_dynamic:='true'; S7_visible:='false'} :WORD :=0; //Länge eines Datensatzes der SZL-Teilliste
N_DR {S7_dynamic:='true'; S7_visible:='false'} :WORD :=0; //Anzahl der Datensätze
adr1 {S7_dynamic:='true'; S7_visible:='false'} :WORD :=0; //siehe Doku adr1
adr2 {S7_dynamic:='true'; S7_visible:='false'} :WORD :=0; //siehe Doku adr2
logadr {S7_dynamic:='true'; S7_visible:='false'} :WORD :=0; //logische Basisadresse
solltyp {S7_dynamic:='true'; S7_visible:='false'} :WORD :=0; //bei Profinet IO Solltyp
isttyp {S7_dynamic:='true'; S7_visible:='false'} :WORD :=0; //bei Profinet IO Isttyp
reserviert {S7_dynamic:='true'; S7_visible:='false'} :WORD :=0; //siehe Doku Reserviert
eastat {S7_dynamic:='true'; S7_visible:='false'} :WORD :=0; //E/A Satus
ber_bgbr {S7_dynamic:='true'; S7_visible:='false'} :WORD :=0; //Bereichskennung Baugruppenbreite
INDEX {S7_dynamic:='true'; S7_visible:='false'} :WORD :=0; // logische Basisadresse
END_VAR
VAR
SZL_HEADER : STRUCT //Struktur als Aktualoperand für SFC 51
LENTHDR : WORD; //Länge eines Datensatzes
N_DR : WORD; //Anzahl der Datensätze
END_STRUCT;
DR : ARRAY [0..9] OF WORD; // Zielbereich für die gelesene SZL-Teilliste
eastat_t : WORD :=0; // E/A-Status temporär byteweise gedreht
by_eastat AT eastat_t : ARRAY [0..1] OF BYTE; // byteweise Sicht auf den E/A-Status
b_eastat AT eastat_t : ARRAY [0..15] OF BOOL; // bitweise Sicht auf den E/A-Status
by0_eastat_t : BYTE :=0; // Byte 0 vom ungedrehten eastat
by1_eastat_t : BYTE :=0; // Byte 1 vom ungedrehten eastat
END_VAR
VAR_TEMP
END_VAR
BEGIN;
// Vorbereitende Anweisungen
INDEX := INT_TO_WORD(ADR); // Berechnung des INDEX als WORD
IF OUT_BG=1 THEN INDEX := INDEX OR 16#8000; END_IF; // addieren von 8000hex wenn Ausgabebaugruppe
// Aufruf SFC 51
ERR_CODE := INT_TO_WORD (SFC51 (
REQ :=REQ, // Eingänge
SZL_ID :=SZL_ID,
INDEX :=INDEX,
BUSY :=BUSY, // Ausgänge
SZL_HEADER :=SZL_HEADER,
DR :=DR
));
// Auswertung der Signale
eastat_t := DR[6]; // Zuweisung von E/A Status
by0_eastat_t := by_eastat[0]; // byte 0 auslesen
by1_eastat_t := by_eastat[1]; // byte 1 auslesen
by_eastat[0] := by1_eastat_t; // byte 0 mit Byte 1 tauschen
by_eastat[1] := by0_eastat_t; // byte 1 mit Byte 0 tauschen
BG_ERR := NOT b_eastat[1] OR b_eastat[2] OR b_eastat[3] OR b_eastat[4] OR b_eastat[5]; // Erkennung ob Baugruppe gestört
// Bedeutung eastat bei Aufruf mit SZL_ID=16#xy91 (Baugruppenzustandsinformation)
// Bit 0 = 1: Baugruppe gestört (über Diagnosealarm erkannt)
// Bit 1 = 1: Baugruppe vorhanden
// Bit 2 = 1: Baugruppe nicht verfügbar
// Bit 3 = 1: Baugruppe deaktiviert
// Bit 4 = 1: Störung der Station (nur Stellvertreter-Slot)
// Bit 5 = 1: Ein CiR-Vorgang für diese Baugruppe /Station ist gerade aktiv oder noch nicht abgeschlossen
// Bit 6 = 1: reserviert für S7-400
// Bit 7 = 1: Baugruppe im Lokalbussegment
// Bit 8 bis 15: Datenkennung für logische Adresse (Eingang: B#16#B4, Ausgang: B#16#B5, externe DP-Anschaltung: B#16#FF)
// Ausgabe der Ausgaenge
BG_OK := NOT BG_ERR;
LENTHDR := SZL_HEADER.LENTHDR;
N_DR := SZL_HEADER.N_DR;
adr1 := DR[0];
adr2 := DR[1];
logadr := DR[2];
solltyp := DR[3];
isttyp := DR[4];
reserviert := DR[5];
eastat := DR[6];
ber_bgbr := DR[7];
END_FUNCTION_BLOCK