VAR_TEMP
// Temporary Variables
I:INT;
// Start info: Structure with info for the OB that has just called the block
TOP_SI: STRUCT
EV_CLASS :BYTE;
EV_NUM :BYTE;
PRIORITY :BYTE;
NUM :BYTE;
TYP2_3 :BYTE;
TYP1 :BYTE;
ZI1 :WORD;
ZI2_3 :DWORD;
END_STRUCT;
// Start info: Structure with info for the last called startup OB
START_UP_SI: STRUCT
EV_CLASS :BYTE;
EV_NUM :BYTE;
PRIORITY :BYTE;
NUM :BYTE;
TYP2_3 :BYTE;
TYP1 :BYTE;
ZI1 :WORD;
ZI2_3 :DWORD;
END_STRUCT;
DUMMY :INT; // Auxiliary variable
ALARM_OUT :BOOL;
END_VAR
VAR
sbRESTART :BOOL := TRUE; // Initial start memory bit
siRUNUPCNT :INT := 0; // Counter for RUNUPCYC execution
ALARM_8P_1:ALARM_8P;
END_VAR
//*************************************************************************************
// Dependence on Calling OB
//*************************************************************************************
// Read out start info with SFC6 (RD_SINFO)
DUMMY := RD_SINFO (TOP_SI := TOP_SI, START_UP_SI := START_UP_SI);
IF sbRESTART THEN
// Initial start
TOP_SI.NUM := 100; // Execute initial start as warm restart
sbRESTART := FALSE; // Reset initial start
END_IF;
// In which OB was the block called ?
CASE WORD_TO_INT(BYTE_TO_WORD(TOP_SI.NUM)) OF
//************************************************************************************
// Handling Error OBs
//************************************************************************************
// OB80: time error
80:;
//************************************************************************************
// Startup
//************************************************************************************
// OB100: Warm restart
100:;
ELSE
//**********************************************************************************
// Message suppression during the startup
//**********************************************************************************
IF siRUNUPCNT = 0 // RUNUPCYC cycle already elapsed ?
THEN
ALARM_OUT :=TRUE;
ELSE
siRUNUPCNT := siRUNUPCNT - 1;
END_IF;
END_CASE;
IF RST.VALUE THEN
OUT.VALUE:=0;
FOR I:= 0 TO 7 BY 1 DO
FirstInBits[I]:=0;
END_FOR;
ELSE
IF NOT(OUT.VALUE) THEN
IF IN1.VALUE & IN1_EN.VALUE THEN
OUT.VALUE:=1;
FirstInBits[0]:=1;
ELSE
IF IN2.VALUE & IN2_EN.VALUE THEN
OUT.VALUE:=1;
FirstInBits[1]:=1;
ELSE
IF IN3.VALUE & IN3_EN.VALUE THEN
OUT.VALUE:=1;
FirstInBits[2]:=1;
ELSE
IF IN4.VALUE & IN4_EN.VALUE THEN
OUT.VALUE:=1;
FirstInBits[3]:=1;
ELSE
IF IN5.VALUE & IN5_EN.VALUE THEN
OUT.VALUE:=1;
FirstInBits[4]:=1;
ELSE
IF IN6.VALUE & IN6_EN.VALUE THEN
OUT.VALUE:=1;
FirstInBits[5]:=1;
ELSE
IF IN7.VALUE & IN7_EN.VALUE THEN
OUT.VALUE:=1;
FirstInBits[6]:=1;
ELSE
IF IN8.VALUE & IN8_EN.VALUE THEN
OUT.VALUE:=1;
FirstInBits[7]:=1;
END_IF;
END_IF;
END_IF;
END_IF;
END_IF;
END_IF;
END_IF;
END_IF;
END_IF;
END_IF;
//alarm_8p
ALARM_8P_1
(EN_R := TRUE, // Update output ACK_STATE
ID := 16#EEEE, // Data channel for messages (always 16#EEEE)
EV_ID:= EV_ID, // 消息编号
SIG_1:= ALARM_OUT AND OUT.VALUE, // Signal 1 to be monitored
SIG_2:= 0, // Signal 2 to be monitored
SIG_3:= 0, // Signal 3 to be monitored
SIG_4:= 0, // Signal 4 to be monitored
SIG_5:= 0, // Signal 5 to be monitored
SIG_6:= 0, // Signal 6 to be monitored
SIG_7:= 0, // Signal 7 to be monitored
SIG_8:= 0, // Signal 8 to be monitored
SD_1 := AUX_PR01, // Auxiliary value 1
SD_2 := AUX_PR02, // Auxiliary value 2
SD_3 := AUX_PR03, // Auxiliary value 3
SD_4 := AUX_PR04, // Auxiliary value 4
SD_5 := AUX_PR05, // Auxiliary value 5
SD_6 := AUX_PR06, // Auxiliary value 6
SD_7 := AUX_PR07, // Auxiliary value 7
SD_8 := AUX_PR08, // Auxiliary value 8
SD_9 := AUX_PR09, // Auxiliary value 9
SD_10:= AUX_PR10); // Auxiliary value 10
QMSG_ERR := ALARM_8P_1.ERROR; // ERROR status parameter
MSG_STAT := ALARM_8P_1.STATUS; // STATUS status parameter
MSG_ACK := ALARM_8P_1.ACK_STATE; // Current OS confirmation status
END_FUNCTION_BLOCK