From 11:00 PM CDT Friday, Nov 8 - 2:30 PM CDT Saturday, Nov 9, ni.com will undergo system upgrades that may result in temporary service interruption.

We appreciate your patience as we improve our online experience.

LabVIEW中的设计考虑要素

概览

在软件开发和维护方面,精心设计的LabVIEW应用是最大限度提高效率的关键。  本文档介绍了LabVIEW中与软件设计相关的基本结构设计模式结构。本文内容并不全面详实,仅作抛砖引玉,为您介绍一些最常见的LabVIEW软件设计元素。通过文档中的链接获取更多详细信息。

内容

基本结构

以下各节介绍了LabVIEW编程中用于完成特定任务的常见结构。熟悉这些基本结构有助于用户更轻松地识别和理解它们在LabVIEW应用中的使用方式。

定义类型

自定义类型(通常缩写为“typedef”)支持用户指定数据类型,且该数据类型的定义将在整个应用程序中始终保持一致。例如,下图为簇自定义类型:

用户将该typedef放置在前面板或程序框图上时,将显示为一个簇,但其接线端和常量的左上角显示有黑色三角形:

typedef用于在整个应用程序中定义一致性类型。为了说明这一点,请注意在typedef中添加新参数(在本例中为配置路径)后的变化:

在单个位置修改typedef(源typedef .ctl文件)后,该更改将自动在整个应用程序中传播:

如簇并非typedef,则需要手动更新整个应用程序中簇(位于前面板和程序框图上)的所有实例。除极少数情况外,在编写LabVIEW应用时,应对所有创建的枚举进行typedef。

通过使用typedef,用户可以通过单一来源的共享数据类型来提高代码的可维护性。

更多资源

 

事件结构

事件结构用于响应LabVIEW程序框图中的用户界面事件和编程事件。例如,用户可以注册事件程序框图,用于在前面板控件值更改时执行。用户还可以通过产生用户事件函数在程序框图中注册以编程方式生成的事件。

事件结构通常放置在While循环中,以便在整个代码执行过程中,代码能够响应多个事件。配置事件结构,从而针对要检测的不同事件配置不同的帧。每个事件帧都包含事件发生时执行的处理代码。 

更多资源

浏览以下LabVIEW的随附项目,查看用户界面事件和编程事件的示例:

  • <LabVIEW 20xx>\examples\Structures\Event Structure\Event Structure.lvproj
  • <LabVIEW 20xx>\examples\Dialog and User Interface\Events\Events.lvproj

 

功能全局变量

功能全局变量(也称为“FGV”、“LabVIEW 2样式全局”或“操作引擎”)是一种数据存储机制。  FGV将数据存储在未初始化的移位寄存器未初始化的反馈节点中,并支持您在应用程序中的任何位置(即“全局”)访问该数据。 基础FGV VI的程序框图如下所示,包含数据输入数据输出,以及包含两个操作(“设置”和“获取”)的运行枚举: 

这个简单的获取/设置FGV提供的功能与使用全局变量相当。实际上,除了“设置”和“获取”之外,FGV还可能会执行其他功能。 

用户可以将FGV用于存储参考并执行更复杂的操作。  例如,观察下图中的文件I/O FGV(使用未初始化的移位寄存器而非反馈节点)。  该FGV存储连续调用之间的文件参考,并在单个VI中执行多个不同的操作(打开、读取、写入和关闭)。  

请注意,FGV与全局变量一样容易受到竞争状态的影响。作为一般规则,应避免在代码的多个位置中写入全局数据。

更多资源

 

面板

子面板是显示其他VI前面板的前面板控件。 使用子面板可设计动态用户界面,在该界面中,用户可以通过指定在子面板中显示的不同VI来替换整个UI部分。子面板还支持模块化应用程序开发,前面板项的逻辑分类组可以包含在单独的VI中。 通过此设计,用户可以修改显示在子面板中的单个VI,而无需更改其他显示VI或主应用VI的代码。 

以下示例扫描文件夹以查找插件VI,并使用这些插件填充文本下拉列表。用户选择文本下拉列表中的项时,相应的插件VI会插入主VI的子面板中。  该结构支持用户在磁盘中添加新的插件VI,而无需对主VI进行任何更改。 

更多资源

运行以下LabVIEW的随附示例,试用更多子面板:

  • <LabVIEW 20xx>\examples\Controls and Indicators\Containers\Multiple VIs in a Subpanel.vi

 

VI

默认情况下,LabVIEW配置VI用于不可重入执行。这意味着一次只能运行VI的一个实例。因此,在下图中,“Process.vi”的一个子VI实例必须等待另一个子VI实例完成后才能运行。

如果用户希望并行运行VI的多个实例,则必须使VI可重入执行。为此,转至文件>VI属性>执行,将“重入”设置更改为共享副本的重入预分配副本的重入

将VI更改为可重入执行后,即可并行运行多个实例:

在下列情况下,可考虑VI重入:

  • 并行运行同一VI的多个实例,以提高应用程序性能
  • 复杂的用户界面显示需要显示同一VI前面板的多个实例

请注意,功能全局变量几乎均为不可重入执行,因为它们用于维护整个应用程序需要共享的全局状态数据。

更多资源

运行以下LabVIEW的随附示例,试用重入VI:

  • <LabVIEW 20xx>\examples\Performance\VI Properties\Reentrant VI Execution.vi

 

异步进程

大多数情况下,从一个VI调用另一个VI时,会使用常规子VI调用。调用子VI时,调用程序框图必须等到子VI完成执行后才能继续执行。这就是同步调用示例。

但是,在某些情况下,应用程序可能要求用户启动子VI,但需要子VI运行的同时,继续执行调用方VI。这就是异步调用示例。使用异步VI调用,可动态并行运行任意数量的VI。此外,通过使用重入VI,可生成相同VI的任意数量实例,并使其异步运行。

在下方示例中,调用方VI异步调用重入Process.vi的多个实例。  每个VI独立运行,并在运行结束后向调用方VI返回数据。  调用方VI可并行执行其他程序框图代码,而无需等待进程VI实例完成。 

更多资源

浏览下列LabVIEW的随附项目,其中的示例介绍了异步VI调用的更多细节:

  • <LabVIEW 20xx>\examples\Application Control\VI Server\Asynchronous Call By Reference\Asynchronous Call By Reference.lvproj

 

面向对象编程

通过LabVIEW类可在LabVIEW中进行面向对象编程。  LabVIEW面向对象编程使用其他面向对象的编程语言(如C++和Java)中的概念,包括类结构、封装和继承。这些概念可用于创建易于维护的代码,并且可以在不影响应用程序内其它代码部分的情况下修改代码。许多面向对象的设计模式可应用于LabVIEW。 请参见将常见的面向对象(OO)设计模式应用于LabVIEW,了解相关内容。

更多资源


浏览LabVIEW随附文件夹中的项目,其中的演示介绍了LabVIEW类编程的基础知识:

  • <LabVIEW 20xx>\examples\Object-Oriented Programming

设计模式

设计模式是一种执行同步或异步代码的理论机制。大多数真实架构(见下节)将一个或多个设计模式作为其核心执行机制的一部分。理解本节中设计模式的行为,有助于用户更好地理解基于这些设计模式而构建的更复杂架构行为。

状态机

状态机状态图流程图的LabVIEW程序框图实现。给定的“状态”将通过程序框图逻辑来确定下一个要执行的状态。一些状态机由用户界面驱动,用户输入或程序框图逻辑可在界面中确定下一个将执行的状态。  

基础LabVIEW状态机包含以下主要组件:

  • typedef枚举:包含状态机的每个状态名称
  • 条件结构:包含每个状态要执行的代码和用于确定序列中下一个状态的转移代码
  • while循环:可支持状态机连续执行多个状态
  • 移位寄存器:用于指定在循环的下一次迭代中将执行的状态
  • (可选)“等待事件”状态:包含用于处理用户界面事件的事件结构

更多资源

浏览以下LabVIEW的随附项目,详细了解状态机:

  • <LabVIEW 20xx>\examples\Design Patterns\State Machine\State Machine.lvproj

使用简单状态机项目模板,用户可以在LabVIEW中自行创建基于状态机的项目;导航至LabVIEW文件菜单>>创建项目>>简单状态机。用户可以通过修改该模板来开始自行创建应用程序。

 

生产者/消费者

生产者/消费者设计模式介绍了如何使用队列在以不同速率运行的多个循环之间共享数据。包含元素入队列函数的循环为“生产者”,包含元素出队列函数的循环为“消费者”。使用队列可确保在循环以不同速率运行时不会丢失数据。 

值得注意的是生产者/消费者设计模式更具理论性。实际上,用户很少会在实际代码中看到基本的生产者/消费者模式。相反,用户更有可能看到队列消息处理器

更多资源

运行以下LabVIEW的随附示例,详细了解如何使用队列在循环间共享数据:

  • <LabVIEW 20xx>\examples\Synchronization\Queue\Queue Overflow and Underflow.vi

 

队列消息处理器

队列消息处理器(QMH)是生产者/消费者设计模式的一种实现,其中包括用于生成用户界面和编程事件的事件结构。  事件处理循环(EHL)包含的事件结构可以为消息处理循环(MHL)将消息排入队列(生成,而MHL可以将消息从队列中取出(消耗)。 MHL还可以根据需要自行生成消息。  在这种情况下,“消息”是包含字符串(驱动MHL中的条件结构)和变体的簇,变体可以包含任何类型的特定于消息的数据。  在QMH中,MHL也可以通过用户事件与EHL通信。  

更多资源

浏览以下LabVIEW的随附项目,详细了解QMH:

  • <LabVIEW 20xx>\examples\Design Patterns\Queued Message Handler\Queued Message Handler Fundamentals.lvproj

使用队列消息处理器模板,用户可以在LabVIEW中自行创建基于QMH的项目;导航至LabVIEW文件菜单>>创建项目…>>队列消息处理器

架构

要确保大型LabVIEW应用具有可扩展性和可维护性,必须具有出色的架构

设想一个用于测试设备的理论性LabVIEW应用。该应用会提供用于配置应用、连接设备、进行测量、显示数据、记录数据、处理错误条件以及可能实现更多功能的代码。

如果该应用程序的全部上述功能均位于同一个LabVIEW程序框图中,则无法单独开发、测试和调试该应用的功能。 例如,如果记录代码过程中出现问题,则无法在不运行整个应用程序的情况下仅调试记录功能。此外,更改记录代码可能会无意中影响应用程序的其他一些部分,因为它们都位于同一个VI中。

上述每个函数都更适合采用异步进程,其中每个模块化函数均可以独立开发、测试和调试。进程之间也需要建立稳健的通信机制。

实现LabVIEW代码以促进这种模块化异步设计的结构化方法则称为架构。一些LabVIEW团队开发了自己的架构。这项任务并非易事,因为在开发成功实现异步LabVIEW应用所需的代码基础结构和消息传递时,存在许多考虑要素、易错点和注意事项。此外,实施一个强大的框架需要大量的模板代码,这就需要在框架内有足够的工具来自动化执行重复性任务(有助于开发人员在尝试手动编写框架级代码时避免错误)。

值得庆幸的是,在多个实体(NI内外部)的通力合作下,已经攻克了这项艰巨的工作,并在LabVIEW社区版添加了消费者级架构。目前最热门的两种LabVIEW架构是操作者框架DQMH

 

操作框架

操作者框架(AF)受NI支持,且随附于LabVIEW。同时也是队列消息处理器(QMH)面向对象的实现。消息类提供“Do”方法VI以执行操作者核心VI中的特定代码,而不是条件结构和元素入队列函数中的消息处理循环帧。

AF基于类的设计提供了一个可扩展的框架,用于实现继承父操作者行为的子操作者,而这在基于标准条件结构的QMH方法中无法实现。此外,借助框架的面向对象设计,可以在给定的操作者中增强或覆盖所有核心框架功能(初始化、消息传递、错误响应等)。

更多资源

浏览以下LabVIEW的随附项目,详细了解操作者框架:

  • <LabVIEW 20xx>\examples\Design Patterns\Actor Framework\Actor Framework Fundamentals.lvproj

使用操作者框架模板,用户可以在LabVIEW中自行创建基于AF的项目;导航至LabVIEW文件菜单>>创建项目…>>操作者框架

请注意,如需成功使用操作者框架,必须具备扎实的面向对象编程的基础知识,并经过充分的指导以及对框架本身的理解。大量AF培训资源供您选择。最热门的资源包括:

当用户开始在自己的应用中使用AF架构时,可以在操作者框架-NI社区用户组中与其他用户互动,向其他编程人员提问并共同探讨最佳实践。

 

DQMH

Delacor Queued Message Handler(DQMH®)使用与标准QMH类似的机制在给定进程(或“模块”)内进行通信,但在异步模块之间通过用户事件进行通信。DQMH并非面向对象的架构,而是使用LabVIEW类作为框架的一些次要组件。

DQMH是由DQMH Consortium开发和维护的三方架构。原始DQMH设计团队的主要目标是为LabVIEW社区版提供一个免费框架,供CLAD/CLD级开发人员使用。

用户可以使用VI Package Manger安装DQMH

更多资源:

安装DQMH软件包后,用户可以浏览以下项目以了解更多信息:

  • <LabVIEW 20xx>\examples\DQMH Consortium\DQMH Fundamentals - Thermal Chamber\DQMH Fundamentals – Thermal Chamber.lvproj

DQMH有海量培训资源可供使用。 当用户开始在自己的应用中使用DQMH架构时,可以在DQMH Consortium工具包-NI社区用户组中与其他用户互动,向其他编程人员提问并共同探讨最佳实践。

DQMH®是DQMH Consortium, LLC.的注册商标。

 

其他LabVIEW架构

AF和DQMH是世界上最流行的LabVIEW架构,但绝不是唯一。LabVIEW社区版还提供其他架构:

Was this information helpful?

Yes

No