WinCC OA-CTRL-图形界面の定时器

引子

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面板Open-mouthed smile

1-1

创建自己的Gedi定时器

我们知道了官方的定时器原理其实就是创建一个"_TimedFunc" datapoint, 然后 调用timedFunc 注册回调函数.

但是timedFunc 不能在Gedi里使用,下面我们变通一下 实现一个自己的Gedi可用的定时器.

1)创建Timer 数据类型

image

2)创建两个Timer 数据点

image

如图一个作为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);
}

image

将文件添加至Control Manager管理器 然后启动 打开para查看是否添加成功

image

bingo!

4) 定时器使用

好的现在定时器已经做好了,

"System1:every5sec.flag" 每隔5s 触发一次

"System1:every2sec.flag" 每隔2s 触发一次

而且做得这两个定时器 任何Gedi界面都可以使用,比其他组态的拖拽定时器 性能要强很多~~~

下面就来做个实验

image

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 跑起来

image

我把两张图合在了一起  定时器好用~

欢迎关注,及时获取更新

posted @ 2020-05-14 18:44  莱立佰  阅读(1923)  评论(0编辑  收藏  举报