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