摘要:本文簡(jiǎn)述了紫金橋軟件讀取歷史數(shù)據(jù)的三種方式,重點(diǎn)說(shuō)明了取批量歷史的不同操作方法以及各種方法之間的區(qū)別。
正文:
紫金橋軟件自帶了過(guò)程數(shù)據(jù)庫(kù),可以高效的保存相關(guān)數(shù)據(jù)點(diǎn)的歷史記錄,同時(shí)提供了豐富的方法讀取所需的歷史記錄。
通過(guò)紫金橋組態(tài)軟件自身的過(guò)程數(shù)據(jù)庫(kù),可以通過(guò)兩種方式自動(dòng)保存數(shù)據(jù)點(diǎn)的歷史記錄,定時(shí)保存和變化率保存,定時(shí)保存適合保存變化不是很快,或者比較有規(guī)律的數(shù)據(jù)點(diǎn),變化率保存的應(yīng)用范圍相對(duì)更廣,適合變化較快或者較慢的情形,這里要注意兩點(diǎn)內(nèi)容:
l 對(duì)于定時(shí)保存的歷史記錄一般不做壓縮的,所以不建議對(duì)于較多的數(shù)據(jù)庫(kù)點(diǎn)設(shè)置為保存間隔較短的定時(shí)保存,否則歷史記錄的文件體積會(huì)增加相對(duì)較快;
l 對(duì)于變化率保存的數(shù)據(jù),系統(tǒng)會(huì)自動(dòng)壓縮保存,要注意的是其變化率是相對(duì)于該點(diǎn)的量程而言的,而不是相對(duì)于上次保存的歷史值。數(shù)據(jù)點(diǎn)的量程可以在“點(diǎn)組態(tài)”基本參數(shù)中修改;
個(gè)人覺(jué)得過(guò)程數(shù)據(jù)庫(kù)很適合保存現(xiàn)場(chǎng)連續(xù)的采集值,對(duì)于一些字符型的數(shù)據(jù),可能還需要借助關(guān)系數(shù)據(jù)庫(kù)來(lái)保留歷史值了。而關(guān)系數(shù)據(jù)庫(kù)在保存連續(xù)數(shù)值方面也遠(yuǎn)不如過(guò)程數(shù)據(jù)庫(kù)方便。關(guān)于紫金橋?qū)﹃P(guān)系數(shù)據(jù)庫(kù)的各種操作,筆者將在其它文檔中進(jìn)行說(shuō)明,這里不再贅述。
紫金橋軟件提供了多種方式讀取歷史數(shù)據(jù),這里僅就一些常用的方法進(jìn)行說(shuō)明。一般有三種方式讀取歷史記錄,分別是:歷史曲線、讀取單點(diǎn)歷史、讀取批量歷史。在說(shuō)明各種方式之前先要解釋下“壞值”的概念,數(shù)據(jù)點(diǎn)只有在系統(tǒng)運(yùn)行時(shí)才能保存歷史記錄,對(duì)于系統(tǒng)沒(méi)有運(yùn)行時(shí)的歷史值,如果該時(shí)刻早于當(dāng)前時(shí)刻,紫金橋軟件通常會(huì)賦一個(gè)壞值,-9999。而對(duì)于未到時(shí)間的歷史值可以在“系統(tǒng)參數(shù)”進(jìn)行設(shè)置,如圖所示:

下面簡(jiǎn)述下讀取歷史記錄的三種操作:
1 通過(guò)歷史曲線
通過(guò)歷史曲線或者趨勢(shì)分析曲線可以直接查詢相關(guān)點(diǎn)的歷史值,這種方法的優(yōu)點(diǎn)在于數(shù)據(jù)很直觀,便捷、曲線可以任意放大。
歷史曲線:

趨勢(shì)分析:

歷史曲線和趨勢(shì)分析曲線的不同在于,歷史曲線可以通過(guò)“打散單元”的操作將該組件分解,自行根據(jù)需要重新組合;而趨勢(shì)分析組件功能更強(qiáng),提供了歷史曲線沒(méi)有的統(tǒng)計(jì)數(shù)據(jù)、全屏顯示等功能,但是不支持分解操作,不能自行組合。
2 讀取單點(diǎn)歷史記錄
單獨(dú)采集某點(diǎn)某時(shí)刻的歷史值或某段時(shí)間的統(tǒng)計(jì)值一般通過(guò)腳本函數(shù)實(shí)現(xiàn):
l 讀取某時(shí)刻歷史值一般使用三種函數(shù):GetHisData(Var,Year,Month,Day,Hour,Minute,Second,MilliSec);
GetHisData2(Var,StartTime,
MilliSec);
GetHisDataEx(DataSource,
VarName ,StartTime,MilliSecond);
GetHisData和GetHisData2前者適合讀取具體時(shí)刻的歷史值,后者通過(guò)一個(gè)時(shí)間值來(lái)獲取歷史記錄,該值是一個(gè)整數(shù),表示相對(duì)于1970年1月1日08:00時(shí)過(guò)去的秒數(shù),這個(gè)秒數(shù)在紫金橋軟件中非常常用。實(shí)際工程中,這個(gè)秒數(shù)可以通過(guò)函數(shù)LongTime ("2001/01/01 14:50:48")得到,該函數(shù)可以自動(dòng)得到某時(shí)刻過(guò)去的秒數(shù)。秒數(shù)也可以通過(guò)一些組件得到,比如起始時(shí)間組件,如圖所示:

圖中有一個(gè)起始時(shí)間組件,其下是該組件的time屬性所對(duì)應(yīng)的相對(duì)于1970/1/1/08:00:00 過(guò)去的秒數(shù)。比如該組件被命名為EndTime,在腳本中通過(guò)#EndTime.time即可得到相應(yīng)的秒數(shù)。
l 讀取某段時(shí)間內(nèi)的統(tǒng)計(jì)值 可以通過(guò)函數(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)過(guò)濾掉壞值。在使用統(tǒng)計(jì)函數(shù)時(shí),要確保對(duì)應(yīng)的點(diǎn)在組態(tài)時(shí)選擇上統(tǒng)計(jì)設(shè)置,如圖所示:

此外還要注意的是,由于紫金橋系統(tǒng)是每小時(shí)自動(dòng)統(tǒng)計(jì)下歷史記錄,對(duì)于剛保存的歷史記錄,比如1小時(shí)內(nèi)的歷史值,通過(guò)統(tǒng)計(jì)函數(shù)可能無(wú)法得到最新的統(tǒng)計(jì)值。如果需要得到即時(shí)的統(tǒng)計(jì)值,需要借助紫金橋軟件提供的SPC歷史組件進(jìn)行統(tǒng)計(jì)。關(guān)于該組件的一些操作可以參看紫金橋軟件相關(guān)幫助文檔。
3 讀取批量歷史
讀取批量歷史通常以報(bào)表的形式顯示出來(lái)。對(duì)于歷史報(bào)表,依據(jù)不同的標(biāo)準(zhǔn)有不同的分法,按照行數(shù)區(qū)分可以分為固定行列和不固定行數(shù),按顯示的類型可以分為統(tǒng)計(jì)和非統(tǒng)計(jì)歷史報(bào)表。所謂統(tǒng)計(jì)報(bào)表通常是對(duì)一些累加值的點(diǎn)進(jìn)行統(tǒng)計(jì),比如最大值、最小值、或者平均值等,非統(tǒng)計(jì)報(bào)表就是直接查詢某時(shí)刻的歷史值。不同情況下具體實(shí)現(xiàn)的方法也各不同,這里僅就筆者熟悉的方法進(jìn)行簡(jiǎn)述。
對(duì)于需要獲取某段時(shí)間內(nèi),固定時(shí)間間隔的歷史記錄,通常其行數(shù)是固定的,比如需要對(duì)一天內(nèi)的整點(diǎn)數(shù)值采樣,其行數(shù)是24,時(shí)間間隔一小時(shí)。這種情況下,使用自由報(bào)表的“取批量歷史”功能最為簡(jiǎn)單。具體操作方式簡(jiǎn)述如下:
首先選中自由報(bào)表中需要顯示歷史記錄的一列,然后點(diǎn)擊自由報(bào)表工具欄中右側(cè)的公式選擇按鈕,如圖所示:

點(diǎn)擊后選擇“取批量歷史”,如圖所示:

系統(tǒng)彈出對(duì)話框:

在“數(shù)據(jù)庫(kù)變量”中填寫(xiě)所關(guān)聯(lián)的數(shù)據(jù)點(diǎn),比如“A1.pv”,根據(jù)實(shí)際情況設(shè)定“采集個(gè)數(shù)”和“時(shí)間間隔”,“采集個(gè)數(shù)”不能填寫(xiě)為變量。這里的“時(shí)間表達(dá)式”是指批量歷史中首個(gè)采集點(diǎn)的時(shí)間,可以是一個(gè)整型變量,其值是前文中提到的1970年1月1日08:00時(shí)過(guò)去的秒數(shù)。
優(yōu)點(diǎn):通過(guò)取批量歷史的功能,可以輕松的獲取某點(diǎn)采集個(gè)數(shù)固定,時(shí)間間隔固定的歷史記錄。
缺點(diǎn):無(wú)法實(shí)現(xiàn)采集時(shí)間不固定、采集歷史記錄個(gè)數(shù)不固定的要求,無(wú)法采集統(tǒng)計(jì)值。
小技巧:通常顯示歷史記錄的時(shí)候,往往需要在另一行顯示該記錄相對(duì)應(yīng)的時(shí)間,可以選擇一列,將該列的輸入輸出設(shè)置為“日期和時(shí)間”,然后將該列關(guān)聯(lián)和歷史值對(duì)應(yīng)的秒數(shù)即可。
有時(shí)需要用戶自行設(shè)置歷史記錄查詢的開(kāi)始時(shí)間和結(jié)束時(shí)間,查詢的歷史記錄的間隔時(shí)間,這時(shí)往往需要借助歷史數(shù)據(jù)對(duì)象來(lái)獲取記錄。
在紫金橋的圖庫(kù)中“歷史數(shù)據(jù)”選擇“歷史數(shù)據(jù)對(duì)象”,如圖所示:

將其拖拽置窗口,系統(tǒng)自動(dòng)增加一歷史數(shù)據(jù)對(duì)象,如圖所示:

雙擊該對(duì)象,可以在屬性對(duì)話框中進(jìn)行參數(shù)設(shè)置,如圖所示:

該組件通常運(yùn)行時(shí)是隱藏的??梢栽趯傩栽O(shè)置對(duì)話框中增加所需查詢的歷史點(diǎn)(可以同時(shí)查詢多個(gè))。通過(guò)點(diǎn)擊“事件腳本”,可以在此編寫(xiě)所需的腳本語(yǔ)句,如圖所示:

通常是通過(guò)按鈕等事件調(diào)用歷史數(shù)據(jù)對(duì)象的Start(BeginTime, Cycle,
Count)函數(shù),通過(guò)該函數(shù)可以設(shè)置查詢的開(kāi)始時(shí)間,查詢的時(shí)間周期和查詢的歷史個(gè)數(shù),并進(jìn)行查詢。當(dāng)查詢結(jié)束后,會(huì)執(zhí)行“檢索完成時(shí)”腳本。一般在“檢索完成時(shí)”的腳本中通過(guò)一個(gè)循環(huán)語(yǔ)句,把查詢到的結(jié)果更新到自由報(bào)表中。例如腳本:
num=#his.GetColCount();//得到查詢的行數(shù)
for k=1 to num+1 step 1
#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ù)對(duì)象查詢的數(shù)據(jù)行數(shù),然后逐行賦值給自由報(bào)表中指定的單元格。關(guān)于該組件的更詳細(xì)操作可以參看紫金橋軟件的說(shuō)明書(shū)。
優(yōu)點(diǎn):可以方便的采集行數(shù)固定或不固定的歷史值。
對(duì)于有些報(bào)表,需要統(tǒng)計(jì)一些歷史值,比如一段時(shí)間的最大值、最小值、平均值或者某段時(shí)間內(nèi),歷史值的最大值和最小值的差值(比如產(chǎn)量)。這類報(bào)表可以通過(guò)SPC控件或者歷史摘要控件進(jìn)行讀取統(tǒng)計(jì)值,然后再寫(xiě)入自由報(bào)表中,也可以直接使用統(tǒng)計(jì)函數(shù)獲取統(tǒng)計(jì)值。關(guān)于SPC控件和歷史摘要控件的操作方法和上文中提到了歷史數(shù)據(jù)對(duì)象比較類似,具體內(nèi)容和相關(guān)函數(shù)可以參看紫金橋軟件說(shuō)明書(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í)為單位的,所以相對(duì)于SPC控件,摘要控件統(tǒng)計(jì)的結(jié)果更為準(zhǔn)確,但是時(shí)間跨度需要大于一小時(shí)。
這里要說(shuō)明的是,對(duì)于一些累加的值而言,比如產(chǎn)量等,有時(shí)需要得到一段時(shí)間內(nèi)的差值,有些用戶往往會(huì)用結(jié)束時(shí)刻的歷史值減去開(kāi)始時(shí)刻的歷史值,這種做法是有隱患的,因?yàn)殚_(kāi)始時(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)過(guò)濾壞值),不過(guò)獲取統(tǒng)計(jì)值的速度會(huì)比獲取歷史值的速度稍慢一點(diǎn),如果該段時(shí)間跨度很大,可以適當(dāng)縮小統(tǒng)計(jì)值的時(shí)間范圍。
有時(shí)可能需要統(tǒng)計(jì)一些離散的歷史值,比如在檢測(cè)行業(yè),每次測(cè)量的時(shí)間間隔可能不固定,測(cè)量次數(shù)可能也不確定,這時(shí)想查詢歷史檢測(cè)記錄,使用前面提到的方法都難以實(shí)現(xiàn)。這里推薦兩種做法:
1 設(shè)置一個(gè)標(biāo)記點(diǎn),該標(biāo)記點(diǎn)使用變化率保存歷史記錄,每測(cè)量結(jié)束后,都改變一次標(biāo)記點(diǎn)的值,其他測(cè)量值同樣保持歷史記錄,查詢時(shí)使用“取全部歷史數(shù)據(jù)對(duì)象”組件(在圖庫(kù)中“歷史數(shù)據(jù)”中調(diào)用),如圖所示:

通過(guò)該組件可以查詢這個(gè)標(biāo)記點(diǎn)指定范圍內(nèi)的所有歷史記錄,同時(shí)可以查詢到該時(shí)刻時(shí)其他測(cè)量值的歷 史值。比如,工程中有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ù)。 進(jìn)入“取全部歷史數(shù)據(jù)”對(duì)象的報(bào)表設(shè)置界面:

可以看到,報(bào)表的前3列分別是時(shí)間、毫秒和查詢的位號(hào)的數(shù)據(jù),可以在后面增加一列,比如A2.PV,見(jiàn)上圖。 并在下面輸入如下的腳本=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ù)來(lái)存放相應(yīng)的數(shù)據(jù)。同時(shí)也會(huì)自動(dòng)地復(fù)制上面輸入的腳本,這樣后面的列就能顯示A2.PV的相應(yīng)時(shí)刻的歷史數(shù)據(jù)了。
優(yōu)點(diǎn):無(wú)需借助關(guān)系數(shù)據(jù)庫(kù),即可查詢離散的無(wú)規(guī)律變化的歷史記錄;
缺點(diǎn):受過(guò)程數(shù)據(jù)庫(kù)自身的局限,無(wú)法保存字符型歷史記錄。
2 每次測(cè)量結(jié)束后,將測(cè)量數(shù)據(jù)保存到關(guān)系數(shù)據(jù)庫(kù)中,然后通過(guò)自由報(bào)表查詢關(guān)系數(shù)據(jù)庫(kù)中的歷史記錄。
優(yōu)點(diǎn):可以方便的保存字符型或非字符型的離散歷史記錄;
缺點(diǎn):需要關(guān)系庫(kù)的支持;
本文簡(jiǎn)述了讀取紫金橋軟件歷史數(shù)據(jù)庫(kù)的三種方式:曲線、函數(shù)、報(bào)表,并詳細(xì)介紹了各種情況下使用報(bào)表讀取歷史數(shù)據(jù)的不同操作方法,當(dāng)然具體操作中,還有更多其他的方法可以選擇。希望以上介紹能對(duì)各位操作紫金橋軟件有所幫助,也希望起到拋磚引玉的作用,歡迎提出更好操作方法,彼此討論提高。