内容 |
1 前言
目前国内闸门监控系统设计的方案基本上是PLC+上位机模式,而上位监控软件大多是购买现成的集成系统和商业组态软件来实现的。但在缺少资金的情况下要进行小型项目自动化建设或改造,就不得不考虑成本问题,因为组态软件是按点数卖钱的,定义一个变量就算一个点,价格昂贵。而采用高级语言结合OPC技术开发监控软件不仅可以节省大量的成本而且可以摆脱对设备驱动程序的依赖,尤其是在对老项目进行自动化改造时,这种优势更加明显。
机遇以上考虑,笔者在参与安徽淮河流域某小型闸门自动化改造工程时,采用了Visual Basic 6.0开发环境,应用OPC自动化接口技术开发了OPC客户端程序(闸门监控系统的监控软件)。服务器采用凯谱华的 KEPServerEx.V4。她嵌入了工业市场上广泛范围(超过80多种支持100种以上设备型号的可下载驱动程序)的驱动程序和组件 ,更重要的是,这个服务器是完全免费的。
2 OPC知识简介
2.1 OPC基本概念
OPC是OLE for Process Control的缩写,即把OLE应用于工业控制领域。OPC建立在OLE规范之上,它为工业控制领域提供了一种标准的数据访问机制。
OPC技术采用COM/DCOM技术的客户/服务器(Client/Server)模型,使OPC的通用性得到扩展。相应的OPC应用程序的开发就有了OPC客户端程序部分和OPC服务器程序部分的开发。一般来说,OPC服务器程序由硬件的生产厂商开发;而OPC客户端程序由用户开发。
2.2 OPC结构原理
2.2.1 OPC基本体系结构
OPC规范提供了两套接口方案,即COM接口和自动化。COM接口效率高,通过该接口,客户能够发挥OPC服务器的最佳性能,采用C++语言的客户一般用COM接口方案;自动化接口使用解释性和宏语言访问OPC服务器,采用Visaul Basic语言的客户一般采用自动化接口。典型的OPC体系如下图所视:
 图1 典型OPC体系机构图
Figure1 OPC architecture
2.2.2 OPC自动化服务器对象模型
OPC自动化服务器对象的组织是层次结构,其对象模型如图5-1所示:

图2 OPC 自动化服务器对象模型
Figure2 Automation Object Hierarchy 服务器对象(Server)拥有服务器的所有信息,同时也是组对象(Group)的容器。OPC组对象(Group)提供了OPC客户程序用来组织数据的一种方法。在每个组对象中,客户可以加入多个OPC数据项(Item)。OPC数据项(Item)是服务器端定义的对象,通常指向设备的一个寄存器单元。OPC客户对设备寄存器的操作都是通过其数据项来完成的,通过OPC数据项(Item),OPC规范尽可能地隐藏了设备的特殊信息,也使OPC服务器的通用性大大增强。OPC数据项(Item)并不提供对外接口,客户不能直接对之进行操作,所有的操作都是通过组对象进行的。每个OPC数据项(Item)的数据结构包括三个成员变量:即数据值、数据质量和时间戳。数据值是以Variant形式表示的。一个OPC服务器中只能有一个OPC浏览器对象,而且它是可选的。OPC浏览器对象是为了让客户程序可以浏览到OPC服务器的配置而设计的,它把OPC服务器上可用的东西显示给用户。
2.2.3 OPC技术优势
一个完整的基于OPC技术的监控系统由OPC客户端程序和OPC服务器程序组成,实际上实现了用户和设备供应商开发监控系统的分工。利用OPC技术实际上就等于客户端程序不用直接从硬件上读取数据,而是直接从OPC服务器上读取数据,设计OPC服务器程序的厂商已经完成了OPC服务器程序与硬件设备的数据存取。而且任意的OPC服务器的接口是标准统一的,这使得客户程序能用一种标准的方法去访问任意厂商的OPC服务器程序。每个用户就不必各自开发和硬件的通信程序,就可以直接读取OPC服务器的数据,提高了代码的重用性。也就是说OPC客户端程序一旦开发成功了,就可以应用到任意一个带有OPC服务器的监控系统中。OPC技术将监控系统的复杂性大大地简化后,软件开发的周期也大大缩短了,用户就可以不需要购买比较昂贵的商业组态软件而独立开发OPC客户端程序。
3 客户端监控程序开发
3.1引用OPC自动化接口
建立新工程或项目,在“工程”菜单下选择“引用”,如图5-3所示。只有引用OPCDAAuoto.DLL后,在程序中才能创建服务器对象,然后进行一系列的操作。

图3 打开引用对话框
Figure3 Open Reference Dialog
(2)在弹出的引用窗口里单击“浏览(B)…”按钮,弹出添加引用窗口,选择OPCDAAuoto.DLL文件。
(3)在引用窗口里的OPC Automation 2.0前面打钩,按“确定”按钮。如图5-4所示:

图4 选择引用项目
Figure4 Select Reference Item
3.2程序开发
3.2.1定义全局变量
变量类型应该指定为对象型。这些对象最好在窗体的通用部分声明加上“Option Explicit”语句,表示模块里的所有变量都需要显式声明。由于OPC自动化接口的数组的索引要求必须从1开始,而系统默认是从0开始,为了避免错误最好在代码的最初加上“Option Base 1”语句。为了使对象可以处理事件,必须将myTestGrp和myServer的声明中加上“WithEvents”语句,表示声明的对象可以响应事件。
Option Explicit Option Base 1 Dim WithEvents myServer As OPCServer Dim myGroups As OPCGroups Dim WithEvents myTestGrp As OPCGroup Dim myItems As OPCItems 3.2.2连接OPC服务器和建立OPC组主要程序 连接子程序: Sub Connect(strProgID As String, Optional strNode As String) If myServer Is Nothing Then ' 建立一个OPC服务器对象 Set myServer = New OPCServer End If If myServer.ServerState = OPCDisconnected Then ' 连接OPC服务器 myServer.Connect strProgID, strNode End If 在Visual Basic中,通过执行一个Set操作实现调用其它接口的方法。 If myGroups Is Nothing Then ' 建立一个OPC组集合 Set myGroups = myServer.OPCGroups End If If myTestGrp Is Nothing Then ' 添加一个OPC组 Set myTestGrp = myGroups.Add("Group") End If End Sub ServerState属性一共有OPCRunning、OPCFailed、OPCNoconfig、OPCSuspended、OPCTest和OPCDisconnected六个,分别表示正在运行、失败、没有配置、暂停、测试和没有连接六种OPC服务器当前的状态。如果OPC服务器没有连接,我们才执行myServer.Connect strProgID, strNode语句。strProgID就是ProgID,strNode就是用于远程通信的IP地址。 在窗口登陆时调用连接子程序,便可以连接到你需要的服务器。 Call Connect("KEPware.KEPServerEx.V4")
3.2.3添加OPC标签
对服务器进行访问前,必须先在OPC组里添加要访问的OPC标签。为了编程方便,在服务器端,将每个闸门的升、降、停止、开度、水位、流量 等监控量组态为TAGI(I=1,2…15)
Sub AddItem() Dim strItemIDs(15) As String Dim lClientHandles(15) As Long Dim lErrors() As Long Dim I As Integer myTestGrp.IsSubscribed = True ' 启动组异步通知。 Set myItems = myTestGrp.OPCItems ' 建立OPC项集合 For I = 1 To 15 ' 生成从TAG1到TAG15的项标识符 strItemIDs(I) = "Server.Group.TAG" & I lClientHandles(I) = I Next Call myItems.AddItems(15, strItemIDs, lClientHandles, lServerHandles, lErrors) End Sub ' 添加OPC项 3.2.4异步读取代码的实现 在定时器事件内进行执行AsyncRead子程序的读取代码 Sub AsyncRead() Dim lErrors() As Long If myTestGrp Is Nothing Then Exit Sub End If If myTestGrp.OPCItems.Count > 0 Then ' 异步读取 lTransID_Rd = lTransID_Rd + 1 myTestGrp.AsyncRead 15, lServerHandles, lErrors, lTransID_Rd, lCancelID_Rd End If End Sub AsyncWrite子程序,完成异步写的操作。 Sub AsyncWrite(nIndex As Integer, ByRef vtItemValues() As Variant, _ ByRef lErrors() As Long) Dim lHandle(1) As Long If myTestGrp Is Nothing Then Exit Sub End If If myTestGrp.OPCItems.Count > 0 Then lHandle(1) = lServerHandles(nIndex) ' 异步写入 lTransID_Wt = lTransID_Wt + 1 myTestGrp.AsyncWrite 1, lHandle(), vtItemValues, _ lErrors, lTransID_Wt, lCancelID_Wt End If End Sub
3.2.5断开OPC服务器
连接着OPC服务器的OPC客户应用程序,在退出前必须断开和OPC服务器的连接。断开连接前要清除 项和组.
Sub Disconnect() Dim lErrors() As Long If Not myItems Is Nothing Then If myItems.Count > 0 Then myItems.Remove 15, lServerHandles, lErrors ' 清除OPC项 End If Set myItems = Nothing End If If Not myTestGrp Is Nothing Then myGroups.Remove "Group"' 清除OPC组 Set myTestGrp = Nothing End If If Not myGroups Is Nothing Then Set myGroups = Nothing End If If Not myServer Is Nothing Then If myServer.ServerState <> OPCDisconnected Then myServer.Disconnect' 断开OPC服务器. End If Set myServer = Nothing End If End Sub
4 结论
OPC技术应用于工业控制领域,大大的突破了传统设备的概念,通过一个接口标准(规范)方便的将现场任何一个符合OPC规范的设备数据收集与处理,从而摆脱了传统上的编写驱动程序的重复劳动,使工程人员在设备选择上有了更大的自主性。
随着组态软件的发展,监控系统开发越来越“傻瓜化”,只需要简单的连接就可以完成一个工程的基本组态,然而,一旦面临对组态软件中没有的设备时,就无能为力了。在项目改造过程中,这种情况尤为明显。 在面临大量诸如小型水利闸门监控系统一样的各种小型工业监控系统改造的情况下,应用OPC不仅可以大大的节约系统开发的时间,而且也能充分利用现有设备,节省开支。可以说,在小型工控系统改造中,OPC技术结合高级语言开发监控软件将具有很大的优势。
【参考文献】 【1】 OPC Foundation. Data Access Custom Interface Standard Specification 2.0[S],1998.10.14. 【2】 詹根基,郭厚焜.基于OPC的客户端监控程序的开发.自动化博览,2005,Vol.22增刊 (9):105-1 【3】 范逸之.Visual Basic 与分布监控系统——RS232/485串行通信,清华大学出版社,2002 【4】 马国华.监控组态软件及其应用,清华大学出版社,2002 【5】 潘爱民.COM原理与应用,清华大学出版社,2000
|