当有新的报警事件到来时,要求报警灯报警,复位后如果还是有新的报警到来,需要再次复位,这样如此循环下去。
如果报警变量较少,可以使用报警位的上升沿实现,如果报警变量达到几百个甚至更多,这种方法就不好用了,所以在程序规划时把报警分为警告和故障,就是两级报警,分别放在两个DB块中,方便扩展,同时也方便使用连续地址访问,实现批量操作。每个扫描周期把变量进行转存一下,比较本周起数据与上个周期的数据进行比较,如果数据发生变化,即两次读取的数据不相等,则进行判断,通过FOR循环,前后两个字的每一位进行异或(XOR)运算,如果结果为1,则判断本周期的该位是否位1(异或的结果为1有可能是报警消除造成的),如果为1,则说明有新的报警到来,触发报警灯亮起,同时退出FOR 循环。

//由于FC对于Input变量不能使用At访问,这里先将Input变量写入到Temp区域变量中
//然后再使用AT变量类型,将Word分解为16元素的BOOL数组
//这里不实用var.%xn的方式访问,是因为要用到动态访问变量,.%xn中的n不能使用变量。
#Now_Word_Temp := #Now_Word;
#Last_Word_Temp := #Last_Word;
#Rst := FALSE;//初始化临时变量
FOR #Num := 0 TO 15 DO
IF #Now_Word_AT[#Num] XOR #Last_Word_AT[#Num] THEN //异或计算判断本次与上次两个位是否一致,
IF #Last_Word_AT[#Num] THEN //如果数据不一致,并且本次数据值为1,则存储临时结果
#Rst := True;
EXIT; //退出For循环
END_IF;
END_IF;
END_FOR;
#F_NewAlarmArrive := #Rst; //将结果写入FC返回值
以上是判断是否有新的报警到来的程序