基于OPC技术的WinCC实时数据归档
2015-12-15强明辉张琳琳马永炜
强明辉,张琳琳,马永炜
(兰州理工大学电气工程与信息工程学院,甘肃 兰州 730050)
0 引言
SIMATIC WinCC是由西门子公司和微软公司共同开发的一款功能强大的HMI/SCADA应用软件系统[1]。WinCC本身具有自己的归档数据库,但其进行归档后的数据库为压缩格式,需要通过WinCC专门集成的工具分析并显示数据,这为第三方的访问带来了很多不便。由于WinCC集成了OPC技术,所以可以对其进行二次开发。本文是利用VB编写OPC客户端,以WinCC作为OPC的服务器,利用OPC协议实现VB和OPC之间的动态数据交换,然后通过VB的ADO数据接口,把数据存储到数据库中。解决了WinCC实时数据转存到标准数据库的难题,为企业管理和监控系统提供了标准的数据源。
1 OPC技术
OPC是针对于不同供应厂商的设备和应用程序之间的软件接口标准化,使其间的数据交换更加简单化的目的而提出的。OPC技术将各个设备驱动程序和通讯程序封装成独立的OPC服务器,OPC客户端无需知道系统的性能特点,而只需通过标准的OPC接口访问OPC服务器[2-5]。
OPC的核心是COM/DCOM技术,COM技术是一种软件组件间相互数据交换的有效方法,COM对象分为客户端和服务器两类,客户端通过COM接口访问服务器。
OPC数据访问提供从数据源读取和写入特定数据的功能。OPC客户程序通过接口从服务器读取数据或写入数据。在OPC客户机访问服务器时,需要创建一个服务器对象,调用这个服务器对象的接口,服务器对象创建组对象并返回组对象的指针,客户程序获得组对象的指针后调用其接口。OPC客户程序访问服务器的结构图如图1。
2 WinCC与数据库的数据交换
2.1 WinCC与VB的数据交换
2.1.1 WinCC的OPC服务器设置
WinCC的OPC服务器设置需要分几步完成:
图1 OPC客户程序访问服务器结构图
1)在安装WinCC的时候需要安装OPC Server,具体方法是在安装选项的Communication组件中,选择OPC Server项。
2)对 WinCC的 OPC服务器进行DCOM设置。具体方法是单击“开始”菜单并选择“运行”,输入dcomcnfg,打开“组件服务”对话框;在此对话框中,单击“组件服 务”——“我 的 电 脑 ”——“DCOM配置”——选择“OPCServer.WinCC”——右键“属性”按钮,打开“OPCServer.WinCC 属性”对话框;在此对话框中,单击“安全”选项中自定义启动和激活权限,在“标识”标签中选择“交互式用户”选项。
3)在完成上述步骤以后,打开组态好的WinCC监控界面。参数设置界面如图2所示。
2.1.2 OPC客户端的设计及编程
利用Visual Basic开发OPC客户程序时,要对DLL进行注册。具体的方法是从VB菜单中选择“工程”——“引用”,在可用的引用一览表中,选择OPC Automation 2.0后按确定。
图2 WinCC人机界面显示
1)VB窗体设计
注册完DLL以后,就要设计VB的窗体。在窗体上添加两个Command按钮,分别命名为连接服务器和退出。根据项目要求,需同步传输23个数据,在窗体上布局23个Text控件会比较麻烦,本文采用编程的方式,在程序运行时,将23个Text控件同时显示在窗体上。部分代码如下:
Load Text1(I)//上载Text控件数组
Load Label1(I)//上载Label控件数组
Label1(I).Left=((I-1)10)*(Label1(1).Width+2000)+Label1(1).Left //Label控件的横坐标
Label1(I).Top=((I-1)Mod 10)*(Label1(1).Height+100)+Label1(1).Top//Label控件的纵坐标
Text1(I).Left=((I-1)10)*(Text1(1).Width+2200)+Text1(1).Left //Text控件的横坐标
Text1(I).Top=((I-1)Mod 10)*(Text1(1).Height+100)+Text1(1).Top//Text控件的纵坐标
Label1(I).Visible=True
Text1(I).Visible=True
VB窗体如图3。
图3 VB窗体设计
2)OPC客户端编程
VB的OPC客户端和OPC服务器之间数据互相通讯的主要源代码如下:
变量声明
Dim WithEvents objServer As OPCServer //OPC服务
Dim WithEvents objGroup As OPCGroup //OPC组
Dim objGroups As OPCGroups
Dim objTestGrp As OPCGroup
Dim objItems As OPCItems
Dim lClientHandles(23)As Long//客户句柄
Dim ServerHandles()As Long//服务器句柄
Dim lErrors()As Long
Dim ItemIDs(23)As String//OPC的标签
Dim vtItemValues()As Variant//用于存储OPC数据的地址
Dim a(1 To 23)As Variant
连接服务器
Set objServer=New OPCServer//创建新的OPC服务器
objServer.Connect("OPCServer.WinCC.1")
//连接OPC服务器
If objServer.ServerState=OPCRunning Then
Option1.Value=True//连接服务器成功的标志
添加OPC组和OPC标签
Set objGroups=objServer.OPCGroups//添加一个OPC组集合
Set objTestGrp=objGroups.Add("TestGrp")
//添加一个OPC组
Set objItems=objTestGrp.OPCItems//建立OPC标签集合
For I=1 To 23//生成23个项标识符
ItemIDs(I)="bb"&I
lClientHandles(I)=I
objItems.AddItems 23,ItemIDs,lClientHandles,ServerHandles,lErrors//添加OPC标签
断开服务器
objItems.Remove 23,ServerHandles,lErrors
//清除OPC的标签
objGroups.Remove"TestGrp"//清除 OPC 组
objServer.Disconnect//断开 OPC 的服务器
Set objItems=Nothing
Set objTestGrp=Nothing
Set objServer=Nothing
本程序是利用Timer1的Timer事件来进行数据更新的显示,如果数据有新的更新就要导入到数据库中,有关定时器的代码将在下面介绍。
2.2 VB与数据库的数据交换
当数据由WinCC传输到VB以后,由于VB不是一个存储单元,所以要将数据存储到指定的归档数据库中,以备报表查询。因为该项目的数据量不大,选用Access为归档数据库。
2.2.1 VB访问数据库的ADO接口
在VB中,常用的数据访问接口有下列几种:Active数据对象ADO,开放式数据库连接ODBC,远程数据库对象RDO,数据库访问对象DAO。其中ADO接口是Microsoft开发数据库应用程序面向对象的新接口。采用了OLE DB的数据访问模式,是数据访问对象DAO、远程数据对象RDO和开放数据库互联ODBC三种方式的扩展,具有更加简单、灵活的操作性能[6]。
ADO对象模型定义了一个可编程的分层对象集合,主要有三个对象成员Connection、Command和Recordset对象,以及几个集合对象Errors、Parameters和Fileds等组成。
2.2.2 VB利用ADO接口访问数据库
在VB使用ADO控件访问Access前,先要在Access中进行归档数据库环境设置。在Access中建立一个名为温度的数据库,并在该数据库的子目录中新建一张表,命名为现场温度记录,这张表用于存储从WinCC服务器中获得的现场温度数据。接着,在VB的开发环境下开发与数据库连接的程序,本次使用的VB控件主要是Timer和Adodc,相应的程序设计步骤如下。
1)建立VB与归档数据库链接。在VB中使用Adodc控件前,必须先对其进行设置,具体方法是:
首先,通过“工程”——“部件”菜单命令选择“Microsoft ADO Data Control 6.0(SP6)(OLEDB)”选项,将ADO数据控件添加到工具箱,点击ADO数据控件,将其添加到窗体上。
然后,设置Adodc2的ConnectionString属性,在Adodc2控件上右键“Adodc属性”——使用连接字符串——单击“生成”按钮——选择 Microsoft Jet 4.0 OLE DB Provider——单击“下一步”按钮——选择或输入数据库名称——单击“测试连接”按钮——弹出测试连接成功对话框—点击“确定”按钮即可。
最后,设置Adodc2的RecordSource属性,选择命令类型为2-adCmdTable,在表名项选择现场温度记录。
根据工艺要求,本项目需要同步传输23个数据,所以需要23个Text控件,这些控件是通过编程来显现在VB的窗体上的,对于这些控件的ADO属性设置,我们也需编程实现,部分代码如下:
Set Text1(I).DataSource=Adodc2'将所有 Text控件的 DataSource 属性设置为Adodc2
设置所有Text控件的DataFiled属性
For I=1 To 8
Text1(I).DataField="体热风"& I& "温度"
Next
For I=9 To 16
Text1(I).DataField="帽热风"&I-8&"温度"Next
Text1(17).DataField="体水槽温度"
Text1(18).DataField="体胶罐温度"
Text1(19).DataField="体胶液温度"
Text1(20).DataField="帽水槽温度"
Text1(21).DataField="帽胶罐温度"
Text1(22).DataField="帽胶液温度"
Text1(23).DataField="厂房温度"
2)实现实时数据的存储。在窗体上插入一个定时器控件,命名为Timer1,将其Interval属性设置为100,在Timer1_Timer()事件中编程。为了不产生冗余,建了一个数据缓冲数组,把每次提取出来的数据同之前的数据缓冲组中的值作对比,若不同就插入数据库,同时更新数据缓冲数组中的值。部分代码如下:
PrivateSub Timer1_Timer()
Dim Update As Boolean
Dim I As Integer
SyncRead OPCCache,vtItemValues,lErrors
//同步读取WinCC的数据
For I=1 To 23
If vtItemValues(I)<>a(I)Then//将OPC标签数组中的数和缓冲数组中的数进行对比
Update=True
Exit For
End If
Next
If Update Then
Adodc2.Recordset.AddNew//向 Access数据库中插入数据
Adodc2.Recordset.Fields("日期及时间")=Now//向 Access数据库中插入当前的日期和时间
For I=1 To 23
Text1(I).Text=vtItemValues(I)
a(I)=vtItemValues(I)
Next
Adodc2.Recordset.Update//保存插入到数据库中的数据
End If
End Sub
部分实时数据进入表后如图4。
图4 数据存入Access数据库
3 实时数据的查询
由图4可知,只要WinCC从下位机采集的这一组数据中的任何一个数据有变化,那么该组数据就会传入到数据库中。根据工艺要求可知,每个采集点的温度均有一定的范围,超过这个范围就会对设备或产品产生一定的损害,所以需建立一个查询,当温度高于该范围时,将其筛选出来,插入到该数据库的另外一个表中,供以后的分析。构造的SQL语句通式如下:
Insert into+“表名”+select+“选择内容”+from+“表名”+where+“条件”
建立查询的相关步骤如下:
1)在数据库温度中再建立一张新表,命名为查询温度,用来存储查询出来的超出范围的温度。
2)在VB窗体上再布局一个ADO控件,命名为Adodc1,将其的ConnectionString设置的与Adodc2一样,RecordSource属性设置为查询温度。然后编写代码:Adodc1.RecordSource="SQL语句"即可以进行相关的查询。
4 结束语
利用VB设计的OPC客户端数据接口,传输数据稳定,实时性好,能同时传输大批量数据。ADO数据库接口简单,传输稳定,实时性好,技术成熟。通过OPC技术和ADO接口有效地完成了WinCC到数据库转储功能。为企业进一步分析数据,利用数据,提供了可靠的数据源。
[1]甄立东.西门子 WinCC V7基础与应用[M].北京:机械工业出版社,2011.
[2]日本OPC协会.OPC应用程序入门[M].日本:2002.
[3]韦源,于平.Visual Basic程序设计基础[M].北京:清华大学出版社,2001.
[4]朱翠苗,郑广成.VB访问SQL Server数据库的几种方案[J].河南科技大学学报,2004,3(25):66-69.
[5]林启宽.用 VB开发 WinCC的OPC客户机[J].工业控制计算机,2006,19(8):80-81.
[6]赵秀梅.基于WinCC工控组态软件的关系数据库的研究[J].微型机与应用,2010,29(6):1-2.