OPC数据访问客户端的研究与实现
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
ULONG m_cRef;}
CAdviseSink 类继承自 IAdviseSink 类,而 IAdviseSink 类是由 OBJIDL.H 定义的标准接口类。在 CAdviseSink 中重 载各成员函数时,仅给出必需的函数实现即可。
1 概述
随着计算机技术、通信技术和控制技术的不断发展,企 业已经不只是注重控制系统的稳定运行,更要利用过程数据 为企业综合自动化服务,全方位地提高企业的信息化水平[1]。 因此,工业过程控制系统及其设备之间以及异构网络控制系 统之间的信息交换就成为亟待解决的问题。为解决这一问题, OPC 技术应运而生。本文依据 OPC 规范,基于 VC++6.0 实 现了 OPC 客户端程序——MyOPCClient,并用 KEPServerEx V4.0 进行测试。
OPC-DA 数据存取规范是 OPC 基金会最初制定的一个工 业标准,重点是对现场设备的在线数据进行存取,其他规范 基本都以它为基础。OPC-DA 规范采用 Client/Server 模式[3], 基于微软的 COM 技术制定标准接口。这些标准接口可分为 定制接口规范和自动化接口规范 2 个部分,2 种接口完成的 功能类似,本文主要以 OPCDA2.05A 规范为基础,分析定制 接口规范中基本的对象和接口功能,进而实现 OPC 客户端。 OPC-DA 服务器主要由 3 类对象组成(见图 1):服务器对象 (Server Object),组对象(Group Object)和项对象(Item Object)。
(2)异步读写方式 OPC 客 户 端 可 以 调 用 组 对 象 的 AsyncRead() 和 AsyncWrite()方法对服务器进行异步读写操作。异步访问时, 当客户端对服务器提出访问要求后,立即返回到客户端执行 其他操作,无须等待;当服务器完成数据读写后会通知客户 端,使客户端得到返回结果。在异步方式下,服务器程序完 成请求后,会触发客户端的 AsyncReadComplete()、AsyncWriteComplete() 、 AsyncCancelComplete() 事 件 , 将 操 作 结 果 发送给客户端。 异步方式允许服务器将读写操作进行排队,使客户端的 调用函数可立刻返回,当服务器读写操作完成后再通知客户 端。显然,异步通报方式的通信效率更高,但有多个客户端 与服务器相连时,同步读写方式更具时效性。对于每个组对 象,客户端可根据需要采用其中一种数据存取方式,而不能 两者都使用。
(2)创建 MFC 应用程序框架,生成新工程 编辑 stdafx.h 文件,包含 opcda.h、opccomn.h、opcerror.h、 opcprops.h、comcat.h 以及 opcda_i.c、opccomn_i.c、opcda_ cats.c。 (3)初始化 COM 库
HRESULT hr=CoInitializeEx(NULL,COINIT_MULTITHREADED);
M_ComInitialized=SUCCEEDED(hr); If(!m_ComInitialized)Return(FALSE);
调用此 COM 库函数一方面是为使用任何其他 COM 库函 数作初始化工作。
(4)构建客户接收器 声明、实现 CAdviseSink 类。接收器是客户端内部的一 个 COM 对象,但它并没有 CLSID(类标志符)和类厂,客户端 程序通常要在接收器的成员函数里访问可连接对象的信息。 声明 CAdviseSink 类如下所示:
【Abstract】This paper introduces and analyzes the OPC DA 2.05A specification, implements Component Object Model(COM) object based on the Active Template Library(ATL), and realizes OPC client applications in VC++6.0 IDE. It gives the general steps and key technologies of OPC client implementation. It is tested and verified that this OPC client can realize stable and fast data exchange with standard OPC server by using Kepware’s OPC Server KEPServerEx V4.0. 【Key words】OPC client; Active Template Library(ATL); Component Object Model(COM)
—80—
服务器对象维护有关服务器的信息并作为组对象的容器,可 动态地创建或释放组对象;而组对象除了维护有关其自身的 信息,还提供了包容项的机制,逻辑上管理项;项对象则表 示服务器中的数据连接[4]。图 2 显示 OPC 数据交换服务器与 OPC 客户端的关系,OPC 客户端可通过访问 OPC 服务器的 COM 接口与不同厂家的一个或者多个服务器进行数据通信。
第 36 卷 第 11 期 Vol.36 No.11 ·软件技术与数据库·
计算机工程 Computer Engineering
文章编号:1000—3428(2010)11—0080—03
文献标识码:A
2010 年 6 月 June 2010
中图分类号:TP311.5
OPC 数据访问客户端的研究与实现
2 OPC 技术
2.1 OPC 简介 OPC(OLE for Process Control)是 OPC 基金会发布的一系
列标准的 OLE/COM 接口标准,旨在提高工业领域中自动化 控制设备、异构现场总线系统,以及企业商务办公环境间的 信 息 可 交 互 性 [2] 。 现 已 发 布 多 个 协 议 , 包 括 : OPC-DA, OPC-DX, OPC-HAD, OPC-Batch, OPC-Security, OPC-A&E, OPC-XMLDA 等,新一代的 OPC 协议——OPC-UA 正在完善 中。OPC-DA 数据访问规范是其中最常用的规范。 2.2 OPC-DA 规范
2.3 OPC-DA 规范数据访问方式 OPC 客户端访问 OPC 服务器的方式分为同步读写方式
和异步读写方式。 (1)同步读写方式 OPC 客户端可以调用组对象的 SyncRead()和 SycnWrite()
方法对服务器进行同步读写操作。同步访问时,客户端会一 直等待这些操作完成,然后再执行其他操作。
苏 磊 1,李 茜 1,汤 伟 2
(1. 陕西科技大学电气与信息工程学院,西安 712021;2. 陕西科技大学造纸工程学院,西安 712021)
摘 要:介绍并分析 OPC DA 2.05A 规范,在 VC++6.0 开发环境下,基于活动模版库实现组件对象模型对象,进而实现 OPC 客户端程序, 给出开发 OPC 客户端的一般步骤以及关键技术。采用 Kepware 公司的 OPC 服务器 KEPServerEx V4.0 测试,验证该 OPC 客户端可与标准 OPC 服务器进行稳定、快捷的数据交换。 关键词:OPC 客户端;活动模版库;组件对象模型
3 OPC 规范关键技术
OPC 规范基于 COM 技术。COM(Component Object Model) 技术是 Microsoft 公司提出的一种组件技术,其目的是为了提 高软件的可复用度,解决不同程序之间的通信问题、互操作 性以及软件的跨平台、跨网络应用问题[5]。
在 VC++6.0 开发环境下实现 COM 有 2 种方法:MFC 库 和 ATL 模板库,MFC 不仅支持 COM 应用,它更是一套 Windows 平台上各种应用开发的基本类库,而 ATL 则主要侧 重于 COM 应用的开发[6]。
class CAdviseSink : public IAdviseSink {public:
CAdviseSink(); ~CAdviseSink(void); STDMETHODIMP QueryInterface(REFIID, void**); //接口查询函数 STDMETHODIMP(ULONG) AddRef(void); //引用计数处理函数 STDMETHODIMP(ULONG) Release(void); //引用计数处理函数 STDMETHODIMP(void) OnDataChange(LPFORMATETC,LPSTGMEDIUM);//处理数据交换 STDMETHODIMP(void) OnViewChange(DWORD, LONG);//不实现 STDMETHODIMP(void) OnRename(LPMONIKER); //不实现 STDMETHODIMP(void) OnSave(void);//不实现 STDMETHODIMP(void) OnClose(void);//不实现 STDMETHODIMP_(void) OnWriteComplete(LPFORMATETC,LPSTGMEDIUM); protected:
OPC 客户端接口及其与 OPC 服务器 COM 对象关系如 图 3 所示。
图 3 OPC 客户端与服务器 COM 对象关系
OPC 客户端与 OPC 服务器 COM 对象协作过程如下: (1)客户端查询注册表,并取得服务器的 CLSID; (2)客户端获取 COM 组件的类厂对象; (3)服务器调用 CoInitialize 创建组件支持的各种类厂; (4)客户端通过类厂对象创建 COM 组件对象; (5)客户端使用 COM 组件通过其接口进行各种操作。
Research and Implementation of OPC Data Access Client
SU Lei1, LI Qian1, TANG Wei2
(1. School of Electrical and Information Engineering, Shaanxi University of Science and Technology, Xi’an 712021; 2. School of Papermaking Engineering, Shaanxi University of Science and Technology, Xi’an 712021)
图 1 OPC 服务器、组、项对象间的关系
OPC Client
OPC Server vector1
OPC Client
OPC Server vector2
OPC Client
OPC Server vector3
图 2 OPC C/S 关Fra Baidu bibliotek示意图
基金项目:陕西省工业攻关基金资助项目(2007K07-07) 作者简介:苏 磊(1982-),男,硕士研究生,主研方向:OPC 技 术;李 茜,教授、硕士;汤 伟,教授、博士 收稿日期:2010-01-08 E-mail:sl013@hotmail.com
4 VC++6.0 环境下 OPC 客户端的实现
基于 VC++6.0 的 OPC 客户端实现过程如下: (1)安装 OPC 基金会提供的 DLL 文件 下 载 OPC 基 金 会 提 供 的 代 理 DLL , 并 配 置 环 境 。
opc_aeps.dll 、 actxprxy.dll 、 opccomn_ps.dl 、 opcproxy.dll 、 opchda_ps.dll 为本地或者远程服务器列集所有接口并定义必 须的数据结构[2];opcenum.exe 可获取本地及远程机上所有的 OPC Server 列表。拷贝这些文件到系统盘的 Winnt 目录下, 用 opcenum/regserver 命令安装 opcenum.exe,然后在运行里 执行 REGSVR32 命令来安装相应的 DLL 文件。
CAdviseSink 类继承自 IAdviseSink 类,而 IAdviseSink 类是由 OBJIDL.H 定义的标准接口类。在 CAdviseSink 中重 载各成员函数时,仅给出必需的函数实现即可。
1 概述
随着计算机技术、通信技术和控制技术的不断发展,企 业已经不只是注重控制系统的稳定运行,更要利用过程数据 为企业综合自动化服务,全方位地提高企业的信息化水平[1]。 因此,工业过程控制系统及其设备之间以及异构网络控制系 统之间的信息交换就成为亟待解决的问题。为解决这一问题, OPC 技术应运而生。本文依据 OPC 规范,基于 VC++6.0 实 现了 OPC 客户端程序——MyOPCClient,并用 KEPServerEx V4.0 进行测试。
OPC-DA 数据存取规范是 OPC 基金会最初制定的一个工 业标准,重点是对现场设备的在线数据进行存取,其他规范 基本都以它为基础。OPC-DA 规范采用 Client/Server 模式[3], 基于微软的 COM 技术制定标准接口。这些标准接口可分为 定制接口规范和自动化接口规范 2 个部分,2 种接口完成的 功能类似,本文主要以 OPCDA2.05A 规范为基础,分析定制 接口规范中基本的对象和接口功能,进而实现 OPC 客户端。 OPC-DA 服务器主要由 3 类对象组成(见图 1):服务器对象 (Server Object),组对象(Group Object)和项对象(Item Object)。
(2)异步读写方式 OPC 客 户 端 可 以 调 用 组 对 象 的 AsyncRead() 和 AsyncWrite()方法对服务器进行异步读写操作。异步访问时, 当客户端对服务器提出访问要求后,立即返回到客户端执行 其他操作,无须等待;当服务器完成数据读写后会通知客户 端,使客户端得到返回结果。在异步方式下,服务器程序完 成请求后,会触发客户端的 AsyncReadComplete()、AsyncWriteComplete() 、 AsyncCancelComplete() 事 件 , 将 操 作 结 果 发送给客户端。 异步方式允许服务器将读写操作进行排队,使客户端的 调用函数可立刻返回,当服务器读写操作完成后再通知客户 端。显然,异步通报方式的通信效率更高,但有多个客户端 与服务器相连时,同步读写方式更具时效性。对于每个组对 象,客户端可根据需要采用其中一种数据存取方式,而不能 两者都使用。
(2)创建 MFC 应用程序框架,生成新工程 编辑 stdafx.h 文件,包含 opcda.h、opccomn.h、opcerror.h、 opcprops.h、comcat.h 以及 opcda_i.c、opccomn_i.c、opcda_ cats.c。 (3)初始化 COM 库
HRESULT hr=CoInitializeEx(NULL,COINIT_MULTITHREADED);
M_ComInitialized=SUCCEEDED(hr); If(!m_ComInitialized)Return(FALSE);
调用此 COM 库函数一方面是为使用任何其他 COM 库函 数作初始化工作。
(4)构建客户接收器 声明、实现 CAdviseSink 类。接收器是客户端内部的一 个 COM 对象,但它并没有 CLSID(类标志符)和类厂,客户端 程序通常要在接收器的成员函数里访问可连接对象的信息。 声明 CAdviseSink 类如下所示:
【Abstract】This paper introduces and analyzes the OPC DA 2.05A specification, implements Component Object Model(COM) object based on the Active Template Library(ATL), and realizes OPC client applications in VC++6.0 IDE. It gives the general steps and key technologies of OPC client implementation. It is tested and verified that this OPC client can realize stable and fast data exchange with standard OPC server by using Kepware’s OPC Server KEPServerEx V4.0. 【Key words】OPC client; Active Template Library(ATL); Component Object Model(COM)
—80—
服务器对象维护有关服务器的信息并作为组对象的容器,可 动态地创建或释放组对象;而组对象除了维护有关其自身的 信息,还提供了包容项的机制,逻辑上管理项;项对象则表 示服务器中的数据连接[4]。图 2 显示 OPC 数据交换服务器与 OPC 客户端的关系,OPC 客户端可通过访问 OPC 服务器的 COM 接口与不同厂家的一个或者多个服务器进行数据通信。
第 36 卷 第 11 期 Vol.36 No.11 ·软件技术与数据库·
计算机工程 Computer Engineering
文章编号:1000—3428(2010)11—0080—03
文献标识码:A
2010 年 6 月 June 2010
中图分类号:TP311.5
OPC 数据访问客户端的研究与实现
2 OPC 技术
2.1 OPC 简介 OPC(OLE for Process Control)是 OPC 基金会发布的一系
列标准的 OLE/COM 接口标准,旨在提高工业领域中自动化 控制设备、异构现场总线系统,以及企业商务办公环境间的 信 息 可 交 互 性 [2] 。 现 已 发 布 多 个 协 议 , 包 括 : OPC-DA, OPC-DX, OPC-HAD, OPC-Batch, OPC-Security, OPC-A&E, OPC-XMLDA 等,新一代的 OPC 协议——OPC-UA 正在完善 中。OPC-DA 数据访问规范是其中最常用的规范。 2.2 OPC-DA 规范
2.3 OPC-DA 规范数据访问方式 OPC 客户端访问 OPC 服务器的方式分为同步读写方式
和异步读写方式。 (1)同步读写方式 OPC 客户端可以调用组对象的 SyncRead()和 SycnWrite()
方法对服务器进行同步读写操作。同步访问时,客户端会一 直等待这些操作完成,然后再执行其他操作。
苏 磊 1,李 茜 1,汤 伟 2
(1. 陕西科技大学电气与信息工程学院,西安 712021;2. 陕西科技大学造纸工程学院,西安 712021)
摘 要:介绍并分析 OPC DA 2.05A 规范,在 VC++6.0 开发环境下,基于活动模版库实现组件对象模型对象,进而实现 OPC 客户端程序, 给出开发 OPC 客户端的一般步骤以及关键技术。采用 Kepware 公司的 OPC 服务器 KEPServerEx V4.0 测试,验证该 OPC 客户端可与标准 OPC 服务器进行稳定、快捷的数据交换。 关键词:OPC 客户端;活动模版库;组件对象模型
3 OPC 规范关键技术
OPC 规范基于 COM 技术。COM(Component Object Model) 技术是 Microsoft 公司提出的一种组件技术,其目的是为了提 高软件的可复用度,解决不同程序之间的通信问题、互操作 性以及软件的跨平台、跨网络应用问题[5]。
在 VC++6.0 开发环境下实现 COM 有 2 种方法:MFC 库 和 ATL 模板库,MFC 不仅支持 COM 应用,它更是一套 Windows 平台上各种应用开发的基本类库,而 ATL 则主要侧 重于 COM 应用的开发[6]。
class CAdviseSink : public IAdviseSink {public:
CAdviseSink(); ~CAdviseSink(void); STDMETHODIMP QueryInterface(REFIID, void**); //接口查询函数 STDMETHODIMP(ULONG) AddRef(void); //引用计数处理函数 STDMETHODIMP(ULONG) Release(void); //引用计数处理函数 STDMETHODIMP(void) OnDataChange(LPFORMATETC,LPSTGMEDIUM);//处理数据交换 STDMETHODIMP(void) OnViewChange(DWORD, LONG);//不实现 STDMETHODIMP(void) OnRename(LPMONIKER); //不实现 STDMETHODIMP(void) OnSave(void);//不实现 STDMETHODIMP(void) OnClose(void);//不实现 STDMETHODIMP_(void) OnWriteComplete(LPFORMATETC,LPSTGMEDIUM); protected:
OPC 客户端接口及其与 OPC 服务器 COM 对象关系如 图 3 所示。
图 3 OPC 客户端与服务器 COM 对象关系
OPC 客户端与 OPC 服务器 COM 对象协作过程如下: (1)客户端查询注册表,并取得服务器的 CLSID; (2)客户端获取 COM 组件的类厂对象; (3)服务器调用 CoInitialize 创建组件支持的各种类厂; (4)客户端通过类厂对象创建 COM 组件对象; (5)客户端使用 COM 组件通过其接口进行各种操作。
Research and Implementation of OPC Data Access Client
SU Lei1, LI Qian1, TANG Wei2
(1. School of Electrical and Information Engineering, Shaanxi University of Science and Technology, Xi’an 712021; 2. School of Papermaking Engineering, Shaanxi University of Science and Technology, Xi’an 712021)
图 1 OPC 服务器、组、项对象间的关系
OPC Client
OPC Server vector1
OPC Client
OPC Server vector2
OPC Client
OPC Server vector3
图 2 OPC C/S 关Fra Baidu bibliotek示意图
基金项目:陕西省工业攻关基金资助项目(2007K07-07) 作者简介:苏 磊(1982-),男,硕士研究生,主研方向:OPC 技 术;李 茜,教授、硕士;汤 伟,教授、博士 收稿日期:2010-01-08 E-mail:sl013@hotmail.com
4 VC++6.0 环境下 OPC 客户端的实现
基于 VC++6.0 的 OPC 客户端实现过程如下: (1)安装 OPC 基金会提供的 DLL 文件 下 载 OPC 基 金 会 提 供 的 代 理 DLL , 并 配 置 环 境 。
opc_aeps.dll 、 actxprxy.dll 、 opccomn_ps.dl 、 opcproxy.dll 、 opchda_ps.dll 为本地或者远程服务器列集所有接口并定义必 须的数据结构[2];opcenum.exe 可获取本地及远程机上所有的 OPC Server 列表。拷贝这些文件到系统盘的 Winnt 目录下, 用 opcenum/regserver 命令安装 opcenum.exe,然后在运行里 执行 REGSVR32 命令来安装相应的 DLL 文件。