当前位置:文档之家› OPC服务器开发的几种方法

OPC服务器开发的几种方法

OPC服务器开发的几种方法陈丹丹钱美夏立邵英(武汉海军工程大学 湖北 武汉 430033)摘要:简要介绍了OPC DA规范,描述了OPC DA(数据访问)服务器开发的三种方法:使用MFC的COM库函数开发OPC服务器、通过ATL开发OPC服务器和利用工具包快速开发OPC服务器,最后对三种方法的特点作出了比较。

关键词:OPC;ATL;服务器开发Abstract: Simply describe the OPC DA specification ,then three Methods of server model design based on OPC DA(Data Access) specification are introduced. The three methods are using MFC ATL and the fast developmentToolkit to develop OPC server.At last, compare the characteristics of three methods .Key words: OPC;ATL;Server development1.引言:OPC DA (OPC 数据访问规范)是OPC基金会最早发布的一个工业标准,主要是对现场设备的在线数据进行存取,目前已经发展到OPC DA 3.0版本。

OPC基于微软的OLE/COM原理,采用客户/服务器模式。

OPC 数据访问服务器主要由服务器对象、组对象和项对象组成。

OPC 服务器对象维护服务器的有关信息并包容OPC组对象,可以动态的创建或释放组对象;而OPC 组对象维护有关其自身的信息并包容OPC项,逻辑上管理OPC项;OPC项则标识了与OPC服务器中数据的连接。

OPC项不可以由OPC客户直接操作,所有对OPC项的操作都是通过包容该项的OPC组对象进行的。

而OPC服务器对象和组对象是聚合关系,即OPC服务器对象产生OPC组对象后,将组对象的指针传递给客户,由客户之间操作对象。

这样既提高了数据存取的速度也易于功能扩展,体现了组件软件的重用性。

它支持COM技术的双向通信机制,具有事件驱动功能,当OPC服务器的数据发生变化时它能自动通知OPC客户。

在OPC1.0规范中事件驱动使用的是COM的通报连接机制,在OPC2.0规范中又增加了对连接点的支持。

而一般的数据采集应用程序,从数据源读数据是主动的,相当于客户主动访问服务器的数据。

这就要求客户不断地查询服务器的数据,不管服务器的数据是否发生了变化,增加了系统的开销。

因此OPC DA的效率大大高于一般的数据采集应用程序。

2.OPC 服务器开发概述OPC 服务器的设计与实现是一个较为复杂与繁重的任务,设计者需要有很高的编程水平,熟悉OPC规范,同时也必须掌握相应的硬件产品特性。

OPC 数据服务器大致可以分解为不同的功能模块:OPC 对象接口管理,Item 数据项管理以及服务器界面和设置等[1]如图1。

图1.OPC服务器结构图一个设备的OPC服务器主要由两部分组成,OPC标准接口的实现和与硬件设备的通信。

OPC服务器的开发必须以OPC规范为基础,实现各个对象及其接口。

下面将就OPC标准接口的实现方法进行重点讨论。

3.OPC DA 服务器开发方法3.1 通过MFC提供的COM支持开发OPC服务器开发一个OPC 服务器主要有以下几个步骤[2][3](1) 定义OPC 数据服务器的名称(Prog ID) 和类标识(CLSID),然后根据规范对各个接口ID 进行定义。

(2) 实现OPC 数据服务器类厂对象。

从IClassFactory 基类派生出TestOPCClassFactory 类, 然后重载CreateInstance () 成员函数, 通过该函数创建CTestServer服务器对象。

(3) 设计OPC 对象。

首先通过继承IUnknown 类派生出OPCServer,OPCGroup 和OPCItem 三个类,分别对应OPC服务器对象,组对象和项对象,并重载IUnknown 类中的接口查询和引用计数函数。

然后将OPC 基金会网站上提供的相应的头文件添加到工程中,通过继承这些接口派生出新的接口类,实现每个接口的成员函数。

在OPCServer 和OPCGroup 类中增加指向相应接口类的指针成员变量,接着修改接口查询函数。

当客户程序查询某一接口时,实例化接口类,并返回接口指针变量。

客户程序再通过该接口指针进一步调用接口成员函数。

(4)数据存储区的设计。

可利用C++标准模板库(STL)中的包容器,通过包容器管理OPC服务器中的数据项。

由于OPC 服务器既要对底层硬件进行读写操作,又要通过OPC接口与客户程序进行交互,所以对数据存储区的操作需要采用多线程模型,以保证数据存取的效率。

为避免不同线程同时对数据区中的数据进行操作,还须考虑对临界区的互斥控制。

(5)界面设计。

可以设计类似Windows 中资源管理器的用户界面,将各数据项用树型结构表示,然后设计数据项和硬件的设置界面,并与数据存储区和硬件接口联系起来,实现相应的组态功能。

在OPC服务器程序关闭时,需要将数据项的属性以及硬件设置参数作为组态文件保存起来,而在程序运行时能自动调入组态文件完成初始设置。

(6)根据硬件的种类和特性,自行开发驱动程序,或者调用硬件厂商提供的I/ODLL 实现对现场设备进行设置以及数据存取的功能。

(7)从OPC 基金会网站上获取OPC 标准组件并在服务器上注册,然后利用OPC 客户端程序进行测试。

3.2 通过ATL开发OPC服务器ATL是VC++提供的活动模板库,是专门针对COM应用开发的。

它内部的模板类实现了COM的一些基本特征,比如一些基本的COM接口,也支持COM的高级特征,如双接口,连接点等。

利用ATL开发OPC服务器的主要步骤如下:[4](1)用ATL 创建一个Exe 进程外服务器。

将OPC DA规范中的IDL 文件, 加入项目中。

进行编译,ClassView中出现很多接口,双击接口可以看到每一接口下的方法。

(2)Server对象的添加。

创建一个简单的ATL 对象,命名为TestServer,支持连接点。

在ATL 生成的对象的IDL 描述中加入OPCServer 对象接口。

在ClassView中右键单击TestServer 类, 选择Implement Interface 和Implemert Connection Point , 并选择要完成添加的接口,可完成OPC接口和连接点接口框架的添加。

然后按OPC DA规范实现其它细节。

另外还要在stdafx.h 中加入# include “OPCDA.h”,# include “opccomn.h”这样就可使用规范定义的COM 接口。

还要在OPCDA.cpp 文件中加入:# include “OPCDA_i.c”,# include “opccomn_i.c”只有这样才可使组件对象的接口暴露给客户程序。

(3)Group对象的添加与Server对象的添加相似, 设组对象为TestGroup, 但由于它不需要在系统中注册, 也不需要类ID 和类厂, 要在工程的OPCDA.cpp文件的对象映射中将其删除掉, 把CTestGroup定义处的public CComCoClass <CTestGroup , &CLSID_TestGroup > 代码删除。

BEGIN_OBJ ECT_MAP (ObjectMap)/ / OBJ ECT_ ENTRY (CLSID_TestGroup ,CTestGroup) / / 删除END_OBJ ECT_MAP ()(4)Item可以通过定义一个一般的类或一个结构来完成, 并根据实际情况定义并实现一些特殊属性和方法, 如增加读取存储区或硬件设备数据的函数等。

(5)数据存储区的设计,硬件驱动程序,OPC服务器的注册与前面相似。

3.3 通过开发工具开发OPC服务器OPC服务器开发工具的目的是将MicroSoft 公司的OLE/COM/DCOM技术和OPC 的技术细节隐藏起来,使用户开发OPC 服务器的工作集中在自己特定的数据采集任务上来。

目前OPC 数据服务器开发工具在国际工业控制领域中使用已经相当广泛,比较著名的供应厂商有FactorySoft, Softing 等公司。

快速开发工具一般是以动态连接库DLL 形式提供给用户,用户只要按照动态连接库中提供的应用编程接口API,即可完成OPC 服务器的开发。

以北京华富惠通技术有限公司推出的OPC 数据访问服务器快速开发工具包HuafuOPC ToolKit 为例,在建立OPC 服务器的过程中,用户必须完成的工作包括:[5] (1)建立应用程序,加载OPC 运行库;(2)按照OPC Toolkit 提供的接口进行正确的函数调用;(3)与设备进行通信。

其中调用OPC Toolkit 的接口流程如下:①用户首先调用InitOPCSvr 进行初始化;②初始化成功之后,注册回调函数;③用户通过CreateTag 向OPC 运行库可添加多个标签;④通过Set TagProperties 函数设置标签属性;⑤调用RunSvr 函数,运行服务器,这时,服务器可以向客户端提供服务;⑥用户和驱动通信,得到标签数据后,刷新OPC 运行库中标签的数据;⑦在服务器退出时,调用UninitOPCSvr。

4.几种方法的分析比较MFC通过多重继承的方式来实现COM对象,具有简单,易于管理、能够深入的掌握COM内部技术细节等特点。

但是因为要从底层开始编写代码,工作相对烦琐,工程也相对复杂。

ATL是通过多继承方式来实现COM对象的(就是COM类是从多个ATL模板类继承过来),然后在COM类中实现COM接口。

ATL是专门用来开发小型的、快速的COM组件,其代码也是经过优化的。

而ATL一个最大的不足就是因为要简化和优化代码,程序中使用非常多的模板类,开发者在开发的过程中,不仅仅要非常熟悉COM技术,还要另外花功夫来研究ATL中各个模板类间的关系,否则无法深入的编程。

另外使用ATL需要对COM 机制有非常深入的理解,并掌握许多原始的Windows API.对于第三种方法,开发人员不需要了解COM 机制及OPC 数据访问服务器接口细节。

开发简单容易,缩短开发周期,节省投资成本,能够满足一些用户的需要,但是由于以动态连接库DLL 形式提供,缺少一些灵活性。

总之,三种方法各有利弊,可根据实际情况确定采用何种方法。

参考文献:[1]马欣、李京、程峥嵘,OPC服务器与客户程序的设计,自动化仪表,2002年7月第23卷第7期[2]曹建、杨邦荣,基于模板库技术的OPC 服务器,电力系统自动化,2001.12[3]李勤、党选举、向荣,基于COM的OPC技术的研究和实现,微计算机信息,2002年第18卷第8 期[4]司纪刚,OPCDA服务器与客户程序开发指南[5]CONTROX-工具包用户手册作者简介:陈丹丹(1981-)女(汉),黑龙江鹤岗人,硕士研究生,研究方向为现场总线。

相关主题