DDE与COM技术在组态软件开发中的应用
发布时间:2007/4/23 0:00:00 访问次数:820
这样,可以使用Matlab开发COM组件,在VC下开发DDE服务程序,使其与InTouch进行数据通信,而这个DDE服务程序调用Matlab开发的COM进行数值处理和算法实现。在实际工业自动化的组态软件开发中,可以使用VC进行数据的采集、命令的发送和复杂的流程控制;使用Matlab下开发的COM完成复杂的算法实现和数字信号处理编程;在InTouch下实现人机对话界面并接收使用者的命令。具体的系统构架如图1所示。
2 应用实现
Windows DDE功能应用的核心是DDE事务管理库(DDEML),它负责管理Windows操作系统下应用程序间的DDE会话和通信,还向用户提供了一系列的应用程序接口API函数。
DDE实现程序间的通信是通过三个标识约定的:
应用程序名(Application):进行DDE对话双方的名称;
主题(Topic):被讨论的数据域;
项目(Item):被讨论的特定数据对象。
在DDE服务程序中首先使用DdeInitialize进行初始化,然后调用DdeCreateStringHandle建立应用程序名、主题和项目等标识的句柄,再通过DdeNameService在操作系统中注册DDE服务程序的名字。根据这些句柄,客户程序就可以使用它提供的DDE服务了。在VC++中的程序实现如下:
#include<ddeml.h>……
DWORD idInstc=0,iData;//iDate是项目对应的数据
HSZ hszSvr,hszTopic,hszIrem;
DdeInitialize(&idInst,(PFNCALLBACK)DdeCallback,CBF_
FAIL_EXECUTES┃CBF_SKIP_ALLNOTIFICATIONS,0L);
//建立应用程序名、主题和项目等标识的句柄
hszSvr=DdeCreateStringHandle(idInst,“DDEApp”,0);
hszTopic=DdeCreateStringHandle(idInst,“DDEAppTopic”,0);
hszItem=DdeCreateStringHandle(idInst,“DDEApphem”,0);
//在操作系统中注册该DDE服务
DdeNameService(idInst,hszSvr,0L,DNS_REGISTER);
……
DDE服务程序的核心部分是一个回调函数,它处理所有DDE消息及相应数据请求。DDE服务程序回调函数的代码如下:
HDDEDATA CALLBACK DdeCallback (WORD usType,WORD usFmt,HCONV hConv,HSZ hsz1,HSZ hsz2, HDDE—DATA hData,DWORD 1Datal,DWORD 1Data2){CHAR sz[5]
if(usType==XTYP_CONNECT){ //得到连接请求return((HDDEDATA)TRUE);
}
//校验主题、项目的句柄及数据格式
if(hszl==hszTopic && hsz2==hszItem && usFmt==CF_TEXT){
if(usType==XTYP_REQUEST‖usType==XTYP_ ADVREQ){//得到数据请求
_itoa(iData,sz,10);//将数据转换为文本格式
return DdeCreateDataHandle(idInst,(LPBYTE)sz,
strlen(s2)十1,0L,hszItem,CP_TEXT,0);
}
if(usType==XTYP_POKE){//得到客户端发送来的数据
DdeGetData(hData,(LPBYTE)sz,strlen(sz)十1,0L);
iData=atoi(sz); //保存数据
DdePostAdvise(idInst,hszTopic,hszItem);
return((HDDEDATA)DDE_FACK);
}
}
return 0;
<这样,可以使用Matlab开发COM组件,在VC下开发DDE服务程序,使其与InTouch进行数据通信,而这个DDE服务程序调用Matlab开发的COM进行数值处理和算法实现。在实际工业自动化的组态软件开发中,可以使用VC进行数据的采集、命令的发送和复杂的流程控制;使用Matlab下开发的COM完成复杂的算法实现和数字信号处理编程;在InTouch下实现人机对话界面并接收使用者的命令。具体的系统构架如图1所示。
2 应用实现
Windows DDE功能应用的核心是DDE事务管理库(DDEML),它负责管理Windows操作系统下应用程序间的DDE会话和通信,还向用户提供了一系列的应用程序接口API函数。
DDE实现程序间的通信是通过三个标识约定的:
应用程序名(Application):进行DDE对话双方的名称;
主题(Topic):被讨论的数据域;
项目(Item):被讨论的特定数据对象。
在DDE服务程序中首先使用DdeInitialize进行初始化,然后调用DdeCreateStringHandle建立应用程序名、主题和项目等标识的句柄,再通过DdeNameService在操作系统中注册DDE服务程序的名字。根据这些句柄,客户程序就可以使用它提供的DDE服务了。在VC++中的程序实现如下:
#include<ddeml.h>……
DWORD idInstc=0,iData;//iDate是项目对应的数据
HSZ hszSvr,hszTopic,hszIrem;
DdeInitialize(&idInst,(PFNCALLBACK)DdeCallback,CBF_
FAIL_EXECUTES┃CBF_SKIP_ALLNOTIFICATIONS,0L);
//建立应用程序名、主题和项目等标识的句柄
hszSvr=DdeCreateStringHandle(idInst,“DDEApp”,0);
hszTopic=DdeCreateStringHandle(idInst,“DDEAppTopic”,0);
hszItem=DdeCreateStringHandle(idInst,“DDEApphem”,0);
//在操作系统中注册该DDE服务
DdeNameService(idInst,hszSvr,0L,DNS_REGISTER);
……
DDE服务程序的核心部分是一个回调函数,它处理所有DDE消息及相应数据请求。DDE服务程序回调函数的代码如下:
HDDEDATA CALLBACK DdeCallback (WORD usType,WORD usFmt,HCONV hConv,HSZ hsz1,HSZ hsz2, HDDE—DATA hData,DWORD 1Datal,DWORD 1Data2){CHAR sz[5]
if(usType==XTYP_CONNECT){ //得到连接请求return((HDDEDATA)TRUE);
}
//校验主题、项目的句柄及数据格式
if(hszl==hszTopic && hsz2==hszItem && usFmt==CF_TEXT){
if(usType==XTYP_REQUEST‖usType==XTYP_ ADVREQ){//得到数据请求
_itoa(iData,sz,10);//将数据转换为文本格式
return DdeCreateDataHandle(idInst,(LPBYTE)sz,
strlen(s2)十1,0L,hszItem,CP_TEXT,0);
}
if(usType==XTYP_POKE){//得到客户端发送来的数据
DdeGetData(hData,(LPBYTE)sz,strlen(sz)十1,0L);
iData=atoi(sz); //保存数据
DdePostAdvise(idInst,hszTopic,hszItem);
return((HDDEDATA)DDE_FACK);
}
}
return 0;
<