2010-08-18 23 views
4

在LabVIEW中,是否可以從VI中判斷輸出終端是否連接到調用VI中?顯然,這取決於調用VI,但也許有一些方法可以找到當前調用VI的答案。LabVIEW VI可以判斷其輸出端子是否有線?

用C語言來說,這就像定義一個函數一樣,它的參數指向了存儲輸出參數的地方,但如果調用者對該參數不感興趣,它將接受NULL

+0

我可以問你爲什麼要這樣做?如果輸出沒有連線,你是否試圖在子VI中避免一些昂貴的計算? – eaolson 2010-08-23 03:14:06

+0

當然你可能會問。這正是原因,但它仍然是一種假設,因爲我正在決定是否設計這樣的VI是否有意義。 – ptomato 2010-08-23 08:35:41

回答

4

據說你不能以自然的方式做到這一點,但有一個解決方法使用數據值引用(需要LV 2009)。給出一個輸出參數的NULL指針是一樣的想法。結果在輸入中作爲數據值參考(它是指針)給出,並且通過子VI檢查非參考。如果它爲空,則不做任何事情。

這裏是子VI(情況真沒有做任何事情):

alt text

這裏是調用VI:

alt text

圖像是VI片段,所以你可以拖動並放在圖表上以獲取代碼。

+0

值得注意的是,這*類似於傳遞指針,但實際上並沒有告訴你有關輸出的任何信息。 (它也很聰明!) – 2010-08-20 14:56:02

1

一般來說,沒有。

可以使用「腳本」功能對代碼執行靜態分析。這需要拉動調用層次結構,並跟蹤線索參考。

把這個試驗拉在一起,有一些困難。同一圖上的多個相同的子VI很難區分。此外,終端引用似乎主要可以通過名稱訪問,這可能會導致與其他vi的名稱相同的終端發生一些衝突。

NI在這個問題的變體上做了一些工作;退房this

1

就像Underflow說的,基本答案是否定的。

你可以看一下here以得到什麼可能是NI提供的最正式和最詳細的答案。

擴展你的比喻,你可以在LV中做到這一點,除了LV沒有C的空概念。你可以看到這個here的例子。

請注意,提供的鏈接下溢中的代碼在可執行文件中不起作用,因爲構建EXE時默認情況下將剝離圖表,並且由於RTE不支持其中使用的一些屬性和方法。


對不起,我看到我誤解了這個問題。我以爲你在問一個輸入,所以我建議的想法不適用。不過,我指出的限制適用。

你爲什麼要這樣做?可能有另一種解決方案。

+0

我沒有記住特定的應用程序 - 但考慮一個帶有簽名'void get_size(int * height,int * width)'的C函數,如果你有'height'或'width'可能是'NULL'只需要一個維度,但是如果他們共享足夠的代碼,那麼如果兩者都需要這兩個代碼,則分別計算它們是沒有意義的。 – ptomato 2010-08-20 08:27:16

0

一般來說,LV編譯器會優化機器碼,使得未使用的代碼甚至沒有內置到可執行文件中。

這不適用於子VI(因爲無法知道你不會嘗試使用指標的值,雖然LV可以做它,如果它在構建可執行文件時刪除FP,並且可能會),但是有一種方法可以讓它適用於子VI--內聯子VI,這應該允許編譯器看到輸出未被使用。你也可以將它的優先級設置爲子程序,這也可以做到這一點,但我不會建議。

正式情況下,內聯只能在LV 2010中使用,但在舊版本中可以訪問私有VI屬性。但我不會推薦它,而且很可能2010年在這方面有一些優化,舊版本沒有。

P.S.一般來說,編譯過程的細節沒有公開,因爲NI調整了編譯器,所以LV版本之間有所不同。整個過程應該在LV 2010上進行重大升級,NI的網站上應該有一些網絡廣播,其中包括一些細節。

2

我建議你這樣做是錯誤的。如果編譯器不夠智能以避免自行計算,則創建該VI的兩個版本。一個昂貴的計算,一個沒有。然後製作一個多態VI,這將允許您在它們之間切換。您在設計時就已經知道您需要哪個版本(因爲您要連接輸出終端或不連接),所以只需使用正確版本的多態VI即可。

或者,傳遞一個變量來打開或關閉計算的昂貴部分的Case語句。