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

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