How To - 動態呼叫方法間的差異性

我想很多人對於下面這一張圖應該有很多很多的疑問,加上這次物聯網座談之後也有幾個朋友問我這個問題,所以我們就來看看這個問題吧!





先來名詞定義
VI:單指VI個體
subVI:以Icon方式部屬於caller中的VI
Asynchronous VI:以VI server動態呼叫執行的VI

左邊兩個是開始非同步呼叫以及等待非同步呼叫結果,搭配Open VI Reference時,option = 0x100 (Call and Collect),用途是允許系統開啟並執行一個subVI進行運算或擷取,由於使用Start Asynchronous Call,因此過程中並不需要等待期執行結束,而是交由Wait On Asynchronous Call透過VI Reference來取回運算或擷取結果。



這個方法適合用在VI執行時間長,不想程式被hang在subVI上時使用。這時候要注意的只有資料取回的機制如何設計,最簡單的就是用兩個迴圈,一個觸發程式,一個取回資料。由於使用Call and Collect的方式,VI Reference是由caller進行管理,因此最後別忘了當Asynchronous VI沒有要使用了,記得Close VI Reference。

同時也可以配合 reentrant flag使用,可以達到multiple instance效果。

此外若該subVI程式並不會回傳任何資料,也就是只有input node而沒有output node的程式,此時可以使用開始非同步呼叫,搭配Open VI Reference時,option = 0x80 (call and forget),用途單純只是呼叫VI執行,執行完畢該VI會自行關閉其VI Reference,caller無須也不建議去管理其VI Reference。



這個方式適用於呼叫一個需要input的VI,但執行相關內容可以與caller無時間關係,例如Display information。

以上兩個方式印象中是LV2009之後才有的。code review也比較少看到工程師在使用,較多的是使用Invoke Node。



Invoke Node相對而言很單純,Run VI只有兩個輸入,Wait Until Done = T時,caller會等待此VI執行完畢,反之就只是處發執行命令。

比較重要的則是Auto Dispose Ref.這個參數。當Auto Dispose Ref. = T,也就是將VI Reference交給Asynchronous VI管理,因此無論caller有沒有執行完畢,Asynchronous VI都會執行完畢。

當Auto Dispose Ref. = F,也就是將VI Reference交給caller管理,當caller在執行結束時LabVIEW關閉所管理的VI reference,導致Asynchronous VI在可能還沒有執行完畢的狀況下隨之強制結束。此外在使用時也得注意,VI Reference是由caller進行管理,所以最後別忘了當Asynchronous VI沒有要使用時,記得Close VI Reference。


只要了解VI Reference是誰在管理,Invoke Node使用起來相對簡單,甚至可以利用這個方式達到reentrant FGV的功能:將FGV設定為reentrant,利用複數Open VI Reference建立不同記憶體配置區域,利用VI reference取得記憶體配置區域,透過Invoke Node執行VI,同時將Auto Dispose Ref. = F,如此該記憶體配置區域於VI執行完畢不會關閉,因此可以給下次執行時取用,達到FGV的功能,又可以有reentrant的能力,減少一模一樣的FGV開發。(雖然用DVR來取代會是更好的方法)

以上簡單明瞭的介紹,提供大家參考。