在学习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时产生注册事件,辅助循环响应停止。现在我们来重写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)~
石头扫地机器人T6体验 整体的使用体验无疑有了进一步提升
后疫情时代,印刷电路板产业后续如何发展
【节能学院】智能操控及无线测温产品在江苏瑞恒双氧水气体检测项目中的应用
2021年工业发展挑战机遇并存,加快布局推动网络优化升级
LED照明行业在2021年终于迎来了曙光
基于Actor Framework仿真线性编码器
智慧社区应该具备怎样的条件
国内人工智能从政策到产业到基金全面开花
realme C20海外市场推出 获得泰国NBTC认证
PCB电路板的电镀工艺流程详解
L-com推出用于满足恶劣环境联网需求的焊接式M12连接器
无线光纤覆盖:FTTH与3G的融合方案
航空制造机器人发展趋势
没有售后服务才是最好的服务!
点阵LED显示屏的制作原理解析
51单片机制作简易电风扇定时控制器
现代电子集成技术分析
雷神公司正在研制世界上最先进的数字雷达
3D打印金属制造的零部件在各行业得到广泛利用
人工智能如何助力儿童成长