最近做一个阀门开度随液位变化的程序,
液位设定一个目标值,
液位高于目标值,阀门开度减小;
液位低于目标值,阀门开度增加。
很明显,该程序适合用PID控制,
在大循环中计算阀门开度值,并下置给阀门,结果,设备经常离线
原因:
经分析,大循环中运行,数据下置太快,设备反应不过来,导致通讯超时,或者是撞包,组态没收到设备回复,导致设备离线。
总之,应该是下置数据据太快导致的离线。
解决方法:
建立中间变量,在大循环中计算开度值,赋值给中间变量。
建立一个延时触发的程序,每5s触发一次下置,命令间隔为200ms。
每5s触发一次下置:
首先,建立一个200ms的定时器,命令间隔200ms.
接着,在大循环中建立如下程序:
IF $Second % 5 == 0 THEN //取系统时间的秒数据,对5求余,结果为0,则5s时间到 pp = 1; //数据是否下置的标志 ENDIF
接着,在条件动作程序里:
条件:pp == 1 && #Timer.Status == 2
ControlVar = ControlVar + 1; //指针指向下一条数据
IF ControlVar == 4 THEN //一轮循环结束,将指针复位
ControlVar = 0; //命令间隔
pp=0; //5s一次循环
ENDIF
#Timer.Start(); //下置一次数据后,重启定时器
最后,在数据改变触发程序中:
if ControlVar == 1 then /// //下置哪条数据就将变量赋值给对应的IO点 /// a1 = a1 + 1;//将指针指向下一条数据 endif if ControlVar == 2 then /// //下置哪条数据就将变量赋值给对应的IO点 /// a2 = a2 + 1; endif if ControlVar == 3 then /// //下置哪条数据就将变量赋值给对应的IO点 /// a3 = a3 + 1; endif if ControlVar == 4 then /// //下置哪条数据就将变量赋值给对应的IO点 /// a4 = a4 + 1; endif
完成!!!
测试结果符合预期:
标签:ControlVar,下置,5s,组态,延时,200ms,数据 From: https://www.cnblogs.com/flash610/p/18574982