IFIX报表.docx
《IFIX报表.docx》由会员分享,可在线阅读,更多相关《IFIX报表.docx(11页珍藏版)》请在冰豆网上搜索。
![IFIX报表.docx](https://file1.bdocx.com/fileroot1/2023-1/2/f1932a32-4960-4e4e-9f58-86fbf8b73431/f1932a32-4960-4e4e-9f58-86fbf8b734311.gif)
IFIX报表
IFIX报表
编辑整理:
尊敬的读者朋友们:
这里是精品文档编辑中心,本文档内容是由我和我的同事精心编辑整理后发布的,发布之前我们对文中内容进行仔细校对,但是难免会有疏漏的地方,但是任然希望(IFIX报表)的内容能够给您的工作和学习带来便利。
同时也真诚的希望收到您的建议和反馈,这将是我们进步的源泉,前进的动力。
本文可编辑可修改,如果觉得对您有帮助请收藏以便随时查阅,最后祝您生活愉快业绩进步,以下为IFIX报表的全部内容。
IFIX报表
IFIX报表常规的做法是采用IFIX内嵌的VBA语言,借助于OFFICE自带的ACCESS和EXCEL来做的。
例如我们要在IFIX画面上通过点击一按钮来察看某一天的数据,假如这有三个模拟量如tag1,tag2,tag3,数据间隔一小时归一次档,它主要分为四步:
一、创建一个ACCESS数据库如ReportDataBase。
mdb,用来存放报表所需的数据。
然后就在这个数据库中建立一个表如ReporData,这样IFIX就能以一定的时间间隔将数据写入此数据库刚才创建的表中。
ReportData的结构如下:
字段名类型
日期日期/时间
tag1数值
tag2数值
tag3数值
二、创建ODBC数据源,用于IFIX与上步已建立的数据库和表进行联系。
方法:
控制面板->管理工具->ODBC数据源,打开ODBC数据源管理器,建立一个“系统DSN",点击“添加”,双击“MicrosoftAccessDrivers(*.mdb)”,出现“ODBCMicrosoftAccess安装"对话框。
数据源名:
MyReport注:
此名是任意的字符组合,但不能与数据库重名。
数据库:
ReportDataBase。
mdb,点击‘选择‘按钮选择第一步创建的Access数据库。
点击“完成”,退出控制面板
三、在IFIX中创建一个“基于时间的调度",如图
名称:
任意合法的字符组合
触发信息:
连续
间隔:
1小时
详细代码如下:
点击“VB编辑器“进入VB编辑器
在“工具”菜单—〉引用“MicrosoftActiveXDataObjectsx.xLibrary"
PrivateSubFixTimer3_OnTimeOut(ByVallTimerIdAsLong)
DimcnAsADODB。
Connection
DimresAsADODB。
Recordset
DimStrSQLAsString
Setcn=NewADODB.Connection
Setres=NewADODB.Recordset
cn。
ConnectionString=”DSN=MyReport;UID=;PWD=;"
//MyReport是数据源名称//
cn.Open
StrSQL="select*fromReportDatawhere日期=#”&Date&"#"
//ReportData是建立数据库中的表名//
res。
OpenStrSQL,cn,adOpenKeyset,adLockOptimistic
res.AddNew
res.Fields(0)=Date
res。
Fields
(1)=Fix32。
Fix。
tag1。
f_cv
res。
Fields
(2)=Fix32.Fix.tag2。
f_cv
res。
Fields(3)=Fix32.Fix.tag3。
f_cv
res。
Update
res.Close
Setres=Nothing
Setcn=Nothing
EndSub
另外,如果定义了主键,如上图,选择了
则res.Fields(0)不可用。
四、在IFIX画面上插入一个按钮。
按钮名称:
Cmdreport
PrivateSubCmdreport_Click()
UserForm2。
show
EndSub
再在”VB编辑器环境“下,插入一用户窗体.并且在工具—〉附加工具中选择日历控件11.0
在“工具"菜单—〉引用“MicrosoftActiveXDataObjects2.7Library”
“MicrosoftExcel9.0Library"
“取消”按钮的代码
PrivateSubCmdcancel_Click()
UnloadMe
EndSub
“确定”按钮的代码如下:
PrivateSubCmdOK_Click()
'OnErrorResumeNext
DimcnAsADODB.Connection
DimresAsADODB.Recordset
DimxlBookAsExcel.Workbook
DimxlsheetAsExcel.Worksheet
DimstrFileNameAsString
DimStrSQLAsString
DimiAsInteger
DimrowAsInteger
strFileName=”c:
\report。
xls"‘预先设计的报表显示模板文件
StrSQL="select*fromReportDatawhere日期=#"&Calendar1.Value&”#”
IfDir(strFileName)=””Then'判断文件是否存在,不存在则退出
MsgBox”报表模版文件不存在”
ExitSub
EndIf
Setcn=NewADODB.Connection
cn.ConnectionString="DSN=MyReport;UID=;PWD=;”
cn.Open
Setres=NewADODB。
Recordset
res.OpenStrSQL,cn,adOpenKeyset,adLockOptimistic
Ifres.RecordCount<=0Then
MsgBox”你要查询的数据不存在,可能已被删除”,vbInformation+vbOKOnly,”系统提示”
res。
Close
Setres=Nothing
cn。
Close
Setcn=Nothing
ExitSub
Else
res。
MoveFirst
SetxlBook=GetObject(strFileName)
Setxlsheet=xlBook。
Worksheets
(1)
xlBook.Application.Visible=True
xlsheet。
Cells(2,"n”)=CDate(res.Fields(0))
i=0
Whilei〈res。
RecordCount
Row=i+4
xlsheet。
Cells(row,"a")=res。
Fields
(1)
xlsheet。
Cells(row,"b")=res.Fields
(2)
xlsheet.Cells(row,"c”)=res.Fields(3)
i=i+1
res。
MoveNext
Wend
xlsheet。
PrintPreviewTrue
xlBook.Application.DisplayAlerts=False
xlBook。
Application.Quit
EndIf
EndSub
基于ADO技术的iFix历史报表的设计与实现
康为水泥阀
1引言
iFIX是全球最领先的HMI/SCADA自动化监控组态软件。
已有超过300,000套以上的软件在全球运行。
世界上许多最成功的制造商都依靠GEFanuc的iFIX软件来全面监控和分布管理全厂范围的生产数据。
iFIX软件内置功能强大的VBA脚本编译器,能实现复杂工程对软件的要求。
但是,因不同项目对历史数据报表要求不尽相同,而iFIX软件又没有提供针对历史数据报表的通用组件,通常实现报表的方法是使用第三方提供的组件(如:
水晶报表),因其封装功能较多,编程不够灵活,对于比较复杂的报表功能实现起来比较麻烦,而且需要在进行报表组态时单独购买。
ADO组件集成在VisualBasic6.0中,对于复杂的报表功能,采用ADO技术访问iFIX历史数据库实现报表非常灵活.
2ADO技术与iFIX历史数据库
2.1ADO技术
ADO(ActiveXDataObjects)是一个用于存取数据源的COM组件。
它是Microsoft新数据库访问技术,是建立在OLEDB之上的高层数据库访问技术。
ADO易于使用、高速度和较低的内存占有率的优点使得编程效率更高.
ADO常用的组件对象有:
ADODB。
Connection和ADODB.Recordset。
通过ADO组件对象访问数据库,基本操作流程是:
用Connection对象连接数据库,利用建立好的连接通过Connection、Command对象执行SQL命令,或利用Recordset对象取得结果记录集进行查询、处理。
2.2iFIX历史数据库
在iFIX安装时,iFIX安装程序会自动在工作站上建立两个系统数据源“FIXDynamicsHistoricalData”和“FIXDynamicsRealTimeData”。
“FIXDynamicsRealTimeData”数据源连接的是iFIX实时数据库;“FIXDynamicsHistoricalData”数据源连接的是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组件对象通过“FIXDynamicsHistoricalData"数据源查询iFIX历史数据库和将查询的结果显示出来。
1)建立数据库标签名描述文件
因iFIX历史数据库是按照TAG(数据库标签名)进行数据存储的,而标签名通常为字母以及编号组成,不便记忆,为了使报表更能直观显示,我们建立数据库标签名描述文件.该文件是一个文本文件,将每个标签名(与iFIX数据库管理器标签名相同)与该标签的描述对应起来,如图1所示:
图1:
数据库标签描述文件
2)配置软件开发环境,添加ActiveX控件及引用ADO对象库
本软件开发环境需要安装VisualBasic6.0和MicrosoftOffice组件。
进行报表查询需要在VB工程中插入时间控件(DTPicker)。
进行报表显示需要显示控件(SpreadSheet)。
要在VB工程中添加ActiveX控件,步骤如下:
打开工程→在“工程”菜单→选择“部件”→在“部件"对话框找到“MicrosoftOfficeXPWebComponents”和“MicrosoftWindowsCommonControls-2.6。
0”,选中选中相应复选框→点击确定。
这样就把ActiveX控件添加到了VB工具箱了。
在使用ADO对象之前,必须先将对象库引入当前工程中。
使用VB集成开发环境“工程”菜单中的“引用”对话框,将其中的“MicrosoftActiveXDataObjects2。
6Library”选中即可.
3)“添加查询变量"窗口设计
该窗口设计如图2所示:
图2:
“添加查询变量”窗口
通过该窗口可以任意添加要查询的变量,设计思路如下:
①在窗口初始化程序中,读取数据库标签名描述文件,并将其显示在“所有点列表”列表框中.
PrivateSubUserForm_Activate()
……
IfDir(VaribleFilePath)<>"”Then
OpenVaribleFilePathForInputAs1
DoWhileNotEOF
(1)
Input#1,int1,str1,str2
ListBox1.AddItemstr1
Loop
Close
……
EndSub
其中VaribleFilePath为数据库标签名描述文件所在的路径。
②点击“〉”按钮,将从“所有点列表"列表框中所选的查询变量移到右边“已选点列表”列表框中。
PrivateSubCommandButton1_Click()
DimstrtempAsInteger
IfListBox1.ListIndex<>—1Then
ListBox2.AddItemListBox1。
Text
strtemp=ListBox1.ListIndex
ListBox1.RemoveItemstrtemp
……
EndSub
③点击“〈”按钮,将从“已选点列表”列表框中所选的查询变量移到左边“所有点列表”列表框中.代码与②类似,不再赘述.
④点击“确定”按钮,将“已选点列表"列表框中的查询变量逐一在数据库标签名描述文件中检索出相应的iFIX数据库管理器标签名。
PrivateSubCommandButton4_Click()
……
DimVaribleTemp()AsString
DimDecTemp()AsString
ReDimPreserveVaribleTemp(ListBox2。
ListCount)
ReDimPreserveDecTemp(ListBox2。
ListCount)
IfDir(VaribleFilePath)〈〉””Then
i1=0
Fori=1ToListBox2.ListCount
OpenVaribleFilePathForInputAs1
LabelTemp=ListBox2。
List(i-1)
DoWhilei1=0
Input#1,str1,str2,str3
Ifstr2=LabelTempThen
DecTemp(i)=str2
VaribleTemp(i)=str3
i1=1
EndIf
Loop
i1=0
Close#1
Form1。
ListBox1.AddItemVaribleTemp(i)
Form1。
ListBox2。
AddItemDecTemp(i)
Next
…
EndSub
在这段程序代码中,定义了两个字符串数组,字符串数组VaribleTemp()用于存放要进行历史数据查询的iFIX数据标签名,并赋值给主窗口Form1的列表框ListBox1;字符串数组DecTemp()用于存放要进行历史数据查询的数据库标签名描述,并赋值给主窗口Form1的列表框ListBox2.
4)主窗体的设计
“历史数据查询”主窗体完成设置查询起始时间、结束时间、查询时间间隔和进行iFIX历史数据库的查询功能。
该窗口设计如图3所示:
①向该窗体加入日期时间控件DTPicker和表格控件SpreadSheet。
②点击查询按钮,软件将按照指定的已选择的查询变量进行数据查询。
在此按钮下编写的代码是报表程序的核心,包括以下部分:
I.对时间日期控件转换成格式化字符串。
……
strStartTime=Format(Me。
DTStartTime,”yyyy-MM—ddHH:
mm:
ss”)‘格式化起始时间
strEndTime=Format(Me.DTEndTime,"yyyy-MM-ddHH:
mm:
ss")‘格式化结束时间
strInterval=Format(Me。
Interval1。
Value,"HH:
MM:
SS")‘格式化时间间隔
图3:
历史数据查询窗口
II。
与iFIX历史数据库连接。
…..
DimconADOAsADODB.Connection‘定义Connection类型的变量
SetconADO=NewADODB.Connection‘创建新的Connection对象赋值给该变量
conADO。
ConnectionString="Provider=MicrosoftOLEDBProviderforODBCDrivers;”+_”DSN=FIXDynamicsHistoricalData;UID=;PWD=;"‘指定连接字符串
conADO。
Open‘使用Open方法打开连接
……
III。
创建并返回记录集,在表格控件SpreadSheet显示结果。
DimTagGroup()AsString‘定义字符串数组,用于存放iFIX标签名
ReDimPreserveTagGroup(ListBox1.ListCount)
Fori1=1ToListBox1.ListCount
TagGroup(i1)=Me.ListBox1.List(i1-1)
strQuery=”SELECTVALUE,DATETIME”+_‘选择要查询的字段
”FROMFIX"+_‘历史数据库节点名为Fix
”WHERETAG=‘”+TagGroup(i1)+”‘”+_‘选择要查询的iFIX标签
”ANDINTERVAL=‘"+strInterval+"‘"+_‘选择要查询时间间隔
"AND(DATETIME>={ts‘"+strStartTime+”‘}AND"+_‘查询时间不小于起始时间
”DATETIME〈={ts‘”+strEndTime+"‘})"‘查询时间不大于结束时间
DimrsADOAsRecordset‘定义Recordset类型的变量
SetrsADO=NewADODB。
Recordset‘创建新的Recordset对象赋值给该变量
rsADO。
CursorLocation=adUseClient
rsADO。
OpenstrQuery,conADO,adOpenDynamic,adLockUnspecified,-1
‘打开记录集
IfrsADO。
RecordCount<=0Then
MsgBox"该时间范围无数据”
SetcnADO=Nothing
SetrsADO=Nothing
ExitSub
EndIf
Me.Spreadsheet2.Range(Chr(Asc("B”)+(i1—1))&”1”)=Me.ListBox2。
List(i1-1)
‘在表格控件第1行,第2列开始显示要查询变量的iFIX标签名描述
Fori=1TorsADO。
RecordCount
Me。
Spreadsheet2.Range("A”&(i+1))=rsADO!
DateTime&""
‘在表格控件第2行起,第1列显示要查询变量的日期时间。
IfrsADO!
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列起显示该标签查询出的数据。
EndIf
rsADO。
MoveNext
Nexti
SetrsADO=Nothing‘释放Recordset对象
Nexti1
SetconADO=Nothing‘释放Connection对象
IV。
数据导出
点击“导出”按钮,将查询到的数据导出成XML文件,可在Excel中打开.
Me.Spreadsheet2.Export