DDE与COM技术在组态软件开发中的应用
来源:华强电子网
作者:华仔
浏览:479
时间:2016-08-10 14:18
标签:
摘要:
DDE与COM技术在组态软件开发中的应用 [日期:2005-3-18] 来源:电子技术应用 作者:北京航空航天大学电子信息工程学院 常 青 张卡华 北工学院电子工程系 张志杰 [字体:模块设计,方便其它应用程序调用,MathWorks公司推荐使用COM builder在Matlab环境下开发COM、COM是Component Object Module的简称,它是一种通用
DDE与COM技术在组态软件开发中的应用 [日期:2005-3-18] 来源:电子技术应用 作者:北京航空航天大学电子信息工程学院 常 青 张卡华 北工学院电子工程系 张志杰 [字体:模块设计,方便其它应用程序调用,MathWorks公司推荐使用COM builder在Matlab环境下开发COM、COM是Component Object Module的简称,它是一种通用的对象接口,任何语言只要按照这种接口标准就可以调用它。这样,可以使用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;<