本帖最后由 shuzhu 于 2020-1-19 15:26 编辑
其次为了更好的理解Actor,有两个文档可以推荐给大家: (1)TS8445 labview 2012 Advanced Design Templates and Sample Project.pdf(推荐第P13来理解Actor和QMH的相似与不同之处,本例的目的也是在于此); (2)https://www.docin.com/p-2113014263.html(这篇文章的作者在全网都没有找到); 1、程序整体结构 Launch.vi为程序的入口,这也是一般AF结构的启用方式(个人认为目的是为了启用第一个Actor的根操作者); UIEvent.lvlib是前面板事件响应操作者,在三级框架中作为事件的收集与分发,此处为了简便只有事件收集循环,没有UI的分发循环(如果以后有时间可以整理一下在QMH中使用的模式); ConDAQActor.lvlib是模拟连续数采,此处仅用一列作为表示,扩展配置相似此处的各;
2、程序中两个操作者的动作和响应关系 (1)初始换控件值,恢复为默认值; (2)点击Initial,进行DAQ采集信息配置;正确为Initial,错误为Initial:Error; (3)点击Start,DAQ开始,并进入DAQRead;正确为Start,错误为Start:Error; (4)进入DAQRead循环执行;正确为Read,错误为Read:Error; (5)点击Pause,DAQ采集任务暂停,方法为清除DAQActor中的所有Msg;正确为Pause,错误为Pause:Error; (6)点击Stop,DAQ采集任务停止并清除(需要确认是否将DAQStop执行完毕,或者使用StopCore来处理结束时的任务,如清除队列);正确为Stop,错误为Stop:Error。
3、部分细节介绍 (1)虚拟一个电压采集卡(红色框中替换为自己虚拟的)
(2)DAQStart-->DAQRead的方法(故先将DAQRead的消息生成,然后再拖入这个循环,DAQRead中给自己发送是相似的)
(3)DAQRead通过给自己发送消息保证循环下去
(4)暂停数据采集(与QMH相似,清除队列中的元素,FlushQueue(自带没有,可自己创建,里面的Flush是已有的))
(5)其他细节可调试着看,此处不再赘述。 4、一点内容 (1)当时为了解决QMH实现并行循环时,在一个Diagram中有14个并行循环,看起来很麻烦,但毫无疑问的使用QMH调试方便,可跟踪;其次是当UI界面中的控件太多,需要赋值时,使用引用的方式虽然很方便,但要是有所改动或调整,其实会非常麻烦。 (2)基于以上才去找更加合适的框架,故了解了基于OOP的AF框架。 (3)找遍了中文社区的资料,很少,在NI的AF社区中也是集中在2011-2013年之间的资料,最近NIWeek对AF的解释文档很少(其实看AF子vi放置的位置,也可见NI对AF的重视程度)。 (4)如果能通过AF结构实现对DAQ的连续采集控制,那其他的应用也可以进行相应的扩展(与sushu的理解是一致的),其实国外的一些开发者也对如何控制DAQ连续采集有疑问,见https://ekerry.wordpress.com/2013/03/28/designing-a-labview-measurement-system-with-multiple-abstraction-layers/中的评论。 (5)其实我对上面这种操作结构还是有一些介意的,还是倾向与任务分发与任务消息回收的方式来处理。在这个版本前写的一个是每个Actor都采用自己的QMH,来接收来自于UIEvent的信息,做相应的处理,更深一步,UIEvent只需要给其他的Actor发送需要的消息就行,Acto的各Case的执行仍是自己来控制。这种好处在于,离开UIEvent后,各Actor也可以自己执行。 (6)对于AF中类的继承等特点还是建议在具体编写程序时进行提炼和规整。 (7)关于Actor的停止问题,可以参见: (8)关于LabVIEW自带的两个例程,有自己的使用特点,但对于一些场景的使用还要具体的对待,我对TimedLoop.lvclass尤其的不解。 5、写在最后 本例只在于如何理解Actor,一点点,AF的其他特性和细节可以到NI的AF社区查找更多的资源。编写程序时,有时是我们不知道有这个功能或者还可以这样用,希望都可以在遇到问题时不懈努力。 在最后找资料的时候,竟然有这个(以前没发现):https://zhuanlan.zhihu.com/p/100469957(粗览一下,作者很厉害),原来是最近才整理的。 有写的不恰当的地方还请批评指正。
|