//Copyright (C) Siemens AG 1999. All Rights Reserved. Confidential //************************************************************************************** // 修改版本用于414-5H 20160515 EBC-LW //************************************************************************************** FUNCTION_BLOCK LED_H TITLE = 'LED_H' { // List of system attributes //S7_tasklist:= 'OB80,OB100'; // Block is called if there is a time error and at a warm restart S7_m_c:= 'true'; // Block can be controlled and monitored S7_alarm_ui:= '1' // Setting for PCS 7 message dialog ('0'=standard message dialog) } AUTHOR: EBCLW NAME: LED_H VERSION: '0.01' FAMILY: EBC KNOW_HOW_PROTECT //************************************************************************************** // Declaration Section: Block Parameters //************************************************************************************** //System attributes for parameters (* S7_sampletime:='true' S7_dynamic:='true' S7_edit:='true' S7_link:='true' S7_param:='true' S7_visible:='true' S7_contact:='true' S7_m_c:='true' S7_shortcut:='' S7_string_0:='' S7_string_1:='' S7_unit:='' S7_server:='alarm_archiv' S7_a_type:='alarm_8p' *) VAR_INPUT EV_ID { S7_visible:='false'; S7_link:='false'; S7_param :='false'; // Parameter cannot be set in CFC S7_server:='alarm_archiv'; // Message no. assigned by server S7_a_type:='alarm_8p' // Block signals with ALARM_8P }:DWORD := 0; // Message ID RUNUPCYC{ S7_visible:='false'; S7_link:='false' } :INT := 3; // Number of run up cycles REQ {S7_string_0:='No_req'; S7_string_1:='Req'}: BOOL:=1;//启动处理(对于调用的SFC51) //若功能码采用W#16#0074则可以使用INDEX读取单个灯的状态这里我们读取所有的指示灯 SSL_ID : WORD := W#16#0074; //系统功能码,读取全部LED指示灯 INDEX : WORD := W#16#0;//部分功能码中对象的类型或编号 读取LED时无效 END_VAR VAR_OUTPUT LENTHDR : WORD;//单条记录长度 N_DR{ S7_m_c:='true'} : WORD;//DR中记录的数据记录的条数 结合LENTHDR值可计算出需要的存储空间长度 //对于不同的CPU LED 读取的数量是不同的,需要在编程前使用SFC51测试查看记录的空间长度 LED_ID1{ // S7_m_c:='true'; S7_visible :='false'} : WORD; LED_ID2{ // S7_m_c:='true'; S7_visible :='false'} : WORD; LED_ID3{ // S7_m_c:='true'; S7_visible :='false'} : WORD; LED_ID4{ // S7_m_c:='true'; S7_visible :='false'} : WORD; LED_ID5{ // S7_m_c:='true'; S7_visible :='false'} : WORD; LED_ID6{ // S7_m_c:='true'; S7_visible :='false'} : WORD; LED_ID7{ // S7_m_c:='true'; S7_visible :='false'} : WORD; LED_ID8{ // S7_m_c:='true'; S7_visible :='false'} : WORD; LED_ID9{ // S7_m_c:='true'; S7_visible :='false'} : WORD; LED_ID10{ // S7_m_c:='true'; S7_visible :='false'} : WORD; LED_ID11{ // S7_m_c:='true'; S7_visible :='false'} : WORD; LED_ID12{ // S7_m_c:='true'; S7_visible :='false'} : WORD; LED_ID13{ // S7_m_c:='true'; S7_visible :='false'} : WORD; LED_ID14{ // S7_m_c:='true'; S7_visible :='false'} : WORD; LED_ID15{ // S7_m_c:='true'; S7_visible :='false'} : WORD; LED_ID16{ // S7_m_c:='true'; S7_visible :='false'} : WORD; LED_ID17{ // S7_m_c:='true'; S7_visible :='false'} : WORD; LED_ID18{ // S7_m_c:='true'; S7_visible :='false'} : WORD; LED_ID19{ // S7_m_c:='true'; S7_visible :='false'} : WORD; LED_ID20{ // S7_m_c:='true'; S7_visible :='false'} : WORD; LED_ID21{ // S7_m_c:='true'; S7_visible :='false'} : WORD; LED_ID22{ // S7_m_c:='true'; S7_visible :='false'} : WORD; LED_ID23{ S7_m_c:='true'; S7_visible :='false'} : WORD; LED_ID24{ // S7_m_c:='true'; S7_visible :='false'} : WORD; LED_ID25{ // S7_m_c:='true'; S7_visible :='false'} : WORD; LED_ID26{ // S7_m_c:='true'; S7_visible :='false'} : WORD; LED_ID27{ // S7_m_c:='true'; S7_visible :='false'} : WORD; LED_ID28{ // S7_m_c:='true'; S7_visible :='false'} : WORD; LED_ID29{ // S7_m_c:='true'; S7_visible :='false'} : WORD; LED_ID30{ // S7_m_c:='true'; S7_visible :='false'} : WORD; LED_ON { S7_m_c:='true' } : DWORD; LED_BLINK { S7_m_c:='true' } : DWORD; BUSY {S7_visible :='false'}: BOOL; R0_RUN {S7_m_c:='true'} : BOOL; R1_RUN {S7_m_c:='true'} : BOOL; R0_MAST {S7_m_c:='true'} : BOOL; R1_MAST {S7_m_c:='true'} : BOOL; // IFM1_OK {S7_m_c:='true'} : BOOL; // IFM2_OK {S7_m_c:='true'} : BOOL; CPU_FAILURE { S7_m_c:='true' } : BOOL; CPU_FAULT { S7_m_c:='true' } : BOOL; QMSG_ERR { S7_visible:='false'; S7_dynamic:='true'} : BOOL := 0; // ALARM_8P: Error output MSG_STAT { S7_visible:='false'; S7_dynamic:='true'} : WORD := 0; // Message: STATUS output MSG_ACK { S7_visible:='false'; S7_dynamic:='true'} : WORD := 0; // Message: ACK_STATE output END_VAR VAR_IN_OUT // Freely assignable auxiliary values of ALARM_8P AUX_PR01 {S7_visible := 'false'} : ANY; // Auxiliary value 1 AUX_PR02 {S7_visible := 'false'} : ANY; // Auxiliary value 2 AUX_PR03 {S7_visible := 'false'} : ANY; // Auxiliary value 3 AUX_PR04 {S7_visible := 'false'} : ANY; // Auxiliary value 4 AUX_PR05 {S7_visible := 'false'} : ANY; // Auxiliary value 5 AUX_PR06 {S7_visible := 'false'} : ANY; // Auxiliary value 6 AUX_PR07 {S7_visible := 'false'} : ANY; // Auxiliary value 7 AUX_PR08 {S7_visible := 'false'} : ANY; // Auxiliary value 8 AUX_PR09 {S7_visible := 'false'} : ANY; // Auxiliary value 9 AUX_PR10 {S7_visible := 'false'} : ANY; // Auxiliary value 10 END_VAR //************************************************************************************** // Declaration Section: Static Variables //************************************************************************************** VAR DR : ARRAY[1..30] OF STRUCT //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@不同的CPU 而不同@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ CPU_LED_ID : WORD; LED_ON : BYTE; LED_BLINK : BYTE; END_STRUCT; SZL_HEADER : STRUCT LENTHDR : WORD; N_DR : WORD; END_STRUCT; sbRESTART :BOOL := TRUE; // Initial start memory bit siRUNUPCNT :INT := 0; // Counter for RUNUPCYC execution //************************************************************************************** // 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 而不同\\\\\\\\\\\\\\\\\\数据的条数 //更换不同的PLC时先下载该程序到PLC 然后查看N_DR的值再修改该代码 CPU_FAILURE :=TRUE; ELSE CPU_FAILURE :=FALSE; END_IF; (* 指示灯的结构 CPU_LED_ID 占一个字 数值结构为 字节0 1111XXXX X:0-2位机架号 X:3位 0待机CPU 1主站CPU X:4-7位 1111 字节1 LED标识符 LED_ON 占一个字节 0关闭 1打开 LED_BLINK 占一个字节 0不闪烁 1正常闪烁 2缓慢闪烁 *) //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;//将每次读取到的位移动与上次移位挨着因为循环TEMP1+1初始为1 故这里要或 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;//将每次读取到的位移动与上次移位挨着因为循环变量TEMP1+1 故这里要或 END_FOR; TEMP6 :=DR[1].CPU_LED_ID AND W#16#FF00;//抹除字节1 仅保留字节0 IF TEMP6=W#16#F900 THEN //检查CPU的状态 // 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; // Decide R0 and R1 status GONG IF N_DR= W#16#1E THEN R0_RUN:=1;R1_RUN:=1; TEMP6 :=DR[1].CPU_LED_ID AND W#16#FF00; IF TEMP6=W#16#F800 THEN R0_MAST:=1;R1_MAST:=0; ELSE R1_MAST:=1;R0_MAST:=0; END_IF; END_IF; IF N_DR= W#16#F THEN TEMP6 :=DR[1].CPU_LED_ID AND W#16#FF00; IF TEMP6=W#16#F800 THEN R0_RUN:=1;R0_MAST:=1;R1_RUN:=0; R1_MAST:=0; ELSE R0_RUN:=0;R0_MAST:=0;R1_RUN:=1; R1_MAST:=1; END_IF; END_IF; // IF DR[10].LED_ON=W#16#0 THEN IFM1_OK:=1; ELSE IFM1_OK:=0; END_IF; // IF DR[11].LED_ON=W#16#0 THEN IFM2_OK:=1; ELSE IFM2_OK:=0; END_IF; //End decide GONG TEMP2 :=TEMP3 AND DW#16#1C79B8F3; IF TEMP2 <> DW#16#0 THEN CPU_FAULT :=TRUE; ELSE CPU_FAULT :=FALSE; END_IF; LED_ID1 := DR[1].CPU_LED_ID; LED_ID2 := DR[2].CPU_LED_ID; LED_ID3 := DR[3].CPU_LED_ID; LED_ID4 := DR[4].CPU_LED_ID; LED_ID5 := DR[5].CPU_LED_ID; LED_ID6 := DR[6].CPU_LED_ID; LED_ID7 := DR[7].CPU_LED_ID; LED_ID8 := DR[8].CPU_LED_ID; LED_ID9 := DR[9].CPU_LED_ID; LED_ID10 := DR[10].CPU_LED_ID; LED_ID11 := DR[11].CPU_LED_ID; LED_ID12 := DR[12].CPU_LED_ID; LED_ID13 := DR[13].CPU_LED_ID; LED_ID14 := DR[14].CPU_LED_ID; LED_ID15 := DR[15].CPU_LED_ID; LED_ID16 := DR[16].CPU_LED_ID; LED_ID17 := DR[17].CPU_LED_ID; LED_ID18 := DR[18].CPU_LED_ID; LED_ID19 := DR[19].CPU_LED_ID; LED_ID20 := DR[20].CPU_LED_ID; LED_ID21 := DR[21].CPU_LED_ID; LED_ID22 := DR[22].CPU_LED_ID; LED_ID23 := DR[23].CPU_LED_ID; LED_ID24 := DR[24].CPU_LED_ID; LED_ID25 := DR[25].CPU_LED_ID; LED_ID26 := DR[26].CPU_LED_ID; LED_ID27 := DR[27].CPU_LED_ID; LED_ID28 := DR[28].CPU_LED_ID; LED_ID29 := DR[29].CPU_LED_ID; LED_ID30 := DR[30].CPU_LED_ID; LED_ON :=TEMP3; LED_BLINK :=TEMP4; ; //********************************************************************************** // Message suppression during the startup //********************************************************************************** IF siRUNUPCNT = 0 // RUNUPCYC cycle already elapsed ? THEN ALARM_OUT :=TRUE; ELSE siRUNUPCNT := siRUNUPCNT - 1; END_IF; END_CASE; //************************************************************************************** // Messages with ALARM_8P //************************************************************************************** // STRING variables must not be linked to ALARM8_P as auxiliary values // so transfer in array of bytes ALARM_8P_1 (EN_R := TRUE, // Update output ACK_STATE ID := 16#EEEE, // Data channel for messages (always 16#EEEE) EV_ID:= EV_ID, // Message number > 0 SIG_1:= ALARM_OUT AND CPU_FAILURE, // Signal 1 to be monitored SIG_2:= ALARM_OUT AND CPU_FAULT, // 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