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

我把兩張圖合在了一起  定時器好用~

歡迎關注,及時獲取更新


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM