引子
Hello ,小伙伴们,我又来更新啦,我们知道WinccOA 是一个事件驱动的系统,报警按钮数值变化都可以驱动一个事件,
有了这些事件,我们就可以捕捉,实现我们的功能,因此没有在Gedi面板上给大家一个可以拖拽的定时器,但是有的时候呢
我们想用定时器给界面界面添加些效果该怎么办呢?别急,下面我们就操练起来:
官方定时器实现
OK ,我们首先咨询了西门子WinCC OA中国区客服,拿到了官方实现定时器的代码
main() { int rc; dpCreate( "_testTimedFunc", "_TimedFunc" ); dpSet("_testTimedFunc.validFrom", makeTime(2020,5,5,13,10,0),//起始时间 "_testTimedFunc.validUntil", makeTime(2020,12,5,13,11,00),//结束时间 "_testTimedFunc.mode", 1, "_testTimedFunc.interval", 2, //时间间隔 "_testTimedFunc.syncTime:_original.._value", -1); rc=timedFunc( "workFunc","_testTimedFunc"); } void workFunc(string dp,time t1,time t2) { DebugN( dp, t1, t2 ); }
其中 timedFunc 函数只能运行在单独的ctl脚本文件中,不可以放在图形界面(详见函数手册)
但是我们发现demo中用到了dpCreate函数,咦?这不是创建一个DataPoint么?
机智的我跑了一遍代码迅速的打开了Para面板
创建自己的Gedi定时器
我们知道了官方的定时器原理其实就是创建一个"_TimedFunc" datapoint, 然后 调用timedFunc 注册回调函数.
但是timedFunc 不能在Gedi里使用,下面我们变通一下 实现一个自己的Gedi可用的定时器.
1)创建Timer 数据类型
2)创建两个Timer 数据点
如图一个作为5s的定时器 一个作为2s的定时器
3)利用官方脚本关联两个定时器
main() { int rc; //2s dpCreate( "_every2sec", "_TimedFunc" ); dpSet("_every2sec.validFrom", makeTime(2020,5,5,13,10,0), "_every2sec.validUntil", makeTime(2120,12,5,13,11,00), "_every2sec.mode", 1, "_every2sec.interval", 2, "_every2sec.syncTime:_original.._value", -1); //5s dpCreate( "_every5sec", "_TimedFunc" ); dpSet("_every5sec.validFrom", makeTime(2020,5,5,13,10,0), "_every5sec.validUntil", makeTime(2120,12,5,13,11,00), "_every5sec.mode", 1, "_every5sec.interval", 5, "_every5sec.syncTime:_original.._value", -1); //设置2s回调 rc=timedFunc( "workFunc2","_every2sec"); //设置5s回调 rc=timedFunc( "workFunc5","_every5sec"); } //2秒回调 void workFunc2(string dp,time t1,time t2) { dpSet("System1:every2sec.flag",TRUE); } //5秒回调 void workFunc5(string dp,time t1,time t2) { dpSet("System1:every5sec.flag",TRUE); }
将文件添加至Control Manager管理器 然后启动 打开para查看是否添加成功
bingo!
4) 定时器使用
好的现在定时器已经做好了,
"System1:every5sec.flag" 每隔5s 触发一次
"System1:every2sec.flag" 每隔2s 触发一次
而且做得这两个定时器 任何Gedi界面都可以使用,比其他组态的拖拽定时器 性能要强很多~~~
下面就来做个实验
initalize代码用来周期性改变白色矩形框颜色
main() { dpConnect("fun01","System1:every5sec.flag"); } void fun01(string dp1, bool a) { if(colorTag){ setValue("RECTANGLE1", "backCol", "red"); }else{ setValue("RECTANGLE1", "backCol", "blue"); } colorTag = !colorTag; }
OK 跑起来
我把两张图合在了一起 定时器好用~