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