在通讯上,经常用到心跳功能,检验主从站通讯是否中断。通讯程序的思路是:从站制作一个循环定时器,定时器每触发一次,数据进行一次加一,加到3000做判断,重新把数据赋值为0。
制作一秒定时器,定时时间视具体而定(现场通讯采用的是串口无线通讯,通讯波特率已调到最大,但接受仍有延时)。
定时器每输出一次,“od_心跳计数”进行一次加一,当“od_心跳计数”大于3000时,赋值为0,循环计数。
主站使用的plc是汇川AM403,AM403读取到从站的“od_心跳计数”数据,计算上一秒的数据与下一秒的数据差值,如果差值不等于0,证明通讯是正常的,如果等于0,则证明通讯中断,发出报警。
首先,AM403与从站进行通讯,读取从站“od_心跳计数数据。
hi_2号RGV心跳计数:= %IW9;
制作一个两秒循环定时器,然后设置一个写入上一秒数据的上升沿,再设置一个数据对比上升沿(注:FB_下一秒数据对比Rtig 触发的上升沿信号不是从T#1s开始,是由于在实际测试中,发现上升沿触发的时间过早,会出现 上一秒数据等于下一秒数据的情况,但把触发时间延迟,可以排除正常情况下,不出现相等的情况)。
FB_心跳循环定时器(IN:= (NOT FB_心跳循环定时器.Q) , PT:= T#2S, Q=> , ET=> ); //暂定一秒循环定时器
FB_上一秒数据写入Rtig(CLK:= (FB_心跳循环定时器.ET < T#1S) , Q=> );
FB_下一秒数据对比Rtig(CLK:= (FB_心跳循环定时器.ET > T#1.5S) AND (FB_心跳循环定时器.ET < T#2S), Q=> );
FB_上一秒数据写入Rtig上升沿触发,把此时读取的数据记下:
IF FB_上一秒数据写入Rtig.Q THEN//写入上升沿触发,写入读到的数据
vi_上一秒赋值 := hi_2号RGV心跳计数;
END_IF
然后,FB_下一秒数据对比Rtig,数据进行对比,这里我采用的减法,二者相减,只要差值不等于0,证明通讯没有中断,反之,通讯中断:
IF FB_下一秒数据对比Rtig.Q THEN
IF (hi_2号RGV心跳计数 - vi_上一秒赋值) <> 0 THEN
vb_心跳故障输出 :=FALSE; //不报警,不执行任何任务
ELSE
vb_心跳故障输出 :=TRUE; //暂时给一个故障代码
END_IF
END_IF
vb_心跳故障输出为true时,报错,反之,正常。