Delphi开发OPC

来源:互联网 发布:js中flag使用方法 编辑:程序博客网 时间:2024/05/16 07:43
1 引言
    在现代工业控制系统中网络数据通讯已成为不可或缺的一部分,网络数据通讯的实现对工控实时监控系统有着至关重要的意义。MCGS(Monitor and Control Generated System)作为一个比较优秀的国产工控组态软件在工业控制实时监控系统中有着比较广泛的应用,因此有必要对MCGS在工业控制中的网络数据通讯进行深入广泛的了解和研究。
    MCGS组态软件本身提供了一套网络数据通讯机制,可把多台计算机通过TCP/IP网、Modem网、485/422/232网连接在一起,构成分布式网络测控系统,实现网络间的数据同步、数据库同步和网络事件处理[1]。但是这种通讯机制必须建立在安装了MCGS组态软件的计算机之间进行,对于没有安装该组态软件的计算机, MCGS没有提供和第三方软件进行串口通讯和TCP/IP通讯的接口。对这类情况,系统开发人员必须设计相应的通讯驱动。
系统开发人员设计数据通讯一般采用两种方式,一种是基于进程的数据通讯;一种是基于OPC的数据通讯。
2 基于进程的数据通讯
    在MCGS中实现网络数据通讯常用的方法是利用后台程序间接实现网络通讯,即首先利用Delphi、VB或VC++等编程语言编写一个后台应用程序实现网络的串口或TCP/IP通讯,然后利用MCGS提供的一套可扩充接口如数据库、OLE、DDE等实现数据在MCGS组态软件和该后台程序之间的交换,从而间接的实现MCGS组态软件和第三方软件的网络数据通讯[2]。这种方法虽然可以实现数据通讯,但是通过后台程序后通讯效率有所下降,特别当数据量比较大时,通讯延时比较大;其次数据接收方必须根据通讯协议对通讯内容进行解析之后方可得到可用的数据内容。
3 基于OPC的数据通讯
3.1 OPC技术规范简介
    OPC(OLE for Process Control,用于过程控制的OLE技术)是一套基于Windows操作平台的工业应用程序之间提供高效的信息集成和交互功能的组件对象模型接口标准,它以微软的(分布式)组件对象模型COM/DCOM/COM+ 技术为基础,采用客户端/服务器模式(如图1所示),具有语言无关性、代码重用性及易于集成性等优点。OPC的服务器是数据的供应方,负责为OPC客户端提供所需的数据,服务器内有一个数据缓冲区,其中存有最新的数据值;OPC客户端是数据的使用方,利用同步或异步方式从服务器缓冲区读取数据并进行处理,从而实现客户端和服务器的网络数据通讯。OPC规范是OPC基金会制定的符合工业控制要求的、标准的通信规范,大大提高了接口程序的兼容性和传输数据的实时性和高效性,在实时控制和实时数据管理等领域有广泛的应用[3-4]。
 
图1  OPC服务器/客户端结构图
    OPC服务器由3类对象组成,相当于3种层次上的接口,包括:服务器(OPC Server)、组(OPC Group)和数据项(OPC Item)。OPC Server是最顶层,即一个服务器程序,它包含该OPC Server 中所有的Group;OPC Group次之,包含该OPC Group中所有的OPC Item;OPC Item是读写数据的最小逻辑单位,不能独立于OPC Group而存在。OPC客户端的实现实际上就是对这三层数据管理的实现。
3.2 OPC客户端的实现
    MCGS本身就是一个OPC服务器,符合OPC标准的客户端都可以读取MCGS实时数据库中的数据。因此只要开发一个满足OPC技术规范的OPC客户端并连接到该MCGS OPC服务器上,即可实现与MCGS之间的通讯。MCGS利用OPC通讯时,其服务器名为MCGSRUN.OPCDataCentre,Group可以根据需要自己定义,Item为要进行操作的MCGS实时数据库中的变量名。Delphi下实现OPC客户端[5]的主要过程如下:
1).初始化COM口,利用Delphi中ActiveX单元中的CoInitializeSecurity函数,该函数原形及其参数的详细说明见MSDN。初始化成功后,进入第二步建立和OPC服务器的连接;
2).建立和OPC服务器的连接,利用Delphi中ComObj单元中的函数
Function CreateRemoteComObject(
const MachineName: WideString; //远程计算机名
const ClassID: TGUID //OPC服务器的GUID
): IUnknown         //返回一个接口
    创建一个COM对象,并返回该COM对象的一个接口引用;
例:建立MCGS的OPC服务器连接:
Var OPCServer:IOPCServer;
OPCServer:=CreateRemoteComObject(
MachineName,         // 远程计算机名
ProgIDToClassID ('MCGSRUN.OPCDataCentre') 
//转化成MCGS OPC服务器的GUID
) as IOPCServer  //返回IOPCServer接口
IOPCServer类型是由OPC基金会提供的OPCDA单元(还有OPCProxy.dll,一般系统自带)中的一个接口类型,以下所用函数不加说明即来自该单元;
3).建立服务器连接后,利用IOPCServer.AddGroup函数在该服务器下添加一个Group对象,同时在该函数中给该Group对象命名并设置客户端的数据刷新时间间隔等。利用IOPCServer.RemoveGroup函数可以删除一个已建立的Group对象。函数原形如下:
function AddGroup(
szName:POleStr;    //Group对象的名字
bActive: BOOL;    //是否激活该Group
dwRequestedUpdateRate: DWORD;   //数据刷新率
hClientGroup: OPCHANDLE;   //客户端OPC句柄
pTimeBias: PLongint;     //一般为nil
pPercentDeadband:PSingle; //一般设为@0.0
dwLCID: DWORD;       //一般为0
out phServerGroup: OPCHANDLE;//服务器OPC句柄
out pRevisedUpdateRate: DWORD; //修正后的数据刷新率
const riid: TIID;  // IOPCItemMgt的GUID号
out ppUnk: IUnknown    //IOPCItemMgt类型的接口
): HResult; stdcall;
4).在Group对象建立之后,可以在该Group下添加需要的Item对象。利用IOPCItemMgt.AddItem函数在指定的Group下添加一组Item对象,MCGS的OPC服务器中的Item就是实时数据库中变量的名字。利用IOPCItemMgt.RemoveItems函数删除一组指定Group中的Item对象。函数原形如下:
function AddItems(
dwCount: DWORD;   //添加Item的数量
pItemArray: POPCITEMDEFARRAY;
//OPCITEMDEF类型的数组,OPCITEMDE是一个记//录类型,存放Item的相关属性,包括Item的名字,//是否激活等
out  ppAddResults: POPCITEMRESULTARRAY;//返回结果
out ppErrors: PResultList    //Error指针
): HResult; stdcall; 
IOPCItemMgt.RemoveItems与此类似。
5).至此OPC技术规范的三个层已经建立,下面就可以对Item进行操作了。利用IOPCSyncIO.Read和IOPCSyncIO.Write函数对指定的Item对象进行数据同步读写操作。该方法虽然可以对Item 进行读写,但是当Item对象很多时,执行效率不高,适合单个或几个Item的情况;当Item很多时就要用到第6步中介绍的利用回调函数实现数据自动更新的方法。
function Write(
dwCount:DWORD;    //读取Item 的数量
phServer:POPCHANDLEARRAY; //Item的OPC句柄数组
pItemValues:POleVariantArray;   //存放读取值的数组
out ppErrors: PResultList    //Error指针
): HResult; stdcall;
IOPCSyncIO.Read与此类似。
6).回调函数实现数据自动更新,利用ActiveX单元提供的IDataObject. DAdvise和IConnectionPoint.Advise函数分别建立一个由IDataObject接口和IConnectionPointContainer接口实现的OPC客户端Group对象回调函数,当服务器Item数据有更新时,自动通知客户端,从而实现数据的自动更新。这两个函数在功能上是一样的,只是利用了不同的接口实现,只要有一个接口的回调函数建立成功即可实现数据的自动更新。当任务结束时需调用IDataObject.DUnadvise和IConnectionPoint.Unadvise来结束建立的回调函数。限于篇幅,这四个函数的参数说明请参考MSDN。
至此一个功能最简单的OPC客户端就完成了。在实际应用中可以利用OPCDA中的OPCBrowse接口动态的连接到指定的服务器中,并在应用时在服务器上建立所需的Group对象及Item对象,或设置Group和Item 的Active属性为False,关闭不需要的Group或Item的自动更新功能,进一步提高网络通讯的通讯效率。
4 试验
    图2为一个加注系统的实时工业过程控制系统的系统结构框图,以MCGS组态软件作为监控系统,完成图形显示、通讯、报表输出、报警处理等;系统与第三方诊断系统的网络通讯采用基于OPC的数据通讯方式。
 
图2 系统结构框图
    系统进行加注时有大量采集到的液位、流量、温度等信息要传输到第三方诊断故障系统中进行诊断,并把结果反馈给MCGS进行图形显示、控制输出、报警处理等。进行利用OPC技术通讯时,所有涉及的量(如液位、温度等)都定义成OPC Server中Group下的Item,采用回调函数自动更新数据,数据刷新间隔设为200ms,即5次/秒,从而保证数据的同步性。试验证明采用基于OPC技术的数据通讯能较好的完成测控任务。
5 结束语
    本文对MCGS在工业控制实时监控系统中的网络通讯进行了研究,详细介绍了运用OPC技术实现网络通讯的方法,该方法通信可靠,可扩从性强,运用灵活方便,扩展了MCGS在工控领域中网络通讯的功能,具有广阔的应用前景。
参  考  文  献
[1] 北京昆仑通态自动化软件科技有限公司.MCGS开发指南 
[2] 方彦军、戚宇君.基于MCGS组态软件的嵌入式串口通信的实现  电子工程师 计算机应用 vol.29  No.11  2003
[3] 张智杰、张燕燕.OPC技术与应用 信息技术 2002年第3期
[4] 孙敏、张成钢、李成铁.OPC技术在组态软件中的应用  制造业自动化 2004.2第26 卷 第2期
[5] 王海瑞、钟家玉.利用Delphi开发OPC客户端工具的方法研究 《微计算机信息》(测控自动化)2004年第20卷第6期
原创粉丝点击