在學(xué)習LabView面向?qū)ο?a target="_blank">編程過程中,相信大家也都接觸到了Actor Framework。該框架于2010年NI Week首次公布,經(jīng)過多年不斷迭代更新,逐漸成為LabVIEW中最為重要的并發(fā)開發(fā)框架。
我們將通過本期內(nèi)容綜合學(xué)習Actor Framework的一些基礎(chǔ)知識,包括Actor的創(chuàng)建、方法的重寫、輔助循環(huán)的構(gòu)建、Actor嵌套關(guān)系、以及接口消息的應(yīng)用。讓大家對AF能有一個更深入的了解。
本文教程: Actor Framework練習—仿真線性編碼器
一、整體功能展示:
程序主體由三部分構(gòu)成,分別為Business Logic、Linear Encoder、User Interface。

用戶操作Linear Encoder產(chǎn)生數(shù)據(jù),分兩種形式更新到User Interface:單點實時更新、多點緩沖更新(利用隊列緩沖區(qū)溢出產(chǎn)生注冊事件)。最終實現(xiàn)的效果如下圖所示:

接下來小編將帶著大家從零開始,完成這個程序的編寫。
二、設(shè)計實現(xiàn):
1.建立Actor并構(gòu)造輔助循環(huán)
首先我們創(chuàng)建一個空白項目Simulate Linear Encoder(項目需要先保存),在我的電腦右鍵—>新建 —>操作者。

分別創(chuàng)建Business Logic、Linear Encoder、User Interface三個Actor。

接下來我們來重寫Actor的方法,可以重寫Actor Core構(gòu)建輔助循環(huán)以實現(xiàn)用戶交互界面。我們可以選中Linear Encoder這個類,右鍵—>新建—>用于重寫的VI。

可以看到Actor類支持重寫的方法,構(gòu)建輔助循環(huán)我們一般需要重寫:Actor Core、Pre Launch Init、Stop Core這三個VI。

如果想要在Linear Encoder的Actor Core構(gòu)建用戶交互界面,就需要一個額外的輔助循環(huán)以響應(yīng)前面板的事件。格外要注意的是輔助循環(huán)的停止,不然可能會無法正常退出程序。
正常程序關(guān)閉時,需要向Actor Core 發(fā)送Stop Message消息,以關(guān)閉Actor Core執(zhí)行消息的循環(huán)。

我們可以利用注冊消息的形式,在Pre Launch Init中創(chuàng)建用戶事件,當執(zhí)行Stop Core時產(chǎn)生注冊事件,輔助循環(huán)響應(yīng)停止?,F(xiàn)在我們來重寫Pre Launch Init,右鍵—>用戶界面—>事件,就可以看到關(guān)于用戶事件相關(guān)API。

我們要在Pre Launch Init中創(chuàng)建用戶事件并將事件的輸出存到LinearEncoder的私有數(shù)據(jù)中,雙擊這個帶紅色鑰匙標識項,便可以看到類存放私有數(shù)據(jù)的地方。

創(chuàng)建一個Events的簇用于存放注冊事件,將其拖進類私有數(shù)據(jù)簇進行保存。

其中Stop用戶事件的引用句柄可以通過右鍵“用戶事件輸出”創(chuàng)建輸入控件得到。

這樣我們便可以在Pre Launch Init中將產(chǎn)生用戶事件的引用句柄存到類私有數(shù)據(jù)中(注意用戶事件數(shù)據(jù)類型需要命名)。

接著我們重寫Stop Core,產(chǎn)生用戶事件并銷毀用戶事件。

接下來便可以重寫Actor core 來搭建輔助循環(huán)。

輔助循環(huán)完成之后,便可以開始前面板用戶交互界面的搭建。
2.重構(gòu)Actorcore前面板

這是Actor core前面板,我們一般情況下不需要在程序運行時顯示這些,可以隱藏這些控件或者在VI前面板中尋找一個空白的地方,放置一個水平指針滑動桿以模擬線性編碼器的位置輸出,如下圖所示:

將Linear Encoder的Actor Core的VI窗口外觀屬性更改為自定義,調(diào)用時顯示前面板(User Interface的Actor Core也需要進行設(shè)置)

3.構(gòu)造傳輸數(shù)據(jù)的方法
本次范例中模擬位置數(shù)據(jù)更新到用戶界面方式有兩種形式:單點實時更新,多點緩沖更新(利用隊列緩沖區(qū)溢出產(chǎn)生注冊事件)。
接下來我們處理多點的緩沖數(shù)據(jù):在Actor core中增加數(shù)值控制值改變的事件。

我們新增一個方法Add Value to Buffer.vi用于將數(shù)據(jù)存儲到隊列的緩沖區(qū),右鍵LinearEncoder類,新建基于靜態(tài)分配模板的VI(動態(tài)分配模板的VI,子類繼承可以重寫)。

我們先在類私有數(shù)據(jù)的簇中,增加隊列引用句柄。

回到Pre Launch Init中,在初始化時創(chuàng)建用于存放緩沖數(shù)據(jù)的隊列,將隊列引用存放在私有數(shù)據(jù)中。隊列緩沖大小設(shè)置為100,即超出100個數(shù)據(jù),在入隊列時會造成超時。

同樣的在Actor停止時,需要將隊列的句柄釋放,即在Stop core增加釋放隊列引用。

隊列的準備工作完成,我們回到新增的Add Value to Buffer.vi處理緩沖數(shù)據(jù),可以通過入隊列是否超時來判斷緩沖區(qū)是否滿100個點的數(shù)據(jù),滿足則將數(shù)據(jù)更新出去。
(此時Business Logic的接口消息還未創(chuàng)建,數(shù)據(jù)并未傳遞出去)

接下來我們重寫User Interface的Actor core,按上面同樣的步驟構(gòu)建輔助循環(huán)。同時增加兩個用戶事件,分別用于更新單點位置數(shù)據(jù)和波形數(shù)據(jù)。

User Interface —— Pre Launch Init 程序框圖:

User Interface —— Stop core 程序框圖:

User Interface —— Actor core 程序框圖:

接著我們構(gòu)建User Interface Actor core的前面板,需要波形圖用于顯示100個點的緩沖數(shù)據(jù)、數(shù)值控件顯示Current Position如下圖所示:

在事件結(jié)構(gòu)中創(chuàng)建兩個用戶事件的響應(yīng):


接著我們?nèi)?chuàng)建兩個靜態(tài)分配的VI,分別是:Update Current Position.vi和Update Graph.vi。這兩個VI用于產(chǎn)生用戶事件,由Business Logic 發(fā)送消息將Linear Encoder 產(chǎn)生的數(shù)據(jù)更新到前面板。


記得在前面板連接好輸入輸出接線端,分別在Update Current Position.vi和UpdateGraph.vi上右鍵—>操作者框架—>創(chuàng)建消息,LabIVEW會自動用腳本幫我們創(chuàng)建好操作者消息,User Interface的內(nèi)容就完成了。

4.接口的應(yīng)用
現(xiàn)在我們來處理Business Logic的部分,用戶邏輯是將Linear Encoder傳遞進來的數(shù)據(jù)更新到User Interface,我們不能直接在Linear Encoder中發(fā)送Business Logic的更新數(shù)據(jù)消息,這樣會使Linear Encoder與Business Logic產(chǎn)生耦合,所以我們使用接口來解耦,進行數(shù)據(jù)的傳遞。
右鍵我的電腦—>新建—>接口,命名為BusinessLogic Interface。

右鍵接口—>新建—>基于動態(tài)模板分配的VI。

分別在前面板放置數(shù)值控件、數(shù)值數(shù)組控件作為輸入端,并連接好接線端。
Position Updated.vi

Encoder Buffer Updated.vi

分別右鍵兩個方法—>操作者框架—>創(chuàng)建消息,為其創(chuàng)建消息,如下所示:

接口創(chuàng)建完畢,我們右鍵Business Logic類,選擇屬性為它繼承這個接口。


繼承接口后我們會發(fā)現(xiàn)Business Logic這個Actor斷線了,這是因為繼承接口后必須重寫接口方法。右鍵Business Logic新建—>用于重寫的VI。
可以看到增加了兩個帶星號的方法,也就是我們剛才接口里創(chuàng)建的兩個方法。我們按住Ctrl同時選中Actor Core.vi、Encoder Buffer Updated.vi、Position Updated.vi對這三個VI進行重寫。

首先對Actor core進行重寫,我們需要在這個Actor內(nèi)啟動Linear Encoder、User Interface,并將兩個Actor的消息隊列引用,保存到Business Logic的私有數(shù)據(jù)中,以便在該Actor內(nèi)可以隨時引用。

此處用的是啟動嵌套操作者函數(shù),它會將Calling Actor與 Nested Actor操作者關(guān)聯(lián)起來,Launch Nested Actor有一個Auto-Stop默認為T,為T狀態(tài)下啟動 NestedActor會將隊列進行保存,當此Calling Actor退出時便會自動關(guān)閉其下所有的Nested Actoor。

接著我們重寫Encoder Buffer Updated.vi。


此處的兩個Send Message:

回到Linear Encoder Actor補全Business Logic傳遞數(shù)據(jù)的部分,打開Add Value to Buffer.vi ,用接口消息Send EncoderBuffer Updated.vi將數(shù)據(jù)傳遞出去。

最后打開Linear Encoder的Actor core,將Linear Encoder Position值傳遞到Add Value to Buffer.vi以及接口消息PositionUpdated.vi中。

5.創(chuàng)建啟動器
這樣我們的程序就編寫完畢了,可以創(chuàng)建一個Launcher.vi用于啟動Business Logic,驗證最終成果。

三、內(nèi)容總結(jié):
1、創(chuàng)建Actor,重寫Actor Method;
2、構(gòu)建輔助循環(huán),利用注冊事件關(guān)閉輔助循環(huán);
3、學(xué)習使用接口,進行模塊間解耦;
4、了解嵌套操作者之間的啟停機制。
注意:本文中的示例程序?qū)旁谝韵掳俣染W(wǎng)盤鏈接中,大家可自行下載并參考學(xué)習,注意軟件版本哦(本篇練習使用的LabVIEW版本為2020)~
審核編輯:湯梓紅
-
編碼器
+關(guān)注
關(guān)注
45文章
3953瀏覽量
142647 -
LabVIEW
+關(guān)注
關(guān)注
2017文章
3688瀏覽量
347137 -
仿真
+關(guān)注
關(guān)注
54文章
4483瀏覽量
138277
原文標題:教程 | Actor Framework練習——仿真線性編碼器
文章出處:【微信號:華穗科技,微信公眾號:華穗科技】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
sushu---Actor Framework基本介紹
actor framework 學(xué)習
Actor Framework -- Test Sequence
什么是線性編碼器
什么是編碼器 什么叫編碼器 編碼器什么意思
光電編碼器,光電編碼器是什么意思
在LabVIEW中創(chuàng)建Actor Framework的同步消息
教程|創(chuàng)建你的第一個Actor Framework
編碼器的主要作用與應(yīng)用有哪些?
編碼器與PLC的接線方法
基于Actor Framework仿真線性編碼器
評論