3 OPC数据访问服务器的实现
OPC服务器的实现一般有3种方法:通过快速开发工具开发OPC服务器;通过MFC(微软基本类库)提供的COM支持开发OPC服务器;通过ATL(活动模板库)开发OPC服务器。
由于OPC快速开发工具功能有许多限制,而MFC开发基于窗口的应用程序虽然比较方便。但它不是开发COM组件的理想工具,需要手工添加很多支持COM的基础代码。ATL是VC++提供专门针对COM应用开发的活动模板库。它内部的模板类实现了COM的一些基本特征。比如一些基本的COM接口,也支持COM的高级特征。如双接口、连接点等,其基本目标是使COM应用开发尽可能的自动化。使用ATL可以快速地开发出高效、简洁的代码,同时对COM组件的开发提供了一定限度的代码自动生成以及可视化支持。所以在此采用ATL研究OPC服务器的开发。
OPCDA规范规定OPCDA Server包含3种对象:Server对象、Group对象和Item对象。Server对象包含了OPCDA Server的相关信息,它可以对Group对象进行添加、删除,是Group对象的容器。Group对象包含了这个组的相关信息,并提供了逻辑上包含组织Item对象的机制。Item对象与数据项关联,每个数据项必须具备Value,Quality和TimeStamp三个属性。OPC数据访问服务器程序结构如图3所示。
由于OPC数据服务器既要对底层硬件进行读写操作,又要通过OPC接口与客户程序进行交互,为保证数据存取的效率,所以采用多线程模型,创建exe形式的进程外OPC服务器。实现OPC数据访问服务器的主要步骤包括:
(1)用ATL创建一个exe进程外服务器。将OPCDA规范中的IDL文件,加入项目中进行编译,将组件接口引入到工程中;
(2)添加OPCServer对象。创建一个简单的ATL对象,命名为GstServer,按照OPC规范添加相应接口并实现其方法,其中AddGroup函数的实现是难点;
(3)添加OPCGroup对象。Group对象是通过Server对象的创建实现的,因此不需要类型库,所以要在工程的OPCDA.cpp文件的对象映射中将其删除,然后用聚合实现接口的添加:
BEGIN_COM_MAP()
COM_INTERFACE_ENTRY_AGGREGATE()
END_COM_MAP()
(4)定义一个类CGstItem添加Item对象。OPCItem无需实现任何接口功能,只要根据实际情况增加相应的功能函数,如根据OPCltem的名称与数据源进行连接、读写数据源等;
(5)数据存储区的设计。数据存储区包含了服务器程序定义的数据项。要根据项的数目确定缓存的大小,使得每个项都有相对应的内存空间;
(6)OPC服务器的结构和功能大同小异,主要的区别在于硬件驱动程序。可以针对不同设备开发相应的读写接口类,并与相应的OPC服务器里的项对象连接起来,实现OPC服务器对现场数据的存取功能。
4 OPC客户应用程序的实现
在该集成系统中,通过自行开发的OPC客户端实现集成平台和子系统的数据交换。在应用程序运行时,客户端将按照指定的采集频率对数据进行采集。
自动化接口封装了COM底层的许多实现,使用户能比较轻松地进行数据访问,具有简单、易于编程等优点。该系统的OPC客户端程序使用VB6通过OPC自动化接口实现OPC数据访问。程序示例如下:
(1)启动VB,新建一工程OPCClient,在VB主菜单的“工程”项中选择“引用”,在弹出窗口可用的引用选项中选择“OPC Automation 2.0”,就可以使用自动化接口;
(2)声明使用的对象及变量
(3)连接OPC服务器、建立OPC组和添加OPC项
5 结 语
OPC作为一项逐渐成熟的技术已得到国内外厂商的高度重视,许多公司都在原有产品的基础上增加了对OPC的支持。由于统一了数据访问的接口,使控制系统进一步走向开放,实现了信息的集成和共享,所以用户能够得到更多的方便。相信随着技术的发展,OPC会越来越广泛地应用于工业过程控制领域。