11.5-编写程序

老师指导意见:

  • 在操作者框架中,真正的实体对象(存储数据的地方)只是操作者和消息,队列只是一个逻辑结构(逻辑抽象),还有一个存储数据的地方是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函数:读取接收过来的消息,并更改现有环境模型

看网页里面的所有资料。

看完了。包含各种入门资料和功能扩展。


猜你喜欢

转载自www.cnblogs.com/lizhensheng/p/11241961.html