热度 1|
1 引言
随着工业自动化技术的发展与企业信息化程度的不断提高,各种控制系统之间的数据通讯与资源共享越来越多地被使用。目前的工控软件基本上都会提供OPC(OLE for Process Control)或DDE服务器,使用户只需开发出符合自己要求的客户端软件即可实现实时数据的存取与分析。一般供应商所提供的样例程序均为VB编写,但编程人员更多使用的是VC、DELPHI等编程软件,本文即选用DELPHI来举例说明OPC与DDE的实时数据采集方法。
2 用OPC实现实时数据采集方法
OPC以OLE/COM/DCOM机制为通信标准,采用客户机/服务器体系结构,是目前工业控制软件中广泛采用的一项技术。OPC服务器通常支持两种类型的访问接口:自动化接口(Automation interface)和自定义接口(Custom interface)。自动化接口通常是为基于脚本编程语言而定义的标准接口,可以使用VB、Delphi、PB等编程语言开发OPC应用程序。自定义接口是专门为C++等高级编程语言而制定的标准接口。OPC服务器程序的主要功能是收集现场设备数据信息,并通过标准OPC接口传送给OPC客户端。OPC客户端程序接收服务器发送来的数据,实现实时数据的采集与处理。符合OPC标准的客户端程序可以访问来自任何生产厂商所提供的符合OPC标准的服务器程序,正是这种开放性与通用性使OPC得到了越来越广泛的应用。
使用Delphi编程语言开发符合OPC标准的服务器端或客户端程序必须安装自动化接口:OPC Automation2.0,添加动态链接库文件OPCDAAuto.dll,如果将代码直接插入程序中编译,可以使程序移植更加方便。基本代码如下:
CoUninitialize();
r1:=CoInitialize(nil);
r1:=CLSIDFromProgID(PWideChar(WideString(OPC Server Name)),clsid); //返回服务器句柄
r1:=CoCreateInstance(clsid,nil, CLSCTX_LOCAL_SERVER,IID_IOPCServer,pOPCServer); //建立服务器连接
r1:=ServerAddGroup(pOPCServer, groupname, true, pRevisedUpdateRate,hClientGroup,GroupIf,phServerGroup); //添加组
r1:=GroupAddItem(GroupIf,ItemID,hClientGroup,VT_EMPTY,ItemHandle,CanonicalType);
// 添加项目标签
V:=ReadOPCGroupItemValue(GroupIf,ItemHandle, ItemValue, ItemQuality); //读数据
edit1.text:=inttostr(V); //显示数据
3 用DDE实现实时数据采集
Delphi中使用了4个控件完成DDE功能,它们是:
DDEClientConv: 客户程序建立并维护DDE会话;
DDEClientItem: 客户程序建立并维护数据交换通道;
DDEServerConv: 服务器程序响应DDE会话;
DDEServerItem: 服务器程序维护数据交换通道。
前两个控件用于生成一个DDE客户程序,后两个控件用于生成一个DDE服务器程序。如果一个应用程序同时应用了这些部件,则这一程序既可以充当DDE客户,也可以充当DDE服务器。会话控件DDEClientConv、DDEServerConv用于建立和维护一个DDE会话。DDE会话包括DDE服务和DDE主题两部分。DDE服务是DDE服务器的名称,是DDE服务器应用程序执行文件名去掉.EXE后缀。DDE主题是一个包含了联接信息的数据单元,是一个文件名。项目控件DDEclientItem、DDEServerItem用于建立和维护DDE数据的传输通道。 DDE项目中包含着实际欲传输的数据名称,DDE项目的格式取决于DDE服务器应用程序。
在工控软件中一般都会提供DDE服务器应用程序,用户只要使用DDEClientConv、DDEclientItem来编辑客户端程序读写数据,如果在编辑程序时动态编辑数据项目,也可以不使用DDEclientItem控件。选取System下的DdeClientConv控件,更改名称属性为Name:=DDE。Delphi的DDE提供了两种联接模式:自动和人工。通过DDEClinetConv 部件的ConnectMode属性进行设置,更改属性为人工方式:ConnenctMode:=ddeManual。当调用OpenLink方法时建立和服务器的联接,数据更新时调用RequestData方法申请并获得数据。编写采集实时数据的代码如下:
DDE.SetLink(DdeService,DdeTopic);
//设置DDE服务器名称和工程项目名称以建立连接
DDE.OpenLink ;
//打开连接
V:=StrAlloc(79);
V:=dde.RequestData(Item);
//返回标签项目数据
Label1.Caption :=V;
StrDisPose(V);
DDE.CloseLink ;
//断开连接