1定時器功能介紹
wincc中定時器的使用可以使wincc按照指定的周期或者時間點去執(zhí)行任務,比如周期執(zhí)行變量歸檔、在指定的時間點執(zhí)行全局腳本或條件滿足時打印報表。wincc已經(jīng)提供了一些簡單的定時器,可以滿足大部分定時功能。但是在有些情況下,wincc 提供的定時器不能滿足我們需求,這時我們就可以通過 wincc提供的腳本接口通過編程的方式實現(xiàn)定時的功能,因為腳本本身既可以直接調(diào)用wincc其他功能,比如報表打印,也可以通過中間變量來控制其他功能的執(zhí)行,比如通過置位/復位歸檔控制變量來觸發(fā)變量記錄的執(zhí)行。wincc 提供了c 腳本和vbs腳本,本文主要以全局 c 腳本編程為例介紹定時功能的實現(xiàn)。
2腳本中定時器介紹
既然在全局腳本中可以編程控制其他功能的執(zhí)行,那么首先看看全局腳本的觸發(fā):
圖1 腳本觸發(fā)器分類
如圖1所示: 腳本觸發(fā)器分為使用定時器和使用變量, 定時器又分為周期執(zhí)行和非周期執(zhí)行一次,比如每分鐘執(zhí)行一次腳本屬于周期執(zhí)行,指定2012年10月1日執(zhí)行一次屬于非周期執(zhí)行。 使用變量觸發(fā)腳本,即在變量發(fā)生變化時,腳本就執(zhí)行一次, 而變量的采集可以根據(jù)指定周期循環(huán)采集,或者根據(jù)變化采集,根據(jù)變化實際是1秒鐘采集變量一次。
3使用腳本實現(xiàn)更多定時器功能
利用腳本自身的定時器, 可以通過在腳本中編程的方式實現(xiàn)更多其它定時功能。
3.1整點歸檔
wincc提供了變量歸檔,變量歸檔分為周期歸檔和非周期歸檔,不管是周期歸檔或非周期的歸檔,都又可以通過一些變量或腳本返回值來控制歸檔, 比如:整點歸檔。下面的設(shè)置結(jié)合wincc腳本,實現(xiàn)了在整點開始歸檔,歸檔五分種后停止歸檔,即每個小時僅歸檔前五分鐘的數(shù)據(jù)。
軟件環(huán)境:windows 7 professional service pack1 , wincc v7.0 sp3
歸檔名稱:processvaluearchive
歸檔變量:newtag
歸檔周期:1 分鐘
歸檔控制變量 startarchive
c腳本觸發(fā)周期:10秒
腳本代碼:
#include apdefap.h
int gscaction( void )
{
#pragma option(mbcs)
#pragma code (kernel32.dll);
void getlocaltime (systemtime* lpst);
#pragma code();
systemtime time;
int t1;
getlocaltime(&time);
t1=time.wminute;
if(t1==00)
{
settagbit(startarchive,1);
}
if(t1==05)
{
settagbit(startarchive,0);
}
return 0;
}
歸檔設(shè)置如圖2:
圖2 歸檔設(shè)置
同理,在以上腳本的基礎(chǔ)上做修改,可以實現(xiàn)在某個指定的時間點打印報表,只要在滿足觸發(fā)條件時調(diào)用下列函數(shù):
rptjobprint(myprintjob);
myprintjob為事先創(chuàng)建好的打印作業(yè)。
腳本主要部分在于獲取系統(tǒng)當前時間,下面的腳本實現(xiàn)了獲取當前時間并分別獲取年、
月、日、時、分、秒、毫秒,星期幾的功能。
varname1到varname8為wincc內(nèi)部變量。若在wincc畫面上顯示時,由于默認i/o 域
的格式為999.99, 要把 varname1的顯示格式改為9999。
#include apdefap.h
int gscaction( void )
{
#pragma option(mbcs)
#pragma code (kernel32.dll);
void getlocaltime (systemtime* lpst);
#pragma code();
systemtime time;
getlocaltime(&time);
settagword(varname1,time.wyear);
settagword(varname2,time.wmonth);
settagword(varname3,time.wdayofweek);
settagword(varname4,time.wday);
settagword(varname5,time.whour);
settagword(varname6,time.wminute);
settagword(varname7,time.wsecond);
settagword(varname8,time.wmilliseconds);
return 0;
}
設(shè)置或讀取系統(tǒng)時間的函數(shù)如下:
setsystemtime
setlocaltime
getsystemtime
getlocaltime
系統(tǒng)中本地計算機時間和格林威治時間是有區(qū)別的。函數(shù)“setsystemtime /
getsystemtime”用于設(shè)置或讀取格林威治時間。
函數(shù)“setlocaltime / getlocaltime”用于設(shè)置或讀取本地計算機時間。
兩種時間會因地理的時區(qū)不同而改變。兩個函數(shù)使用方法相同。
3.2 wincc項目激活時避免腳本初次執(zhí)行及延遲執(zhí)行腳本
全局腳本在項目激活時,是要執(zhí)行一次的,在有些情況下,需要避免腳本執(zhí)行,就采用在腳本中去判斷。比如可以創(chuàng)建wincc內(nèi)部布爾型變量 flag,腳本如下:
#include apdefap.h
int gscaction( void )
{
#pragma option(mbcs)
if ( gettagbit(flag)==1)
settagword(newtag,1);//根據(jù)自己的需求編寫對應代碼.
else
settagbit(flag,1); //return-type: bool
return 0;
}
除了避免項目運行激活時觸發(fā)腳本執(zhí)行,我們還可以通過sleep() 延遲腳本功能執(zhí)行,比如開機后五分鐘開始執(zhí)行腳本具體功能,代碼如下:
#include apdefap.h
int gscaction( void )
{
#pragma option(mbcs)
#pragma option(mbcs)
#pragma code(kernel32.dll);
void sleep(int milliseconds);
#pragma code()
sleep(300000); //延遲300秒即五分鐘
int temp;
//根據(jù)自己的需求編寫對應代碼.
temp=gettagword(newtag); //return-type: word
temp++;
settagword(newtag,temp);
return 0;
}