力控组态实现延时5s延时触发,命令间隔200ms

最近做一个阀门开度随液位变化的程序,

液位设定一个目标值,

液位高于目标值,阀门开度减小;

液位低于目标值,阀门开度增加。

很明显,该程序适合用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    

完成!!!

 测试结果符合预期:

 

posted on 2024-11-28 19:01  flash610  阅读(554)  评论(0)    收藏  举报