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