在實際應用中我們經(jīng)常會遇到這樣的問題:在我們構(gòu)建了一個實時監(jiān)控管理系統(tǒng)時,我們可以直接獲得一些被監(jiān)測量的瞬時值;在進行統(tǒng)計核算時,這些瞬時值不能有效地反應在一定時間段內(nèi)的生產(chǎn)產(chǎn)量、原料用量、能源消耗等生產(chǎn)情況。要反應類似這些信息就需要對相關(guān)的瞬時值進行累計計算,得到即時累計值,然后通過即時累計再獲取某時間段內(nèi)的階段統(tǒng)計值。
下面我們就介紹一下通過紫金橋軟件如果實現(xiàn)這一應用需求。
瞬時值的采集和累計過程是通過紫金橋的累計點來完成的。關(guān)于累計點各參數(shù)的意思可以查看在線幫助,但這里需要強調(diào)的是一定要注意“時間基”設(shè)置,否則可能得到錯誤的累計結(jié)果。
再有累計點的過程值(PV)表示是被監(jiān)測量的瞬時值,需要通過數(shù)據(jù)連接與I/O數(shù)據(jù)關(guān)聯(lián)起來,這樣才能利用累計點的計算功能通過TOTAL參數(shù)獲取累計值。如果我們需要系統(tǒng)重新啟動后,累計量能從上次累計值繼續(xù)累計,我們需要在歷史組態(tài)中將TOTAL參數(shù)的“退出時保存實時值作為下次啟動初值”選項選中。
在這里我們建立“累計量1”和“累計量2”兩個累計點,并以這兩個點為例介紹一下前述需求的實現(xiàn)過程。
我們假設(shè)要統(tǒng)計時間段為每8小時統(tǒng)計一次。由于某一時段內(nèi)的統(tǒng)計結(jié)果一旦統(tǒng)計完成就應在以后的查詢和使用過程保持不變,這樣我們可以通過另外一個點將這個統(tǒng)計結(jié)果保存下來,下次使用時我們可以直接讀取,而不需要重復計算了。這樣也可以簡化后續(xù)的查詢組態(tài)。
既然這里我們是8小時統(tǒng)計一次,我們就可以將系統(tǒng)小時變量($SYSTEM.Hour)的變化作為事務處理的觸發(fā)條件(實際應用時,我們可以統(tǒng)計周期選擇其它觸發(fā)條件)。每當系統(tǒng)小時值發(fā)生變化時,首先檢查是否到了8小時的時間間隔,如果到了就將“累計量1”和“累計量2”的當前值累計值(參數(shù)TOTAL)通過歷史插值的方法保存到“累計統(tǒng)計1”和“累計統(tǒng)計2”過程值中(參數(shù)PV),然后再將“累計量1”和“累計量2”的當前值累計值復位(清零)。通過這樣處理我們得到了一個每8小時統(tǒng)計一次的階段累計量值。
建立步驟如下:
在點組態(tài)中新建兩個模擬I/O點(累計統(tǒng)計1和累計統(tǒng)計2)用于形成累計量1和累計量2的歷史統(tǒng)計結(jié)果。
在“數(shù)據(jù)庫”導航樹中的“腳本/值改變”下建立值改變動作腳本,變量名為“$SYSTEM.Hour”,
腳本如下:
int 開始時刻=0;
int 時間間隔=8;
if( mod($SYSTEM.Hour + 24 - 開始時刻, 0, 時間間隔) == 0) then
InsertHisData(累計統(tǒng)計1.PV,累計量1.Total,$system.Year,
$system.Month,$system.Day,$system.Hour,0,0,0);
InsertHisData(累計統(tǒng)計2.PV,累計量2.Total,$system.Year,
$system.Month,$system.Day,$system.Hour,0,0,0);
累計量1.RESET=1;
累計量2.RESET=1;
endif
統(tǒng)計結(jié)果已經(jīng)有了,下面介紹如何查詢顯示:
假設(shè)我們要查詢的是一天內(nèi)每8小時的統(tǒng)計結(jié)果,那么我們首先需要指定查詢?nèi)掌?,這需要使用一個啟始時間組件;再有我們需要將查詢的結(jié)構(gòu)顯示出來,這可以通過一個自由報表組件來完成。下面介紹一下實現(xiàn)步驟:
A.定義一個整型中間變量tm,用于要查詢記錄的開始時間。
B.新建一個窗口,在窗口中建立一個開始時間組件將其命名為:StartTime;在此開始時間組件的事件腳本中對其進行初始化:
time=$system.longtime;
time = time - GetHour()*3600- GetMinute()*60-GetSecond();//修正為一天啟始時間
tm = time;
C.再建立一個自由報表,進入報表設(shè)置窗口,將報表第一列顯示屬性設(shè)置為“日期和時間”型;在這列的第二行、第三行和第四行分別公式:=tm+8*3600、=tm+16*3600、=tm+24*3600。
在第二列的第二行、第三行和第四行分別公式:
=GetHisData2(累計統(tǒng)計1.PV,VAL(1,$R),0)
注:GetHisData2為獲得指定數(shù)據(jù)庫變量,指定時刻的歷史記錄值;VAL(1,$R)表示獲得第一列,當前行單元格內(nèi)的值,即為第一列指定的時間;這列主要是獲得“累計統(tǒng)計1.PV”每8小時的歷史記錄。
D.在第三列的第二行、第三行和第四行分別公式:
=GetHisData2(累計統(tǒng)計2.PV,VAL(1,$R),0)
注:這列主要是獲得“累計統(tǒng)計2.PV”每8小時的歷史記錄。
E.在窗中建立一個按鈕,在按鈕的鼠標自定義動作中輸入腳本:tm = #time.time,用來變換查詢啟始時間。