发布于 2012-02-25 06:39:32
98楼
可以处理无限多个报警,已在多个项目用过,原始程序使用SCL编写,此处代码已转为STL
FUNCTION FC 10 : VOID
TITLE =报警处理
//当有新的报警产生时Buzzer会有输出,同时Lamp会闪烁,
//按下复位按钮后,Buzzer没有输出,Lamp一直输出,
//当报警解除时,Lamp没有输出。
//创建报警DB数据时,应在报警数据的后面创建与报警数据
//长度相同的临时数据区。
AUTHOR : hushuguo
VERSION : 1.0
VAR_INPUT
AlarmOrigin : ANY ; //报警数据的起点
ByteLength : INT ; //报警字节的长度
END_VAR
VAR_OUTPUT
Lamp : BOOL ; //报警灯
Buzzer : BOOL ; //蜂鸣器
END_VAR
VAR_IN_OUT
Reset : BOOL ; //报警复位
END_VAR
VAR_TEMP
TempAny : ANY ;
ByteNumber : INT ; //字节编号
I1 : INT ;
I2 : INT ;
Alarm : BOOL ;
END_VAR
BEGIN
NETWORK
TITLE =SCL network
SET ;
SAVE ;
= L 16.2;
L P##AlarmOrigin;
LAR1 ;
L D [AR1,P#0.0];
T LD 0;
L P##AlarmOrigin;
LAR1 ;
L D [AR1,P#4.0];
T LD 4;
L P##AlarmOrigin;
LAR1 ;
L W [AR1,P#8.0];
T LW 8;
L LD 6;
SLD 8;
SRD 11;
T #ByteNumber;
CLR ;
= #Alarm;
L #ByteLength;
+I ;
L 1;
-I ;
L #ByteNumber;
T #I1;
TAK ;
T LW 18;
TAK ;
A7d0: L #I1;
L LW 18;
<=I ;
JCN A7d1;
L 0;
T #I2;
A7d2: L #I2;
L 7;
<=I ;
JCN A7d3;
L LW 4;
T LW 20;
L #I1;
ITD ;
L L#8;
*D ;
L #I2;
ITD ;
+D ;
OPN DB [LW 20];
LAR1 ;
A DBX [AR1,P#0.0];
JCN A7d4;
SET ;
= #Alarm;
L LW 4;
T LW 20;
L #I1;
L #ByteLength;
+I ;
ITD ;
L L#8;
*D ;
L #I2;
ITD ;
+D ;
OPN DI [LW 20];
LAR1 ;
A DIX [AR1,P#0.0];
NOT ;
JCN A7d4;
SET ;
= #Buzzer;
A7d4: L LW 4;
T LW 20;
L #I1;
L #ByteLength;
+I ;
ITD ;
L L#8;
*D ;
L #I2;
ITD ;
+D ;
L LW 4;
T LW 22;
TAK ;
T LD 24;
TAK ;
L #I1;
ITD ;
L L#8;
*D ;
L #I2;
ITD ;
+D ;
OPN DB [LW 22];
LAR1 ;
CLR ;
A DBX [AR1,P#0.0];
OPN DI [LW 20];
LAR1 LD 24;
= DIX [AR1,P#0.0];
L #I2;
L 1;
+I ;
T #I2;
JU A7d2;
A7d3: L #I1;
L 1;
+I ;
T #I1;
JU A7d0;
A7d1: CLR ;
A #Reset;
JCN A7d6;
CLR ;
= #Buzzer;
= #Reset;
A7d6: CLR ;
A #Buzzer;
NOT ;
A #Alarm;
= L 16.3;
A #Buzzer;
A "1Hz";
O L 16.3;
= #Lamp;
A L 16.2;
SAVE ;
BE ;
END_FUNCTION
注意 "1Hz"是一个以1HZ的方波变化的BOOL变量