在工業(yè)控制中,常常要從一些數(shù)據(jù)的歷史趨勢(shì)中分析問題和發(fā)現(xiàn)問題。紫金橋?qū)崟r(shí)數(shù)據(jù)庫(kù)支持歷史數(shù)據(jù)的快速保存和檢索,可以按照一定的條件把數(shù)據(jù)保存到歷史庫(kù)中,用戶需要時(shí)可隨時(shí)訪問。
歷史數(shù)據(jù)一般是點(diǎn)的某個(gè)參數(shù)在過去某一時(shí)刻的瞬時(shí)值,是與時(shí)間有關(guān)的數(shù)據(jù),每一個(gè)歷史數(shù)據(jù)記錄上都有一個(gè)時(shí)間戳,記錄歷史數(shù)據(jù)的采樣時(shí)間。位號(hào)是否保存歷史數(shù)據(jù),歷史數(shù)據(jù)的保存條件都由用戶進(jìn)行數(shù)據(jù)組態(tài)時(shí)決定。實(shí)時(shí)數(shù)據(jù)庫(kù)按照用戶指定的采樣條件在庫(kù)中進(jìn)行采樣,如果采樣的條件滿足,就將采樣數(shù)據(jù)加上時(shí)間戳,記入歷史庫(kù)中。
歷史數(shù)據(jù)庫(kù)是磁盤文件,為了防止頻繁的寫磁盤,紫金橋?qū)崟r(shí)數(shù)據(jù)庫(kù)在內(nèi)存中開辟了歷史數(shù)據(jù)緩沖區(qū)。歷史數(shù)據(jù)從實(shí)時(shí)數(shù)據(jù)庫(kù)中采集以后,首先放在內(nèi)存緩沖區(qū)中,當(dāng)存盤時(shí)間到達(dá)或緩沖區(qū)已滿時(shí)一次性的寫入磁盤歷史庫(kù)文件。用戶訪問歷史數(shù)據(jù)時(shí),系統(tǒng)首先檢查歷史數(shù)據(jù)緩沖區(qū)中是否有用戶需要的歷史數(shù)據(jù),如果沒有然后在檢查歷史數(shù)據(jù)庫(kù)文件中是否有用戶需要的歷史數(shù)據(jù)。歷史數(shù)據(jù)緩沖區(qū)的設(shè)立大大加快了歷史數(shù)據(jù)的存取速度。
紫金橋歷史數(shù)據(jù)庫(kù)具有如下特點(diǎn):
u 紫金橋?qū)崟r(shí)數(shù)據(jù)庫(kù)能夠?qū)⑷魏吸c(diǎn)的任何參數(shù)存盤。
u 無論數(shù)據(jù)來源于現(xiàn)場(chǎng)設(shè)備、人工錄入數(shù)據(jù)、還是計(jì)算結(jié)果都能存入歷史數(shù)據(jù)庫(kù)。
u 具有先進(jìn)的數(shù)據(jù)壓縮算法,能夠充分利用有限的盤空間存儲(chǔ)長(zhǎng)期的歷史數(shù)據(jù)
u 具有歷史插值功能。
對(duì)于某些特定的應(yīng)用,需要修改歷史數(shù)據(jù),紫金橋?qū)崟r(shí)數(shù)據(jù)庫(kù)沒有提供相關(guān)修改歷史數(shù)據(jù)的方法,但通過上述的歷史插值功能,可以完成歷史數(shù)據(jù)修改的目的。下面通過一個(gè)簡(jiǎn)單的示例,介紹下歷史數(shù)據(jù)的修改。
在工程中新建一個(gè)窗口,添加如下組件:

為了能用腳本調(diào)用各組件的功能,將各組件命名為:
組件 |
名稱 |
取歷史組件 |
His |
左側(cè)下拉框 |
tagSel |
起始時(shí)間 |
BegTime |
時(shí)間范圍 |
TimeLen |
左側(cè)報(bào)表 |
list |
右側(cè)下拉框 |
tagSel2 |
右側(cè)報(bào)表 |
newList |
設(shè)計(jì)思路:
1.查詢:通過下拉框選擇要修改的數(shù)據(jù)庫(kù)點(diǎn),點(diǎn)擊查詢按鈕時(shí),用起始時(shí)間和結(jié)束時(shí)間組件的設(shè)置,通過取取歷史組件查詢?cè)摱螘r(shí)間范圍內(nèi)的歷史數(shù)據(jù),然后將數(shù)據(jù)顯示在報(bào)表中。點(diǎn)擊導(dǎo)出到Excel按鈕,將報(bào)表中的數(shù)據(jù)(包括時(shí)間和數(shù)值)導(dǎo)出至Excel中。
2.修改:利用Excel打開保存的文件,修改數(shù)據(jù)。
3.插值:選擇對(duì)應(yīng)的數(shù)據(jù)庫(kù)點(diǎn),點(diǎn)擊選擇Excel文件按鈕,加載Excel修改后的文件,將數(shù)據(jù)顯示在報(bào)表中,點(diǎn)擊插入歷史數(shù)據(jù)庫(kù)按鈕,完成歷史數(shù)據(jù)的插入。
實(shí)現(xiàn)方法:
1.將要修改的點(diǎn)在添加至下拉框中。
2.在查詢按鈕中添加自定義動(dòng)作,如下:
string strCurTag = #tagSel.GetCurItemText();
strCurTag = StrTrimLeft(strCurTag);
strCurTag = StrTrimRight(strCurTag);
if StrInStr(StrLower(strCurTag),".pv",0) < 0 then
strCurTag = strCurTag+".pv";
endif
#his.FindHisEx(strCurTag,#BegTime.Time,#TimeLen.Time); //利用取歷史組件的FindHisEx函數(shù),查詢某一數(shù)據(jù)庫(kù)點(diǎn)在指定時(shí)間范圍內(nèi)的歷史數(shù)據(jù)。
3.將取歷史組件中的數(shù)據(jù)導(dǎo)出至報(bào)表中,設(shè)置取歷史組件的數(shù)據(jù)刷新動(dòng)作為:
//調(diào)整報(bào)表的顯示行數(shù),如果不足20行,則顯示20行,大于則顯示實(shí)際的行數(shù)
#list.DeleteRow(21,#list.RowCount());
int nListCnt = #list.RowCount();
int nDataCnt = #his.GetDataCount();
#list.ClearRowData(1,nListCnt);
if nDataCnt > nListCnt then
#list.AddRow(nDataCnt-nlistCnt);
Endif
//通過for循環(huán)將數(shù)據(jù)添加至報(bào)表中
int i=0;
int nTime = 0;
int nMS = 0;
real rData = 0;
for i=1 to nDataCnt+1
nTime = #his.GetDataTime(i);
#list.SetVal(1,i,nTime);
nMs = #his.GetDataMS(i);
#list.SetVal(2,i,nMs);
rData = #his.GetData(i);
#list.SetVal(3,i,rData);
Next
4.導(dǎo)出Excel按鈕腳本,如下:
#list.SaveAsEx("",0);
利用報(bào)表的SaveAsEx函數(shù)實(shí)現(xiàn)報(bào)表數(shù)據(jù)導(dǎo)出Exce文件功能。
5.選擇Exce按鈕腳本,如下:
#newList.LoadAsEx("",0);
6.插入歷史數(shù)據(jù)庫(kù)腳本,如下:
int nCnt = #hisList.RowCount();
int i=0;
string strCurTag = #tagSel2.GetCurItemText();
strCurTag = StrTrimLeft(strCurTag);
strCurTag = StrTrimRight(strCurTag);
if StrInStr(StrLower(strCurTag),".pv",0) < 0 then
strCurTag = strCurTag+".pv";
endif
for i=1 to nCnt+1
InsertHisDataEx("",strCurTag,#hisList.Val(3,i),#hisList.Val(1,i),#hisList.Val(2,i));
Next
利用InsertHisDataEx函數(shù),實(shí)現(xiàn)歷史數(shù)據(jù)的插值,如果該時(shí)間戳已經(jīng)存在,數(shù)據(jù)庫(kù)自動(dòng)替換該值。
總結(jié):利用該功能可以方便的完成歷史數(shù)據(jù)的修改,紫金橋?qū)崟r(shí)數(shù)據(jù)庫(kù)對(duì)歷史數(shù)據(jù)的操作提供了靈活的操作手段。歷史數(shù)據(jù)保存對(duì)數(shù)據(jù)完整性和數(shù)據(jù)的壓縮比上有較好的兼顧平衡,數(shù)據(jù)保存結(jié)構(gòu)先進(jìn)合理,使得在檢索有較高的效率,系統(tǒng)提供多種數(shù)據(jù)查詢手段,包括單點(diǎn)數(shù)據(jù)查詢,批量數(shù)據(jù)查詢,指定時(shí)間格式查詢、任意時(shí)間段數(shù)據(jù)查詢等都有對(duì)應(yīng)的組件。歷史數(shù)據(jù)的處理是實(shí)時(shí)數(shù)據(jù)庫(kù)的重要性能指標(biāo),紫金橋?qū)崟r(shí)數(shù)據(jù)庫(kù)有著獨(dú)到的優(yōu)勢(shì)。