摘要:本文簡述了紫金橋軟件讀取歷史數據的三種方式,重點說明了取批量歷史的不同操作方法以及各種方法之間的區別。
正文:
紫金橋軟件自帶了過程數據庫,可以高效的保存相關數據點的歷史記錄,同時提供了豐富的方法讀取所需的歷史記錄。
通過紫金橋組態軟件自身的過程數據庫,可以通過兩種方式自動保存數據點的歷史記錄,定時保存和變化率保存,定時保存適合保存變化不是很快,或者比較有規律的數據點,變化率保存的應用范圍相對更廣,適合變化較快或者較慢的情形,這里要注意兩點內容:
l 對于定時保存的歷史記錄一般不做壓縮的,所以不建議對于較多的數據庫點設置為保存間隔較短的定時保存,否則歷史記錄的文件體積會增加相對較快;
l 對于變化率保存的數據,系統會自動壓縮保存,要注意的是其變化率是相對于該點的量程而言的,而不是相對于上次保存的歷史值。數據點的量程可以在“點組態”基本參數中修改;
個人覺得過程數據庫很適合保存現場連續的采集值,對于一些字符型的數據,可能還需要借助關系數據庫來保留歷史值了。而關系數據庫在保存連續數值方面也遠不如過程數據庫方便。關于紫金橋對關系數據庫的各種操作,筆者將在其它文檔中進行說明,這里不再贅述。
紫金橋軟件提供了多種方式讀取歷史數據,這里僅就一些常用的方法進行說明。一般有三種方式讀取歷史記錄,分別是:歷史曲線、讀取單點歷史、讀取批量歷史。在說明各種方式之前先要解釋下“壞值”的概念,數據點只有在系統運行時才能保存歷史記錄,對于系統沒有運行時的歷史值,如果該時刻早于當前時刻,紫金橋軟件通常會賦一個壞值,-9999。而對于未到時間的歷史值可以在“系統參數”進行設置,如圖所示:
下面簡述下讀取歷史記錄的三種操作:
1 通過歷史曲線
通過歷史曲線或者趨勢分析曲線可以直接查詢相關點的歷史值,這種方法的優點在于數據很直觀,便捷、曲線可以任意放大。
歷史曲線:
趨勢分析:
歷史曲線和趨勢分析曲線的不同在于,歷史曲線可以通過“打散單元”的操作將該組件分解,自行根據需要重新組合;而趨勢分析組件功能更強,提供了歷史曲線沒有的統計數據、全屏顯示等功能,但是不支持分解操作,不能自行組合。
2 讀取單點歷史記錄
單獨采集某點某時刻的歷史值或某段時間的統計值一般通過腳本函數實現:
l 讀取某時刻歷史值一般使用三種函數:GetHisData(Var,Year,Month,Day,Hour,Minute,Second,MilliSec);
GetHisData2(Var,StartTime,
MilliSec);
GetHisDataEx(DataSource,
VarName ,StartTime,MilliSecond);
GetHisData和GetHisData2前者適合讀取具體時刻的歷史值,后者通過一個時間值來獲取歷史記錄,該值是一個整數,表示相對于1970年1月1日08:00時過去的秒數,這個秒數在紫金橋軟件中非常常用。實際工程中,這個秒數可以通過函數LongTime ("2001/01/01 14:50:48")得到,該函數可以自動得到某時刻過去的秒數。秒數也可以通過一些組件得到,比如起始時間組件,如圖所示:
圖中有一個起始時間組件,其下是該組件的time屬性所對應的相對于1970/1/1/08:00:00 過去的秒數。比如該組件被命名為EndTime,在腳本中通過#EndTime.time即可得到相應的秒數。
l 讀取某段時間內的統計值 可以通過函數GetStatisDataEx(DataSource,VarName,
StartTime,TimeSpan, Flag,Time)或GetStatisData (Var, Year, Month, Day, Hour, TimeSpan, Flag,Time)得到一段時間內的最大值、最小值或者平均值。
val = GetStatisDataEx("","FQ101.PV", LongTime("2007/09/04 14:30:00"),
2,0,strTime) 示例中Val變量可以得到FQ101.pv值在2007年9月4日14點30分起2個小時內的平均值。這里要注意的是,GetStatisData
和GetStatisDataEx函數會自動過濾掉壞值。在使用統計函數時,要確保對應的點在組態時選擇上統計設置,如圖所示:
此外還要注意的是,由于紫金橋系統是每小時自動統計下歷史記錄,對于剛保存的歷史記錄,比如1小時內的歷史值,通過統計函數可能無法得到最新的統計值。如果需要得到即時的統計值,需要借助紫金橋軟件提供的SPC歷史組件進行統計。關于該組件的一些操作可以參看紫金橋軟件相關幫助文檔。
3 讀取批量歷史
讀取批量歷史通常以報表的形式顯示出來。對于歷史報表,依據不同的標準有不同的分法,按照行數區分可以分為固定行列和不固定行數,按顯示的類型可以分為統計和非統計歷史報表。所謂統計報表通常是對一些累加值的點進行統計,比如最大值、最小值、或者平均值等,非統計報表就是直接查詢某時刻的歷史值。不同情況下具體實現的方法也各不同,這里僅就筆者熟悉的方法進行簡述。
對于需要獲取某段時間內,固定時間間隔的歷史記錄,通常其行數是固定的,比如需要對一天內的整點數值采樣,其行數是24,時間間隔一小時。這種情況下,使用自由報表的“取批量歷史”功能最為簡單。具體操作方式簡述如下:
首先選中自由報表中需要顯示歷史記錄的一列,然后點擊自由報表工具欄中右側的公式選擇按鈕,如圖所示:
點擊后選擇“取批量歷史”,如圖所示:
系統彈出對話框:
在“數據庫變量”中填寫所關聯的數據點,比如“A1.pv”,根據實際情況設定“采集個數”和“時間間隔”,“采集個數”不能填寫為變量。這里的“時間表達式”是指批量歷史中首個采集點的時間,可以是一個整型變量,其值是前文中提到的1970年1月1日08:00時過去的秒數。
優點:通過取批量歷史的功能,可以輕松的獲取某點采集個數固定,時間間隔固定的歷史記錄。
缺點:無法實現采集時間不固定、采集歷史記錄個數不固定的要求,無法采集統計值。
小技巧:通常顯示歷史記錄的時候,往往需要在另一行顯示該記錄相對應的時間,可以選擇一列,將該列的輸入輸出設置為“日期和時間”,然后將該列關聯和歷史值對應的秒數即可。
有時需要用戶自行設置歷史記錄查詢的開始時間和結束時間,查詢的歷史記錄的間隔時間,這時往往需要借助歷史數據對象來獲取記錄。
在紫金橋的圖庫中“歷史數據”選擇“歷史數據對象”,如圖所示:
將其拖拽置窗口,系統自動增加一歷史數據對象,如圖所示:
雙擊該對象,可以在屬性對話框中進行參數設置,如圖所示:
該組件通常運行時是隱藏的。可以在屬性設置對話框中增加所需查詢的歷史點(可以同時查詢多個)。通過點擊“事件腳本”,可以在此編寫所需的腳本語句,如圖所示:
通常是通過按鈕等事件調用歷史數據對象的Start(BeginTime, Cycle,
Count)函數,通過該函數可以設置查詢的開始時間,查詢的時間周期和查詢的歷史個數,并進行查詢。當查詢結束后,會執行“檢索完成時”腳本。一般在“檢索完成時”的腳本中通過一個循環語句,把查詢到的結果更新到自由報表中。例如腳本:
num=#his.GetColCount();//得到查詢的行數
for k=1 to num+1 step 1
#report.settxt(1,k+1,#his.GetTimeText(k-1,0));//得到時間
#report.settxt(2,k+1,#his.GetCellText(0,k-1));//得到變量1的歷史值
#report.settxt(3,k+1,#his.GetCellText(1,k-1));//得到變量2的歷史值
Next
該腳本首先獲得歷史數據對象查詢的數據行數,然后逐行賦值給自由報表中指定的單元格。關于該組件的更詳細操作可以參看紫金橋軟件的說明書。
優點:可以方便的采集行數固定或不固定的歷史值。
對于有些報表,需要統計一些歷史值,比如一段時間的最大值、最小值、平均值或者某段時間內,歷史值的最大值和最小值的差值(比如產量)。這類報表可以通過SPC控件或者歷史摘要控件進行讀取統計值,然后再寫入自由報表中,也可以直接使用統計函數獲取統計值。關于SPC控件和歷史摘要控件的操作方法和上文中提到了歷史數據對象比較類似,具體內容和相關函數可以參看紫金橋軟件說明書。其中SPC控件可以從任意時段的歷史數據中進行抽樣統計,進行SPC統計的點是否選擇了“是否統計”都不影響SPC分析;而歷史摘要控件選擇的是該點的統計值,進行歷史摘要的點必須選擇“統計”,而統計往往是以小時為單位的,所以相對于SPC控件,摘要控件統計的結果更為準確,但是時間跨度需要大于一小時。
這里要說明的是,對于一些累加的值而言,比如產量等,有時需要得到一段時間內的差值,有些用戶往往會用結束時刻的歷史值減去開始時刻的歷史值,這種做法是有隱患的,因為開始時刻或者結束時刻系統可能處于未運行狀態,這時,歷史值會是壞值-9999。所以建議的做法是選取這段時間內的最大統計值減去這段時間內的最小統計值(系統會自動過濾壞值),不過獲取統計值的速度會比獲取歷史值的速度稍慢一點,如果該段時間跨度很大,可以適當縮小統計值的時間范圍。
有時可能需要統計一些離散的歷史值,比如在檢測行業,每次測量的時間間隔可能不固定,測量次數可能也不確定,這時想查詢歷史檢測記錄,使用前面提到的方法都難以實現。這里推薦兩種做法:
1 設置一個標記點,該標記點使用變化率保存歷史記錄,每測量結束后,都改變一次標記點的值,其他測量值同樣保持歷史記錄,查詢時使用“取全部歷史數據對象”組件(在圖庫中“歷史數據”中調用),如圖所示:
通過該組件可以查詢這個標記點指定范圍內的所有歷史記錄,同時可以查詢到該時刻時其他測量值的歷 史值。比如,工程中有A1和A2兩個位號,A1是標記點,現在希望查詢A1的在當天的所有歷史數據。比如 查到的結果是12:23:18.102時刻有一個歷史數據,18:43:25.358時刻有一個歷史數據。這時希望同時查詢A2在12:23:18.102時刻和18:43:25.358時刻的歷史數據。 進入“取全部歷史數據”對象的報表設置界面:
可以看到,報表的前3列分別是時間、毫秒和查詢的位號的數據,可以在后面增加一列,比如A2.PV,見上圖。 并在下面輸入如下的腳本=GetHisData2(A2.PV, Val(1,$R), Val(2,$R)) 。這段腳本的意義是取A2.PV的歷史數據,其中時間采用左側第一列的時間,毫秒數采用左側第二列的時間。 當組件查詢到A1.PV的歷史數據的時候,會自動地增加報表的行數來存放相應的數據。同時也會自動地復制上面輸入的腳本,這樣后面的列就能顯示A2.PV的相應時刻的歷史數據了。
優點:無需借助關系數據庫,即可查詢離散的無規律變化的歷史記錄;
缺點:受過程數據庫自身的局限,無法保存字符型歷史記錄。
2 每次測量結束后,將測量數據保存到關系數據庫中,然后通過自由報表查詢關系數據庫中的歷史記錄。
優點:可以方便的保存字符型或非字符型的離散歷史記錄;
缺點:需要關系庫的支持;
本文簡述了讀取紫金橋軟件歷史數據庫的三種方式:曲線、函數、報表,并詳細介紹了各種情況下使用報表讀取歷史數據的不同操作方法,當然具體操作中,還有更多其他的方法可以選擇。希望以上介紹能對各位操作紫金橋軟件有所幫助,也希望起到拋磚引玉的作用,歡迎提出更好操作方法,彼此討論提高。