在使用AF時,其實要手動加入很多基礎功能,就像是打地基一樣,

但是很多步驟是重複的,非常浪費時間!

所以建議安裝「Events for UI Actor Indicator」這個模組,

利用其腳本功能自動建立常用程式碼。
 

先打開JKI VI Package Manager,選擇版本,譬如2019,

然後搜尋關鍵字「events for」,應該可以找到,如下圖:


000_從JKI VI Pkg Mgr安裝.png

如果找不到,請在此網址下載:
https://forums.ni.com/t5/Actor-Framework-Documents/Events-for-UI-Actor-Indicators/ta-p/3869260?profile.language=zh-TW

 

安裝前,

2019-000_安裝前.png

安裝後,工具列選單多了Create Actor From Template...

2019-001_安裝後.png

====================================================
這個模組有兩大功能:

<功能1>從自訂樣板去新增一個Actor

只要在工具列選單中,點選Tools->Create Actor From Template...

就會出現一個對話視窗,

這時你可以在Name of Actor輸入Actor的名稱,

並從Template下拉選單中,選擇預設的樣板,去新增一個Actor,

功能1_1.png

選好後按下「Create Actor」,

腳本工具就會自動產生相關檔案,並自動把常用的Override 方法建立起來,

甚至依照樣板,分門別類放在虛擬資料夾中,如下所示:

功能1_3.png

這邊要特別補充的是,

剛安裝好的時候,在預設路徑「.../Labview20xx/project/Create Actor from Template」

這個資料夾中,只有預設一個template檔「_UI Template」可選,

功能1_02_找到Toolkit Template存放根目錄.png

但只要你在此目錄中,依循命名格式建好樣板檔案,

你就可以從自訂樣板去創造Actor。

這個關鍵的命名格式,就是樣板資料夾名稱的最前方要加上底線「_」,

如下,我在資料夾中額外建立了3個樣板,

「_UI Template_wtihFP_OpenClose」,

「_SubPanel Template」,

「_ProcessActor Template」。
 

功能1_07_template的資料夾路徑.png
而且要注意,內部樣板Actor的class名稱也要和資料夾一致!

功能1_04_class名稱也要改一致以免出錯.png

這樣重開LabVIEW之後,到template下拉選單,就可看到4個樣板可以選擇了!

功能1_2.png

但有一點要注意,用此方法建立的Actor內部自訂的成員函數,

若按右鍵自動產生對應Msg時,

此Msg和所屬Do函數,都會被放在一個獨立的新資料夾內(Actor名稱XXXXX Messages)

其路徑不在原本的Actor 名稱資料夾之下,而是與其同階層,

相較之下,若用LabVIEW原生功能,新增Actor、Actor成員函數,

和對應的Messages資料夾時,檔案結構和路徑是不一樣的。

 

<功能2>自動建立Indicator所對應的user event

只要是利用此外掛模組建立的Actor,在其Front Panel上的任一Indicator上按右鍵,

在選單中最下方點「Add Event Support」,

此功能內部的腳本工具就會自動完成四件事:

(1) 創建一個User Event,而且會針對Indicator的屬性去自動選擇event的資料格式

(2) 把新增User Event程式碼放在Pre launch Init.vi之中

(3)新增一個SubVI,叫做「Destroy User Events」,用來摧毀User Event,並會在Stop Core.vi中呼叫它

(4)將User Event註冊到Actor Core.vi中,Helper Loop內部的Event Structure上面,使其能響應這個user event

注意,這功能有兩個前提!

1.該Actor必須是用此外掛模組建立才行! (用原始方法新增的Actor不行!)

2.只有Front Panel上的Indicator才行! (Controller不行!)

===================================

常見應用範例為:

[EX1]使用DAQ讀取資料,並將資料顯示在Waveform chart上面。

實作重點:

善用Actor Core.vi中的Helper Loop,

利用其內部Event structure中timeout這個case!

 

STEP1:預先建立好Waveform Chart的user event,

並將其註冊到Event structure上,

並在此event中,將傳進來的資料,直接連到實體Waveform Chart輸出。

(以上3步驟只要用上述模組的<功能2>,就能瞬間完成)。

 

STEP2: 在Helper Loop上建立移位暫存器,

並給一個-1當作初始值,連接到timeout事件。


STEP3: 在Front Panel上建立一個Start按鈕

按下後,觸發其對應的事件,

內部程式就會對移位暫存器寫入一個新的數值,譬如10,

也就是更改timeout 頻率從-1變成10,

這樣下次Helper Loop執行時,

timeout這個case就會以10ms一次的頻率,不斷的執行。

 

STEP4:

接著,timeout case內部只要放一個Send Actor Msg,

就會達成每10ms 執行一次對應的Actor method,

而這個method內部就是呼叫「DAQ read」函數,獲取2D資料陣列,

並把資料陣列丟給Generate User Event,

觸發一開始建立好的Waveform Chart的User Event,

這樣就能優雅地利用user event實現「資料傳遞」,

把資料丟給Waveform Chart,使其不斷地被更新!

 

據說這樣比「取得Waveform Chart的reference,然後寫入 property node」,更不佔資源。

 

=============

教學影片

1.Tom McQuillan的第八集
https://www.youtube.com/watch?v=p--8oUMsZDE

2.許濬麟老師的介紹與教學
https://www.youtube.com/watch?v=LL-3sdE2YxA

arrow
arrow

    sky 發表在 痞客邦 留言(0) 人氣()