注入站控制系统基于数据库的报表解决方案研究
2020-01-20贺明庆
贺明庆
(大庆油田第一采油厂仪表安装维修大队,黑龙江 大庆 163453)
1 工艺流程及主要测控点
目前,油田配注系统普遍采用“集中配置,分散注入”的工艺流程,即一个配置站对应多个注入站。其过程是在配置站将化学药剂与清水按照一定比例混合,制成符合浓度要求的母液,母液经过熟化后,由外输泵输送至各个注入站,在注入站按照每口井的配比方案加入清水,然后,注入井下。
注入站工艺流程为:上游配置站输送来的母液进入母液储罐,经柱塞泵增压后被输送到母液汇管中,再经过单井母液调节阀进入混合器。注水站来的清水经过单井清水调节器进入混合器,在这里与母液充分混合后被注入井下。
注入站的测控参数主要包括母液储罐液位、柱塞泵进出口压力、单井压力、单井清水流量等。
2 基本原理
采用“VBA+数据库”的方案实现报表查询。VBA(Visual Basic for Application)是新一代标准宏语言,是基于Visual Basic for Windows发展而来的,语言简单易学,功能强大。
VBA是VB的应用程序版本,必须依赖于已有的应用程序,不能独立运行。目前,WIinCC、FactoryTalk View Studio、Ifix等主流组态软件都支持VBA编程。
具体过程是利用组态软件SE的数据记录功能建立数据记录模型,将需要的数据采集并存储在ODBC指定的数据库中。当操作员查询报表时,选择日期后,按下查询按钮,即执行VBA代码,将数据库中的数据读出来,并写入报表模板中,生成指定日期的生产数据报表。
3 报表开发过程
3.1 添加HMI标签
展开HMI服务器的“HMI标签”,右键点击“标签”,点击“打开”,在打开的标签窗口中点击“新建”,在标签名称栏中输入标签名“DayReport_Date”,类型选择“字符串”,数据源类型选择“内存”,点击“接受”,保存标签。
3.2 添加ActiveX控件引用
ActiveX控件是一种基于COM接口的控件,通常不能独立使用,只能在宿主程序中运行,支持COM接口规范的编程环境均可使用它。在报表查询画面中,需要使用日历控件,必须提前在“Visual Basic编辑器”中添加ActiveX控件引用。打开SE,点击“视图”,选择“Visual Basic编辑器”。在打开的窗口中点击“工具”,选择“引用”,在列表栏中勾选“MicroSoft Calender control 2007”,点击“确定”,保存设置。
3.3 创建并组态画面
打开SE的应用项目浏览器窗口,展开HMI服务器的“图形”,右键点击“显示”,选择“新建”,创建画面“Report”。打开画面“Report”,添加日历控件、按钮、文本、字符串等对象。将日历控件的“Value”属性及字符串的表达式属性与“DayReport_DATE”标签相关联,并设置字体、颜色等其他相关属性。
3.4 设计报表模板
根据生产岗位的需求,采用Micosoft Office Excel 2007设计报表模板“日报表.xlsx”。并将报表模板文件存储在“D:模板”路径下备用(此路径应与VBA代码中指定的路径一致)。
3.5 设置数据记录
展开HMI服务器的“数据记录”,右键点击“数据记录模型”,点击“新建”,打开数据记录模型的设置窗口。点击“设置”标签,选择“ODBC数据库”,点击“ODBC数据源”;选择“系统数据源”标签,点击“新建”;选择“系统数据源”,点击“下一步”;选择“Micosoft Access Driver(⋆.mdb ⋆.accdb)”,点击“完成”;弹出的“ODBC Micosoft Access 安装”窗口,在“数据源名”栏中输入“Report”,点击“创建”按钮,选择保存数据库的位置,在“数据库名”栏中输入“Report”,点击“确定”。点击“创建表”标签,在数据库中创建表“FloatTable”“StringTable”“TagTa ble”。点击“路径”标签,勾选“启用ODBC备用路径”。点击“文件管理”标签,设置清除ODBC数据库中保存旧记录的天数。点击“记录触发器”标签,勾选“周期性”,根据需求,在“间隔”栏中设置数据采集周期。点击“模型中的标签”标签,添加需要记录的数据标签。
3.6 编制 VBA程序
(1)通用中代码
Option Explicit
Public MyTagGroup As TagGroup
Dim sDateTag As Tag
Public gS_DBPath As String
Public gO_Connection As ADODB.Connection
(2)页面初始化代码
Private Sub Display_AnimationStart()
gS_DBPath = “Provider=Microsoft.ACE.OLEDB.12.0;Data Source=D:dataDatabase1.accdb;”
Set gO_Connection = New ADODB.Connection
gO_Connection.CursorLocation = adUseClient
gO_Connection.Open gS_DBPath
If MyTagGroup Is Nothing Then
Set MyTagGroup=Application.CreateTagGroup(Me.AreaName)
MyTagGroup.Add “DayReport_DATE”
Set sDateTag = MyTagGroup.Item(“DayReport_DATE”)
If sDateTag.Value = “” Then
sDateTag.Value = Format(Now, “yyyy-mm-dd”)
End If
End If
End Sub
(3)查询按钮部分代码
Private Sub 按钮 3_Released()
Dim sSql As String
Dim rsData As New ADODB.Recordset
Dim i As Integer
Dim ExcelID As Excel.Application
Dim rptName As String
Dim sDate As String
If sDateTag.Value =“”Then
sDate = Format(Now, “yyyy-mm-dd”)
Else
sDate = sDateTag.Value
End If
Set ExcelID = New Excel.Application
ExcelID.Workbooks.Open (“d: 模 板 日 报 表.xlsx”)
ExcelID.Worksheets(1).Activate
sSql = “select ⋆ from tagtable inner join floattable on tagtable.tagindex = floattable.tagindex where tagtable.tagName like ‘%MBFT%ACC%’ and floattable.dateandtime in (select min(dateandtime) from floattable where floattable.dateandtime between #” +CStr(DateAdd(“d”, -1, sDate)) + “ 10:00:00# and #+ CStr(DateAdd(“d”, -1, sDate)) + “ 10:05:00#)order by tagtable.tagindex desc”
rsData.Open sSql, gO_Connection, adOpenKeyset,adLockReadOnly
For i = 0 To rsData.RecordCount - 1
ExcelID.Cells(i + 7, 11) = Format(rsData.Fields(“val”), “###0.00”) ‘ 将 结 果 集 记 录 写 入Excel
rsData.MoveNext
Next i
rsData.Close: Set rsData = Nothing
ExcelID.DisplayAlerts = False
rptName =“D:data”+Format(DateAdd(“d”,1, sDate), “yyyy-mm-dd”)+“日报表 .xlsx”
ExcelID.ActiveWorkbook.SaveAs rptName
ExcelID.ActiveWorkbook.Close
ExcelID.Quit: Set ExcelID = Nothing
End Sub
4 结语
采用“VBA+数据库”的方式实现报表功能,比单纯使用VBA开发报表的方式更为简单灵活,但应当注意的是,采用Office Access数据库,当数据记录达到数万条时,查询效率较低,有时需要一两分钟,甚至出现系统无响应的情况。为了提高查询效率,也可以采用Micosoft SQL数据库,原理相同,只需对数据库连接的代码略作改动,并添加相应的ODBC数据源即可,此处不再赘述。