



图1中实例块HV0110A是一个阀门的控制块,用于控制阀门的启停等,图2图3是一个连锁程序,使用的是INOUT的方式进行编写,这样就可以直接引用触发条件,用这些条件控制设备,最后如图4一样实例化连锁,在INOUT引脚关联实际的控制对象。
但是遇到一个问题,这些连锁在使用过程中,大约隔四五天某一个就会出一次问题,就比如阀门HV0110A明明没有打开,监视状态下开反馈为0、关反馈为1,但是监视连锁时发现开反馈为1、关反馈为0,导致逻辑执行错误。因此想问一下是不是这种连锁的编程方式本身存在这样的缺陷,还是其他方面的问题。
目前我自己检查过的方面有:
1,交叉引用,确定没有重复调用的情况;
2,修改扫描周期从50MS改到150MS(由于是过程控制,扫描周期可以设置的比较慢);
3,2的方式无效,于是将主程序从OB1中移到OB31中,并把优先级设高,保证没有被其它程序中断,循环实际设置到200MS,并将其它循环中断做了相移,保证不重叠;
4,如图5中发现与上位机通讯过载,于是更换了能承受更多负载的CPU;(由于是多台单站同时与PLC连接,因此通讯负载一直都设置在50%);
5,诊断中没有报错;
6,存储器占用也都低于40%;
7,测试程序的实际扫描时间约3MS。
如果是程序逻辑错误,应该会频繁出错;而且是所有连锁中随机某一个出一次问题。在此前我用同样一套程序在这家公司的另一个厂使用,目前也没有出过问题,最大的不同就是连锁的编写方式不一样(连锁的数据量也大很多),所以是这种方式存在缺陷,还是我设置的通讯负载50%是否太高,当程序到达一定数量后出现了过载?或是别的原因?
图中的截图都是仿真实验的例子