

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