最近測試了labview調(diào)用dll中的回調(diào)函數(shù)相關(guān)功能,遇到了一些問題,現(xiàn)在做一下整理和總結(jié),相關(guān)的內(nèi)容比較多,分多篇來寫。
在LabVIEW中,新手經(jīng)常將所有的程序放在事件結(jié)構(gòu)中來執(zhí)行,有時(shí)還不取消前面板鎖定,一個(gè)事件觸發(fā)沒有執(zhí)行完成時(shí),又去執(zhí)行另外一個(gè)事件,導(dǎo)致界面鎖死,必須從任務(wù)管理器里面關(guān)閉程序才行。
![wKgZomTnFqOAMqVvAAKtoIyqNeY810.jpg](https://file1.elecfans.com/web2/M00/96/1E/wKgZomTnFqOAMqVvAAKtoIyqNeY810.jpg)
進(jìn)一步優(yōu)化,會(huì)采用生產(chǎn)者-消費(fèi)者結(jié)構(gòu),在事件結(jié)構(gòu)中觸發(fā),在消費(fèi)者循環(huán)中,處理相關(guān)的程序。但如果要處理的程序時(shí)間較長,還是會(huì)導(dǎo)致隊(duì)列阻塞,不能及時(shí)處理相應(yīng)的程序。此時(shí),便可以采用事件回調(diào)的方式來來解決。
![wKgZomTnFqOALZiXAALB0o0_JfI308.jpg](https://file1.elecfans.com/web2/M00/96/1E/wKgZomTnFqOALZiXAALB0o0_JfI308.jpg)
先簡單介紹一下回調(diào)函數(shù),是一種在編程中常見的概念,它通常用于在特定事件發(fā)生時(shí)執(zhí)行預(yù)定義的操作。回調(diào)函數(shù)可以作為參數(shù)傳遞給其他函數(shù),以便在需要時(shí)被調(diào)用,從而實(shí)現(xiàn)定制的事件處理和邏輯分離。詳細(xì)的概念網(wǎng)上很多,可以感興趣可以查一下。
在labview中,無法實(shí)現(xiàn)將函數(shù)的地址指針傳遞給dll的,實(shí)際測試過VI引用是不可以的。可通過包裝器的方式來實(shí)現(xiàn),網(wǎng)上這方面的信息很少,個(gè)人理解,就是額外做一個(gè)中間層,將labview和dll進(jìn)行連接。更進(jìn)一步,就用其他語言如c++,編寫好相關(guān)的函數(shù)指針,完全實(shí)現(xiàn)既定的功能,之后再打包成中間的dll,在labview中進(jìn)行調(diào)用。
labview本身,是支持回調(diào)函數(shù)的,只不過,這種機(jī)制是在內(nèi)部進(jìn)行實(shí)現(xiàn)(也許還支持其他的交互方式,本人沒有測試出來)。可以利用此功能,編寫一些異步的程序,解決一些程序執(zhí)行時(shí)間較長的問題。
1)搜索找到“事件回調(diào)注冊”,這兩個(gè)是同樣的東西,在不同的文件路徑下面,選擇一個(gè)即可。
![wKgaomTnFqOAMiF2AABhurO2fqQ366.jpg](https://file1.elecfans.com/web2/M00/96/3C/wKgaomTnFqOAMiF2AABhurO2fqQ366.jpg)
2)拖放到程序框圖內(nèi),這個(gè)函數(shù)包含了事件、VI引用還有用戶參數(shù)。
![wKgZomTnFqOAfYF8AAEGbSpmYyI094.jpg](https://file1.elecfans.com/web2/M00/96/1E/wKgZomTnFqOAfYF8AAEGbSpmYyI094.jpg)
3)這里寫一個(gè)簡單的測試函數(shù),a+b=sum。其中a傳入值,b和sum傳入引用。
void Add(int a, int& b, int& sum) {
sum = a + b;
}
這幾個(gè)參數(shù),作為函數(shù)的輸入,連接到用戶參數(shù)中上面。
![wKgaomTnFqOAEJNrAACAEelHcmM625.jpg](https://file1.elecfans.com/web2/M00/96/3C/wKgaomTnFqOAEJNrAACAEelHcmM625.jpg)
4)選擇這個(gè)回調(diào)函數(shù)的觸發(fā)方式,這里使用A的值改變。將A的引用連接到“事件”接線端,選擇相應(yīng)的事件。
![wKgaomTnFqOAUrFcAAGpI-YcXmg316.jpg](https://file1.elecfans.com/web2/M00/96/3C/wKgaomTnFqOAUrFcAAGpI-YcXmg316.jpg)
5)在VI引用上,右鍵選擇“創(chuàng)建回調(diào)VI”,可以自動(dòng)生成一個(gè)用于執(zhí)行的VI函數(shù)。
![wKgZomTnFqSATtAMAAEgo5mnho8496.jpg](https://file1.elecfans.com/web2/M00/96/1E/wKgZomTnFqSATtAMAAEgo5mnho8496.jpg)
![wKgaomTnFqSAQXvMAAGGlQfWglo837.jpg](https://file1.elecfans.com/web2/M00/96/3C/wKgaomTnFqSAQXvMAAGGlQfWglo837.jpg)
這個(gè)生成的VI與自己編寫的VI靜態(tài)調(diào)用有所區(qū)別,界面顯示多了個(gè)*,右鍵查看是選擇了“嚴(yán)格類型VI的引用”。
![wKgaomTnFqOAQUmBAAH37j7997k875.jpg](https://file1.elecfans.com/web2/M00/96/3C/wKgaomTnFqOAQUmBAAH37j7997k875.jpg)
6)編程完成相關(guān)函數(shù)功能,保存VI。
![wKgZomTnFqSAMjnRAAFT_7Srmcs758.jpg](https://file1.elecfans.com/web2/M00/96/1E/wKgZomTnFqSAMjnRAAFT_7Srmcs758.jpg)
7)編寫簡單的循環(huán)和延時(shí),保證程序一直是執(zhí)行狀態(tài)。
![wKgZomTnFqSAESfKAAFAftMgRv4541.jpg](https://file1.elecfans.com/web2/M00/96/1E/wKgZomTnFqSAESfKAAFAftMgRv4541.jpg)
8)程序測試。輸入A=1,B=1,運(yùn)行軟件。軟件運(yùn)行時(shí),程序沒有執(zhí)行。當(dāng)用于觸發(fā)的A達(dá)到“值改變”的條件時(shí),程序運(yùn)行,sum得到數(shù)據(jù)為2。
![wKgaomTnFqSAe_LiAAD_i-z5EHM316.jpg](https://file1.elecfans.com/web2/M00/96/3C/wKgaomTnFqSAe_LiAAD_i-z5EHM316.jpg)
9) 后續(xù)改變A的數(shù)值,發(fā)現(xiàn)整個(gè)sum沒有發(fā)生變化,A的數(shù)據(jù)是以值的類型傳入的,后面再改變數(shù)據(jù),也無法改變最初傳入的數(shù)據(jù)值。
![wKgaomTnFqeAFcBpAAB4W6jkJHU658.jpg](https://file1.elecfans.com/web2/M00/96/3D/wKgaomTnFqeAFcBpAAB4W6jkJHU658.jpg)
10)修改B的數(shù)據(jù),再修改A觸發(fā)程序,可以以看到程序運(yùn)行。說明只需要注冊一次,程序可以觸發(fā)多次。
![wKgZomTmHWuAIWsAAAFPqHy_OUg638.png](https://file1.elecfans.com/web2/M00/94/EF/wKgZomTmHWuAIWsAAAFPqHy_OUg638.png)
11)在常規(guī)用事件結(jié)構(gòu)處理的事件,在“事件檢測窗口”中,都是有記錄的。但是利用事件回調(diào)是沒有記錄的,說明這個(gè)事件回調(diào)和事件結(jié)構(gòu)沒有直接關(guān)系。
![wKgZomTnFqSAJj0-AAJGzp9lQ2w136.jpg](https://file1.elecfans.com/web2/M00/96/1E/wKgZomTnFqSAJj0-AAJGzp9lQ2w136.jpg)
-
LabVIEW
+關(guān)注
關(guān)注
1977文章
3657瀏覽量
325658 -
調(diào)試
+關(guān)注
關(guān)注
7文章
589瀏覽量
34064 -
程序
+關(guān)注
關(guān)注
117文章
3796瀏覽量
81419 -
回調(diào)函數(shù)
+關(guān)注
關(guān)注
0文章
87瀏覽量
11623
發(fā)布評論請先 登錄
相關(guān)推薦
回調(diào)函數(shù)
labview怎么處理dll中的回調(diào)函數(shù)輸出值
關(guān)于labview中調(diào)用dll中的事件并回調(diào)問題
詳解java 回調(diào)機(jī)制
LabWindows/CVI 程序 回調(diào)函數(shù)設(shè)計(jì)
![LabWindows/CVI 程序 <b class='flag-5'>回</b><b class='flag-5'>調(diào)</b>函數(shù)設(shè)計(jì)](https://file1.elecfans.com//web2/M00/A7/2C/wKgZomUMQs-AL6FqAAAZDGcCwbE462.jpg)
回調(diào)函數(shù)的詳細(xì)資料說明
![<b class='flag-5'>回</b><b class='flag-5'>調(diào)</b>函數(shù)的詳細(xì)資料說明](https://file.elecfans.com/web1/M00/86/60/pIYBAFx3jCOAPTYkAAIm4TAodbs965.png)
5個(gè)使用帶有中斷的回調(diào)的技巧
![5個(gè)使用帶有中斷的<b class='flag-5'>回</b><b class='flag-5'>調(diào)</b>的技巧](https://file.elecfans.com/web1/M00/A2/8E/pIYBAF1MyciAYkX3AAE_JEvqO8M604.png)
評論