問題提出
在使用LabVIEW軟件編寫大型測試軟件時,對于某些子程序,考慮到程序執(zhí)行效率及前面板大小有限等因素,有時需要在主程序中動態(tài)加載運行并顯示其前面板,同時也要實現(xiàn)主程序與子程序控件之間的值交互,如主程序能夠讀取或修改子程序前面板中某個控件的值。
那么,如何在LabVIEW平臺中實現(xiàn)這種目的呢?實際上,這兒可以分解為下面兩個問題:
1. 如何在主程序中動態(tài)加載調用子程序面板?
2. 如何動態(tài)設置(修改)或獲取子程序面板中控件的值?
對于第1個問題,在主程序中可以通過子面板控件動態(tài)加載調用子程序。
對于第2個問題,通過子程序中控件的名稱可獲取控件的引用,進而修改或獲取該控件的值。
對于上面兩個問題,下面通過一個簡單的例子給出LabVIEW中的解決方法。
實例說明
該例運行前面板如下圖所示,主界面區(qū)域分割成了左右兩部分,右半部分功能是使用子面板控件動態(tài)加載并顯示名為“參數(shù)子面板.vi”的子程序前面板,該面板上包含了三個控件,分別為“控件1”、“控件2”和“控件3”三個數(shù)值控件;左邊部分功能是通過控件名稱用以讀取或修改子面板上這三個控件的值。
程序框圖實現(xiàn)方法
其程序框圖使用包含2幀的順序結構,第1幀目的是在子面板中動態(tài)加載運行子程序并顯示其前面板,第2幀目的是讀或寫子面板某個控件的值。
第1幀代碼如下圖所示,在子面板中動態(tài)加載子程序前面板并顯示時,分別使用了VI的調用節(jié)點函數(shù)“Run VI”和子面板的調用節(jié)點函數(shù)“Insert VI”。另外,該幀中,也將打開的子程序的VI引用通過順序結構的局部變量傳遞給了下一幀。
在第2幀中使用了事件結構,主要完成通過子程序中控件的名稱設置或獲取某個參數(shù)的值,代碼如下圖所示:
第2幀中實現(xiàn)的關鍵技術是怎樣得到子程序中被修改控件的引用,為此,本例單獨寫了一個子程序,對應上圖中紅色矩形框內的圖標,其實現(xiàn)代碼如下圖所示。該子程序包含2個輸入參數(shù)ControlName和VIRef,即控件的名稱和其所在的VI引用,1個輸出參數(shù)“ControlRef”,即根據(jù)名稱查找到的控件的引用。其原理是通過VI的引用得到當前VI的面板引用,由面板引用得到當前面板上所有控件的引用,然后由控件引用得到每個控件的名稱,然后在While循環(huán)中逐一與被查找的控件名稱比較,與其相等即為查找到的控件的引用。
在第2幀框圖程序中,得到被設置或獲取的控件引用后,就可以利用控件的“值”屬性對其進行修改或讀取了。
需要說明的是,這兒得到的控件引用是一個通用型的引用,在直接使用其“值”屬性時,由于該類型的引用對應的值屬性可能是數(shù)值型的值、布爾型的值或路徑型的值等等,程序本身是無法判斷的,所有對其“值”屬性讀或寫時,其輸出或輸入參數(shù)都是變體類型的變量。如下圖所示,當設置其值時(左圖),可以將前面板上的“參數(shù)值”控件的值直接輸入到屬性節(jié)點,LabVIEW內部自動可以將任意的數(shù)據(jù)類型轉換為變體類型。但當獲取其值時(右圖),由于其變體類型可以表示任意類型的數(shù)據(jù),需要開發(fā)者顯式的通過“變體至數(shù)據(jù)類型轉換”函數(shù)將變體類型的值轉換已知類型的值。對于本例,需將變體類型轉換為“雙精度”類型的變量。
總結
本文通過一個具體的例子,詳細演示了如何在LabVIEW平臺中實現(xiàn)子程序前面板的動態(tài)加載及主/子程序間控件值的交互功能。通過這個例子學到的編程知識點包括:子面板的使用方法,屬性節(jié)點的使用方法、變體類型的使用等。
如果你覺得這篇文章對你有用的話,關注+收藏+點贊吧。