<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁(yè) > 測(cè)試測(cè)量 > 設(shè)計(jì)應(yīng)用 > labview的深入探索----利用DDE實(shí)現(xiàn)進(jìn)程間的數(shù)據(jù)交換之一

          labview的深入探索----利用DDE實(shí)現(xiàn)進(jìn)程間的數(shù)據(jù)交換之一

          作者: 時(shí)間:2017-01-09 來(lái)源:網(wǎng)絡(luò) 收藏
          LABVIEW是多線(xiàn)程的,在兩個(gè)線(xiàn)程交換數(shù)據(jù)有多種方法,進(jìn)程(PROCESS)和線(xiàn)程(THREAD)是兩個(gè)不同的概念,我們啟動(dòng)一個(gè)執(zhí)行文件實(shí)際上就是啟動(dòng)一個(gè)進(jìn)程,WINDOWS的進(jìn)程管理器可以觀察到當(dāng)前存在那些活動(dòng)進(jìn)程,進(jìn)程間交換數(shù)據(jù)可以簡(jiǎn)單地理解成多個(gè)執(zhí)行文件間交換數(shù)據(jù).

          進(jìn)程間交換數(shù)據(jù)有幾種方法:剪切板(CLIPBOARD),動(dòng)態(tài)數(shù)據(jù)交換(DDE),內(nèi)存映射文件(MAP FILE)和一般文件,當(dāng)然也可以用TCP/IP ,SHARE VARIABLE,DATASOCKET,不過(guò)這些都屬于網(wǎng)絡(luò)數(shù)據(jù)交換,用于本機(jī)進(jìn)程間通訊并不合適.

          過(guò)去的一篇文章中已經(jīng)介紹過(guò)如何利用剪切板進(jìn)行通訊,今天介紹一下動(dòng)態(tài)數(shù)據(jù)交換(DDE)

          DDE(Dynamic Data Exchange),即動(dòng)態(tài)數(shù)據(jù)交換,是Windows平臺(tái)上的一個(gè)完整的通信協(xié)議,它使應(yīng)用程序能彼此交換數(shù)據(jù)和發(fā)送指令。DDE過(guò)程是兩個(gè)程序的對(duì)話(huà)過(guò)程,一方向另一方提出問(wèn)題,然后等待回答。提出問(wèn)題的一方即申請(qǐng)告知信息的應(yīng)用程序,稱(chēng)為顧客(Client),回答的一方即提供信息的應(yīng)用程序,稱(chēng)為服務(wù)器(Server)。一個(gè)應(yīng)用程序可以同時(shí)是顧客和服務(wù)器:當(dāng)它向其他程序請(qǐng)求數(shù)據(jù)時(shí),它充當(dāng)?shù)氖穷櫩?;?dāng)有其它程序需要它提供數(shù)據(jù)時(shí),它又成了服務(wù)器。但就某一確定的時(shí)刻而言,一個(gè)應(yīng)用程序只能充當(dāng)顧客或服務(wù)器。

          DDE對(duì)話(huà)的內(nèi)容是通過(guò)3 個(gè)標(biāo)識(shí)進(jìn)行約定的:①服務(wù)器名(Service Name):DDE源的每個(gè)應(yīng)用程序有一個(gè)唯一的服務(wù)器名,通常為不帶后綴的可執(zhí)行文件;②話(huà)題(Topic):對(duì)源程序有意義的一些數(shù)據(jù)單元即對(duì)話(huà)的議題,許多應(yīng)用程序?qū)⑽臋n名作為DDE會(huì)話(huà)的話(huà)題;③項(xiàng)目(Item):DDE會(huì)話(huà)中,兩個(gè)應(yīng)用程序間真正傳遞的數(shù)據(jù)。建立DDE之前,客戶(hù)程序必須填寫(xiě)服務(wù)程序的3個(gè)標(biāo)識(shí)名。

          DDE鏈接有3種類(lèi)型:①熱鏈接(hot link):服務(wù)器發(fā)送專(zhuān)門(mén)為DDE對(duì)話(huà)而設(shè)定項(xiàng)目中的數(shù)據(jù),當(dāng)這些數(shù)據(jù)發(fā)生變化時(shí),鏈接將實(shí)時(shí)動(dòng)作,自動(dòng)更新數(shù)據(jù);②冷鏈接(cold link):當(dāng)數(shù)據(jù)發(fā)生變化時(shí),客戶(hù)必須明確地提出更新要求,數(shù)據(jù)才會(huì)被更新;③暖鏈接(warm link):服務(wù)器在數(shù)據(jù)發(fā)生變化時(shí),通知客戶(hù),客戶(hù)根據(jù)自己的要求決定是否更新數(shù)據(jù)。

          DDE本質(zhì)上是通過(guò)發(fā)送消息實(shí)現(xiàn)的,在VC和CVI中,可以注冊(cè)事件回調(diào)函數(shù),實(shí)現(xiàn)自動(dòng)數(shù)據(jù)交換,但是遺憾的是LABVIEW并沒(méi)有對(duì)DDE提供事件驅(qū)動(dòng)方式,正如它的串口操作一樣,都是通過(guò)輪詢(xún)(POLLING)方式進(jìn)行的,因此就涉及到兩個(gè)進(jìn)程DDE速度協(xié)調(diào)的問(wèn)題。

          DDE是WINDOWS早期進(jìn)程間通訊的重要方式,現(xiàn)在用的不多了,但是很多應(yīng)用程序,比如OFFICE,MATLAB等,包括各種流行的組態(tài)軟件,依然提供對(duì)DDE的支持,所以有必要了解一下。

          7。1以后的LABVIEW在模板中是找不到DDE庫(kù)的,需要手動(dòng)添加到USER LIB中。

          C:Program FilesNational InstrumentsLabVIEW 8.5vi.libPlatformdde.llb

          主要分成客戶(hù)機(jī)和服務(wù)器兩部分,客戶(hù)機(jī)和服務(wù)器VI。


          DDE數(shù)據(jù)交換首先要啟動(dòng)服務(wù)器,否則客戶(hù)機(jī)無(wú)法連接。

          服務(wù)器操作過(guò)程是:
          注冊(cè)服務(wù)器---》注冊(cè)ITEM----》設(shè)定ITEM值-----》取消ITEM注冊(cè)---》取消服務(wù)器注冊(cè)




          相應(yīng)客戶(hù)端的讀數(shù)據(jù)框圖




          注意到服務(wù)器的循環(huán)每500MS更新一次,客戶(hù)端每500MS更新一次,服務(wù)器和客戶(hù)端基本保持同步,如果客戶(hù)端速度高于服務(wù)器,將導(dǎo)致對(duì)服務(wù)器的同一數(shù)據(jù)讀多次,同理,如果服務(wù)端運(yùn)行速度快,客戶(hù)端運(yùn)行速度慢,將導(dǎo)致數(shù)據(jù)丟失,這正是沒(méi)有事件響應(yīng)的缺點(diǎn),很難保證發(fā)送和接受的同步。因此,上面的程序僅適用于對(duì)數(shù)據(jù)交換要求不高的情況,比如監(jiān)控等。

          DDE是一個(gè)層次結(jié)構(gòu),SERVER--》TOPIC---》ITEM
          一個(gè)SEVER可以包括多個(gè)TOPIC,(類(lèi)似與組),每個(gè)TOPIC又可以包括多個(gè)ITEM(項(xiàng)目),我們可以通過(guò)循環(huán)注冊(cè)多個(gè)TOPIC和多個(gè)ITEM,實(shí)現(xiàn)批量數(shù)據(jù)交換。




          上圖中,通過(guò)循環(huán)為T(mén)OPIC1同時(shí)注冊(cè)了10個(gè)ITEM,分別是ITEM0----》ITEM9,在主循環(huán)中分別向ITEM0--》ITEM9寫(xiě)入數(shù)據(jù)。





          同理,我們可以對(duì)我們有通訊的數(shù)據(jù)詳細(xì)分類(lèi)成多個(gè)SERVER和多個(gè)TOPIC,進(jìn)行大量的數(shù)據(jù)交換。

          后續(xù)文章中將進(jìn)一步介紹DDE的高級(jí)同步技術(shù)。


          關(guān)鍵詞: labviewDDE數(shù)據(jù)交

          評(píng)論


          技術(shù)專(zhuān)區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();