VI內的數據傳遞一般是通過:
(1)移位寄存器
(2)局部變量
(3)引用與屬性節點、調用節點
一、引用
引用常稱為引用句柄,在Windows編程中,引用句柄指的是指向指針的指針。
換句話說,引用句柄保存的是其他一些數據類型的地址,例如窗口句柄。
1、控件引用
控件的引用句柄指的也是指向特定數據類型的指針,長度為四個字節。
控件的引用句柄不但能夠表示控件的類型,還與空間一一對應,這是通過句柄的編號來實現的。
它自身未代表任何空間,但是通過引用句柄指向特定的實例后,就可以操作具體的控件了。
簡單的理解就是通過對引用句柄的操作,可以改變控件的屬性參數。
(1)創建
建立一個控件的引用句柄,然后拖動一個控件到控件引用句柄,這樣就可以建立特定數據類型的控件引用句柄,上圖分別建立了數字控件和布爾控件的引用句柄。
(2)如何通過引用句柄建立屬性節點
(3)區分
是指向布爾控件的引用句柄,因此它的值屬性節點是布爾值。
是指向布爾控件引用的引用句柄,因此它的值屬性是引用。
(4)嚴格類型控件引用句柄與非嚴格類型控件引用句柄
① 嚴格類型控件引用句柄僅接收數據類型完全相同的控件引用句柄
例如,如果嚴格類型控件引用句柄的類型是32位的整數滑動條,那么只能把一個32位整數滑動條連接到該引用句柄接線端,而不能將8位整數滑動條、雙精度標量滑動桿、32位整數滑動桿簇等數據類型與之連接。
在控件上創建的引用在默認情況下是嚴格類型的。
前面板上控件引用左下角的紅色星形符號表明該控件引用是嚴格類型的;
在程序框圖上,在連接到控件引用接線端的屬性節點或調用節點顯示(嚴格)表明該控件引用是嚴格類型的。
② 非嚴格類型控件引用句柄接收的數據類型較靈活
例如,假設一個非嚴格類型控件引用的類型屬於滑動桿,那么32位整數滑動桿、單精度滑動桿、32位整數滑動桿簇等都可連接到該控件引用接線端。
在非嚴格類型控件引用狀態下,可把任何類型控件與控件引用接線端連接。
當某屬性節點與一個非嚴格類型控件引用接線端連接時,在值屬性中會產生變體數據。在使用該數據前可能需要進行數據轉換。
只有當圖表引用是嚴格類型時,才能看到圖表的歷史數據屬性。
2、VI引用
(1)創建嚴格類型VI引用以動態調用VI
https://blog.csdn.net/weixin_42341666/article/details/104375775
(2)利用VI引用寫入或讀取另一個VI的控件值
https://bbs.elecfans.com/m/jishu_294664_1_1.html
(3)異步調用VI的多個實例實現並行執行
https://zone.ni.com/reference/zhs-XX/help/371361R-0118/lvhowto/acbr_call_clones/
二、屬性節點和調用節點
屬性節點用於訪問控件的屬性。
例如需要改變控件在前面板的大小,運行時候的狀態等都需要通過屬性節點來進行操作,與引用結合起來講就是屬性節點可以設置引用的屬性。
但由於屬性節點與前面板綁定,無法利用到 LabVIEW 的執行系統多線程優勢,並且讀寫使用 UI Thread,所以效率最低。
1、類別設置(一般用於嚴格類的屬性)
對於不同類別的使用(App、VI或控件等),其引用是不同的。在一般的程序設計中,使用更多的是VI的屬性和方法。獲得VI的屬性和方法需要首先確定類別。
鼠標右鍵——應用程序控制——屬性節點——放置
在其上右鍵——選擇類(可選擇多個類別)——VI服務器——VI
再將控件的引用連接到其輸入引用接口
2、創建控件的屬性(非嚴格)
方法1:鼠標右鍵——應用程序控制——屬性節點——放置后在其上右鍵——連接至——窗格——選擇具體控件名
方法2:右鍵點擊控件——創建——屬性節點
3、優劣
(1)內存
屬性節點實質上是對“輸入控件、顯示控件”中數據進行查詢或置入,不會占用內存,因為在部件創建時已經為此參數分配好了內存。
(2)執行速度
相對於局部變量而言,屬性節點的執行效率是很低的,或者說更占用CPU的資源。
(3)數據競爭
屬性節點可以通過“錯誤簇”來引導數據流,所以避免了發生數據競爭現象。
注意,當屬性節點的錯誤簇沒有使用(與其它VI相互連接),同樣可能會導致數據競爭現象發生。
三、局部變量
通過局部變量可以在一個VI中訪問或者存儲數據。
通常這些數據都是存儲在不同的顯示或者輸入控件當中,所以說局部變量不是單獨存在的,每一個局部變量都是與特定的控件相對應的。
一個控件可以生成許多局部變量,就相當於在一個函數中定義了一個變量,在函數的任何地方都可以使用這個變量一樣。
1、創建局部變量
方法1:控件上右擊——創建——局部變量
方法2:應用程序框圖空白處右鍵——局部變量
放置后左鍵點擊該局部變量——選擇控件
2、優劣
(1)內存
每一個局部變量都要復制對應控件中的數據,因此這將消耗更多的內存。
當為數組建立多個局部變量時,會占用大量的內存。
(2)執行速度
由於局部變量是對內存進行直接讀、寫操作,所以它的執行速度很快(約快1000倍以上)。
(3)數據競爭
局部變量容易導致數據競爭,原因是局部變量破壞了數據流的工作方式。這也正是LabVIEW 強調“慎用”局部變量的原因。
3、屬性節點和局部變量、全局變量
切勿使用局部變量或全局變量來作為一種減少連線的方法。變量增加處理開銷,內存使用和程序的復雜性。
此外,變量的使用破壞了LabVIEW數據流原則,遮蓋了實際的數據來源。當變量從程序的多個位置讀寫,就難以確定哪個在實際影響數據值。
簡單顯示值更新一般用局部變量。
但是有些顯示特性,比如變灰,無效,不可見之類操作還是要用屬性節點,局部變量辦不到。
局部變量和全局變量是內存數值操作,屬性節點是對控件值的屬性進行的操作。理論上,變量的效率比屬性節點高。
但在實際寫程序中,大量全局變量的應用和不必要的局部變量會拖慢程序的性能和可讀性,並且一般使用變量的時候有很大的隨意性,導致后期維護的難度增加,牽一發而動全身,改變了一次賦值后要挨個去找這個變量的影響應用范圍。
再者,根據實際經驗,全局變量在多層VI嵌套之后再賦值,另個一VI或同VI中其他循環對數據進行輪詢,會出現兩者不同步的現象,原因可能有循環的時間間隔不同,內存相應時間不同等,尤其是在通訊數據處理過程中,隱藏了很大的BUG。