下載本文檔
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、 3/3LabVIEW如何方便地調(diào)用DLL文件 LabVIEW如何方便地調(diào)用DLL文件 LabVIEW調(diào)用DLL文件 LabVIEW支持通過(guò)調(diào)用DLL文件的方式與其它編程語(yǔ)言混合使用。比如,在實(shí)際的工程項(xiàng)目中,用戶可以用C+語(yǔ)言實(shí)現(xiàn)軟件的運(yùn)算部分,并把這些功能構(gòu)建在DLL文件中,然后再使用LabVIEW編寫(xiě)程序的界面部分,并通過(guò)調(diào)用編寫(xiě)好的DLL來(lái)調(diào)用運(yùn)算部分的功能。 LabVIEW 中是通過(guò)Call Library Function Node(CLN)節(jié)點(diǎn)來(lái)完成DLL文件調(diào)用的。創(chuàng)建一個(gè)新的VI,右擊程序框圖,在Functions Palette中依次選中ConnectivityLibrar
2、ies & Executables工具欄即可找到該節(jié)點(diǎn)(如下圖)。 將節(jié)點(diǎn)放置在程序框圖中,雙擊會(huì)出現(xiàn)它的配置對(duì)話框,共有四頁(yè)。第一頁(yè)用于填寫(xiě)被調(diào)用函數(shù)的信息Library name or path(庫(kù)名/路徑)需給出DLL文件名和路徑,若引用操作系統(tǒng)路徑下的DLL文件,直接輸入文件名也可調(diào)用,其它的必須輸入全路徑。在這里已經(jīng)給出名字的DLL是被靜態(tài)加載到程序中的,也就是說(shuō)當(dāng)調(diào)用了這個(gè)DLL的VI被裝入存時(shí),DLL同時(shí)被裝入存。LabVIEW也可動(dòng)態(tài)加載DLL,只要勾選上Specify path on diagram(在程序框圖中指定路徑)的選項(xiàng)即可。選擇了這個(gè)選項(xiàng),在Library name
3、 or path(庫(kù)名/路徑)中輸入的容就無(wú)效了,取而代之的是CLN 節(jié)點(diǎn)多出一對(duì)輸入輸出,用于指明所需要使用的DLL的路徑。這樣,當(dāng)VI被打開(kāi)時(shí),DLL不會(huì)被裝入存,只用程序運(yùn)行到需要使用這個(gè)DLL中的函數(shù)時(shí),才把其裝入存。Function name是需要調(diào)用的函數(shù)的名稱,LabVIEW 會(huì)把DLL中所有的暴露出來(lái)的函數(shù)都列出,用戶只要在下拉框中選取即可。Thread欄用于設(shè)定哪個(gè)線程里運(yùn)行被調(diào)用的函數(shù)。用戶可以通過(guò)CLN 節(jié)點(diǎn)的配置面板來(lái)指定被調(diào)用函數(shù)運(yùn)行所在的線程。CLN 的線程選項(xiàng)非常簡(jiǎn)單,只有兩項(xiàng):Run in UI thread和Run in any thread。LabVIEW的
4、程序框圖上直接可以看出一個(gè)CLN節(jié)點(diǎn)是選用的什么線程。如果Run in UI thread,節(jié)點(diǎn)顏色是橙色的;Run in any thread則是淺黃色的 通常情況下,除非使用的動(dòng)態(tài)庫(kù)是多線程安全的,CLN 中選擇Run in any thread方式;否則必須選擇Run in UI thread方式。判斷一個(gè)動(dòng)態(tài)庫(kù)是不是多線程安全的,需通過(guò)以下方法:如果一個(gè)動(dòng)態(tài)庫(kù)的文檔中沒(méi)有明確說(shuō)明它是多線程安全的,那么就要當(dāng)作是非多線程安全的;在可以看到動(dòng)態(tài)庫(kù)源代碼的條件下,如果代碼中存在全局變量、靜態(tài)變量或者代碼中看不到有l(wèi)ock一類(lèi)的操作,那么這個(gè)動(dòng)態(tài)庫(kù)也就肯定不是多線程安全的。 選擇了Run in
5、 any thread方式,LabVIEW會(huì)在最方便的線程運(yùn)行動(dòng)態(tài)庫(kù)函數(shù),且一般會(huì)與調(diào)用它的VI在同一個(gè)線程運(yùn)行。因?yàn)長(zhǎng)abVIEW是自動(dòng)多線程的語(yǔ)言,它也很可能會(huì)把動(dòng)態(tài)庫(kù)函數(shù)分配給一個(gè)單獨(dú)的線程運(yùn)行。如果程序中存在沒(méi)有直接或間接先后關(guān)系的兩個(gè)CLN節(jié)點(diǎn),LabVIEW很可能會(huì)同時(shí)在不同的線程運(yùn)行它們所調(diào)用的函數(shù),也許是同一函數(shù)。對(duì)于非多線程安全的動(dòng)態(tài)庫(kù),這是很危險(xiǎn)的操作。很容易引起數(shù)據(jù)混亂,甚至是程序崩潰。 選擇Run in UI thread方式,因?yàn)長(zhǎng)abVIEW只有一個(gè)界面線程,所以如果所有的CLN設(shè)置都是界面線程,那么就可以保證這些CLN調(diào)用的函數(shù)肯定全部都運(yùn)行在同一線程下,肯定不會(huì)
6、被同時(shí)調(diào)用。對(duì)于非多線程安全的動(dòng)態(tài)庫(kù),這種方式就保證了它的安全。 讓我們回到配置對(duì)話框第一頁(yè),Calling convention用于指明被調(diào)用函數(shù)的調(diào)用約定。這里只支持兩種約定:stdcall 和C call。它們之間的區(qū)別在于,stdcall由被調(diào)用者負(fù)責(zé)清理堆棧,C call由調(diào)用者清理堆棧。這個(gè)設(shè)置錯(cuò)誤時(shí),可能會(huì)引起LabVIEW崩潰,也就是說(shuō)如果LabVIEW調(diào)用DLL函數(shù)時(shí)出現(xiàn)異常,首先應(yīng)該考慮這個(gè)設(shè)置是否正確。(Windows API一般使用的都是stdcall;標(biāo)準(zhǔn)C的庫(kù)函數(shù)大多使用C call。如果函數(shù)聲明中有類(lèi)似_stdcall這樣的關(guān)鍵字,它就是stdcall的。) 第二
7、頁(yè)是函數(shù)參數(shù)的配置(圖4)。 DLL和LabVIEW之間傳遞參數(shù),最常用的三種數(shù)據(jù)類(lèi)型是數(shù)值、數(shù)值型數(shù)組和字符串。C語(yǔ)言中經(jīng)常把指針或者數(shù)據(jù)的地址在函數(shù)間傳遞,在32位操作系統(tǒng)中,可以使用int32數(shù)值來(lái)表示指針。因此,當(dāng)需要在LabVIEW中傳遞指針數(shù)據(jù)時(shí),可以使用I32或U32數(shù)值類(lèi)型來(lái)表示這個(gè)地址類(lèi)型的數(shù)據(jù)。但是,64位的程序中,數(shù)據(jù)的地址只能使用I64或U64來(lái)表示。這樣,如果一個(gè)調(diào)用了DLL函數(shù)的VI,并且函數(shù)參數(shù)中有地址型數(shù)據(jù),使用固定數(shù)據(jù)類(lèi)型的數(shù)值來(lái)表示地址,就要準(zhǔn)備兩份代碼。解決方法是使用LabVIEW中的新的數(shù)據(jù)類(lèi)型Pointer-sized Integer。這個(gè)數(shù)據(jù)類(lèi)型的長(zhǎng)
8、度在不同的平臺(tái)上會(huì)自動(dòng)使用32位或64位長(zhǎng)度。如果在C語(yǔ)言函數(shù)參數(shù)聲明中有const關(guān)鍵字,可以選中Constant選項(xiàng)。布爾類(lèi)型在DLL函數(shù)和LabVIEW VI之間傳遞沒(méi)有專有的數(shù)據(jù)類(lèi)型,是利用數(shù)值類(lèi)型來(lái)傳遞的。輸入時(shí)先把布爾值轉(zhuǎn)變?yōu)閿?shù)值,在傳遞給DLL函數(shù);輸出時(shí)再把數(shù)值轉(zhuǎn)為布爾值。對(duì)于數(shù)組的傳遞,LabVIEW只支持C 數(shù)據(jù)類(lèi)型中的數(shù)值型數(shù)組,傳遞數(shù)組類(lèi)型需要注意的的是“Array Format”要選擇“Array Data Pointer”。這個(gè)設(shè)置中還有其他兩個(gè)選項(xiàng),帶有“Handle”的參數(shù)類(lèi)型都是表示LabVIEW定義的特殊類(lèi)型的。在第三方的DLL中不會(huì)使用到數(shù)組參數(shù)作為輸出值
9、時(shí),要記得為輸出的數(shù)組數(shù)開(kāi)辟空間。開(kāi)辟數(shù)據(jù)空間的方法有兩種:第一種方法,創(chuàng)建一個(gè)長(zhǎng)度滿足要求的數(shù)組,作為初始值傳遞給參數(shù),輸出數(shù)的數(shù)據(jù)就會(huì)被放置在輸入數(shù)組的所在的存空間。第二種方法是直接在 參數(shù)配置面板上進(jìn)行設(shè)置。在Minimum size中寫(xiě)入一個(gè)固定的數(shù)值,LabVIEW就會(huì)按此大小為輸出的數(shù)組開(kāi)辟空間。在Minimum size 中選擇函數(shù)的其它數(shù)值參數(shù),而不是固定數(shù)值。這樣LabVIEW會(huì)按照當(dāng)時(shí)被選擇的參數(shù)值的大小來(lái)開(kāi)辟空間。字符串與使用與數(shù)組是非常類(lèi)似的,實(shí)際上在C語(yǔ)言中字符串就是一個(gè)I8數(shù)組。 在NI軟件的安裝路徑下打開(kāi)當(dāng)前使用版本的LabVIEW文件夾,通過(guò)examplesdl
10、ldata passingCall NativeCode.llb找到簡(jiǎn)單數(shù)據(jù)類(lèi)型在LabVIEW與C之間的對(duì)應(yīng)關(guān)系。部分常見(jiàn)關(guān)系見(jiàn)表1。 第三頁(yè)用于為DLL設(shè)置一些回調(diào)函數(shù),可以使用這些回調(diào)函數(shù)在特定的情形下完成初始化、清理資源等工作(圖5) 如果為Reserve選擇了一個(gè)回調(diào)函數(shù),那么當(dāng)一個(gè)新的線程開(kāi)始調(diào)用這個(gè)DLL時(shí),這個(gè)回調(diào)函數(shù)首先被調(diào)用??梢岳眠@個(gè)函數(shù)為新線程使用到的數(shù)據(jù)做初始化工作。線程在使用完這個(gè)DLL之后,它會(huì)去調(diào)用Unreserve中指定的回調(diào)函數(shù)。Abort中指定的函數(shù)用于VI非正常結(jié)束時(shí)被調(diào)用,也就是讓一個(gè)程序在運(yùn)行完前停止。這些回調(diào)函數(shù)的原型在Prototype for
11、 these procedures中列出,必須要由DLL的開(kāi)發(fā)者按照特定的格式實(shí)現(xiàn)。如果使用的DLL不是專為L(zhǎng)abVIEW設(shè)計(jì)的,一般不會(huì)包含這樣的回調(diào)函數(shù)。 第四頁(yè)是錯(cuò)誤處理方式,用戶可根據(jù)需要選擇相應(yīng)的錯(cuò)誤檢查級(jí)別。 另外還需要注意的是,C語(yǔ)言中的struct在LabVIEW中可以使用cluster來(lái)表示,但有時(shí)需要作出相應(yīng)的調(diào)整。這是因?yàn)樵贑語(yǔ)言中,struct的字節(jié)對(duì)齊是可以進(jìn)行設(shè)置的,這就決定了其各元素的存放地址的可變性。C語(yǔ)言中的對(duì)字節(jié)對(duì)齊數(shù)可通過(guò)#pragma pack指令或在工程屬性中進(jìn)行指定。而在LabVIEW的cluster中,所有元素只能是1字節(jié)對(duì)齊的,所以如果要和C語(yǔ)言
12、中非1字節(jié)對(duì)齊的struct對(duì)應(yīng),需要做出一些調(diào)整。比如,對(duì)于C語(yǔ)言中2字節(jié)對(duì)齊的struct,第一個(gè)元素如果是I8型的,在LabVIEW的cluster中第一個(gè)元素對(duì)應(yīng)不變,但不能緊挨著放第二個(gè)元素,必須留一個(gè)無(wú)意義的空位。C語(yǔ)言的struct其實(shí)也是如此,只不過(guò)沒(méi)有表現(xiàn)出來(lái)。所以為了方便,如果自己用C 語(yǔ)言生成DLL文件供LabVIEW調(diào)用最好將struct都設(shè)為1字節(jié)對(duì)齊。C語(yǔ)言的struct中可以嵌套數(shù)組,但是這和LabVIEW中含有數(shù)組元素的cluster是不一樣的,LabVIEW中需要將數(shù)組中的元素都拆開(kāi)放入cluster中。 如果C語(yǔ)言的struct中含有一個(gè)指針,LabVIEW中的cluster只能用一個(gè)U32數(shù)值(32位系統(tǒng)上,64位系統(tǒng)上使用U64)來(lái)表示指針的地址,而不能將指針?biāo)赶虻娜莘诺紺luster中去。如果聲明的是指向struct的指針,才能在
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 附件:1.1521項(xiàng)擬繼續(xù)有效行業(yè)標(biāo)準(zhǔn)復(fù)審結(jié)論-表(征求意見(jiàn)稿)
- 石河子大學(xué)《藥物波譜解析》2022-2023學(xué)年第一學(xué)期期末試卷
- 石河子大學(xué)《食品包裝學(xué)》2022-2023學(xué)年第一學(xué)期期末試卷
- 石河子大學(xué)《計(jì)算機(jī)網(wǎng)絡(luò)基礎(chǔ)》2022-2023學(xué)年期末試卷
- 沈陽(yáng)理工大學(xué)《弱信號(hào)檢測(cè)技術(shù)》2021-2022學(xué)年第一學(xué)期期末試卷
- 沈陽(yáng)理工大學(xué)《建筑節(jié)能》2023-2024學(xué)年第一學(xué)期期末試卷
- 沈陽(yáng)理工大學(xué)《過(guò)程控制系統(tǒng)與儀表》2021-2022學(xué)年期末試卷
- 沈陽(yáng)理工大學(xué)《電鍍工藝》2022-2023學(xué)年期末試卷
- 沈陽(yáng)理工大學(xué)《環(huán)境工程概論》2023-2024學(xué)年第一學(xué)期期末試卷
- 合同產(chǎn)值申報(bào)
- 建筑工程項(xiàng)目管理咨詢招標(biāo)(范本)
- 三位數(shù)除兩位數(shù)的除法練習(xí)題
- 慢性胃炎的中醫(yī)治療培訓(xùn)課件
- Python程序設(shè)計(jì)課件第7章面向?qū)ο蟪绦蛟O(shè)計(jì)
- 最新爆破安全規(guī)程
- 主題班會(huì)課防盜
- 幼兒園課件《撓撓小怪物》
- 教師教案檢查八大評(píng)分標(biāo)準(zhǔn)教案的評(píng)分標(biāo)準(zhǔn)
- 政府會(huì)計(jì)基礎(chǔ)知識(shí)講義
- 幼兒園整合式主題活動(dòng)設(shè)計(jì)案例《溫馨家園》
- 荒漠區(qū)生態(tài)治理(麥草沙障、植物固沙)施工方案
評(píng)論
0/150
提交評(píng)論