LabVIEWCompactRIO 开发指南6
RTFIFO启用共享变量
可以使用启用了RT FIFO的单进程共享变量在两个循环之间确定地传输数据,也可以使用启用了RT FIFO的网络发布共享变量在网络之间确定地传输数据。图3.14中的框图与前面的例子类似,但是它使用了支持RT FIFO的共享变量而不是RT FIFO函数来共享数据。优先级为100的时间关键型循环使用启用了实时FIFO的名为loop Comm的共享变量与非确定性循环共享获取的数据。非确定性循环将从共享变量loop Comm读取的获取数据记录到实时目标的磁盘上。
图3.14使用支持RT FIFO的共享变量
要在共享变量上启用RT FIFO,请导航到共享变量属性对话框的RT FIFO页面,并在启用实时FIFO复选框中放置复选标记。
图3.15 启用RT FIFO,可以从多个并行循环中读写共享变量而不会引起抖动
使用单元素RT FIFO来传输最新的值(标签或更新),并使用多元素RT FIFO来传输缓冲的值(消息或流)。多元素FIFO的特点是每次写操作都向缓冲区中添加一个元素,每次读操作都从缓冲区中删除一个元素。只要消费者循环经常检查FIFO,就可以将缓冲区保留为默认的两个元素,并且不会错过任何触发器/命令。
为了检查FIFO,消费者任务必须读取共享变量并检查错误状态。如果FIFO为空,共享变量返回警告-2220。如果这个警告没有返回,那么FIFO不是空的,并且返回的值是一个有效的命令。
每次读取共享变量时,都会从FIFO中删除一个元素(假设FIFO不是空的)。因此,不能让多个消费者从同一个FIFO接收命令,但可以让多个指挥员将命令放入FIFO。
LabVIEW实时设计模式
设计模式是软件工程中常见问题的可重用解决方案。通过在LabVIEW实时应用程序中使用设计模式,可以利用软件工程社区积累的经验。设计模式的好处包括:
■更快的开发时间
■更高的可靠性
■更好的代码可重用性
■更容易调试
■增强可维护性
在查看一些常见的设计模式之前,需要了解在LabVIEW Real-Time中同步循环的选项。同步是任何设计模式的基础。
同步和定时
在LabVIEW Real-Time中实现设计模式时,最重要的考虑因素之一是循环的同步。几乎所有的LabVIEW实时应用程序都由两个或多个具有不同同步需求的循环组成。例如,第1节介绍的涡轮机测试应用程序。涡轮测试应用程序由具有多种同步类型的多个回路组成。每个循环必须只有一个同步源(状态机是个例外)。例如,如果有一个需要连续运行的任务和一个正在等待消息的任务,那么在同一个循环中实现它们可能会有问题。
周期环路A
周期循环在规定的周期内连续运行。涡轮PWM特性环在涡轮测试应用中是周期性的。这个循环如图3.16所示,以100毫秒或10赫兹的周期执行。它使用变量进行通信。在设计周期循环时,请注意不要添加任何会引入阻塞或其他类型同步的函数(例如,没有超时的队列)。
图3.16 涡轮测试应用程序中的涡轮PWM特性回路周期性地执行。
还可以通过使用与数据采集和分析循环类似的定时循环,为更高优先级的任务实现周期性循环。通常只有在实现周期性任务时才应该使用定时循环,因为任何类型的阻塞都会引入抖动。
事件驱动的循环
事件驱动的循环仅在事件发生时执行。事件通常是从另一个进程接收消息。涡轮机测试应用程序中的消息循环是事件驱动的。在命令解析器示例中,同步源是Dequeue Element函数。超时设置为default(-1),这意味着函数永远不会超时,并且只有在从主机接收到命令时才执行循环。事件驱动架构的其他常用功能包括:
■队列
■通知
■RT FIFO
■用户事件(事件结构)
■网络流
图3.17带有事件驱动同步的循环示例
当使用事件驱动的设计模式时,可以阻塞,直到收到消息或发生超时。当阻塞没有超时,程序有效地使用CPU,但也阻止任何后台任务的运行。如果在这些函数中添加一个超时,可以有一个“超时”状态,在此期间可以在等待消息的同时执行后台任务。
计划循环
计划循环在一个绝对时间执行。例如每天午夜执行的维护例程。这种类型的同步不太常见。
设计模式
LabVIEW实时应用程序中常见的设计模式与Windows应用程序中使用的设计模式相似。本节研究两种设计模式:状态机和生产者-消费者。
状态机
状态机是一种常见且有用的设计模式。可以使用状态机来实现任何可以通过状态图或流程图显式描述的算法。状态机通常说明一个中等复杂的决策算法,例如诊断例程或进程监视器。
生产者消费者
生产者-消费者设计模式用于在以不同速率产生和消费数据的进程之间传输数据。在Windows操作系统上,生产者消费者通常使用Queue函数实现。在LabVIEW Real-Time中,它可以通过队列或RT FIFO来实现。可以实现生产者-消费者设计模式,以便在两个循环之间共享数据或共享事件。
数据共享生产者和消费者
当需要执行一个流程(如数据分析),当数据源(如触发获取)以不均匀的速率生成数据,并且需要在数据可用时执行该流程时,请使用数据共享生产者消费者设计模式。
事件共享生产者-消费者
当希望异步执行代码以响应事件而不减慢用户界面响应速度时,请使用事件共享生产者消费者设计模式。
一个生产者消费者事件共享设计模式的例子是涡轮机测试应用程序中包含的HMI,如图3.18所示。这个应用程序有一个循环专门用于从用户界面接收事件,另一个循环处理命令并通过网络将它们发送到CompactRIO控制器。由于网络通信功能依赖于外部资源,即网络,因此如果将它们置于UI Event Handler循环中,它们可能会影响用户界面的响应性。
由于此应用程序在Windows主机PC上运行,因此可以使用队列在两个循环之间共享数据。实时应用程序可以使用队列或RT FIFO来共享数据,具体取决于是否涉及时间关键循环。
图3.18带有事件的生产者消费者的例子
需要说明的是,上述的例程和文档,都是可以下载的,双击即可打开,其中压缩文件是可以采用粘贴复制的方式,拷贝到硬盘上。这不是图片,各位小伙伴看到后尝试一下,这个问题就不用加微信咨询了。有关LabVIEW编程、LabVIEW开发等相关项目,可联系们。附件中的资料这里无法上传,可去公司网站搜索下载。
楼主最近还看过