

基于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为数据库标签名描述文件所在的路径。
②点击“>”按钮,将从“所有点列表”列表框中所选的查询变量移到右边“已选点列表”列表框中。
Private SubCommandButton1_Click()
Dim strtemp AsInteger
IfListBox1.ListIndex <> -1 Then
ListBox2.AddItemListBox1.Text
strtemp =ListBox1.ListIndex
ListBox1.RemoveItemstrtemp
……
End Sub
③点击“<”按钮,将从“已选点列表”列表框中所选的查询变量移到左边“所有点列表”列表框中。代码与②类似,不再赘述。
④点击“确定”按钮,将“已选点列表”列表框中的查询变量逐一在数据库标签名描述文件中检索出相应的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
在这段程序代码中,定义了两个字符串数组,字符串数组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") ‘ 格式化时间间隔
图3:历史数据查询窗口
II.与iFIX历史数据库连接.
…..
Dim conADO AsADODB.Connection ‘定义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 ‘定义字符串数组,用于存放iFIX标签名
ReDim PreserveTagGroup(ListBox1.ListCount)
For i1 = 1 ToListBox1.ListCount
TagGroup(i1) =Me.ListBox1.List(i1 - 1)
strQuery = "SELECTVALUE,DATETIME " + _ ‘选择要查询的字段
"FROM FIX " + _‘历史数据库节点名为Fix
"WHERE TAG = ‘" +TagGroup(i1) + "‘ " + _ ‘选择要查询的iFIX标签
"AND INTERVAL = ‘"+ strInterval + "‘" + _ ‘选择要查询时间间隔
"AND (DATETIME>={ts ‘" + strStartTime + "‘} AND " + _ ‘查询时间不小于起始时间
"DATETIME <={ts‘" + strEndTime + "‘})" ‘查询时间不大于结束时间
Dim rsADO AsRecordset ‘定义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软件中调用该程序
将编写好的软件在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知识即可实现。采用本文介绍的方法设计程序只需经过简单修改,就可移植到其它工程中。该方法优于采用SQD和SQT连接数据库,因为采用后者连接数据库不仅需要在SQLLIB数据表中进行预先定义SQL语言,而且还需要在SCU配置文件中配置SQL帐户。编程效率和程序执行效率比较低。康为水泥阀