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

為了能用腳本調(diào)用各組件的功能,將各組件命名為:
組件 |
名稱 |
取歷史組件 |
His |
左側(cè)下拉框 |
tagSel |
起始時間 |
BegTime |
時間范圍 |
TimeLen |
左側(cè)報表 |
list |
右側(cè)下拉框 |
tagSel2 |
右側(cè)報表 |
newList |
設(shè)計思路:
1.查詢:通過下拉框選擇要修改的數(shù)據(jù)庫點,點擊查詢按鈕時,用起始時間和結(jié)束時間組件的設(shè)置,通過取取歷史組件查詢該段時間范圍內(nèi)的歷史數(shù)據(jù),然后將數(shù)據(jù)顯示在報表中。點擊導(dǎo)出到Excel按鈕,將報表中的數(shù)據(jù)(包括時間和數(shù)值)導(dǎo)出至Excel中。
2.修改:利用Excel打開保存的文件,修改數(shù)據(jù)。
3.插值:選擇對應(yīng)的數(shù)據(jù)庫點,點擊選擇Excel文件按鈕,加載Excel修改后的文件,將數(shù)據(jù)顯示在報表中,點擊插入歷史數(shù)據(jù)庫按鈕,完成歷史數(shù)據(jù)的插入。
實現(xiàn)方法:
1.將要修改的點在添加至下拉框中。
2.在查詢按鈕中添加自定義動作,如下:
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ù)庫點在指定時間范圍內(nèi)的歷史數(shù)據(jù)。
3.將取歷史組件中的數(shù)據(jù)導(dǎo)出至報表中,設(shè)置取歷史組件的數(shù)據(jù)刷新動作為:
//調(diào)整報表的顯示行數(shù),如果不足20行,則顯示20行,大于則顯示實際的行數(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ù)添加至報表中
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);
利用報表的SaveAsEx函數(shù)實現(xiàn)報表數(shù)據(jù)導(dǎo)出Exce文件功能。
5.選擇Exce按鈕腳本,如下:
#newList.LoadAsEx("",0);
6.插入歷史數(shù)據(jù)庫腳本,如下:
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ù),實現(xiàn)歷史數(shù)據(jù)的插值,如果該時間戳已經(jīng)存在,數(shù)據(jù)庫自動替換該值。
總結(jié):利用該功能可以方便的完成歷史數(shù)據(jù)的修改,紫金橋?qū)崟r數(shù)據(jù)庫對歷史數(shù)據(jù)的操作提供了靈活的操作手段。歷史數(shù)據(jù)保存對數(shù)據(jù)完整性和數(shù)據(jù)的壓縮比上有較好的兼顧平衡,數(shù)據(jù)保存結(jié)構(gòu)先進合理,使得在檢索有較高的效率,系統(tǒng)提供多種數(shù)據(jù)查詢手段,包括單點數(shù)據(jù)查詢,批量數(shù)據(jù)查詢,指定時間格式查詢、任意時間段數(shù)據(jù)查詢等都有對應(yīng)的組件。歷史數(shù)據(jù)的處理是實時數(shù)據(jù)庫的重要性能指標(biāo),紫金橋?qū)崟r數(shù)據(jù)庫有著獨到的優(yōu)勢。
|