LabVIEWCompactRIO 开发指南4 第三章LabVIEW实时应用程序的设计

简介: LabVIEWCompactRIO 开发指南4 第三章LabVIEW实时应用程序的设计

LabVIEWCompactRIO 开发指南4


第三章LabVIEW实时应用程序的设计


在为CompactRIO创建LabVIEW实时应用程序时,从第1章:设计CompactRIO软件体系结构中描述的设计图开始。如果开始软件开发时没有某种架构或流程图可供参考,那可能很难跟踪所有软件组件和通信路径。一旦创建了一个设计图,下一步就是实现LabVIEW实时代码了。


顶层RTOS的设计VI


设计LabVIEW实时程序的一个很好的起点是创建一个类似于图3.1所示VI的顶层框架。在这个框架VI中,进程(循环)包含在子VI中。将进程包含在子VI中有助于创建可读且可维护的应用程序。每个子VI可能包含一个或多个进程。


dfbe463ac8d9e86231763700c64b8e84.png


图3.1 创建包含程序总体结构的顶层VI


一旦设计了顶级RTOS VI,下一步就是实现每个过程。本章提供了在LabVIEW Real-Time中设计进程的最佳实践,包括确定性与非确定性进程、进程间数据通信、设计模式和内存管理。


确定性和非确定性过程


对于许多工程师和科学家来说,在安装了通用操作系统(如Windows)的标准PC上运行测量或控制程序是不可接受的。在任何时候,操作系统都可能由于多种原因延迟用户程序的执行:运行病毒扫描、更新图形、执行系统后台任务等等。此外,对运行时间有要求的应用程序,意味着应用程序需要在不重新启动的情况下运行数天、数周或数年,此时通常需要RTOS。


在设计实时应用程序时,可以从两个级别的可靠性中进行选择。


第一级的可靠性保证程序以一定的速度运行而不会中断。CompactRIO上使用的RTOS提供了这种级别的可靠性,而不需要任何特殊的编程技术。可以将进程实现为带有定时函数的常规While循环,以获得比使用通用操作系统高得多的可靠性。


第二级的可靠性涉及确定性和抖动。如果确定性描述流程如何响应外部事件或在给定的时间限制内执行操作,那么抖动是执行时间无法满足这些期望的程度的度量。一些应用程序需要定时行为在一个可接受的抖动内执行,如图3.2所示。


4bb71b1f6acfcf065da1c39a02552e27.png


图3.2 抖动是对任务在后续迭代中执行时间差异的度量


CompactRIO能够限制抖动量,这可能是关键任务应用程序的要求。在设计具有一个或多个进程的确定性应用程序时,可以从两个选项中进行选择,这些进程需要对抖动量进行硬性限制:


1.使用LabVIEW FPGA实现关键任务——由于LabVIEWFPGA代码运行在硬件中而不是在操作系统中,因此可以保证关键任务不会崩溃或挂起。RTOS比通用操作系统更具确定性和可靠性,但如果编程不正确,它仍然容易导致软件崩溃。


2.在LabVIEW Real - Time中使用定时循环实现关键任务——比While循环稍微复杂一点,定时循环旨在以最小的抖动执行确定性任务。


下一节描述使用定时循环和VI优先级实现确定性流程。如果应用程序不包含任何需要有界抖动的任务,请使用定时函数While Loops而不是Timed Loops。定时循环提供了许多有用的内置功能,但也比While循环涉及更多的开销和复杂性。在不使用定时循环的情况下,您可以从RTOS的可靠性中获益,但您不能对抖动进行限制或最小化抖动。


实现确定性流程


第1章讨论了设计CompactRIO应用程序的一种方法——分离任务并将它们识别为进程(循环)。应用程序可能由确定性和非确定性任务组成。确定性进程每次都必须按时完成,因此需要专用的处理器资源来确保及时完成。将确定性任务与所有其他任务分开,以确保它们接收到足够的处理器资源。例如,如果控制应用程序定期获取数据并将数据存储在磁盘上,则可能需要确定地处理数据获取的时间和控制。然而,在磁盘上存储数据本质上是一个不确定的任务,因为文件I/O操作具有不可预测的响应时间,这取决于硬件和硬件资源的可用性。因此,希望为数据采集任务使用定时循环,为数据记录使用While循环。While循环应该用于不确定的任务或无界代码(文件I/O、网络通信等)。


表3.1包括确定性和非确定性任务例子。


b8c28b8cd51f398c1e3810ef220c34a1.png


设置确定性任务的优先级


如果编程正确,RTOS可以保证程序以一致的定时运行。RTOSs通过向程序员提供对任务优先级的高度控制以及确保重要的截止日期被满足的能力来做到这一点。可以通过使用定时循环或设置子VI的优先级来设置LabVIEW实时任务的优先级。如果出于可读性的考虑,在设置优先级时,通常最好使用定时循环。对于定时循环,优先级被标注在框图上供任何开发人员查看,而子VI的优先级仅在VI属性对话框中显示。


定时循环


定时循环类似于While循环,但包含了用于确定地执行代码的附加特性。使用定时循环,可以指定代码执行的周期和优先级。一个定时循环的优先级越高,该结构相对于框图上的其他定时结构的优先级就越高。框图上具有最高优先级的定时循环被称为时间关键循环。可以在框图上动态配置优先级和周期,也可以通过双击Timed Loop上的左侧输入节点时启动的配置窗口动态配置。

46635b62de78f6bffe4344fb5ca1d028.png



图3.3 通过定时循环配置对话框可以指定定时循环的周期和优先级。


在RTOS上使用定时循环时,定时是很重要的。当调用时间关键型循环时,它是框图上唯一执行的循环。如果将时间关键型循环设置为100%的时间运行并且从不进入睡眠状态,那么它将完全垄断系统的一个核心。一定要为时间关键循环指定一个合理的周期,但允许应用程序中的其他后台任务执行。


防止不良计时行为的一种方法是为应用程序创建时间预算。时间预算包括确定在应用程序中执行每个循环所需的时间量,并相应地设置循环的速率。时间预算应该限制应用程序使用不超过80%的可用CPU。


VI优先级


还可以设置代码的确定性部分的优先级,将其放置在子VI中,并通过VI属性对话框修改VI优先级,如图3.4所示。



418f0561f2899905c86fc05e7cd2f1de.png

图3.4。通过“执行”类别下的“VI属性”对话框指定VI的优先级。


尽量避免在同一个应用程序中使用定时循环和VI优先级。如果必须使用两者,应该对它们之间的关系有一个清晰的理解。如果VI的优先级中包含了具有优先级的定时循环,则定时循环将忽略该VI的优先级。与图3.4所示的VI优先级相比,Timed Loops的执行优先级略低于时间关键优先级(最高),略高于具有高优先级的VI。具有时间关键优先级设置的VIs优先于定时循环。While循环以正常优先级执行。


为了理解LabVIEW是如何基于优先级调度并行任务的,图3.5总结了可用的优先级和执行系统。执行系统是一个相关线程池。更多信息可以在LabVIEW实时帮助文档中找到,了解基于优先级的调度模型。


5597b2987182cea36b5262b557e6bb8c.png


图3.5 LabVIEW实时中可用的优先级和执行系统


用子VI创建模块化代码


根据定义,模块化意味着使用模块或较小的部分来实现总体目标。在LabVIEW中,程序模块化意味着创建被称为子VI的更小的代码段。子VI与VI相同。它们包含前面板和方框图,但可以在VI中调用它们。子VI类似于基于文本的编程语言中的子程序。涡轮测试实时VI使用图3.6所示的子VI来计算一次从DMA FIFO读取多少元素以避免缓冲区溢出或下溢情况。这个子VI从数据采集和分析循环中调用。


12db31d0cbe2810a1f3cd1bdcdc3315e.png


图3.6 通过创建子VI来创建模块化代码


进程间数据通信


在设计嵌入式应用程序时要考虑的最重要的因素之一是数据通信。本节将讨论第1章中讨论的用于实时目标上的进程间通信的每种数据通信模型的推荐数据传输机制。表3.2给出了每种通信模型的推荐数据通信机制。推荐用于两个不确定性循环之间的数据传输的数据通信机制,通常比用于涉及时间关键型或确定性循环的数据传输的推荐机制更灵活。


表3.2 每种通信模型的推荐进程间数据通信机制


04efc159f62649074f36b08bb6a73460.png


请注意,在选择数据通信机制时,传输类型只是考虑因素之一。可能有使用基于命令的机制实现更新的有效用例,反之亦然,这取决于前面提到的其他考虑因素,如易于实现、可灵活性或性能。下一节提供了在LabVIEW Real-Time中实现每种通信模型的最佳实践。


单进程共享变量


共享变量是指可以在框图中无法通过网线连接的两个位置之间、运行在实时目标上的两个VIs之间或运行在不同目标上的两个VIs之间,跨网络发送数据的配置软件项。使用单进程共享变量共享实时目标上的当前值数据或标签,并使用网络发布的共享变量在不同目标上的VIs之间共享数据。单进程共享变量在底层被实现为全局变量。


7921e6645f1112a3121dcfae4999c883.png


图3.7 使用单进程共享变量在多个进程之间进行变量通信。


要创建单进程共享变量,请在Project Explorer窗口中右键单击实时目标,并从快捷菜单中选择New»variable。在“共享变量属性”对话框中,可以将变量类型设置为“单进程”(单进程共享变量是全局变量)。



de629554424a6ea2d1d94db06ea2143f.png


图3.8 每种通信模型的推荐进程间数据通信机制


如果应用程序包含相对大量的变量,并且需要动态标记查找等标记管理特性,则应该考虑下面描述的当前值表,它旨在有效地处理大量标记。


由于单进程共享变量基于全局变量,因此它们充当共享资源,如果在时间关键型循环中使用,可能会引入抖动。如果对在时间关键型循环中使用单进程共享变量感兴趣,请确保在变量属性对话框中启用RT FIFO。启用了RT FIFO的单进程共享变量将在下一节RT FIFO中讨论。    


需要说明的是,上述的例程和文档,都是可以下载的,双击即可打开,其中压缩文件是可以采用粘贴复制的方式,拷贝到硬盘上。这不是图片,各位小伙伴看到后尝试一下,这个问题就不用加微信咨询了。有关LabVIEW编程、LabVIEW开发等相关项目,可联系们。附件中的资料这里无法上传,可去公司网站搜索下载。

相关文章
|
6月前
|
存储 API 异构计算
LabVIEWCompactRIO 开发指南30 目标间通信
LabVIEWCompactRIO 开发指南30 目标间通信
44 3
LabVIEWCompactRIO 开发指南30 目标间通信
|
6月前
|
网络协议 安全 数据挖掘
LabVIEWCompactRIO 开发指南12 LabVIEWCompactRIO 开发指南12 第四章网络通信的最佳实践
LabVIEWCompactRIO 开发指南12 LabVIEWCompactRIO 开发指南12 第四章网络通信的最佳实践
38 2
|
6月前
|
异构计算
LabVIEWCompactRIO 开发指南第六章44 同步模块
LabVIEWCompactRIO 开发指南第六章44 同步模块
36 1
|
6月前
|
异构计算
LabVIEWCompactRIO 开发指南第六章41 同步模块
LabVIEWCompactRIO 开发指南第六章41 同步模块
41 1
|
6月前
|
测试技术 C++ 异构计算
LabVIEWCompactRIO 开发指南34 在模拟模式下调试
LabVIEWCompactRIO 开发指南34 在模拟模式下调试
45 1
|
6月前
|
数据采集 前端开发 芯片
LabVIEWCompactRIO 开发指南第六章40 模块分类
LabVIEWCompactRIO 开发指南第六章40 模块分类
40 2
|
6月前
|
人工智能 前端开发 异构计算
LabVIEWCompactRIO 开发指南第六章38
LabVIEWCompactRIO 开发指南第六章38
37 1
|
6月前
|
资源调度 算法 程序员
LabVIEWCompactRIO 开发指南第六章42
LabVIEWCompactRIO 开发指南第六章42
44 1
|
6月前
|
存储 异构计算
LabVIEWCompactRIO 开发指南第六章43
LabVIEWCompactRIO 开发指南第六章43
37 1
|
6月前
|
异构计算
LabVIEWCompactRIO 开发指南第七章50
LabVIEWCompactRIO 开发指南第七章50
33 1
下一篇
无影云桌面