應用問題
在實際應用中我們經常會遇到這樣的問題:在我們構建了一個實時監控管理係統時,我們可以直接獲得一些被監測量的瞬時值;在進行統計核算時,這些瞬時值不能有效地反應在一定時間段內的生產產量、原料用量、能(neng)源(yuan)消(xiao)耗(hao)等(deng)生(sheng)產(chan)情(qing)況(kuang)。要(yao)反(fan)應(ying)類(lei)似(si)這(zhe)些(xie)信(xin)息(xi)就(jiu)需(xu)要(yao)對(dui)相(xiang)關(guan)的(de)瞬(shun)時(shi)值(zhi)進(jin)行(xing)累(lei)計(ji)計(ji)算(suan),得(de)到(dao)即(ji)時(shi)累(lei)計(ji)值(zhi),然(ran)後(hou)通(tong)過(guo)即(ji)時(shi)累(lei)計(ji)再(zai)獲(huo)取(qu)某(mou)時(shi)間(jian)段(duan)內(nei)的(de)階(jie)段(duan)統(tong)計(ji)值(zhi)。
下麵我們就介紹一下通過紫金橋軟件如果實現這一應用需求。
實現過程
瞬(shun)時(shi)值(zhi)的(de)采(cai)集(ji)和(he)累(lei)計(ji)過(guo)程(cheng)是(shi)通(tong)過(guo)紫(zi)金(jin)橋(qiao)的(de)累(lei)計(ji)點(dian)來(lai)完(wan)成(cheng)的(de)。關(guan)於(yu)累(lei)計(ji)點(dian)各(ge)參(can)數(shu)的(de)意(yi)思(si)可(ke)以(yi)查(zha)看(kan)在(zai)線(xian)幫(bang)助(zhu),但(dan)這(zhe)裏(li)需(xu)要(yao)強(qiang)調(tiao)的(de)是(shi)一(yi)定(ding)要(yao)注(zhu)意(yi)“時間基”設置,否則可能得到錯誤的累計結果。

再有累計點的過程值(PV)表示是被監測量的瞬時值,需要通過數據連接與I/O數據關聯起來,這樣才能利用累計點的計算功能通過TOTAL參數獲取累計值。如果我們需要係統重新啟動後,累計量能從上次累計值繼續累計,我們需要在曆史組態中將TOTAL參數的“退出時保存實時值作為下次啟動初值”選項選中。
在這裏我們建立“累計量1”和“累計量2”兩個累計點,並以這兩個點為例介紹一下前述需求的實現過程。
我們假設要統計時間段為每8小xiao時shi統tong計ji一yi次ci。由you於yu某mou一yi時shi段duan內nei的de統tong計ji結jie果guo一yi旦dan統tong計ji完wan成cheng就jiu應ying在zai以yi後hou的de查zha詢xun和he使shi用yong過guo程cheng保bao持chi不bu變bian,這zhe樣yang我wo們men可ke以yi通tong過guo另ling外wai一yi個ge點dian將jiang這zhe個ge統tong計ji結jie果guo保bao存cun下xia來lai,下xia次ci使shi用yong時shi我wo們men可ke以yi直zhi接jie讀du取qu,而er不bu需xu要yao重zhong複fu計ji算suan了le。這zhe樣yang也ye可ke以yi簡jian化hua後hou續xu的de查zha詢xun組zu態tai。
既然這裏我們是8小時統計一次,我們就可以將係統小時變量($SYSTEM.Hour)的變化作為事務處理的觸發條件(實際應用時,我們可以統計周期選擇其它觸發條件)。每當係統小時值發生變化時,首先檢查是否到了8小時的時間間隔,如果到了就將“累計量1”和“累計量2”的當前值累計值(參數TOTAL)通過曆史插值的方法保存到“累計統計1”和“累計統計2”過程值中(參數PV),然後再將“累計量1”和“累計量2”的當前值累計值複位(清零)。通過這樣處理我們得到了一個每8小時統計一次的階段累計量值。
建立步驟如下:
在點組態中新建兩個模擬I/O點(累計統計1和累計統計2)用於形成累計量1和累計量2的曆史統計結果。
在“數據庫”導航樹中的“腳本/值改變”下建立值改變動作腳本,變量名為“$SYSTEM.Hour”,

腳本如下:
int 開始時刻=0;
int 時間間隔=8;
if( mod($SYSTEM.Hour + 24 - 開始時刻, 0, 時間間隔) == 0) then
InsertHisData(累計統計1.PV,累計量1.Total,$system.Year,
$system.Month,$system.Day,$system.Hour,0,0,0);
InsertHisData(累計統計2.PV,累計量2.Total,$system.Year,
$system.Month,$system.Day,$system.Hour,0,0,0);
累計量1.RESET=1;
累計量2.RESET=1;
endif
統計結果已經有了,下麵介紹如何查詢顯示:
假設我們要查詢的是一天內每8小時的統計結果,那麼我們首先需要指定查詢日期,這需要使用一個啟始時間組件;再有我們需要將查詢的結構顯示出來,這可以通過一個自由報表組件來完成。下麵介紹一下實現步驟:
A.定義一個整型中間變量tm,用於要查詢記錄的開始時間。
B.新建一個窗口,在窗口中建立一個開始時間組件將其命名為:StartTime;在此開始時間組件的事件腳本中對其進行初始化:
time=$system.longtime;
time = time - GetHour()*3600- GetMinute()*60-GetSecond();//修正為一天啟始時間
tm = time;
C.再建立一個自由報表,進入報表設置窗口,將報表第一列顯示屬性設置為“日期和時間”型;在這列的第二行、第三行和第四行分別公式:=tm+8*3600、=tm+16*3600、=tm+24*3600。
在第二列的第二行、第三行和第四行分別公式:
=GetHisData2(累計統計1.PV,VAL(1,$R),0)
注:GetHisData2為獲得指定數據庫變量,指定時刻的曆史記錄值;VAL(1,$R)表示獲得第一列,當前行單元格內的值,即為第一列指定的時間;這列主要是獲得“累計統計1.PV”每8小時的曆史記錄。
D.在第三列的第二行、第三行和第四行分別公式:
=GetHisData2(累計統計2.PV,VAL(1,$R),0)
注:這列主要是獲得“累計統計2.PV”每8小時的曆史記錄。
E.在窗中建立一個按鈕,在按鈕的鼠標自定義動作中輸入腳本:tm = #time.time,用來變換查詢啟始時間。
小結上shang麵mian例li子zi隻zhi是shi介jie紹shao了le一yi下xia在zai紫zi金jin橋qiao軟ruan件jian中zhong實shi現xian累lei計ji統tong計ji的de一yi種zhong思si路lu,在zai實shi際ji應ying用yong中zhong還hai會hui有you許xu多duo要yao處chu理li的de事shi項xiang,實shi現xian過guo程cheng也ye要yao比bi這zhe複fu雜za的de多duo。希xi望wang這zhe個ge小xiao例li子zi能neng達da到dao拋pao磚zhuan引yin玉yu的de作zuo用yong,對dui您nin解jie決jue類lei似si問wen題ti有you所suo幫bang助zhu。
|