OPC服务器开发的几种方法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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 development
1.引言:
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