操作者框架(Actor Framework)正常使用篇2嵌套操作者的使用

操作者框架(Actor Framework)正常使用篇2嵌套操作者的使用

我们来填上篇文章的坑,嵌套操作者的使用。关于嵌套操作者我们这篇文章讲两个部分,开启嵌套操作者和关闭嵌套操作者,其他的操作和根操作者大同小异就不在这篇文章里多说了。

一、开启嵌套操作者

开启嵌套操作者的模块如下图所示,具体不细讲,大家可以看Labview自带的帮助文档,写的应该是比较细的。

图片

关于嵌套操作者的开启,我所知道的,且比较常见的有两种方法。

方法一:Actor Core.vi里启动

根操作者通过“启动嵌套操作者”模块在Actor Core.vi里启动操作者,相当于一个初始化,这个初始化是启动嵌套操作者,然后将消息队列给到右侧的辅助循环。注意由于Labview类是值传递,所以,要从“启动嵌套操作者”模块的“调用方操作者输出”端将操作者传回去。(这是新手,好吧这是我初期常犯的错误)

关于这个方法有个变种,当你需要初始化启动很多嵌套操作者的时候,可以做一个单独的vi进行启动,并串联进根操作者这条线里。但这时候你要注意,你需要在根操作者中留有一个属性来存储这些嵌套操作者的消息队列,关于在属性中存储嵌套操作者的消息队列,我会在方法二进行讲解。

图片

方法二:在操作者消息里启动

你需要在根操作者属性中放置“嵌套操作者的消息数组”和“嵌套操作者名字数组”来存放嵌套操作者消息队列和名字。这样做的目的是方便我们去查找嵌套操作者的消息队列,只要能实现这一目的,具体方法并不是很重要,大家根据实际需求可以更改存放消息队列的方式方法。

图片

然后编写启动嵌套操作者的vi,并创建消息。

图片

这里注意一下,不要把启动嵌套操作者放在Pre Launch Init.vi。这里有两种理解方式。

方式1:

根操作者还没启动好,嵌套操作者你就想启动?做梦去吧!

方式2:

首先,根操作者和嵌套操作者的启动,都离不开“启动操作者核心”这个vi,而这个vi是非重入的。

图片

当你的根操作者在Pre Launch Init.vi阶段,Pre Launch Init.vi的启动在图A所示的红圈处,黑色箭头指示的地方,是图B红色箭头指的队列需要无限等待的地方。

图片

图A

注意,由于图B指的队列需要图A里发送对应的数据,所以根操作者此时还未离开“启动操作者核心.vi”。

图片

图B

而这时(在Pre Launch Init.vi里),你要启动嵌套操作者就会导致,嵌套操作者要等待根操作者完成“启动操作者核心.vi”,由于这个vi是非可重入的,所以会导致卡死。(总算讲完了。。。也不知道大家能不能看懂,确实有点绕,后期如果大家有需要,我可以再录个视频讲一下这个东西)

二、关闭嵌套操作者

有人会说关闭,不就是发个关闭消息吗,这有啥好讲的?

太好了,你已经知道了最简单且最实用的嵌套操作者关闭方法!那我后面就不讲这个了,我们主要来讲一下操作者之间关闭的“连锁反应”。

图片

大概就是这样,根操作者就像一个班长,下面有小组长,小组长下面有一群组员。当然这个层级还可以继续增加。

1.快速理解

  • 大班长关闭了,下面的小弟(小组长、组员)都关闭。同理小组长关闭了下面的小弟(组员)也都关闭。
  • 小弟正常关闭(发送标准停止)了,不影响老大关闭。
  • 但是小弟不正常关闭(小弟发生错误了,或者发送紧急停止),小弟的老大关闭,同时根据第一条,小弟的小弟也会关闭。

这个很好验证,大家写个模拟错误的消息试一下就知道了。

图片

2.较为深入理解

到底为啥,会出现如此奇妙的事情呢?

由于AF的停止核心,会将自身携带的嵌套操作者队列都发送一遍停止消息,所以老大关闭了,下面的小弟也都关闭。

图片

然后我说下,小弟为什么有时候能(发生错误)关闭老大,有时候不行。

关闭老大的行为主要是图中圈出来的Send Last Ack来实现的,小弟结束的时候会向老大发送Send Last Ack。

图片

last ack里包含了 Actor Core里最后的错误,这些信息会传给它的老大,并在老大的Actor Core里处理。

图片

Actor Core收到错误会对错误进行处理,可以看到“处理错误.vi”里,通过错误码把错误码43和其他因为错误区分了开来,错误码43不会向后面继续输出错误。

图片

错误码43是啥呢,其实就是“发送标准停止”。而紧急停止的错误码是1608,并没有在“处理错误.vi”里被区别对待。这也就是为啥,给小弟发送“标准停止消息”,不会让老大停止。而小弟“因错误导致停止”或“发送紧急停止”后,会引发老大的停止。

图片

三、总结

嵌套操作者的使用,这篇文章听上去挺简单的,其实里面道道很多。

如果你是初学者,我建议你根据我文章里讲的那几种启动和关闭方式,写个demo玩一下就行,不用去深刻理解里面的原因。

如果你是有简单玩过操作者的人,可以根据我讲的内部原理,去试着理解一下为什么会这样,当然我讲的不是很好,如果第一次看感到晕也是正常的,我仅希望我这篇文章能是你学习AF框架道路上一点助力就好。

如果你是大佬,后台轻喷一下就行。。。

四、碎碎念

根据我讲的内部原理,去试着理解一下为什么会这样,当然我讲的不是很好,如果第一次看感到晕也是正常的,我仅希望我这篇文章能是你学习AF框架道路上一点助力就好。

如果你是大佬,后台轻喷一下就行。。。

四、碎碎念

整体AF的文章,我其实一直在思考怎么写比较好,这也是我这篇文章更新那么慢的原因。我有想过写个稍微复杂一点的代码,然后带着大家慢慢拆解,但写着写着就感觉要填的坑太多了,根本讲不完,和朋友交流后决定还是要把基础的都一点点码完再考虑写个一到两篇稍微综合点的文章。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值