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