在使用AF時,其實要手動加入很多基礎功能,就像是打地基一樣,
但是很多步驟是重複的,非常浪費時間!
所以建議安裝「Events for UI Actor Indicator」這個模組,
利用其腳本功能自動建立常用程式碼。
先打開JKI VI Package Manager,選擇版本,譬如2019,
然後搜尋關鍵字「events for」,應該可以找到,如下圖:
如果找不到,請在此網址下載:
https://forums.ni.com/t5/Actor-Framework-Documents/Events-for-UI-Actor-Indicators/ta-p/3869260?profile.language=zh-TW
安裝前,
安裝後,工具列選單多了Create Actor From Template...
====================================================
這個模組有兩大功能:
<功能1>從自訂樣板去新增一個Actor
只要在工具列選單中,點選Tools->Create Actor From Template...
就會出現一個對話視窗,
這時你可以在Name of Actor輸入Actor的名稱,
並從Template下拉選單中,選擇預設的樣板,去新增一個Actor,
選好後按下「Create Actor」,
腳本工具就會自動產生相關檔案,並自動把常用的Override 方法建立起來,
甚至依照樣板,分門別類放在虛擬資料夾中,如下所示:
這邊要特別補充的是,
剛安裝好的時候,在預設路徑「.../Labview20xx/project/Create Actor from Template」
這個資料夾中,只有預設一個template檔「_UI Template」可選,
但只要你在此目錄中,依循命名格式建好樣板檔案,
你就可以從自訂樣板去創造Actor。
這個關鍵的命名格式,就是樣板資料夾名稱的最前方要加上底線「_」,
如下,我在資料夾中額外建立了3個樣板,
「_UI Template_wtihFP_OpenClose」,
「_SubPanel Template」,
「_ProcessActor Template」。
而且要注意,內部樣板Actor的class名稱也要和資料夾一致!
這樣重開LabVIEW之後,到template下拉選單,就可看到4個樣板可以選擇了!
但有一點要注意,用此方法建立的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
留言列表