恭喜,你发布的帖子
发布于 2016-05-26 21:44:28
8楼
报警消息的处理:
我记得同事说以前有一个项目,报警消息使用的都是Alarm8P,功能块大概使用了200多个后就CPU412-5H直接不行了,怎么调用的Alarm8P呢?
直接CALL,每周期都扫描所有的Alarm8P,但其实CPU手册里总有一项写明了该CPU同时处理的消息块的个数,越低端这个数越小。占用不少CPU资源呢。因此做了以下处理:
CPU刚启动的时候不调用,此时CPU要干的事情太多,而此时的报警也基本毫无意义。
只有当消息状态有变化的时候才调用消息功能块。
....
S7300CPU被省略了后面的处理(这下面代码其实是不够完善的处理)
//报警消息处理
//Alarm Message
MsgEff1[0]:=QHHA;
MsgEff1[1]:=QHW;
MsgEff1[2]:=QLW;
MsgEff1[3]:=QLLA;
MsgEff1[4]:=FALSE;
MsgEff1[5]:=FALSE;
MsgEff1[6]:=FALSE;
MsgEff1[7]:=FALSE;
IF (RunUpCyc = 0) AND (MsgEffOld<>MsgEff)THEN
IF (MsgEff AND 16#01) <> ( MsgEffOld AND 16#01)THEN
iRet1:= ALARM_SQ(SIG := MsgEff1[0] // IN: BOOL
,ID :=W#16#EEEE // IN: WORD
,EV_ID :=MsgEvID1 // IN: DWORD
,SD :=SD1 // IN: ANY
); // INT
END_IF;
IF (MsgEff AND 16#02) <> ( MsgEffOld AND 16#02) THEN
iRet2:= ALARM_SQ(SIG :=MsgEff1[1] // IN: BOOL
,ID :=W#16#EEEE // IN: WORD
,EV_ID :=MsgEvID2 // IN: DWORD
,SD :=SD2 // IN: ANY
); // INT
END_IF;
IF (MsgEff AND 16#04) <> ( MsgEffOld AND 16#04)THEN
iRet3:= ALARM_SQ(SIG :=MsgEff1[2] // IN: BOOL
,ID :=W#16#EEEE // IN: WORD
,EV_ID :=MsgEvID3 // IN: DWORD
,SD :=SD3 // IN: ANY
); // INT
END_IF;
IF (MsgEff AND 16#08) <> ( MsgEffOld AND 16#08)THEN
iRet4:= ALARM_SQ(SIG :=MsgEff1[3] // IN: BOOL
,ID :=W#16#EEEE // IN: WORD
,EV_ID :=MsgEvID4 // IN: DWORD
,SD :=SD4 // IN: ANY
); // INT
END_IF;
END_IF;
MsgEffOld:=MsgEff ;
请填写推广理由:
分享
只看
楼主