引子
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 跑起來
我把兩張圖合在了一起 定時器好用~