最近測(cè)試了labview調(diào)用dll中的回調(diào)函數(shù)相關(guān)功能,遇到了一些問(wèn)題,現(xiàn)在做一下整理和總結(jié),相關(guān)的內(nèi)容比較多,分多篇來(lái)寫。
在LabVIEW中,新手經(jīng)常將所有的程序放在事件結(jié)構(gòu)中來(lái)執(zhí)行,有時(shí)還不取消前面板鎖定,一個(gè)事件觸發(fā)沒(méi)有執(zhí)行完成時(shí),又去執(zhí)行另外一個(gè)事件,導(dǎo)致界面鎖死,必須從任務(wù)管理器里面關(guān)閉程序才行。
進(jìn)一步優(yōu)化,會(huì)采用生產(chǎn)者-消費(fèi)者結(jié)構(gòu),在事件結(jié)構(gòu)中觸發(fā),在消費(fèi)者循環(huán)中,處理相關(guān)的程序。但如果要處理的程序時(shí)間較長(zhǎng),還是會(huì)導(dǎo)致隊(duì)列阻塞,不能及時(shí)處理相應(yīng)的程序。此時(shí),便可以采用事件回調(diào)的方式來(lái)來(lái)解決。
先簡(jiǎn)單介紹一下回調(diào)函數(shù),是一種在編程中常見的概念,它通常用于在特定事件發(fā)生時(shí)執(zhí)行預(yù)定義的操作?;卣{(diào)函數(shù)可以作為參數(shù)傳遞給其他函數(shù),以便在需要時(shí)被調(diào)用,從而實(shí)現(xiàn)定制的事件處理和邏輯分離。詳細(xì)的概念網(wǎng)上很多,可以感興趣可以查一下。
在labview中,無(wú)法實(shí)現(xiàn)將函數(shù)的地址指針傳遞給dll的,實(shí)際測(cè)試過(guò)VI引用是不可以的??赏ㄟ^(guò)包裝器的方式來(lái)實(shí)現(xiàn),網(wǎng)上這方面的信息很少,個(gè)人理解,就是額外做一個(gè)中間層,將labview和dll進(jìn)行連接。更進(jìn)一步,就用其他語(yǔ)言如c++,編寫好相關(guān)的函數(shù)指針,完全實(shí)現(xiàn)既定的功能,之后再打包成中間的dll,在labview中進(jìn)行調(diào)用。
labview本身,是支持回調(diào)函數(shù)的,只不過(guò),這種機(jī)制是在內(nèi)部進(jìn)行實(shí)現(xiàn)(也許還支持其他的交互方式,本人沒(méi)有測(cè)試出來(lái))??梢岳么斯δ埽帉懸恍┊惒降某绦?,解決一些程序執(zhí)行時(shí)間較長(zhǎng)的問(wèn)題。
1)搜索找到“事件回調(diào)注冊(cè)”,這兩個(gè)是同樣的東西,在不同的文件路徑下面,選擇一個(gè)即可。
2)拖放到程序框圖內(nèi),這個(gè)函數(shù)包含了事件、VI引用還有用戶參數(shù)。
3)這里寫一個(gè)簡(jiǎn)單的測(cè)試函數(shù),a+b=sum。其中a傳入值,b和sum傳入引用。
void Add(int a, int& b, int& sum) {
sum = a + b;
}
這幾個(gè)參數(shù),作為函數(shù)的輸入,連接到用戶參數(shù)中上面。
4)選擇這個(gè)回調(diào)函數(shù)的觸發(fā)方式,這里使用A的值改變。將A的引用連接到“事件”接線端,選擇相應(yīng)的事件。
5)在VI引用上,右鍵選擇“創(chuàng)建回調(diào)VI”,可以自動(dòng)生成一個(gè)用于執(zhí)行的VI函數(shù)。
這個(gè)生成的VI與自己編寫的VI靜態(tài)調(diào)用有所區(qū)別,界面顯示多了個(gè)*,右鍵查看是選擇了“嚴(yán)格類型VI的引用”。
6)編程完成相關(guān)函數(shù)功能,保存VI。
7)編寫簡(jiǎn)單的循環(huán)和延時(shí),保證程序一直是執(zhí)行狀態(tài)。
8)程序測(cè)試。輸入A=1,B=1,運(yùn)行軟件。軟件運(yùn)行時(shí),程序沒(méi)有執(zhí)行。當(dāng)用于觸發(fā)的A達(dá)到“值改變”的條件時(shí),程序運(yùn)行,sum得到數(shù)據(jù)為2。
9) 后續(xù)改變A的數(shù)值,發(fā)現(xiàn)整個(gè)sum沒(méi)有發(fā)生變化,A的數(shù)據(jù)是以值的類型傳入的,后面再改變數(shù)據(jù),也無(wú)法改變最初傳入的數(shù)據(jù)值。
10)修改B的數(shù)據(jù),再修改A觸發(fā)程序,可以以看到程序運(yùn)行。說(shuō)明只需要注冊(cè)一次,程序可以觸發(fā)多次。
11)在常規(guī)用事件結(jié)構(gòu)處理的事件,在“事件檢測(cè)窗口”中,都是有記錄的。但是利用事件回調(diào)是沒(méi)有記錄的,說(shuō)明這個(gè)事件回調(diào)和事件結(jié)構(gòu)沒(méi)有直接關(guān)系。
-
LabVIEW
+關(guān)注
關(guān)注
1958文章
3651瀏覽量
321462 -
調(diào)試
+關(guān)注
關(guān)注
7文章
564瀏覽量
33837 -
程序
+關(guān)注
關(guān)注
115文章
3747瀏覽量
80669 -
回調(diào)函數(shù)
+關(guān)注
關(guān)注
0文章
87瀏覽量
11521
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論