1 OPC技术简介
1.1 什么是OPC
OPC(OLE for Process Control),即用于过程控制的对象链接与嵌入技术,是一种规范,是在工业控制和生产自动化领域中使用的硬件和软件的接口标准。OPC以组件对象模型和分布式组件对象模型(COM/DCOM)技术为基础,采用客户/服务器(Client/Server)的模式,定义了一组COM对象及其接口标准。
OPC规范是由世界范围内自动化领域中处于领导地位的硬件和软件开发商,在微软的协作下制定的,并且已经得到越来越多的客户和硬件制造商的认可。
1.2 OPC的意义
在传统的控制系统中,针对同一个硬件设备,每个应用软件都要根据自己的需求开发一套硬件驱动程序。这不仅加大了开发和维护费用,而且带来了访问冲突问题。
OPC技术将各个硬件设备驱动程序和通讯程序封装成独立的OPC服务器,上层应用软件(作为OPC客户端)可以不关心硬件的性能特点,而通过标准的OPC接口访问OPC服务器。
这样不仅解决了上述问题,而且实现了软件的“即插即用”。OPC相当于一块软件“主板”,它能够直接与现场的PLC、工业网络、数据采集和Windows CE设备连接,快速有效地获取现场实时数据。PC机内的各种监视、控制和管理等应用软件则像是插在OPC主板上的软件“芯片”,芯片可以通过OPC获得现场实时数据,芯片之间也可以按照OPC协议进行通讯,从而实现软件的“即插即用”。
1.3 OPC对象与接口
OPC的核心是COM/DCOM技术。在COM模型中,软件的功能被分解为一些组件,这些组件通过COM协议在一定条件下连接起来,实现相应的功能。COM对象分为客户端和服务器两类,客户端通过COM接口访问服务器[2]。
OPC数据访问规范描述了OPC服务器需要实现的COM对象及其接口,它定义了定制接口(custom interface)和自动化接口(automation interface)[1]。OPC客户程序通过接口与服务器通讯,间接读取数据。OPC服务器必须实现定制接口,也可以有选择地实现自动化接口。一般来说,自动化接口能为VB等高级语言客户程序提供极大的便利,但数据传输效率较低;而定制接口则为用C/C++语言编写的程序带来灵活高效的调用手段。
OPC客户程序访问服务器时,创建一个服务器对象(这里指的是逻辑对象,目的是利用这个逻辑对象建立与实际服务器的连接),调用这个服务器对象的接口,服务器对象创建组对象并返回组对象的指针,客户程序获得组对象的指针后调用其接口。
注意,OPC项并不是OPC客户直接操作的对象,因为OPC项没有定义外部接口,对象的所有操作都是通过包容该项的组对象进行的。
2 OPC数据访问服务器的结构及设计步骤
2.1 OPC数据访问服务器的结构
图 1 OPC数据访问服务器的结构
本文实现的OPC数据访问服务器具有数据采集的功能,提供符合OPC规范的定制接口。主要由OPC 服务器对象、OPC 组对象、OPC 项对象和针对CAN(Controller Area Network控制器局域网)通讯卡编写的I/O 动态链接库(DLL)组成,采用如图1所示的结构。
OPC 服务器对象是客户端与服务器交互的首要对象。客户端通过访问服务器对象的接口函数与之进行交互。一个服务器对象里可以设置一个以上的组对象。OPC 服务器对象的主要功能是:①创建和管理OPC 组对象;②管理服务器内部的状态信息;③将服务器的错误代码翻译成描述性语句;④浏览服务器内部的数据组织结构。
OPC 组对象用于组织管理服务器内部的实时数据信息,它是OPC 项对象的集合。正因为有了组对象,OPC应用程序就可以成批地对所需要的数据进行访问,也可以以组为单位启动或停止数据访问。其主要功能是:①管理组对象内部的状态信息;②创建和管理项对象;③OPC服务器内部的实时数据存取服务(同步或异步方式)。
OPC 服务器对象和组对象支持的接口由OPC规范定义,但并未规定具体如何实现,需要开发人员自己完成。
OPC项则与现场设备中的模块相对应,它包含数据项的值(value)、品质(quality)和时间戳(time stamp)。
I/O DLL是针对具体硬件设备开发的驱动程序,实现从现场设备读取数据的功能。
2.2 实现OPC数据访问服务器的主要步骤:
2.2.1 获得并注册OPC标准组件
根据COM规范,COM服务器可分为进程内服务器、本地服务器和远程服务器。后两种服务器与客户程序运行在不同的进程空间,属于进程外服务器。为了实现进程间通讯,需要用到代理/存根模块。代理/存根模块由接口描述语言(IDL)直接生成。OPC基金会为每种OPC服务器提供了相应的代理/存根动态链接库,这些文件可以在OPC基金会的网站(www.opcfoundation.org)上免费下载。
注意,设计OPC服务器时可以在OPC对象上增加接口以满足特定的要求,但不能修改标准的OPC IDL文件或相应的 proxy/stub DLL。新增的接口描述应定义在独立的IDL文件中,并由该文件生成独立的代理/存根模块来完成接口的调用工作。
组件的注册将在后面介绍。
2.2.2 编写OPC服务器代码
首先定义0PC数据服务器的名称(ProgID)和类标识(CLSID),实现COM库的初始化功能和0PC数据服务器类厂对象的接口功能。然后实现OPC对象和数据缓冲区。接下来针对具体硬件编写I/O DLL,实现数据的实时读取。这项工作是十分繁重的,要求开发人员具有良好的COM编程知识,具体过程限于篇幅不能详述,这里指出两点引起注意:
⑴全局唯一标识符(GUID)
GUID是为每个COM对象提供的十六字节标识数。COM类至少有两个GUID:类标识(CLSID)和接口标识(IID)。CLSID用于标识COM类,登记在Windows注册表中,包含指向包括COM类的DLL或EXE组件的路径。IID用于标识该类的接口,被应用程序用来查询和触发该类的方法,也登记在注册表中。由于对象类是由GUID标识的,所以必须保证它们的唯一性,才能使最终用户在使用由不同软件商开发的组件时不会发生冲突。
可以使用宏DEFINE_GUID (name , long , word , word , word , byte1 , … ,byte8 )
其中 name 是标识数的名字,其余参数是实际的ID码。类标识的命名惯例是CLSID_ClassName ,而接口ID的命名惯例是IID_InterfaceName。
有两种途径来获得GUID:
①Microsoft Visual C++提供了两个工具来产生GUID:UUIDGen.exe和GUIDGen.exe(大小写没有影响)。前者是一个命令行程序,直接产生一个GUID;后者是一个基于对话框的应用程序,运行UUIDGen.exe,产生一个Create GUID对话框。它提供四种格式,选定之后,按New GUID键产生新的GUID,显示在Result栏中;按Copy键可以复制产生的结果。
②利用COM库提供的API函数来产生GUID:
HRESULT CoCreateGuid (GUID *pguid )
如果创建GUID成功,则函数返回S_OK,并且pguid将指向所得到的GUID值。
⑵OPC组件的注册
注册表是客户和组件程序共同访问的信息仓库,通常情况下,当组件程序被安装到计算机上之后,必须通过某种途径把它的信息注册到注册表中,然后客户程序才能根据注册表中的信息对组件程序进行操作。
根据COM规范,组件程序可分为自注册组件程序和非自注册组件程序。OPC基金会提供的组件都是自注册组件。对于非自注册组件程序,其注册过程与组件程序没有直接关系,必须单独进行注册信息的配置,比如,可以编写一个注册表文件,然后在RegEdit中引入。
对于DLL形式的进程内自注册组件,Windows系统提供了RegSvr32.exe注册工具进行组件注册和注销。组件程序本身必须包含DllRegisterServer和DllUnregisterServer两个注册表入口函数。注册和注销的格式分别为:
RegSvr32 <系统路径>
RegSvr32 /u <系统路径>
对于EXE形式的进程外自注册组件,COM规范规定,必须支持两个命令行参数/RegServer和/UnregServer(大小写无关,并且“/”可以用“-”代替),以便完成注册和注销操作。注册和注销的格式分别为:
<系统路径> /RegServer
<系统路径> /UnregServer
2.2.3 测试OPC服务器
OPC服务器经过调试之后,还需要利用OPC客户程序对它的主要功能进行测试。
3 OPC技术在CAN现场总线系统中的应用
本文开发的OPC服务器是针对华控公司的CAN通讯卡编写的,用于从华控的CAN通讯卡和RSM智能模块组成的现场通讯网络中读取信息。
3.1 系统组成
系统主要由上位机, CAN通讯卡,OPC 客户端,OPC服务器,RSM智能模块,通讯媒体等组成。如图2所示。
图2 系统构成
①上位机的软、硬件配置: Microsoft Windows 98/2000 或Windows NT操作系统;32M以上内存、1G以上可用硬盘空间、SVGA显示卡。
②CAN通讯卡选用华控公司的HK-CAN30B,它是一种将CAN通讯协议与PC机PCI总线标准相连接的非智能CAN插卡,通过该卡可对工业现场具有CAN通讯接口的仪表和控制设备进行监控。
③CAN现场设备选用华控的RSM智能模块,每个模块都是在一个嵌入式实时多任务的内核管理下周期性工作,按组态要求定时地向上发送和取得数据。
④通讯媒体可以选用双绞线、带屏蔽双绞线等。
⑤客户端选用力控公司的力控2.6监控组态软件。力控2.6支持OPC技术。它作为OPC客户端,充分利用了OPC服务器的强大性能,为工程人员提供了方便高效的数据访问能力。在力控中可以同时挂接任意多个OPC服务器,每个OPC服务器都可以当作一个外部设备进行定义、增加或删除。
3.2 OPC 服务器与客户端的连接
3.2.1 定义OPC设备
首先在力控导航器窗口中选择“实时数据库”中的 “I/O设备驱动”并展开,出现“OPC”设备。双击“OPC(Client)”,出现I/O设备定义对话框。在“设备名称”中定义逻辑设备的名称(由用户随意定义),不妨定义为“OPC”,在“数据更新周期”中指定采集周期,填写故障后恢复查询的周期和最长时间,然后单击“下一步”,出现OPC设备定义对话框。
力控会自动搜索计算机系统中已经安装的所有OPC服务器。如果OPC服务器编写无误并且注册正确,则点击下拉框“OPC 服务器”时会列出已经安装的所有OPC服务器的名称,选择要使用的OPC服务器,这里选择本文设计的服务器“OPC.Server.1”。
选择“Server类型”,是“当地(local)”还是“远程(remote)”。在“数据访问方式”中选择“缓冲区”或“外设”方式,对于“缓冲区”方式,OPC客户程序将通过OPC服务器的缓冲区读取数据;对于“外设”方式,OPC客户程序将通过OPC服务器直接从设备读取数据。从设备直接读取数据速度会慢一些,一般只有在故障诊断或极特殊的情况下才会使用。在“死区百分比”中输入一个百分值,表示过程数据值的变化不超出这个比例将不对其进行数据更新。单击“确定”就完成了OPC设备的定义。
3.2.2 对OPC数据项进行数据连接
启动力控的数据库组态程序DBMan。首先在点组态中创建所要用的变量,不妨设为gg1。展开“数据连接”项,已经建立的OPC设备就排列在其中。双击我们刚才建立的OPC设备 “OPC”,则出现“数据连接”对话框。选择要连接的点参数gg1后,单击“增加”按钮,出现“数据项组态”对话框。
如果OPC服务器支持“浏览”功能,双击右上侧列表框中的“Root”,列表框会自动列出它提供的数据区;如果OPC服务器不支持“浏览”功能,其数据项的描述需要用户根据OPC服务器的资料说明,在“数据项”输入框内手工填写。选择“数据类型”和“读写权限”,在“访问路径”中输入数据的访问路径(这一项不是必需的,需要填写的,可以参考所使用的OPC服务器的手册),这里不用填写。
最后单击“确定”按钮,就生成了一个数据项的数据连接,如图3所示,从而实现了与现场实际信息的连接。
图3 力控数据连接结果
在系统运行时,力控和服务器建立连接,自动完成和OPC服务器之间的数据交换。
4 结束语
本文设计的OPC数据访问服务器符合OPC规范,实现了对数据的实时读写,具有实用价值。总之,有了OPC规范,控制系统软件可以高效、稳定地对硬件设备进行数据存取, 系统应用软件之间也可以灵活地进行信息交互,极大地提高了控制系统的互操作性和适应性。