OPC DA客户端的三种实现方式

http://www.dqjsw.com.cn/dianqi/OPC/310.html
OPC DA客户端的三种实现方式
时间:2009-09-30 来源:未知 编辑:电气自动化技术网 点击:301次 字体设置: 大 中 小


1  引言 
    OPC(OLE for Process Control)是一个工业标准,他是许多世界领先的自动化和软、硬件公司与微软公司合作的结晶。管理该标准的组织是OPC基金会。该基金会的会员单位在世界范围内超过150个,包括了世界上几乎全部的控制系统、仪器仪表和过程控制系统的主要供应商。OPC技术建立了一组符合工业控制要求的接口规范,将现场信号按照统一的标准与SCADA、HMI等软件无缝连接起来,同时将硬件和应用软件有效地分离开。只要硬件开发商提供带有OPC接口的服务器,任何支持OPC接口的客户程序均可采用统一的方式对不同硬件厂商的设备进行存取,无须重复开发驱动程序。如果希望将数据引入数据库进行统计分析,就要进行客户端开发。
2  客户程序的设计方法与比较
    客户程序的设计主要是指客户程序中OPC接口部分的设计。客户程序本身可以完成很多复杂的数据处理与显示功能,但需要通过OPC接口部分访问OPC服务器,对现场数据进行存取。
    开发OPC、Data、Access、Client之前,要弄清服务器的大体情况,比如需要访问的服务器是否提供自动化接口、服务器的OPC的版本等,到目前为止,OPC有1.0和2.0两个版本,两个版本的接口定义不同,2.0版是对1.0的改进,但不兼容。
    OPC客户端的主要任务:
    ①创建服务器对象。
    ②建立与服务器的连接。
    ③浏览OPC服务器的功能。客户程序需要创建OPC基金会提供的OPC服务器浏览器对象(OPCServerList)再通过该对象的IOPCServerList接口获得OPC服务器名称的列表;可以通过枚举注册表中包含“OPC”子键的程序名来浏览符合OPC数据存取规范的服务器,但效率较低。
    ④通过OPC接口读写数据。
    ⑤断开连接。
    注意事项:
    设计时需要注意OPC对象的VARAINT结构类型、引用计数问题、内存管理问题和处理错误返回代码问题。由于一个OPC客户程序可能与多个OPC服务器相连,因此设计时也最好采用多线程,同时与多个OPC服务器程序进行交换以保证较高的通信效率。另外客户程序中OPC接口部分如何与其它功能模块进行数据交换需要根据实际情况仔细考虑。
2.1 使用MFC的COM库函数开发OPC客户端
    直接使用COM库函数开发OPC客户端,是最基本也是最灵活的方式,这种开发方式难度和工作量都大,要求开发人员对OPC规范和COM技术原理又比较深入的了解。早些时候VisualC++编译器还不支持模板,因此,它们不得不借助非模板的其它手段来将COM功能掺入类中。Microsoft通过加入一些虚函数到CCmdTarget类和一些宏中解决了这个问题,使得在MFC中实现COM接口有了可能。
    客户要创建一个COM对象首先应得到类厂对象,再由类厂对象创建COM对象。为了实现类厂对象,MFC提供了一个通用的类厂COleObjectFactory,其从CCmdTarget派生,并实现了IclassFactory2接口。在COleObjectFactory的成员中,最主要的是对象的类标识符(CLSID)和类型信息,类厂的CreateInstance成员函数利用这些信息在运行中创建COM对象。
    OPCServer应用程序包括了一个Server对象、多个Group对象、多个Item对象,Server对象实现IOPCServer接口;Group对象实现IOPCItemMgt、IOPCSyncIO接口;Item对象不实现任何接口,只是建立与数据源的连接。
    数据通信是通过OPC客户对OPC服务器的多次调用完成的。OPC客户首先要通过类厂对象创建OPCServer对象,由OPCGroup对象的IUnknown接口查询到IOPCServer接口,再通过调用这一接口根据客户需要增加多个OPCGroup对象;这样OPC客户就可以通过创建的OPCGroup对象调用IOPCItemMgt接口增加实际数量的Item对象;即创建OPCItem对象;接着通过调用OPCGroup对象的IOPCSyncIO接口成员函数Read和Write同步读写该组所包含的Item对象的属性,即实际数据值;最后OPC客户在退出时释放所有的接口并依次删除OPCItem、OPCGroup和OPCServer对象。
    客户端程序与OPC数据存取服务器连接的过程:
    步骤1:初始化COM库。
    hr=CoInitialize(NULL);
    if(FAILED(HR))
    {
       AfxMessageBox(“CoInitialize fail!”)
               return true;
     }
    …….
    CoUninitialize();
    return FALSE;
    步骤2:创建Server对象(以下代码均略去变量定义、出错处理等部分)。
    CLSIDFromProgID(PROGRAM_ID,&clsid);
    HRESULT hr=CoCreateInstance   (clsid,NULL,CLSCTX_INPROC_SERVER,IID_IUnknown,reinterpret_cast<void**>(&m_pUnknown));
    if(FAILED(hr))
    MessageBox(“can't create server”);
    return TRUE;
    步骤3:获得IOPCServer 接口。
    m_pUnknown->QuertyIterface(IID_IOPCServer,( void**)(&m_pServer));
    步骤4:添加组
    m_pServer->AddGroup(“GROUP”,TURE,CLIENT_RATE,1,NULL,NULL,O,&m_hGroup,&revisedUpdateRate,ID_IOPCItemMgt,(LPUNKNOWN*)(&m_pItemMgt));
    步骤5:添加其他接口
    m_pItemMgt->QueryInterface(IID_IOPCSyncIO, ( void**)(&m_pSyncIO));
    m_pItemMgt->QueryInterface(IID_IOPCASyncIO, ( void**)(&m_pASyncIO));
    利用IOPCServer接口,可以实现增加或删除组对象等管理功能;利用IOPCItemMgt接口在组中可以实现增加(IOPCItemMgt::AddItems()、删除(IOPCItemMgt::DeleteItems())及管理项等功能,利用IOPCSyncIO和IOPCASyncIO可进行数据的同步或异步读写操作,不多赘述。
2.2 通过创建包装类实现客户端
    利用#import伪指令引入类型库,编辑器从类型库中读取信息并且创建包装类。不仅可以对类型库文件(.tlb)使用#import指令,也可以对组件DLL或EXE文件,甚至支持类型库的复合文件和LoadTypeLib函数可以理解的任何其他文件格式使用#import指令。#import指令将产生两个文件,他们位于输出路径,和类型库具有相同的名称,后缀分别为“.tlh”和“.tli”。用#import指令引入类型库时,在StdAfx.h文件中添加:#import “...\...\OPCServer\OPCServer.tlb”\,其他步骤代码类似COM库函数开发方式。
    包装类封装了COM库函数,Visual C++客户程序通过包装类访问组件提供的属性和方法。虽然中间多了一层,但对客户程序开发人员来说,却方便多了。#import指令利用了一个新的类:_com_ptr_t,也被成为智能指针,是一个模板类,它封装了接口指针并提供了一些方法和重载操作符来简化指针的操作。智能指针自动执行COM的CoCreateInstance和QuertyIterface、AddRef和Release函数。要实现异常处理,可使用try/catch块。在catch块中,异常对象类型为_com_error对象。_com_error类封装了HERSULT错误代码和IerrorInfo接口提供的相关环境信息。用#import伪指令,使得在Visual C++中使用代码组件和在VBA中一样方便,而且不需要在工程中对组件进行源代码维护。
2.3 利用第三方的动态连接库或工具包快速开发OPC客户端
    互联网上有一些OPC客户端和服务器的开发工具包(ToolKit),利用这些工具包可以快速地开发OPC程序,但这些工具包大多需要付费。Factory Soft还开发了比较通用的服务器和客户端的快速开发工具,文献[4]介绍了把它用于先进控制软件平台的开发和应用情况,但这个开发工具价格昂贵,不适合中小型系统的自主开发。也有一些是免费的客户端程序和可产生仿真数据的服务器程序以及一些测试评价工具。比如Wintech OPC Server Client Develop Kit (1.0),其源代码可从http://www.csdn.net或http://www.win-tech.com /index.htm 下载,解压缩后需注意四个文件:WTclient.dll、Wtclient lib文件、WTclientAPI.h、Wtclient Word文档。WTclientAPI.h 定义了部分API函数,这些API函数的实现以DLL的形式封装起来,详见WTclient DLL User
  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值