在學(xué)習(xí)LabView面向?qū)ο?a target="_blank">編程過程中,相信大家也都接觸到了Actor Framework。該框架于2010年NI Week首次公布,經(jīng)過多年不斷迭代更新,逐漸成為LabVIEW中最為重要的并發(fā)開發(fā)框架。
我們將通過本期內(nèi)容綜合學(xué)習(xí)Actor Framework的一些基礎(chǔ)知識,包括Actor的創(chuàng)建、方法的重寫、輔助循環(huán)的構(gòu)建、Actor嵌套關(guān)系、以及接口消息的應(yīng)用。讓大家對AF能有一個(gè)更深入的了解。
本文教程: Actor Framework練習(xí)—仿真線性編碼器
一、整體功能展示:
程序主體由三部分構(gòu)成,分別為Business Logic、Linear Encoder、User Interface。
用戶操作Linear Encoder產(chǎn)生數(shù)據(jù),分兩種形式更新到User Interface:單點(diǎn)實(shí)時(shí)更新、多點(diǎn)緩沖更新(利用隊(duì)列緩沖區(qū)溢出產(chǎn)生注冊事件)。最終實(shí)現(xiàn)的效果如下圖所示:
接下來小編將帶著大家從零開始,完成這個(gè)程序的編寫。
二、設(shè)計(jì)實(shí)現(xiàn):
1.建立Actor并構(gòu)造輔助循環(huán)
首先我們創(chuàng)建一個(gè)空白項(xiàng)目Simulate Linear Encoder(項(xiàng)目需要先保存),在我的電腦右鍵—>新建 —>操作者。
分別創(chuàng)建Business Logic、Linear Encoder、User Interface三個(gè)Actor。
接下來我們來重寫Actor的方法,可以重寫Actor Core構(gòu)建輔助循環(huán)以實(shí)現(xiàn)用戶交互界面。我們可以選中Linear Encoder這個(gè)類,右鍵—>新建—>用于重寫的VI。
可以看到Actor類支持重寫的方法,構(gòu)建輔助循環(huán)我們一般需要重寫:Actor Core、Pre Launch Init、Stop Core這三個(gè)VI。
如果想要在Linear Encoder的Actor Core構(gòu)建用戶交互界面,就需要一個(gè)額外的輔助循環(huán)以響應(yīng)前面板的事件。格外要注意的是輔助循環(huán)的停止,不然可能會無法正常退出程序。
正常程序關(guān)閉時(shí),需要向Actor Core 發(fā)送Stop Message消息,以關(guān)閉Actor Core執(zhí)行消息的循環(huán)。
我們可以利用注冊消息的形式,在Pre Launch Init中創(chuàng)建用戶事件,當(dāng)執(zhí)行Stop Core時(shí)產(chǎn)生注冊事件,輔助循環(huán)響應(yīng)停止。現(xiàn)在我們來重寫Pre Launch Init,右鍵—>用戶界面—>事件,就可以看到關(guān)于用戶事件相關(guān)API。
我們要在Pre Launch Init中創(chuàng)建用戶事件并將事件的輸出存到LinearEncoder的私有數(shù)據(jù)中,雙擊這個(gè)帶紅色鑰匙標(biāo)識項(xiàng),便可以看到類存放私有數(shù)據(jù)的地方。
創(chuàng)建一個(gè)Events的簇用于存放注冊事件,將其拖進(jìn)類私有數(shù)據(jù)簇進(jìn)行保存。
其中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前面板,我們一般情況下不需要在程序運(yùn)行時(shí)顯示這些,可以隱藏這些控件或者在VI前面板中尋找一個(gè)空白的地方,放置一個(gè)水平指針滑動桿以模擬線性編碼器的位置輸出,如下圖所示:
將Linear Encoder的Actor Core的VI窗口外觀屬性更改為自定義,調(diào)用時(shí)顯示前面板(User Interface的Actor Core也需要進(jìn)行設(shè)置)
3.構(gòu)造傳輸數(shù)據(jù)的方法
本次范例中模擬位置數(shù)據(jù)更新到用戶界面方式有兩種形式:單點(diǎn)實(shí)時(shí)更新,多點(diǎn)緩沖更新(利用隊(duì)列緩沖區(qū)溢出產(chǎn)生注冊事件)。
接下來我們處理多點(diǎn)的緩沖數(shù)據(jù):在Actor core中增加數(shù)值控制值改變的事件。
我們新增一個(gè)方法Add Value to Buffer.vi用于將數(shù)據(jù)存儲到隊(duì)列的緩沖區(qū),右鍵LinearEncoder類,新建基于靜態(tài)分配模板的VI(動態(tài)分配模板的VI,子類繼承可以重寫)。
我們先在類私有數(shù)據(jù)的簇中,增加隊(duì)列引用句柄。
回到Pre Launch Init中,在初始化時(shí)創(chuàng)建用于存放緩沖數(shù)據(jù)的隊(duì)列,將隊(duì)列引用存放在私有數(shù)據(jù)中。隊(duì)列緩沖大小設(shè)置為100,即超出100個(gè)數(shù)據(jù),在入隊(duì)列時(shí)會造成超時(shí)。
同樣的在Actor停止時(shí),需要將隊(duì)列的句柄釋放,即在Stop core增加釋放隊(duì)列引用。
隊(duì)列的準(zhǔn)備工作完成,我們回到新增的Add Value to Buffer.vi處理緩沖數(shù)據(jù),可以通過入隊(duì)列是否超時(shí)來判斷緩沖區(qū)是否滿100個(gè)點(diǎn)的數(shù)據(jù),滿足則將數(shù)據(jù)更新出去。
(此時(shí)Business Logic的接口消息還未創(chuàng)建,數(shù)據(jù)并未傳遞出去)
接下來我們重寫User Interface的Actor core,按上面同樣的步驟構(gòu)建輔助循環(huán)。同時(shí)增加兩個(gè)用戶事件,分別用于更新單點(diǎ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個(gè)點(diǎn)的緩沖數(shù)據(jù)、數(shù)值控件顯示Current Position如下圖所示:
在事件結(jié)構(gòu)中創(chuàng)建兩個(gè)用戶事件的響應(yīng):
接著我們?nèi)?chuàng)建兩個(gè)靜態(tài)分配的VI,分別是:Update Current Position.vi和Update Graph.vi。這兩個(gè)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傳遞進(jìn)來的數(shù)據(jù)更新到User Interface,我們不能直接在Linear Encoder中發(fā)送Business Logic的更新數(shù)據(jù)消息,這樣會使Linear Encoder與Business Logic產(chǎn)生耦合,所以我們使用接口來解耦,進(jìn)行數(shù)據(jù)的傳遞。
右鍵我的電腦—>新建—>接口,命名為BusinessLogic Interface。
右鍵接口—>新建—>基于動態(tài)模板分配的VI。
分別在前面板放置數(shù)值控件、數(shù)值數(shù)組控件作為輸入端,并連接好接線端。
Position Updated.vi
Encoder Buffer Updated.vi
分別右鍵兩個(gè)方法—>操作者框架—>創(chuàng)建消息,為其創(chuàng)建消息,如下所示:
接口創(chuàng)建完畢,我們右鍵Business Logic類,選擇屬性為它繼承這個(gè)接口。
繼承接口后我們會發(fā)現(xiàn)Business Logic這個(gè)Actor斷線了,這是因?yàn)槔^承接口后必須重寫接口方法。右鍵Business Logic新建—>用于重寫的VI。
可以看到增加了兩個(gè)帶星號的方法,也就是我們剛才接口里創(chuàng)建的兩個(gè)方法。我們按住Ctrl同時(shí)選中Actor Core.vi、Encoder Buffer Updated.vi、Position Updated.vi對這三個(gè)VI進(jìn)行重寫。
首先對Actor core進(jìn)行重寫,我們需要在這個(gè)Actor內(nèi)啟動Linear Encoder、User Interface,并將兩個(gè)Actor的消息隊(duì)列引用,保存到Business Logic的私有數(shù)據(jù)中,以便在該Actor內(nèi)可以隨時(shí)引用。
此處用的是啟動嵌套操作者函數(shù),它會將Calling Actor與 Nested Actor操作者關(guān)聯(lián)起來,Launch Nested Actor有一個(gè)Auto-Stop默認(rèn)為T,為T狀態(tài)下啟動 NestedActor會將隊(duì)列進(jìn)行保存,當(dāng)此Calling Actor退出時(shí)便會自動關(guān)閉其下所有的Nested Actoor。
接著我們重寫Encoder Buffer Updated.vi。
此處的兩個(gè)Send Message:
回到Linear Encoder Actor補(bǔ)全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)建一個(gè)Launcher.vi用于啟動Business Logic,驗(yàn)證最終成果。
三、內(nèi)容總結(jié):
1、創(chuàng)建Actor,重寫Actor Method;
2、構(gòu)建輔助循環(huán),利用注冊事件關(guān)閉輔助循環(huán);
3、學(xué)習(xí)使用接口,進(jìn)行模塊間解耦;
4、了解嵌套操作者之間的啟停機(jī)制。
注意:本文中的示例程序?qū)旁谝韵掳俣染W(wǎng)盤鏈接中,大家可自行下載并參考學(xué)習(xí),注意軟件版本哦(本篇練習(xí)使用的LabVIEW版本為2020)~
審核編輯:湯梓紅
-
編碼器
+關(guān)注
關(guān)注
45文章
3772瀏覽量
137114 -
LabVIEW
+關(guān)注
關(guān)注
1995文章
3670瀏覽量
333063 -
仿真
+關(guān)注
關(guān)注
51文章
4234瀏覽量
135293
原文標(biāo)題:教程 | Actor Framework練習(xí)——仿真線性編碼器
文章出處:【微信號:華穗科技,微信公眾號:華穗科技】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
sushu---Actor Framework基本介紹
actor framework 學(xué)習(xí)
Actor Framework -- Test Sequence
什么是線性編碼器
什么是編碼器 什么叫編碼器 編碼器什么意思

光電編碼器,光電編碼器是什么意思
在LabVIEW中創(chuàng)建Actor Framework的同步消息
教程|創(chuàng)建你的第一個(gè)Actor Framework
編碼器的主要作用與應(yīng)用有哪些?

編碼器與PLC的接線方法

評論