如何在一個循序結構傳遞資料給子VI使用

各位大大您好

想請問要如何在一個順序結構傳遞資料給子VI使用,但是不用全域變數,也不連線?
如果用全域變數就會越用越多,結果整個子VI都是全域變數
如果連線,輸入一個變數就一條線,20個變數就20條!
雖然學會cluster,送進子VI只有一條線,但是在合併得過程也是會產生一大陀的線
,而且傳入子VI,子VI的UI會產生很大的Cluster控制元件,實在不美觀,又得想怎麼把它隱藏或塞到冥王星之類的。

不知道有沒有什麼方式可以解?

我想到的方式是把資料先寫入檔案,在子vi裡再將資料讀出,提供給你參考

下面這種資料給子VI的方式,可以在子VI不是Running就傳送,使用起來不會比你提的那2種方式好用,且不可改變子VI元件的名稱及刪除元件.

test.llb

![](upload://k3uVB9beLh7BNVzPMnoXrprdBif.jpeg)

![](upload://vVs2QHJEseiuWOxFZDyqkqUhhVU.jpeg)

![](upload://vzOVGOnm9EgNO5fxHcPDFpwEayf.jpeg)

![](upload://4i9wa7JloBscfgAYsVjcgawrsw.jpeg)

![](upload://coAbVAIutEPHqrus5LX0XOjGpmJ.jpeg)

還可以用Notifier與Queue.

![](upload://raw7TNR5GEW9ijPLRTbkpOQJ0Qv.jpeg)

感謝兩位大大的回覆。

小弟在研究以前NIDAY的範例程式,其中介紹了生產者與消費者的架構,是用佇列作出來的,其中消費者本身的機制有點像是狀態機
然後他在消費者的Loop放了個位移暫存器去當做資料分享,每個State都可以把資料丟回這個資料分享區去讓所有STATE的子VI存取讀寫資料,我感覺這樣的好處是可以大幅減少全域變數的使用,但是發現一但傳該子VI的變數越多,從資料共享區拉出來的線就越多,特別是Unbundle By Name的時候…非常佔位子…幾乎一個State的面積有3/4都被Unbundle和延伸出的線覆蓋…其實子連到兩個子VI,個別輸入4和9個參數,還包含我在共享區放下了滿多布林,可以讓我判斷哪些STATE已經執行過了,所以拉出了很多綠線+And Or Xor 等等布林元件。
所以就很多線…雖然將某個最大的子VI裡面9X個全域+區域變數,縮減到5X個區域變數,把原本一定要用全域的部分都輸出存到主Loop的資料共享區…但卻產生了一堆線,非常可怕…可以說是越來越亂。

另外一個問題想跟各位大大請教依下,資料共享區的資料數龐大,除了變數多,還放了大體積的Arry,全部包成一個Cluster放在共享區的位移暫存器,我該先UnBundle再傳入子VI還是整條 Cluster傳入到子VI才做Unbundle的動作呢?

我測試了一下Queue的方式,在子VI中DeQueue可以收到資料,但是我生產的Queue是用該子VI的QueueName產生的,所以該Queue不會在主Main的Queue產生。但是是按造範例的方式,將該子VI放到與主Main不同的Loop去跑,Main一但產生該子VI的Queue,該子VI就可以馬上接收到資料,但這不是我想做的。
我只是純粹想在主Main的消費者狀態機的某一個State把資料送進去該子VI,不想產生太多線以增加閱讀性,想減少區域或全域變數太多的問題,減少記憶體耗費,提高程式品質,最終是想培養一個好的寫作習慣,如過撰寫品質好效率佳BUG少的程式。
Lovesmartx40733.3994675926

我認為,使用queue的時機不在於減少local variable或global variable的使用喔。是為了不讓資料漏失

先不考慮subvi,現在就只要想一個主vi就好。vi裡面有兩個迴圈,一個迴圈負責接收儀器傳回的資料,另一個迴圈負責把資料儲存(你也可想成是要處理資料)。現在考慮的情況是:處理資料是需要時間的,假設處理每一筆資料要花5ms,儀器回傳資料的時間不固定,有時2ms會傳一次,有時10ms回傳一次,接收資料的時間需要花1ms。

現在你的目標是希望:
(1) 每次資料回傳的時候,程式都可以接收到資料,也就是隨時必須在stand by的狀態接收資料。
(2) 因為有的時候讀取資料比較快(2ms),有的時候讀取資料比較慢(10ms),但是處理資料的時間都固定是(5ms)。希望如果大量資料湧入的時候,尚未消化的資料可以先儲存在記憶體裡面,慢慢消化。

這時就要用到queue了。不能用local variable也不能用global variable。


[Quote]另外一個問題想跟各位大大請教依下,資料共享區的資料數龐大,除了變數多,還放了大體積的Arry,全部包成一個Cluster放在共享區的位移暫存器,我該先UnBundle再傳入子VI還是整條 Cluster傳入到子VI才做Unbundle的動作呢?[/Quote]

我會整個cluster傳到subvi,因為我不喜歡在subvi上面接太多線,感覺會很亂。不過這樣做的前提是cluster裡面的大部份資料都是subvi所需要的。如果只是傳單一個變數進入subvi,當然是先unblundle後再傳單一變數進去會比較好。



贊成你思考一個有效率的程式架構。


but, local variable跟global variable是很難避免使用的。無論怎麼思考,使用variable會是省時間的做法。

在c++,變數就是在記憶體定義個空間存放資料,在你程式你面要叫他1000次也不是問題。

估計LabVIEW的原理也是這樣,但是因為labview是圖形化程式,雖然變數相同,在記憶體佔的空間相同,但是為了讓variable的圖是顯示在螢幕上,硬是要多使用一些記憶體。是可以少用,但不要矯枉過正,(我認為啦…呵呵… 有錯誤請告訴我喔…)



另外ancle所提到的存到檔案。只適用於存取少量的資料,如參數設定。對於需要大量存去的資料,完全不建議使用硬碟當成buffer,因為硬碟效能比記憶體慢太多了。記憶體在北橋跟CPU共享頻寬,硬碟則要到南橋,況且硬碟還有巡軌時間,跟記憶體根本不能比。

提供另外一個方法

Functional Gloable Variable 搭配 Variant