labview的深入探索----利用DDE實現(xiàn)進(jìn)程間的數(shù)據(jù)交換之一
LABVIEW是多線程的,在兩個線程交換數(shù)據(jù)有多種方法,進(jìn)程(PROCESS)和線程(THREAD)是兩個不同的概念,我們啟動一個執(zhí)行文件實際上就是啟動一個進(jìn)程,WINDOWS的進(jìn)程管理器可以觀察到當(dāng)前存在那些活動進(jìn)程,進(jìn)程間交換數(shù)據(jù)可以簡單地理解成多個執(zhí)行文件間交換數(shù)據(jù).
進(jìn)程間交換數(shù)據(jù)有幾種方法:剪切板(CLIPBOARD),動態(tài)數(shù)據(jù)交換(DDE),內(nèi)存映射文件(MAP FILE)和一般文件,當(dāng)然也可以用TCP/IP ,SHARE VARIABLE,DATASOCKET,不過這些都屬于網(wǎng)絡(luò)數(shù)據(jù)交換,用于本機(jī)進(jìn)程間通訊并不合適.
過去的一篇文章中已經(jīng)介紹過如何利用剪切板進(jìn)行通訊,今天介紹一下動態(tài)數(shù)據(jù)交換(DDE)
DDE(Dynamic Data Exchange),即動態(tài)數(shù)據(jù)交換,是Windows平臺上的一個完整的通信協(xié)議,它使應(yīng)用程序能彼此交換數(shù)據(jù)和發(fā)送指令。DDE過程是兩個程序的對話過程,一方向另一方提出問題,然后等待回答。提出問題的一方即申請告知信息的應(yīng)用程序,稱為顧客(Client),回答的一方即提供信息的應(yīng)用程序,稱為服務(wù)器(Server)。一個應(yīng)用程序可以同時是顧客和服務(wù)器:當(dāng)它向其他程序請求數(shù)據(jù)時,它充當(dāng)?shù)氖穷櫩?;?dāng)有其它程序需要它提供數(shù)據(jù)時,它又成了服務(wù)器。但就某一確定的時刻而言,一個應(yīng)用程序只能充當(dāng)顧客或服務(wù)器。
DDE對話的內(nèi)容是通過3 個標(biāo)識進(jìn)行約定的:①服務(wù)器名(Service Name):DDE源的每個應(yīng)用程序有一個唯一的服務(wù)器名,通常為不帶后綴的可執(zhí)行文件;②話題(Topic):對源程序有意義的一些數(shù)據(jù)單元即對話的議題,許多應(yīng)用程序?qū)⑽臋n名作為DDE會話的話題;③項目(Item):DDE會話中,兩個應(yīng)用程序間真正傳遞的數(shù)據(jù)。建立DDE之前,客戶程序必須填寫服務(wù)程序的3個標(biāo)識名。
DDE鏈接有3種類型:①熱鏈接(hot link):服務(wù)器發(fā)送專門為DDE對話而設(shè)定項目中的數(shù)據(jù),當(dāng)這些數(shù)據(jù)發(fā)生變化時,鏈接將實時動作,自動更新數(shù)據(jù);②冷鏈接(cold link):當(dāng)數(shù)據(jù)發(fā)生變化時,客戶必須明確地提出更新要求,數(shù)據(jù)才會被更新;③暖鏈接(warm link):服務(wù)器在數(shù)據(jù)發(fā)生變化時,通知客戶,客戶根據(jù)自己的要求決定是否更新數(shù)據(jù)。
DDE本質(zhì)上是通過發(fā)送消息實現(xiàn)的,在VC和CVI中,可以注冊事件回調(diào)函數(shù),實現(xiàn)自動數(shù)據(jù)交換,但是遺憾的是LABVIEW并沒有對DDE提供事件驅(qū)動方式,正如它的串口操作一樣,都是通過輪詢(POLLING)方式進(jìn)行的,因此就涉及到兩個進(jìn)程DDE速度協(xié)調(diào)的問題。
DDE是WINDOWS早期進(jìn)程間通訊的重要方式,現(xiàn)在用的不多了,但是很多應(yīng)用程序,比如OFFICE,MATLAB等,包括各種流行的組態(tài)軟件,依然提供對DDE的支持,所以有必要了解一下。
7。1以后的LABVIEW在模板中是找不到DDE庫的,需要手動添加到USER LIB中。
C:Program FilesNational InstrumentsLabVIEW 8.5vi.libPlatformdde.llb
主要分成客戶機(jī)和服務(wù)器兩部分,客戶機(jī)和服務(wù)器VI。
DDE數(shù)據(jù)交換首先要啟動服務(wù)器,否則客戶機(jī)無法連接。
服務(wù)器操作過程是:
注冊服務(wù)器---》注冊ITEM----》設(shè)定ITEM值-----》取消ITEM注冊---》取消服務(wù)器注冊
相應(yīng)客戶端的讀數(shù)據(jù)框圖
注意到服務(wù)器的循環(huán)每500MS更新一次,客戶端每500MS更新一次,服務(wù)器和客戶端基本保持同步,如果客戶端速度高于服務(wù)器,將導(dǎo)致對服務(wù)器的同一數(shù)據(jù)讀多次,同理,如果服務(wù)端運(yùn)行速度快,客戶端運(yùn)行速度慢,將導(dǎo)致數(shù)據(jù)丟失,這正是沒有事件響應(yīng)的缺點(diǎn),很難保證發(fā)送和接受的同步。因此,上面的程序僅適用于對數(shù)據(jù)交換要求不高的情況,比如監(jiān)控等。
DDE是一個層次結(jié)構(gòu),SERVER--》TOPIC---》ITEM
一個SEVER可以包括多個TOPIC,(類似與組),每個TOPIC又可以包括多個ITEM(項目),我們可以通過循環(huán)注冊多個TOPIC和多個ITEM,實現(xiàn)批量數(shù)據(jù)交換。
上圖中,通過循環(huán)為TOPIC1同時注冊了10個ITEM,分別是ITEM0----》ITEM9,在主循環(huán)中分別向ITEM0--》ITEM9寫入數(shù)據(jù)。
同理,我們可以對我們有通訊的數(shù)據(jù)詳細(xì)分類成多個SERVER和多個TOPIC,進(jìn)行大量的數(shù)據(jù)交換。
后續(xù)文章中將進(jìn)一步介紹DDE的高級同步技術(shù)。