在學習LabView面向對象編程過程中,相信大家也都接觸到了Actor Framework。該框架于2010年NI Week首次公布,經過多年不斷迭代更新,逐漸成為LabVIEW中最為重要的并發開發框架。
我們將通過本期內容綜合學習Actor Framework的一些基礎知識,包括Actor的創建、方法的重寫、輔助循環的構建、Actor嵌套關系、以及接口消息的應用。讓大家對AF能有一個更深入的了解。
本文教程: Actor Framework練習—仿真線性編碼器
一、整體功能展示:
程序主體由三部分構成,分別為Business Logic、Linear Encoder、User Interface。
用戶操作Linear Encoder產生數據,分兩種形式更新到User Interface:單點實時更新、多點緩沖更新(利用隊列緩沖區溢出產生注冊事件)。最終實現的效果如下圖所示:
接下來小編將帶著大家從零開始,完成這個程序的編寫。
二、設計實現:
1.建立Actor并構造輔助循環
首先我們創建一個空白項目Simulate Linear Encoder(項目需要先保存),在我的電腦右鍵—>新建 —>操作者。
分別創建Business Logic、Linear Encoder、User Interface三個Actor。
接下來我們來重寫Actor的方法,可以重寫Actor Core構建輔助循環以實現用戶交互界面。我們可以選中Linear Encoder這個類,右鍵—>新建—>用于重寫的VI。
可以看到Actor類支持重寫的方法,構建輔助循環我們一般需要重寫:Actor Core、Pre Launch Init、Stop Core這三個VI。
如果想要在Linear Encoder的Actor Core構建用戶交互界面,就需要一個額外的輔助循環以響應前面板的事件。格外要注意的是輔助循環的停止,不然可能會無法正常退出程序。
正常程序關閉時,需要向Actor Core 發送Stop Message消息,以關閉Actor Core執行消息的循環。
我們可以利用注冊消息的形式,在Pre Launch Init中創建用戶事件,當執行Stop Core時產生注冊事件,輔助循環響應停止?,F在我們來重寫Pre Launch Init,右鍵—>用戶界面—>事件,就可以看到關于用戶事件相關API。
我們要在Pre Launch Init中創建用戶事件并將事件的輸出存到LinearEncoder的私有數據中,雙擊這個帶紅色鑰匙標識項,便可以看到類存放私有數據的地方。
創建一個Events的簇用于存放注冊事件,將其拖進類私有數據簇進行保存。
其中Stop用戶事件的引用句柄可以通過右鍵“用戶事件輸出”創建輸入控件得到。
這樣我們便可以在Pre Launch Init中將產生用戶事件的引用句柄存到類私有數據中(注意用戶事件數據類型需要命名)。
接著我們重寫Stop Core,產生用戶事件并銷毀用戶事件。
接下來便可以重寫Actor core 來搭建輔助循環。
輔助循環完成之后,便可以開始前面板用戶交互界面的搭建。
2.重構Actorcore前面板
這是Actor core前面板,我們一般情況下不需要在程序運行時顯示這些,可以隱藏這些控件或者在VI前面板中尋找一個空白的地方,放置一個水平指針滑動桿以模擬線性編碼器的位置輸出,如下圖所示:
將Linear Encoder的Actor Core的VI窗口外觀屬性更改為自定義,調用時顯示前面板(User Interface的Actor Core也需要進行設置)
3.構造傳輸數據的方法
本次范例中模擬位置數據更新到用戶界面方式有兩種形式:單點實時更新,多點緩沖更新(利用隊列緩沖區溢出產生注冊事件)。
接下來我們處理多點的緩沖數據:在Actor core中增加數值控制值改變的事件。
我們新增一個方法Add Value to Buffer.vi用于將數據存儲到隊列的緩沖區,右鍵LinearEncoder類,新建基于靜態分配模板的VI(動態分配模板的VI,子類繼承可以重寫)。
我們先在類私有數據的簇中,增加隊列引用句柄。
回到Pre Launch Init中,在初始化時創建用于存放緩沖數據的隊列,將隊列引用存放在私有數據中。隊列緩沖大小設置為100,即超出100個數據,在入隊列時會造成超時。
同樣的在Actor停止時,需要將隊列的句柄釋放,即在Stop core增加釋放隊列引用。
隊列的準備工作完成,我們回到新增的Add Value to Buffer.vi處理緩沖數據,可以通過入隊列是否超時來判斷緩沖區是否滿100個點的數據,滿足則將數據更新出去。
(此時Business Logic的接口消息還未創建,數據并未傳遞出去)
接下來我們重寫User Interface的Actor core,按上面同樣的步驟構建輔助循環。同時增加兩個用戶事件,分別用于更新單點位置數據和波形數據。
User Interface —— Pre Launch Init 程序框圖:
User Interface —— Stop core 程序框圖:
User Interface —— Actor core 程序框圖:
接著我們構建User Interface Actor core的前面板,需要波形圖用于顯示100個點的緩沖數據、數值控件顯示Current Position如下圖所示:
在事件結構中創建兩個用戶事件的響應:
接著我們去創建兩個靜態分配的VI,分別是:Update Current Position.vi和Update Graph.vi。這兩個VI用于產生用戶事件,由Business Logic 發送消息將Linear Encoder 產生的數據更新到前面板。
記得在前面板連接好輸入輸出接線端,分別在Update Current Position.vi和UpdateGraph.vi上右鍵—>操作者框架—>創建消息,LabIVEW會自動用腳本幫我們創建好操作者消息,User Interface的內容就完成了。
4.接口的應用
現在我們來處理Business Logic的部分,用戶邏輯是將Linear Encoder傳遞進來的數據更新到User Interface,我們不能直接在Linear Encoder中發送Business Logic的更新數據消息,這樣會使Linear Encoder與Business Logic產生耦合,所以我們使用接口來解耦,進行數據的傳遞。
右鍵我的電腦—>新建—>接口,命名為BusinessLogic Interface。
右鍵接口—>新建—>基于動態模板分配的VI。
分別在前面板放置數值控件、數值數組控件作為輸入端,并連接好接線端。
Position Updated.vi
Encoder Buffer Updated.vi
分別右鍵兩個方法—>操作者框架—>創建消息,為其創建消息,如下所示:
接口創建完畢,我們右鍵Business Logic類,選擇屬性為它繼承這個接口。
繼承接口后我們會發現Business Logic這個Actor斷線了,這是因為繼承接口后必須重寫接口方法。右鍵Business Logic新建—>用于重寫的VI。
可以看到增加了兩個帶星號的方法,也就是我們剛才接口里創建的兩個方法。我們按住Ctrl同時選中Actor Core.vi、Encoder Buffer Updated.vi、Position Updated.vi對這三個VI進行重寫。
首先對Actor core進行重寫,我們需要在這個Actor內啟動Linear Encoder、User Interface,并將兩個Actor的消息隊列引用,保存到Business Logic的私有數據中,以便在該Actor內可以隨時引用。
此處用的是啟動嵌套操作者函數,它會將Calling Actor與 Nested Actor操作者關聯起來,Launch Nested Actor有一個Auto-Stop默認為T,為T狀態下啟動 NestedActor會將隊列進行保存,當此Calling Actor退出時便會自動關閉其下所有的Nested Actoor。
接著我們重寫Encoder Buffer Updated.vi。
此處的兩個Send Message:
回到Linear Encoder Actor補全Business Logic傳遞數據的部分,打開Add Value to Buffer.vi ,用接口消息Send EncoderBuffer Updated.vi將數據傳遞出去。
最后打開Linear Encoder的Actor core,將Linear Encoder Position值傳遞到Add Value to Buffer.vi以及接口消息PositionUpdated.vi中。
5.創建啟動器
這樣我們的程序就編寫完畢了,可以創建一個Launcher.vi用于啟動Business Logic,驗證最終成果。
三、內容總結:
1、創建Actor,重寫Actor Method;
2、構建輔助循環,利用注冊事件關閉輔助循環;
3、學習使用接口,進行模塊間解耦;
4、了解嵌套操作者之間的啟停機制。
注意:本文中的示例程序將會放在以下百度網盤鏈接中,大家可自行下載并參考學習,注意軟件版本哦(本篇練習使用的LabVIEW版本為2020)~
審核編輯:湯梓紅
-
編碼器
+關注
關注
45文章
3669瀏覽量
135261 -
LabVIEW
+關注
關注
1977文章
3657瀏覽量
325678 -
仿真
+關注
關注
50文章
4124瀏覽量
134008
原文標題:教程 | Actor Framework練習——仿真線性編碼器
文章出處:【微信號:華穗科技,微信公眾號:華穗科技】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
sushu---Actor Framework基本介紹
actor framework 學習
Actor Framework -- Test Sequence
什么是線性編碼器
什么是編碼器 什么叫編碼器 編碼器什么意思
![什么是<b class='flag-5'>編碼器</b> 什么叫<b class='flag-5'>編碼器</b> <b class='flag-5'>編碼器</b>什么意思](https://file1.elecfans.com//web2/M00/A4/47/wKgZomUMM3iAWiWoAAEYsdvw0Do831.jpg)
評論