//第二部分
//**************************************************************************************
// Declaration Section Multiple Instances(SFB/FB), remember to copy the FB/FC blocks into your projects manually!
//**************************************************************************************
ALARM_8P_1: ALARM_8P; // Generation of max. 8 messages with max. 10 auxiliary values
END_VAR
//**************************************************************************************
// Declaration Section: Temporary Variables
//**************************************************************************************
VAR_TEMP
// 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;
TEMP1 : INT;
TEMP2,TEMP3,TEMP4,TEMP5 : DWORD;
TEMP6 : WORD;
END_VAR
//**************************************************************************************
// Code Section
//*************************************************************************************
//*************************************************************************************
// 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:
;
siRUNUPCNT := RUNUPCYC; // Save RUNUPCYC value
ELSE
//**********************************************************************************
// Technological Section
//**********************************************************************************
//get the LED status from controller
TEMP1:=RDSYSST(REQ :=REQ // IN: BOOL
,SZL_ID :=SSL_ID // IN: WORD
,INDEX :=INDEX // IN: WORD
,BUSY :=BUSY // OUT: BOOL
,SZL_HEADER :=SZL_HEADER // OUT: STRUCT
,DR :=DR // OUT: ANY
); // INT
LENTHDR := SZL_HEADER.LENTHDR;
N_DR := SZL_HEADER.N_DR;
// IF N_DR=W#16#E THEN
IF N_DR=W#16#F THEN
CPU_FAILURE :=TRUE;
ELSE
CPU_FAILURE :=FALSE;
END_IF;
//filter the data and construct the data for displaying in OS
TEMP3 :=BYTE_TO_DWORD(DR[1].LED_ON);
TEMP4 :=BYTE_TO_DWORD(DR[1].LED_BLINK)AND DW#16#1;
FOR TEMP1:= 1 TO (WORD_TO_INT(SZL_HEADER.N_DR)-1) BY 1 DO
// Statement Section
TEMP2 :=ROL(IN:=BYTE_TO_DWORD(DR[TEMP1+1].LED_ON), N :=TEMP1);
TEMP3 :=TEMP3 OR TEMP2;
TEMP5 :=ROL(IN:=BYTE_TO_DWORD(DR[TEMP1+1].LED_BLINK), N :=TEMP1) AND ROL(IN:=DW#16#1, N :=TEMP1);
TEMP4 :=TEMP4 OR TEMP5;
END_FOR;
TEMP6 :=DR[1].CPU_LED_ID AND W#16#FF00;
IF TEMP6=W#16#F900 THEN
// TEMP2 :=ROR(IN:=TEMP3 AND DW#16#0FFF8000, N :=14);
// TEMP5 :=ROL(IN:=TEMP3 AND DW#16#00003FFF, N :=14);
// TEMP3 :=TEMP2 OR TEMP5;
//TEMP2 :=ROR(IN:=TEMP4 AND DW#16#0FFF8000, N :=14);
// TEMP5 :=ROL(IN:=TEMP4 AND DW#16#00003FFF, N :=14);
//----------------------------
TEMP2 :=ROR(IN:=TEMP3 AND DW#16#3FFF0000, N :=15);
TEMP5 :=ROL(IN:=TEMP3 AND DW#16#00007FFF, N :=15);
TEMP3 :=TEMP2 OR TEMP5;
TEMP2 :=ROR(IN:=TEMP4 AND DW#16#3FFF0000, N :=15);
TEMP5 :=ROL(IN:=TEMP4 AND DW#16#00007FFF, N :=15);
TEMP4 :=TEMP2 OR TEMP5;
ELSE
;
END_IF;
//字数限制 未完程序请看第三部分
//此程序为修改程序 请多交流 QQ 275578306