DDE與COM技術在組態(tài)軟件開發(fā)中的應用
發(fā)布時間:2007/4/23 0:00:00 訪問次數(shù):825
這樣,可以使用Matlab開發(fā)COM組件,在VC下開發(fā)DDE服務程序,使其與InTouch進行數(shù)據(jù)通信,而這個DDE服務程序調用Matlab開發(fā)的COM進行數(shù)值處理和算法實現(xiàn)。在實際工業(yè)自動化的組態(tài)軟件開發(fā)中,可以使用VC進行數(shù)據(jù)的采集、命令的發(fā)送和復雜的流程控制;使用Matlab下開發(fā)的COM完成復雜的算法實現(xiàn)和數(shù)字信號處理編程;在InTouch下實現(xiàn)人機對話界面并接收使用者的命令。具體的系統(tǒng)構架如圖1所示。
2 應用實現(xiàn)
Windows DDE功能應用的核心是DDE事務管理庫(DDEML),它負責管理Windows操作系統(tǒng)下應用程序間的DDE會話和通信,還向用戶提供了一系列的應用程序接口API函數(shù)。
DDE實現(xiàn)程序間的通信是通過三個標識約定的:
應用程序名(Application):進行DDE對話雙方的名稱;
主題(Topic):被討論的數(shù)據(jù)域;
項目(Item):被討論的特定數(shù)據(jù)對象。
在DDE服務程序中首先使用DdeInitialize進行初始化,然后調用DdeCreateStringHandle建立應用程序名、主題和項目等標識的句柄,再通過DdeNameService在操作系統(tǒng)中注冊DDE服務程序的名字。根據(jù)這些句柄,客戶程序就可以使用它提供的DDE服務了。在VC++中的程序實現(xiàn)如下:
#include<ddeml.h>……
DWORD idInstc=0,iData;//iDate是項目對應的數(shù)據(jù)
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);
//在操作系統(tǒng)中注冊該DDE服務
DdeNameService(idInst,hszSvr,0L,DNS_REGISTER);
……
DDE服務程序的核心部分是一個回調函數(shù),它處理所有DDE消息及相應數(shù)據(jù)請求。DDE服務程序回調函數(shù)的代碼如下:
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);
}
//校驗主題、項目的句柄及數(shù)據(jù)格式
if(hszl==hszTopic && hsz2==hszItem && usFmt==CF_TEXT){
if(usType==XTYP_REQUEST‖usType==XTYP_ ADVREQ){//得到數(shù)據(jù)請求
_itoa(iData,sz,10);//將數(shù)據(jù)轉換為文本格式
return DdeCreateDataHandle(idInst,(LPBYTE)sz,
strlen(s2)十1,0L,hszItem,CP_TEXT,0);
}
if(usType==XTYP_POKE){//得到客戶端發(fā)送來的數(shù)據(jù)
DdeGetData(hData,(LPBYTE)sz,strlen(sz)十1,0L);
iData=atoi(sz); //保存數(shù)據(jù)
DdePostAdvise(idInst,hszTopic,hszItem);
return((HDDEDATA)DDE_FACK);
}
}
return 0;
<這樣,可以使用Matlab開發(fā)COM組件,在VC下開發(fā)DDE服務程序,使其與InTouch進行數(shù)據(jù)通信,而這個DDE服務程序調用Matlab開發(fā)的COM進行數(shù)值處理和算法實現(xiàn)。在實際工業(yè)自動化的組態(tài)軟件開發(fā)中,可以使用VC進行數(shù)據(jù)的采集、命令的發(fā)送和復雜的流程控制;使用Matlab下開發(fā)的COM完成復雜的算法實現(xiàn)和數(shù)字信號處理編程;在InTouch下實現(xiàn)人機對話界面并接收使用者的命令。具體的系統(tǒng)構架如圖1所示。
2 應用實現(xiàn)
Windows DDE功能應用的核心是DDE事務管理庫(DDEML),它負責管理Windows操作系統(tǒng)下應用程序間的DDE會話和通信,還向用戶提供了一系列的應用程序接口API函數(shù)。
DDE實現(xiàn)程序間的通信是通過三個標識約定的:
應用程序名(Application):進行DDE對話雙方的名稱;
主題(Topic):被討論的數(shù)據(jù)域;
項目(Item):被討論的特定數(shù)據(jù)對象。
在DDE服務程序中首先使用DdeInitialize進行初始化,然后調用DdeCreateStringHandle建立應用程序名、主題和項目等標識的句柄,再通過DdeNameService在操作系統(tǒng)中注冊DDE服務程序的名字。根據(jù)這些句柄,客戶程序就可以使用它提供的DDE服務了。在VC++中的程序實現(xiàn)如下:
#include<ddeml.h>……
DWORD idInstc=0,iData;//iDate是項目對應的數(shù)據(jù)
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);
//在操作系統(tǒng)中注冊該DDE服務
DdeNameService(idInst,hszSvr,0L,DNS_REGISTER);
……
DDE服務程序的核心部分是一個回調函數(shù),它處理所有DDE消息及相應數(shù)據(jù)請求。DDE服務程序回調函數(shù)的代碼如下:
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);
}
//校驗主題、項目的句柄及數(shù)據(jù)格式
if(hszl==hszTopic && hsz2==hszItem && usFmt==CF_TEXT){
if(usType==XTYP_REQUEST‖usType==XTYP_ ADVREQ){//得到數(shù)據(jù)請求
_itoa(iData,sz,10);//將數(shù)據(jù)轉換為文本格式
return DdeCreateDataHandle(idInst,(LPBYTE)sz,
strlen(s2)十1,0L,hszItem,CP_TEXT,0);
}
if(usType==XTYP_POKE){//得到客戶端發(fā)送來的數(shù)據(jù)
DdeGetData(hData,(LPBYTE)sz,strlen(sz)十1,0L);
iData=atoi(sz); //保存數(shù)據(jù)
DdePostAdvise(idInst,hszTopic,hszItem);
return((HDDEDATA)DDE_FACK);
}
}
return 0;
<