

基於ADO技術的iFix曆史報表的設計
1引言
iFIX是全球***的HMI/SCADA自動化監控組態軟件。,已有超過300,000套以上的軟件在全球運行。世界上許多*成功的製造商都依靠 GE Fanuc的iFIX軟件來**監控和分布管理全廠範圍的生產數據。iFIX 軟件內置功能強大的VBA腳本編譯器,能實現複雜工程對軟件的要求。但是,因不同項目對曆史數據報表要求不盡相同,而iFIX軟件又沒有提供針對曆史數據報表的通用組件,通常實現報表的方法是使用第三方提供的組件(如:水晶報表),因其封裝功能較多,編程不夠靈活,對於比較複雜的報表功能實現起來比較麻煩,而且需要在進行報表組態時單獨購買。ADO組件集成在Visual Basic 6.0中,對於複雜的報表功能,采用ADO技術訪問iFIX曆史數據庫實現報表非常靈活。
2ADO技術與iFIX曆史數據庫
2.1ADO 技術
ADO (ActiveX DataObjects) 是一個用於存取數據源的COM組件。它是Microsoft新數據庫訪問技術,是建立在OLEDB之上的高層數據庫訪問技術。ADO易於使用、高速度和較低的內存占有率的優點使得編程效率更高。
ADO常用的組件對象有:ADODB.Connection和ADODB.Recordset。通過ADO組件對象訪問數據庫,基本操作流程是:用Connection對象連接數據庫,利用建立好的連接通過Connection、Command對象執行SQL命令,或利用Recordset對象取得結果記錄集進行查詢、處理。
2.2 iFIX曆史數據庫
在iFIX安裝時,iFIX安裝程序會自動在工作站上建立兩個係統數據源“FIXDynamics Historical Data”和“FIX Dynamics Real Time Data”。 “FIXDynamics Real Time Data”數據源連接的是iFIX實時數據庫;“FIX Dynamics HistoricalData” 數據源連接的是iFIX曆史數據庫。
實時數據庫和曆史數據庫都可通過ODBC進行訪問。
在進行iFIX工程組態時,可以在iFIX工作台係統樹下的“曆史定義”定義要查詢的曆史數據。當iFIX運行時,iFIX會按照組態好的要進行記錄曆史數據的標簽的實時值以曆史文件的形式保存。例如:工程節點名為“FIX”,並且組態生成24小時的曆史文件,則這些曆史文件以xxxx.H24(其中xxxx為記錄時間)保存到工程目錄下的“…\HTRDATA\FIX\”。iFIX曆史數據庫主要有以下字段:
NODE為工程的邏輯節點名;TAG為數據庫標簽名;FIELD為數據庫標簽的域名;VALUE為數據庫標簽數值;DATETIME為記錄日期和時間;INTERVAL為查詢時間間隔。
3 曆史報表軟件的設計與實現
3.1功能介紹
本軟件可實現與iFIX工程應用軟件的無縫連接,滿足查詢iFIX曆史數據並以報表形式顯示。
1)可以任意選擇要查詢的變量,變量在報表中的顯示順序隻跟選擇要查詢變量的順序有關。
2)查詢變量時,按照日期查詢,用戶隻需設置要查詢的變量,輸入“起始時間”、“結束時間”、“時間間隔”即可進行查詢。
3)查詢結果可導出。
3.2設計與實現
軟件設計主要包括利用ADO組件對象通過“FIXDynamics Historical Data”數據源查詢iFIX曆史數據庫和將查詢的結果顯示出來。
1)建立數據庫標簽名描述文件
因iFIX曆史數據庫是按照TAG(數據庫標簽名)進行數據存儲的,而標簽名通常為字母以及編號組成,不便記憶,為了使報表更能直觀顯示,我們建立數據庫標簽名描述文件。該文件是一個文本文件,將每個標簽名(與iFIX數據庫管理器標簽名相同)與該標簽的描述對應起來,如圖1所示:
圖1:數據庫標簽描述文件
2)配置軟件開發環境,添加ActiveX控件及引用ADO對象庫
本軟件開發環境需要安裝VisualBasic 6.0和MicrosoftOffice組件。進行報表查詢需要在VB工程中插入時間控件(DTPicker)。進行報表顯示需要顯示控件(SpreadSheet)。要在VB工程中添加ActiveX控件,步驟如下:打開工程→在“工程”菜單→選擇“部件”→在“部件”對話框找到“Microsoft Office XP Web Components”和“Microsoft WindowsCommon Controls-2.6.0”,選中選中相應複選框→點擊確定。這樣就把ActiveX控件添加到了VB工具箱了。
在使用ADO對象之前,必須先將對象庫引入當前工程中。使用VB集成開發環境“工程”菜單中的“引用”對話框,將其中的“MicrosoftActiveX Data Objects 2.6 Library”選中即可。
3)“添加查詢變量”窗口設計
該窗口設計如圖2所示:
圖2:“添加查詢變量”窗口
通過該窗口可以任意添加要查詢的變量,設計思路如下:
①在窗口初始化程序中,讀取數據庫標簽名描述文件,並將其顯示在“所有點列表”列表框中。
Private SubUserForm_Activate()
……
IfDir(VaribleFilePath) <> "" Then
OpenVaribleFilePath For Input As 1
Do While NotEOF(1)
Input #1, int1,str1, str2
ListBox1.AddItemstr1
Loop
Close
……
End Sub
其中VaribleFilePath為(wei) 數據庫標簽名描述文件所在的路徑。
②點擊“>”按鈕,將從(cong) “所有點列表”列表框中所選的查詢變量移到右邊“已選點列表”列表框中。
Private SubCommandButton1_Click()
Dim strtemp AsInteger
IfListBox1.ListIndex <> -1 Then
ListBox2.AddItemListBox1.Text
strtemp =ListBox1.ListIndex
ListBox1.RemoveItemstrtemp
……
End Sub
③點擊“<”按鈕,將從(cong) “已選點列表”列表框中所選的查詢變量移到左邊“所有點列表”列表框中。代碼與(yu) ②類似,不再贅述。
④點擊“確定”按鈕,將“已選點列表”列表框中的查詢變量逐一在數據庫標簽名描述文件中檢索出相應的iFIX數據庫管理器標簽名。
Private SubCommandButton4_Click()
……
Dim VaribleTemp()As String
Dim DecTemp() AsString
ReDim PreserveVaribleTemp(ListBox2.ListCount)
ReDim PreserveDecTemp(ListBox2.ListCount)
IfDir(VaribleFilePath) <> "" Then
i1 = 0
For i = 1 ToListBox2.ListCount
OpenVaribleFilePath For Input As 1
LabelTemp =ListBox2.List(i - 1)
Do While i1 = 0
Input #1, str1,str2, str3
If str2 = LabelTempThen
DecTemp(i) =str2
VaribleTemp(i) =str3
i1 = 1
End If
Loop
i1 = 0
Close #1
Form1.ListBox1.AddItemVaribleTemp(i)
Form1.ListBox2.AddItemDecTemp(i)
Next
…
End Sub
在這段程序代碼中,定義(yi) 了兩(liang) 個(ge) 字符串數組,字符串數組VaribleTemp()用於(yu) 存放要進行曆史數據查詢的iFIX數據標簽名,並賦值給主窗口Form1的列表框ListBox1;字符串數組DecTemp()用於(yu) 存放要進行曆史數據查詢的數據庫標簽名描述,並賦值給主窗口Form1的列表框ListBox2。
4)主窗體(ti) 的設計
“曆史數據查詢”主窗體(ti) 完成設置查詢起始時間、結束時間、查詢時間間隔和進行iFIX曆史數據庫的查詢功能。該窗口設計如圖3所示:
①向該窗體(ti) 加入日期時間控件DTPicker和表格控件SpreadSheet。
②點擊查詢按鈕,軟件將按照指定的已選擇的查詢變量進行數據查詢。在此按鈕下編寫(xie) 的代碼是報表程序的核心,包括以下部分:
I.對時間日期控件轉換成格式化字符串。
……
strStartTime =Format(Me.DTStartTime, "yyyy-MM-dd HH:mm:ss") ‘ 格式化起始時間
strEndTime =Format(Me.DTEndTime, "yyyy-MM-dd HH:mm:ss") ‘ 格式化結束時間
strInterval =Format(Me.Interval1.Value, "HH:MM:SS") ‘ 格式化時間間隔
圖3:曆史數據查詢窗口
II.與(yu) iFIX曆史數據庫連接.
…..
Dim conADO AsADODB.Connection ‘定義(yi) Connection類型的變量
Set conADO = NewADODB.Connection ‘創建新的Connection對象賦值給該變量
conADO.ConnectionString= "Provider=Microsoft OLE DB Provider for ODBC Drivers; " + _"DSN=FIX Dynamics Historical Data;UID=;PWD=;" ‘指定連接字符串
conADO.Open ‘使用Open方法打開連接
……
III.創建並返回記錄集,在表格控件SpreadSheet顯示結果。
Dim TagGroup() AsString ‘定義(yi) 字符串數組,用於(yu) 存放iFIX標簽名
ReDim PreserveTagGroup(ListBox1.ListCount)
For i1 = 1 ToListBox1.ListCount
TagGroup(i1) =Me.ListBox1.List(i1 - 1)
strQuery = "SELECTVALUE,DATETIME " + _ ‘選擇要查詢的字段
"FROM FIX " + _‘曆史數據庫節點名為(wei) Fix
"WHERE TAG = ‘" +TagGroup(i1) + "‘ " + _ ‘選擇要查詢的iFIX標簽
"AND INTERVAL = ‘"+ strInterval + "‘" + _ ‘選擇要查詢時間間隔
"AND (DATETIME>={ts ‘" + strStartTime + "‘} AND " + _ ‘查詢時間不小於(yu) 起始時間
"DATETIME <={ts‘" + strEndTime + "‘})" ‘查詢時間不大於(yu) 結束時間
Dim rsADO AsRecordset ‘定義(yi) Recordset類型的變量
Set rsADO = NewADODB.Recordset ‘創建新的Recordset對象賦值給該變量
rsADO.CursorLocation= adUseClient
rsADO.OpenstrQuery, conADO, adOpenDynamic, adLockUnspecified, -1
‘打開記錄集
IfrsADO.RecordCount <= 0 Then
MsgBox"該時間範圍無數據"
Set cnADO =Nothing
Set rsADO =Nothing
Exit Sub
End If
Me.Spreadsheet2.Range(Chr(Asc("B")+ (i1 - 1)) & "1") = Me.ListBox2.List(i1 - 1)
‘在表格控件第1行,第2列開始顯示要查詢變量的iFIX標簽名描述
For i = 1 TorsADO.RecordCount
Me.Spreadsheet2.Range("A"& (i + 1)) = rsADO!DateTime & ""
‘在表格控件第2行起,第1列顯示要查詢變量的日期時間。
If rsADO!Value& "" = "" Then
Me.Spreadsheet2.Range(Chr(Asc("B")+ (i1 - 1)) & (i + 1)) = "無數據"
Else
Me.Spreadsheet2.Range(Chr(Asc("B")+ (i1 - 1)) & (i + 1)) = rsADO!Value & ""
‘在表格控件第2行起,第2列起顯示該標簽查詢出的數據。
End If
rsADO.MoveNext
Next i
Set rsADO = Nothing‘釋放Recordset對象
Next i1
Set conADO =Nothing ‘釋放Connection對象
IV. 數據導出
點擊“導出”按鈕,將查詢到的數據導出成XML文件,可在Excel中打開。
Me.Spreadsheet2.Export
3.3在iFIX軟件中調用該程序
將編寫(xie) 好的軟件在VisualBasic 6.0中生成.EXE文件(例如iFix曆史數據查詢.exe),然後在iFIX中調用該程序。
Dim MyAppID
Dim appPath AsString
appPath =System.ProjectPath & "\APP\iFix曆史數據查詢.exe"
MyAppID =Shell(appPath, 0)
4結束語
本文探討了ADO技術在iFIX曆史報表中的應用,也可采用ADO技術設計實時報表,編程人員隻需具備一定VB知識即可實現。采用本文介紹的方法設計程序隻需經過簡單修改,就可移植到其它工程中。該方法優(you) 於(yu) 采用SQD和SQT連接數據庫,因為(wei) 采用後者連接數據庫不僅(jin) 需要在SQLLIB數據表中進行預先定義(yi) SQL語言,而且還需要在SCU配置文件中配置SQL帳戶。編程效率和程序執行效率比較低。康為(wei) 水泥閥