老师指导意见:
- 在操作者框架中,真正的实体对象(存储数据的地方)只是操作者和消息,队列只是一个逻辑结构(逻辑抽象),还有一个存储数据的地方是VI的显示控件,所以一共只有三个地方存储数据。
- 对优先级的考虑
- 三个优先级,如果采用简单优先级,那样会造成饥饿(starvation)或无穷阻塞(infinitive blocking)问题
- 解决方案:
- 老化(aging),逐渐增加系统中等待时间很长的进程
- 动态改变优先级。即优先级高的消息并不总是优先级最高的,而是在大部分时间内优先级最高的,优先级低的消息也并不总是优先级低的,也有在小部分事件是优先级高的。
- 最终考虑
- 不设置优先级,检测队列中元素的数量,当数量增大时,删除队列中的元素,来保证实时性。
深入理解操作者框架-TASK函数设计
- 每一个操作者只有接收模块,没有发送模块,发送模块是通过调用别人的接收模块来实现的,了解这一点对构建消息有帮助。
- 即,你想要某一个操作者接收哪一种消息并完成什么样的动作,
- 注意:操作者类下面的TASK函数是“用于数据成员访问的VI”(权限:读取),可以右键类名字,然后新建即可。(如果你在设计类,则动态分配,如果不是则静态分配)
- 在VI属性-执行选项卡中禁用内嵌子VI,选择非重入执行
- 新建完这个VI之后,到工具栏-操作者框架消息制作器-选中这个操作者类下面的这个TASK函数,点击生成,即生成了一个完整的消息。
- 接下来更改类和VI的名字即可,为所有VI图框添加标识信息。
- 要想使用引用值改变引用的事件,必须在属性节点中选择value(sgnl)[值(信号)],而不是value[值]
主操作者自动转发消息(若子操作者同时拥有接收和发送消息的功能,则也适用这个准则)
- 实现行为:子操作者重复发送坐标消息到主操作者,主操作者自动发送到地图操作者
- 两种方式
- 第一种,主操作者检测到所接收的消息后使用事件结构,检测到数据值改变时自动发送到地图操作者(发送到哪一个操作者由设计人员指定,暂时不由程序自动控制,要想由程序自动控制,使用一张表即可)
- 使用第二种,即老师所想的。还是使用循环结构,先对所有数据进行检测,分析,然后确定执行发送消息。
- 需要哪些检测分析的方法?
- 怎么确定执不执行准发动作。
- 注意,这两件事都在主操作者中执行么?
- 不是的。
- 在主操作者的接收消息类的DO函数中接收数据和处理数据,形成决策,将决策写入控制簇(命名为control_cluster),类似于单片机里面的使能位置位。
- 为了增加性能,应该就使用寄存器中的使能位,而不是使用LV中的簇数据类型。可以每一个操作者一个“寄存器”。如,关于地图操作者的设置位,不仅仅包括允许地图更新,还应该使用更多的寄存器位来设置地图操作者的功能。
- 因为控制簇存储在主操作者的消息类中,所以更改控制簇的内容,需要改变几个函数,首先是消息类的数据簇,然后是send函数,然后是task函数。
- 还要相应地修改主操作者类数据簇中的引用
- 在核心函数中建立并行循环
- 并行循环的停止,使用通知器,是不行的,因为循环不会继续运行。
- 将等待通知器的超时设为0,循环可以继续运行,但是当点击停止全部按钮后,前面板进程会阻塞,无响应,原因不知道。
- 后来在循环中设置立即超时的事件结构才解决这个问题。
定义环境模型操作者
- 核心函数:对环境模型进行初始化,然后循环对其他操作者提供环境信息,维护模型
- 接收消息:接收别的操作者提供的模型信息
- DO函数:读取接收过来的消息,并更改现有环境模型
看网页里面的所有资料。
看完了。包含各种入门资料和功能扩展。