基于COM的OPC技术研究及其接口实现
2008-10-09
作者:李 勤 党选举
摘 要: 介绍了微软" title="微软">微软的COM(DCOM)结构及在此基础上建立的OPC技术规范,具体分析了OPC的结构,并对OPC接口实现进行了详尽的论述。
关键词: COM DCOM OPC OPC接口 OPC服务器
从计算机技术介入工业应用领域开始,伴生的“信息孤岛”问题就一直困绕着业界。“信息孤岛”相当严重地限制了信息交换继而约束了应用领域的拓展。作为开放控制网络的现场总线,虽然能实现现场设备之间、现场设备与控制室之间的通信,但是如此多的总线采用不同的协议,而没有形成一个统一的系统平台。正是在这种背景下,产生了OPC技术。
1 COM(DCOM)和OPC技术
随着计算机硬件和软件的飞速发展,计算机应用的功能愈为强大、实现愈为灵活的同时,软件业也因软件的大而复杂、应用是单一集成或不易被集成、操作系统的模块化不充分、不统一的开发方式而面临着严峻的挑战。
长期以来,设计者曾用面向对象" title="面向对象">面向对象程序设计方法来解决传统软件开发的问题。但随着软件科学的不断发展,对应用软件的跨语言、跨平台和互操作性提出了更高的要求。在这种情况下,面向对象方法已经难以满足现代的分布式软件的应用。为了解决这个问题提出了组态软件的思想。它将单独、庞大而复杂的应用程序" title="应用程序">应用程序分成多个模块,每个模块都是一个自给自足的组件(Component),应用软件与组件好比是机器与零件的关系。如何将许多独立的组件粘合起来组成一个能满足要求的应用系统,即需要组件之间的接口。COM就是这么一种组件标准,不但如此,它还引入了面向对象的思想。
一个COM组件可以包含多个COM对象,COM对象被很好地封装起来,客户无需知道对象内部实现细节,只需通过COM接口访问COM对象。COM组件分为三种类型:进程内组件、本地组件和远程组件即DCOM组件。DCOM是COM的无缝扩展,DCOM组件与客户程序可位于不同计算机上,这些计算机在局域网内、广域网上,也可通过Internet进行连接。它可以作为分布式应用系统的基本架构,客户程序与DCOM组件对象之间形成客户/服务器关系。客户程序只负责接受用户的输入并把服务器的响应结果反馈给用户。这种分布式结构不仅可以减轻客户程序的负担,还可以提高系统的整体性能。对客户程序而言,组件程序所处的位置是透明的,不必编写任何处理远程调用的代码。因为DCOM处理了底层网络协议的所有细节。
OPC(OLE for Process Control)规范是在微软倡导下,由OPC基金会建立的硬件和软件接口标准。它基于微软现有的OLE、组件对象模型COM(Component Object Model)、分布式组件对象模型DCOM(Distributed COM)技术。目前已得到越来越多的工控领域硬件和软件制造商的承认和支持,并已成为事实上的国际标准。OPC把硬件供应商和软件开发商分离开来,在设备和数据库等数据源与客户之间架起一座桥梁。硬件厂商提供带OPC接口的服务器,客户通过带OPC接口的程序存取不同硬件厂商的设备。总的来说,采用OPC规范设计系统有以下好处:
(1)OPC规范以COM/DCOM为技术基础,而COM/DCOM支持TCP/IP等网络协议,因此可以将各个子系统从物理上分开,分布于网络的不同节点上。
(2)OPC按照面向对象的原则,将一个应用程序(OPC服务器)作为一个对象封装起来,只将接口方法暴露在外面,客户以统一的方式去调用这个方法,从而保证软件对客户的透明性,使得用户完全从低层的开发中脱离出来。
(3)OPC实现了远程调用,使得应用程序的分布与系统硬件的分布无关,便于系统硬件配置,使系统的应用范围更广。
(4)采用OPC规范,便于系统的组态化,将系统复杂性大大减小,可以大大缩短软件开发周期,提高软件运行的可靠性和稳定性,便于系统的升级与维护。
(5)OPC规范了接口函数,不管现场设备以何种形式存在,客户都以统一的方式去访问,从而实现系统的开放性,易于实现与其它系统的接口。
OPC现有的几个比较成熟的规范,主要包括数据存取规范(The OPC Data Access Specification 3.0)、报警和事件存取规范(The OPC Alarm and Event Access Specification)、历史和数据事件存取规范(The OPC Historical Data Access Specification)。
OPC把OLE/COM等新技术带给了OPC基金会,从而为工控领域的数据交换提供了技术保证。
2 OPC结构及其接口分析
2.1 OPC的一般结构
OPC规范是一种硬件和软件的接口标准,它有两种接口:自定义接口(Custom Interface)和自动接口(Automation Interface)。一般来说,使用VB开发的客户程序会使用自动接口,容易得到最佳性能。OPC规范只对这些COM接口加以说明,没有具体实现它,而是由OPC服务器实现。
OPC结构是一种COM结构的客户/服务器模式,如图1所示。在这种模式中,OPC服务器组件提供一个接口给OPC的对象并且对这些接口进行管理。
一个OPC客户程序通过具体的定制和自动接口与OPC服务器进行通信,一个OPC客户可以连接多个由不同开发商提供的服务器,一个OPC服务器可被多个客户使用。开发商提供具体的码来确定服务器存取哪些设备、数据、数据名以及服务器如何从设备中存取数据的细节等。
2.2 OPC数据存取定制接口规范" title="接口规范">接口规范分析
一个OPC数据存取服务器由三种层次的接口组成,即:服务器(Server)、组(Group)、项(Item)。三种层次的接口关系如图2所示。
(1)OPCServer对象
一个服务器包括一个服务器对象,它维护服务器的信息作为多个组的容器。OPC服务器巩固和优化各种客户所请求的数据存取,以便于提高与设备的有效通信。其中IOPCServer是OPC服务器最主要的接口,必须提供这个接口,所有被定义的函数都要实现。
(2)OPCGroup 对象
一个组维护它自身的信息和包容,逻辑上组织多个项。组分为两种:公共组和私有组。公共组能被多个客户使用,而私有组只被一个客户使用。
组的创建:私有组客户通过IOPCServer:AddGroup来创建,而公共组既可由服务器创建,也可由客户来创建。当它被客户创建时,它首先作为私有组出现,然后才由IOPCPublicGroupStateMgt:MoveToPublic转为公共组。一旦一个组成为公共组,组内的项不能被改变;如果要改变必须重新为这项重建一个公共组,然后把这项归于此组内。
组的释放:在与组相连的所有接口被释放前,客户不应该调用IOPCServer:RemoveGroup来删掉私有组。在所有客户接口被释放前,不能调用IOPCServerPublicGroups:RemovePublicGroup来删除公共组。
(3)Item对象
Item对象提供OPC服务器与数据源的连接,即每一个Item对象与一个信号变量连接。它为OPC客户提供信号变量的数值、属性、时间戳以及数据类型等。从服务器的有效性和复杂性等方面考虑,Item对象不是COM对象,因此不提供与客户的接口,对它的访问需要通过Group对象。
项是读写数据的最小逻辑单位,每一个项由ItemID(Item Definition)来标识。它的句法依赖于服务器,对于不同的系统它构成的含义不相同。如在一个DCS中有可能是“TIC101.PV”,而在一个支持低水平(Level)存取的PLC服务器可能支持:
“COM1.STATION:42.REG:40001;0,4095,-100.0,+1235.0”。
2.3 OPC服务器/客户方式的实现
客户与OPC组件之间采用连接点进行双向通信。为了使用连接点,客户必须创建一个支持IUnknown 和 IOPCDataCallback接口的对象。建立一个单独的连接至少需要四个来回:
(1)客户程序调用可连接对象的IUnknown::QueryInterface 方法来请求指向IConnectionPointContainer接口的指针。
(2)客户程序调用IConnectionPointContainer::FindConnectionPoint方法来请求一个指向IOPCDataCallback连接点的指针。
(3)客户程序调用IConnectionPoint::Advise方法来为对象提供一个指向其sink对象的Iunknown接口的指针。
(4)可连接对象调用客户的sink对象的IUnknown::
QueryInterface 方法来请求指向IOPCDataCallback接口的指针。
然后,可连接对象就可以调用由客户程序的sink实现的IOPCDataCallback接口的方法了。
3 OPC服务器的实现方式
对于每一个OPC服务器开发人员而言,下面几项是必备的素质:
·熟悉微软的COM、DCOM(COM+)技术;
·熟知所要开发的OPC服务器接口规范,例如:数据存取接口规范,包括数据存取定制接口规范、数据存取自动接口规范;
·了解计算机过程控制的一些基本理论及应用所涉及的各个参数;
·熟练地运用开发COM接口程序的计算机语言。
微软的COM(DCOM)技术深奥复杂,不易掌握,不利于程序员快速高效地开发出OPC服务器。OPC基金会已提供了各种标准的COM接口,可对其复用,以减轻程序员的负担。
一般采用两种方式来实现OPC服务器的开发:
·依据OPC规范从底层实现OPC标准接口,程序员要花大量的时间去熟悉COM(DCOM)以及OPC的各个接口函数;
·利用OPC快速开发工具" title="开发工具">开发工具。事实它是一个API函数库,每个API函数调用OPC标准接口的方法,屏蔽底层操作。以使程序员把精力放在功能的实现上,而不用花大量的时间研究COM(DCOM)技术和OPC的各个接口之间的关系。
笔者曾开发了两个动态链接的API函数库,一个专用于服务器应用程序的开发,另一个用于客户方应用程序的开发。下面是OPC数据服务器的快速开发工具的一组API函数集合,描述了用户数据采集程序与OPC服务器之间的编程接口,简单归纳如下:
(1)开发工具初始化API
BOOL InitWTOPCSvr(GUID CLSID_Svr, UINT ServerRate, LPCSTR Name);
在使用开发工具前,必须使用初使化函数对开发工具进行初始化,提供OPC服务器刷新率、OPC服务器的程序信息(如CLSID)、服务器的名字等。
(2)注册与删除API
BOOL RegisterOPCSvr(GUID CLSID_Svr,LPCSTR Name, LPCSTR Descr, LPCSTR ExePath);
BOOL UnRegisterOPCSvr(CLSID_Svr, LPCSTR Name);
向注册表提供OPC服务器的注册信息,支持OPC服务器的浏览及远程访问。
其中Descr是对服务器的描述,一般指服务器的版本信息;ExePath是行文件的完整路径。如果函数成功则返回TRUE,否则返回FALSE。
(3)启动/停止OPC
开发工具API及获取开发工具的运行状态API。
BOOL StartServerDLL();
int NumbrClientConnections ();
void RequestDisconnect ();
UninitOPCsvr();
在用户程序退出前,应获取OPC服务器的运行状态,检查是否有OPC客户与服务器连接,决定是否退出程序。用户可以调用 NumbrClientConnections () 函数,观察有多少个OPC客户程序与OPC服务器连接。调用RemoveTag()函数删除Item.;在程序终止时,调用UninitOPCsvr()函数来初始化DCOM。
(4)OPC服务器变量写值API
HRESULT WriteCallback( WRITEPROC lpCallback);
为了完成OPC客户程序对现场设备中参数的修改,用户程序需要提供相应的函数指针,供OPC工具调用。用户可以利用回调函数完成设备参数的修改工作。
(5)OPC服务器变量读值API
BOOL ReadTag (HANDLE TagHandle, VARIANT *pValue, FILETIME *pTimestamp);
为了完成OPC客户程序对现场设备中参数的读取,用户程序需要提供相应的函数指针,供OPC工具调用。用户可以利用回调函数完成设备参数的读取。如果服务器不支持timeStamp,则dll使用当前的PC值。
(6)添加/删除数据变量API
HANDLE AddTag(Cstring name,VARIANT value,BOOL reakOnly);
BOOL RemoveTag(HANDLE hTag);
数据变量是用户提供给OPC客户的数据访问点,用户程序需要维护数据点的变化,根据现场数据的变化及时更新。同时利用变量的命名规则定义OPC服务器的浏览地址空间,如使用“·”表示树状结构的分枝,变量名称为FI302.VFD.AI.MODE.TARGET。
(7)数据变量的更新API
BOOL UpdateTag(HANDLE handle,VARIANT& var,WORD quality,FILETIME timeStamp);
BOOL UpdateTagByNameA (LPCSTR Name, VARIANT Value, WORD Quality);
用户通过更新函数可以及时更新和维护开发工具中已经添加的数据变量的值、时间戳、质量。
(8)修改变量的属性值API
BOOL SetTagProp(ANDLE TagHandle,DWORD PropertyID, LPCSTR Description, VARIANT Value);
任何OPC Item都可通过这个函数加以修改。
(9)OPC服务器断开API
BOOL DisconnectCallback (DISCONNECTPROC lpCallback);
用户可以利用回调函数完成与服务器的断开。
对于服务器应用程序,有几点值得注意:
·每一个OPC服务器都由一个唯一的CLSID所标识,OPC客户利用它与服务器进行连接;
·初始化COM/DCOM;
·注册服务器应用程序。
对于客户方应用程序,有几点值得注意:
·初始化COM/DCOM;
·OPC数据存取服务器名,可用CoCreateInstance创建非远程服务器对象, 用CoCreateInstanceEx来创建远程服务器对象;
·服务器主机名,由CoCreateInstanceEx获得;
·供应商对OPC项(Item)的具体规定。
4 OPC发展现状与趋势
目前,OPC基金会正在开发OPC DX standard for Ethernet,如图3所示。它将为以太网上服务器到服务器(Server-to-Server)的通信和可互操作的数据交换提供支持。它是已存在的OPC数据存取规范的扩展,它扩展了运行时的数据共享交换,与正在使用的实时应用协议相独立。它能在任意时间和地点传输数据,而不管它基于那种通信技术。所有基于工业以太网开发出来的现场设备、网络设备和PC产品都可进行无缝的通信。对于自动化设备可有多个网络策略的终端用户,也可通过多个网络与OPC DX设备通信。某些OPC软件既可与设备进行通信,也可与其它软件通信。
另外,不管是旧系统还是新系统都可通过OPC DX进行通信。
不久的将来,OPC接口将会扩展到XML(Extensible Markup Language)领域。
OPC技术随着适合它的新技术的问世会不断地改进和完善。目前,用于以太网的OPC DX规范已经完成,而在中国OPC刚刚开始。为了加快与国际化接轨,不能只停留在介绍层面上,而应去了解它的内部,开发自己的OPC服务器。
参考文献
1 OPC基金会 (www.opcfoundation.org)
2 [美] Guy Eddon,Henry Eddon著.希望图书创作室译.Inside COM+ Base Services.北京:北京希望电子出版社,2000.4
3 [美] Dale Rogerson著, 杨秀章译. Inside COM.北京: 清华大学出版社,1993.3
4 余 英,梁 刚.Visual C++实践与提高COM和COM+篇.北京:中国铁道出版社,2000.2
5 钟霖田.OPC-全开放控制系统的核心构件.自动化博览, 2002;(2)