0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于Actor Framework仿真线性编码器

华穗科技 来源:华穗科技 2023-12-22 10:15 次阅读

在学习LabView面向对象编程过程中,相信大家也都接触到了Actor Framework。该框架于2010年NI Week首次公布,经过多年不断迭代更新,逐渐成为LabVIEW中最为重要的并发开发框架。

我们将通过本期内容综合学习Actor Framework的一些基础知识,包括Actor的创建、方法的重写、辅助循环的构建、Actor嵌套关系、以及接口消息的应用。让大家对AF能有一个更深入的了解。

本文教程 Actor Framework练习—仿真线性编码器

一、整体功能展示:

程序主体由三部分构成,分别为Business LogicLinear Encoder、User Interface。

c2ab4ade-a06e-11ee-8b88-92fbcf53809c.png

用户操作Linear Encoder产生数据,分两种形式更新到User Interface:单点实时更新、多点缓冲更新(利用队列缓冲区溢出产生注册事件)。最终实现的效果如下图所示:

c2bc3f2e-a06e-11ee-8b88-92fbcf53809c.png

接下来小编将带着大家从零开始,完成这个程序的编写。

二、设计实现:

1.建立Actor并构造辅助循环

首先我们创建一个空白项目Simulate Linear Encoder(项目需要先保存),在我的电脑右键—>新建 —>操作者。

c2cf6cf2-a06e-11ee-8b88-92fbcf53809c.png

分别创建Business Logic、Linear Encoder、User Interface三个Actor。

c2dce35a-a06e-11ee-8b88-92fbcf53809c.png

接下来我们来重写Actor的方法,可以重写Actor Core构建辅助循环以实现用户交互界面。我们可以选中Linear Encoder这个类,右键—>新建—>用于重写的VI。

c2e7a95c-a06e-11ee-8b88-92fbcf53809c.png

可以看到Actor类支持重写的方法,构建辅助循环我们一般需要重写:Actor Core、Pre Launch Init、Stop Core这三个VI。

c2f94d7e-a06e-11ee-8b88-92fbcf53809c.png

如果想要在Linear Encoder的Actor Core构建用户交互界面,就需要一个额外的辅助循环以响应前面板的事件。格外要注意的是辅助循环的停止,不然可能会无法正常退出程序。

正常程序关闭时,需要向Actor Core 发送Stop Message消息,以关闭Actor Core执行消息的循环。

c300482c-a06e-11ee-8b88-92fbcf53809c.png

我们可以利用注册消息的形式,在Pre Launch Init中创建用户事件,当执行Stop Core时产生注册事件,辅助循环响应停止。现在我们来重写Pre Launch Init,右键—>用户界面—>事件,就可以看到关于用户事件相关API

c3141190-a06e-11ee-8b88-92fbcf53809c.png

我们要在Pre Launch Init中创建用户事件并将事件的输出存到LinearEncoder的私有数据中,双击这个带红色钥匙标识项,便可以看到类存放私有数据的地方。

c3225a52-a06e-11ee-8b88-92fbcf53809c.png

创建一个Events的簇用于存放注册事件,将其拖进类私有数据簇进行保存。

c32ad90c-a06e-11ee-8b88-92fbcf53809c.png

其中Stop用户事件的引用句柄可以通过右键“用户事件输出”创建输入控件得到。

c3431fe4-a06e-11ee-8b88-92fbcf53809c.png

这样我们便可以在Pre Launch Init中将产生用户事件的引用句柄存到类私有数据中(注意用户事件数据类型需要命名)。

c34d8f9c-a06e-11ee-8b88-92fbcf53809c.png

接着我们重写Stop Core,产生用户事件并销毁用户事件。

c35827d6-a06e-11ee-8b88-92fbcf53809c.png

接下来便可以重写Actor core 来搭建辅助循环。

c36e941c-a06e-11ee-8b88-92fbcf53809c.png

辅助循环完成之后,便可以开始前面板用户交互界面的搭建。

2.重构Actorcore前面板

c38556e8-a06e-11ee-8b88-92fbcf53809c.png

这是Actor core前面板,我们一般情况下不需要在程序运行时显示这些,可以隐藏这些控件或者在VI前面板中寻找一个空白的地方,放置一个水平指针滑动杆以模拟线性编码器的位置输出,如下图所示:

c3930f9a-a06e-11ee-8b88-92fbcf53809c.png

将Linear Encoder的Actor Core的VI窗口外观属性更改为自定义,调用时显示前面板(User Interface的Actor Core也需要进行设置)

c39fdf36-a06e-11ee-8b88-92fbcf53809c.png

3.构造传输数据的方法

本次范例中模拟位置数据更新到用户界面方式有两种形式:单点实时更新,多点缓冲更新(利用队列缓冲区溢出产生注册事件)。

接下来我们处理多点的缓冲数据:在Actor core中增加数值控制值改变的事件。

c3b429dc-a06e-11ee-8b88-92fbcf53809c.png

我们新增一个方法Add Value to Buffer.vi用于将数据存储到队列的缓冲区,右键LinearEncoder类,新建基于静态分配模板的VI(动态分配模板的VI,子类继承可以重写)。

c3c449f2-a06e-11ee-8b88-92fbcf53809c.png

我们先在类私有数据的簇中,增加队列引用句柄。

c3cf4bfe-a06e-11ee-8b88-92fbcf53809c.png

回到Pre Launch Init中,在初始化时创建用于存放缓冲数据的队列,将队列引用存放在私有数据中。队列缓冲大小设置为100,即超出100个数据,在入队列时会造成超时。

c3e4120a-a06e-11ee-8b88-92fbcf53809c.png

同样的在Actor停止时,需要将队列的句柄释放,即在Stop core增加释放队列引用。

c3efadae-a06e-11ee-8b88-92fbcf53809c.png

队列的准备工作完成,我们回到新增的Add Value to Buffer.vi处理缓冲数据,可以通过入队列是否超时来判断缓冲区是否满100个点的数据,满足则将数据更新出去。

(此时Business Logic的接口消息还未创建,数据并未传递出去)

c3fa7e78-a06e-11ee-8b88-92fbcf53809c.png

接下来我们重写User Interface的Actor core,按上面同样的步骤构建辅助循环。同时增加两个用户事件,分别用于更新单点位置数据和波形数据。

c4066f26-a06e-11ee-8b88-92fbcf53809c.png

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

c4164f86-a06e-11ee-8b88-92fbcf53809c.png

User Interface —— Stop core 程序框图:

c424ff36-a06e-11ee-8b88-92fbcf53809c.png

User Interface —— Actor core 程序框图:

c42f3adc-a06e-11ee-8b88-92fbcf53809c.png

接着我们构建User Interface Actor core的前面板,需要波形图用于显示100个点的缓冲数据、数值控件显示Current Position如下图所示:

c44a0312-a06e-11ee-8b88-92fbcf53809c.png

在事件结构中创建两个用户事件的响应:

c4591168-a06e-11ee-8b88-92fbcf53809c.png

c467a1f6-a06e-11ee-8b88-92fbcf53809c.png

接着我们去创建两个静态分配的VI,分别是:Update Current Position.vi和Update Graph.vi。这两个VI用于产生用户事件,由Business Logic 发送消息将Linear Encoder 产生的数据更新到前面板。

c477fcc2-a06e-11ee-8b88-92fbcf53809c.png

c48e7434-a06e-11ee-8b88-92fbcf53809c.png

记得在前面板连接好输入输出接线端,分别在Update Current Position.vi和UpdateGraph.vi上右键—>操作者框架—>创建消息,LabIVEW会自动用脚本帮我们创建好操作者消息,User Interface的内容就完成了。

c4995228-a06e-11ee-8b88-92fbcf53809c.png

4.接口的应用

现在我们来处理Business Logic的部分,用户逻辑是将Linear Encoder传递进来的数据更新到User Interface,我们不能直接在Linear Encoder中发送Business Logic的更新数据消息,这样会使Linear Encoder与Business Logic产生耦合,所以我们使用接口来解耦,进行数据的传递。

右键我的电脑—>新建—>接口,命名为BusinessLogic Interface。

c4a2ba34-a06e-11ee-8b88-92fbcf53809c.png

右键接口—>新建—>基于动态模板分配的VI。

c4abb300-a06e-11ee-8b88-92fbcf53809c.png

分别在前面板放置数值控件、数值数组控件作为输入端,并连接好接线端。

Position Updated.vi

c4b3637a-a06e-11ee-8b88-92fbcf53809c.png

Encoder Buffer Updated.vi

c4c45e64-a06e-11ee-8b88-92fbcf53809c.png

分别右键两个方法—>操作者框架—>创建消息,为其创建消息,如下所示:

c4d1c41e-a06e-11ee-8b88-92fbcf53809c.png

接口创建完毕,我们右键Business Logic类,选择属性为它继承这个接口。

c4e074dc-a06e-11ee-8b88-92fbcf53809c.png

c4ef8f08-a06e-11ee-8b88-92fbcf53809c.png

继承接口后我们会发现Business Logic这个Actor断线了,这是因为继承接口后必须重写接口方法。右键Business Logic新建—>用于重写的VI。

可以看到增加了两个带星号的方法,也就是我们刚才接口里创建的两个方法。我们按住Ctrl同时选中Actor Core.vi、Encoder Buffer Updated.vi、Position Updated.vi对这三个VI进行重写。

c4f764bc-a06e-11ee-8b88-92fbcf53809c.png

首先对Actor core进行重写,我们需要在这个Actor内启动Linear Encoder、User Interface,并将两个Actor的消息队列引用,保存到Business Logic的私有数据中,以便在该Actor内可以随时引用。

c5015d50-a06e-11ee-8b88-92fbcf53809c.png

此处用的是启动嵌套操作者函数,它会将Calling Actor与 Nested Actor操作者关联起来,Launch Nested Actor有一个Auto-Stop默认为T,为T状态下启动 NestedActor会将队列进行保存,当此Calling Actor退出时便会自动关闭其下所有的Nested Actoor。

c50fd5b0-a06e-11ee-8b88-92fbcf53809c.png

接着我们重写Encoder Buffer Updated.vi。

c5249b58-a06e-11ee-8b88-92fbcf53809c.png

c53a3a6c-a06e-11ee-8b88-92fbcf53809c.png

此处的两个Send Message:

c5476160-a06e-11ee-8b88-92fbcf53809c.png

回到Linear Encoder Actor补全Business Logic传递数据的部分,打开Add Value to Buffer.vi ,用接口消息Send EncoderBuffer Updated.vi将数据传递出去。

c55ed48a-a06e-11ee-8b88-92fbcf53809c.png

最后打开Linear Encoder的Actor core,将Linear Encoder Position值传递到Add Value to Buffer.vi以及接口消息PositionUpdated.vi中。

c56b2cee-a06e-11ee-8b88-92fbcf53809c.png

5.创建启动器

这样我们的程序就编写完毕了,可以创建一个Launcher.vi用于启动Business Logic,验证最终成果。

c57aaad4-a06e-11ee-8b88-92fbcf53809c.png

三、内容总结:

1、创建Actor,重写Actor Method;

2、构建辅助循环,利用注册事件关闭辅助循环;

3、学习使用接口,进行模块间解耦;

4、了解嵌套操作者之间的启停机制。

注意:本文中的示例程序将会放在以下百度网盘链接中,大家可自行下载并参考学习,注意软件版本哦(本篇练习使用的LabVIEW版本为2020)~

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 编码器
    +关注

    关注

    41

    文章

    3360

    浏览量

    131537
  • LabVIEW
    +关注

    关注

    1918

    文章

    3619

    浏览量

    316992
  • 仿真
    +关注

    关注

    50

    文章

    3872

    浏览量

    132161

原文标题:教程 | Actor Framework练习——仿真线性编码器

文章出处:【微信号:华穗科技,微信公众号:华穗科技】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    [每周一练]Actor Framework框架(1125-1201)

    。Creat Project里面就大不相同。当时也创建了Actor Framework,体验了一下,感觉看不懂就渐渐淡忘了,也没有注意这个框架的名字(因为不了解)。今年有一次被问到是否知道Actor
    发表于 11-25 00:04

    编码器仿真模型

    在捣鼓温度控制仿真,需要用到编码器,型号为EC11E.原理图都画好了,其他仿真模型也都有了,就是编码器
    发表于 07-15 01:30

    sushu---Actor Framework基本介绍

    一练]Actor Framework框架(1125-1201)2016-02-28 20:15:20新写的一篇帖子:sushu---Actor Framework一种使用方式主贴里面循
    发表于 01-03 20:05

    actor framework 学习

    本帖最后由 yingtn 于 2018-2-27 11:47 编辑 各位前辈:小弟在学习 actor framework 时遇到了一个问题:在右击类新建时“重写的VI项”是灰色的,不可选 ,求教?我用的是 labview 2015 32位。
    发表于 02-27 11:44

    Actor Framework中的定时结构 (LabVIEW中的定时结构详解----终)

    本帖最后由 一只耳朵怪 于 2018-6-26 08:54 编辑 Actor Framework中的定时结构(LabVIEW中的定时结构详解----终)思考了很久怎么样将这个帖子完结,想到
    发表于 06-26 01:18

    Actor Framework -- Test Sequence

    本帖最后由 shenjianym 于 2019-10-29 08:13 编辑 用Actor Framework框架写了一个关于测试序列(生成随机数并判断)的程序。该程序使用的是LabVIEW2017版本,加2017版JKL状态机。注:程序跑第二次的时候会出现BUG,
    发表于 10-28 15:28

    什么是线性编码器

    `线性编码器是什么呢,首先我们要先了解一下编码器什么,编码器就是把数据利用一定的原理,把数据编辑整理,进而转换成能利用通讯采集的信号的一种设备。这里我们一般认为
    发表于 12-17 11:22

    LabVIEW Actor Framework学习之八皇后

    大家好,我是Richie,为什么把贴子给我删除了呢,我再试试重新发一次。本期重点:以LabVIEW OOP为基础,使用AF(Actor Framework)框架来编写程序,对八皇后问题进行求解。欢迎
    发表于 05-30 20:08

    荣小菜补钙记第33期:基于LabVIEW Actor Framework的连续测量和记录系统1

    荣小菜补钙记第33期:基于LabVIEW Actor Framework的连续测量和记录系统1 同步更新于 WeChat:荣小菜在补钙大家好,我是荣小菜,也可以叫我Richie,从本期开始打算开始
    发表于 05-29 15:32

    编码器,编码器是什么意思

    编码器,编码器是什么意思 编码器 编码器(encoder)是将信号
    发表于 03-08 15:04 2892次阅读

    在LabVIEW中创建Actor Framework的抽象消息及接口

    由于面向对象需要降低耦合性,那么基于类的操作者也需要考虑如何降低耦合性。当Nest Actor给Root Actor发送消息时,需要调用Root Actor的消息类的Send ***.vi,这就导致了Nest
    的头像 发表于 09-23 10:51 5393次阅读

    在LabVIEW中创建Actor Framework的同步消息

    首先,第一次使用Reply Msg时,继承关系中是没有Reply Msg的,因为默认Reply Msg不包含在Actor Framework.lvlib中的,需要手动添加。
    的头像 发表于 11-04 10:33 2664次阅读

    教程|创建你的第一个Actor Framework

    本文小编将手把手教你如何在LabVIEW中创建你的第一个Actor Framework,跟着搭建并感受对象和类的神奇吧!
    的头像 发表于 12-26 17:00 2400次阅读

    编码器种类及型号

    编码器种类及型号:最常见的编码器类型是旋转编码器线性编码器。旋转编码器通常用于测量机器人的关节
    的头像 发表于 05-18 11:15 3795次阅读
    <b class='flag-5'>编码器</b>种类及型号

    编码器与PLC的接线方法

    编码器分为旋转编码器线性编码器两种。旋转编码器用于检测旋转位置和速度,而线性
    发表于 12-22 09:20 458次阅读
    <b class='flag-5'>编码器</b>与PLC的接线方法