摘 要:本文介紹了采用ADO技術實現iFix歷史報表的實際應用。上位機采用組態軟件iFix3.5,通過Visual Basic 6.0作為開發工具,采用ADO技術設計實現基于iFix的歷史報表功能的程序,采用本文介紹的方法設計的報表應用程序具有普遍性,通過簡單設置可移植到其它工程中。
關鍵詞:ADO;iFix; 歷史報表;Visual Basic
Abstract:Introduce how to design the history data report used ADO technology for iFix software. The iFix3.5 is as the configuration software in the upper computer and the Visual Basic 6.0 is as the development tool。The history data report software is designed by ADO component. Using the method to design report program can fit to any iFix project .the software can be applicated other projects through simple setting.
Key words: ADO;iFix; History Report;Visual Basic
1 引言
iFIX是全球最領先的HMI/SCADA自動化監控組態軟件。,已有超過300,000套以上的軟件在全球運行。世界上許多最成功的制造商都依靠 GE Fanuc的iFIX軟件來全面監控和分布管理全廠范圍的生產數據。iFIX 軟件內置功能強大的VBA腳本編譯器,能實現復雜工程對軟件的要求。但是,因不同項目對歷史數據報表要求不盡相同,而iFIX軟件又沒有提供針對歷史數據報表的通用組件,通常實現報表的方法是使用第三方提供的組件(如:水晶報表),因其封裝功能較多,編程不夠靈活,對于比較復雜的報表功能實現起來比較麻煩,而且需要在進行報表組態時單獨購買。ADO組件集成在Visual Basic 6.0中,對于復雜的報表功能,采用ADO技術訪問iFIX歷史數據庫實現報表非常靈活。
2 ADO技術與iFIX歷史數據庫
2.1 ADO 技術
ADO (ActiveX Data Objects) 是一個用于存取數據源的COM組件。它是Microsoft新數據庫訪問技術,是建立在OLE DB之上的高層數據庫訪問技術。ADO易于使用、高速度和較低的內存占有率的優點使得編程效率更高。
ADO常用的組件對象有:ADODB.Connection和ADODB.Recordset。通過ADO 組件對象訪問數據庫,基本操作流程是:用Connection對象連接數據庫,利用建立好的連接通過Connection、Command對象執行SQL命令,或利用Recordset對象取得結果記錄集進行查詢、處理。
2.2 iFIX歷史數據庫
在iFIX安裝時,iFIX安裝程序會自動在工作站上建立兩個系統數據源“FIX Dynamics Historical Data”和“FIX Dynamics Real Time Data”。 “FIX Dynamics Real Time Data”數據源連接的是iFIX實時數據庫;“FIX Dynamics Historical Data” 數據源連接的是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組件對象通過“FIX Dynamics Historical Data”數據源查詢iFIX歷史數據庫和將查詢的結果顯示出來。
1)建立數據庫標簽名描述文件
因iFIX歷史數據庫是按照TAG(數據庫標簽名)進行數據存儲的,而標簽名通常為字母以及編號組成,不便記憶,為了使報表更能直觀顯示,我們建立數據庫標簽名描述文件。該文件是一個文本文件,將每個標簽名(與iFIX數據庫管理器標簽名相同)與該標簽的描述對應起來,如圖1所示:
[align=center]

圖1:數據庫標簽描述文件[/align]
2)配置軟件開發環境,添加ActiveX控件及引用ADO對象庫
本軟件開發環境需要安裝Visual Basic 6.0和Microsoft Office組件。進行報表查詢需要在VB工程中插入時間控件(DTPicker)。進行報表顯示需要顯示控件(SpreadSheet)。要在VB工程中添加ActiveX控件,步驟如下:打開工程→在“工程”菜單→選擇“部件” →在“部件”對話框找到“Microsoft Office XP Web Components”和“Microsoft Windows Common Controls-2.6.0”,選中選中相應復選框→點擊確定。這樣就把ActiveX控件添加到了VB工具箱了。
在使用ADO對象之前,必須先將對象庫引入當前工程中。使用VB集成開發環境“工程”菜單中的“引用”對話框,將其中的“Microsoft ActiveX Data Objects 2.6 Library”選中即可。
3)“添加查詢變量”窗口設計
該窗口設計如圖2所示:
[align=center]

圖2:“添加查詢變量”窗口[/align]
通過該窗口可以任意添加要查詢的變量,設計思路如下:
①在窗口初始化程序中,讀取數據庫標簽名描述文件,并將其顯示在“所有點列表”列表框中。
Private Sub UserForm_Activate()
……
If Dir(VaribleFilePath) <> "" Then
Open VaribleFilePath For Input As 1
Do While Not EOF(1)
Input #1, int1, str1, str2
ListBox1.AddItem str1
Loop
Close
……
End Sub
其中VaribleFilePath為數據庫標簽名描述文件所在的路徑。
②點擊“>”按鈕,將從“所有點列表”列表框中所選的查詢變量移到右邊“已選點列表”列表框中。
Private Sub CommandButton1_Click()
Dim strtemp As Integer
If ListBox1.ListIndex <> -1 Then
ListBox2.AddItem ListBox1.Text
strtemp = ListBox1.ListIndex
ListBox1.RemoveItem strtemp
……
End Sub
③點擊“<”按鈕, 將從“已選點列表”列表框中所選的查詢變量移到左邊“所有點列表”列表框中。代碼與②類似,不再贅述。
④點擊“確定”按鈕,將“已選點列表”列表框中的查詢變量逐一在數據庫標簽名描述文件中檢索出相應的iFIX數據庫管理器標簽名。
Private Sub CommandButton4_Click()
……
Dim VaribleTemp() As String
Dim DecTemp() As String
ReDim Preserve VaribleTemp(ListBox2.ListCount)
ReDim Preserve DecTemp(ListBox2.ListCount)
If Dir(VaribleFilePath) <> "" Then
i1 = 0
For i = 1 To ListBox2.ListCount
Open VaribleFilePath For Input As 1
LabelTemp = ListBox2.List(i - 1)
Do While i1 = 0
Input #1, str1, str2, str3
If str2 = LabelTemp Then
DecTemp(i) = str2
VaribleTemp(i) = str3
i1 = 1
End If
Loop
i1 = 0
Close #1
Form1.ListBox1.AddItem VaribleTemp(i)
Form1.ListBox2.AddItem DecTemp(i)
Next
…
End Sub
在這段程序代碼中,定義了兩個字符串數組,字符串數組VaribleTemp()用于存放要進行歷史數據查詢的iFIX數據標簽名,并賦值給主窗口Form1的列表框ListBox1;字符串數組DecTemp()用于存放要進行歷史數據查詢的數據庫標簽名描述,并賦值給主窗口Form1的列表框ListBox2。
4)主窗體的設計
“歷史數據查詢”主窗體完成設置查詢起始時間、結束時間、查詢時間間隔和進行iFIX歷史數據庫的查詢功能。該窗口設計如圖3所示:
① 向該窗體加入日期時間控件DTPicker和表格控件SpreadSheet。
② 點擊查詢按鈕,軟件將按照指定的已選擇的查詢變量進行數據查詢。在此按鈕下編寫的代碼是報表程序的核心,包括以下部分:
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") ‘ 格式化時間間隔
[align=center]

圖3:歷史數據查詢窗口[/align]
II. 與iFIX歷史數據庫連接.
…..
Dim conADO As ADODB.Connection ‘定義Connection類型的變量
Set conADO = New ADODB.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() As String ‘定義字符串數組,用于存放iFIX標簽名
ReDim Preserve TagGroup(ListBox1.ListCount)
For i1 = 1 To ListBox1.ListCount
TagGroup(i1) = Me.ListBox1.List(i1 - 1)
strQuery = "SELECT VALUE,DATETIME " + _ ‘選擇要查詢的字段
"FROM FIX " + _ ‘歷史數據庫節點名為Fix
"WHERE TAG = ‘" + TagGroup(i1) + "‘ " + _ ‘選擇要查詢的iFIX標簽
"AND INTERVAL = ‘" + strInterval + "‘" + _ ‘選擇要查詢時間間隔
"AND (DATETIME >={ts ‘" + strStartTime + "‘} AND " + _ ‘查詢時間不小于起始時間
"DATETIME <={ts ‘" + strEndTime + "‘})" ‘查詢時間不大于結束時間
Dim rsADO As Recordset ‘定義Recordset類型的變量
Set rsADO = New ADODB.Recordset ‘創建新的Recordset對象賦值給該變量
rsADO.CursorLocation = adUseClient
rsADO.Open strQuery, conADO, adOpenDynamic, adLockUnspecified, -1
‘打開記錄集
If rsADO.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 To rsADO.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軟件中調用該程序
將編寫好的軟件在Visual Basic 6.0中生成.EXE文件(例如iFix歷史數據查詢.exe),然后在iFIX中調用該程序。
Dim MyAppID
Dim appPath As String
appPath = System.ProjectPath & "\APP\iFix歷史數據查詢.exe"
MyAppID = Shell(appPath, 0)
4 結束語
本文探討了ADO技術在iFIX歷史報表中的應用,也可采用ADO技術設計實時報表,編程人員只需具備一定VB知識即可實現。采用本文介紹的方法設計程序只需經過簡單修改,就可移植到其它工程中。該方法優于采用SQD和SQT連接數據庫,因為采用后者連接數據庫不僅需要在SQLLIB數據表中進行預先定義SQL語言,而且還需要在SCU配置文件中配置SQL帳戶。編程效率和程序執行效率比較低。
參考文獻:
[1] GE Intellution公司.iFIX電子書.
[2] 王棟. Visual Basic 6.0程序開發實例教程[M].清華大學出版社