文章目录
前言
如果你是LabVIEW的零基础使用者,或者仅仅对这个工具产生了浓厚的兴趣,那么你来对地方了。作为一位拥有数十年LabVIEW相关行业工作经验的老鸟,我深知LabVIEW的无限潜力,以及它在工程和科学领域的巨大影响。本博客的目的是帮助你快速入门LabVIEW,不需要任何编程背景或先验知识。我们将从LabVIEW下载和安装开始,逐步引导你探索LabVIEW的世界,并通过实际的练习操作来巩固学习。无需担心复杂的代码编写,LabVIEW的图形化界面将让你轻松理解和构建你的应用程序。
一、走进LabVIEW的世界
1.1 什么是LabVIEW?
LabVIEW,全称LabVIEW(Laboratory Virtual Instrument Engineering Workbench),是一款使用G编程语言的图形化编程环境,广泛用于控制系统、数据采集、信号处理、仪器模拟等领域。无论你是工程师、科学家还是学生,LabVIEW都为你提供了一个直观且功能强大的工具,用于快速开发各种应用程序。
1.2 LabVIEW应用领域
应用领域 | 概述 |
---|---|
自动化和控制系统 | LabVIEW可用于设计、开发和控制各种自动化系统,包括制造、工业控制、机器人、测试和测量系统。它能够与各种硬件设备(传感器、执行器、PLC等)集成,实现高效的自动化控制。 |
测试和测量 | LabVIEW广泛用于各种测试和测量应用,包括电子测试、仪器控制、数据采集和分析。它为工程师和科学家提供了灵活的工具,用于采集和分析实验数据。 |
信号处理和通信 | LabVIEW支持信号处理算法和通信协议,可用于无线通信、音频处理、图像处理和数字信号处理应用。它是设计和模拟数字信号处理系统的有力工具。 |
机器视觉 | LabVIEW提供了丰富的机器视觉工具和库,用于图像处理、对象识别、检测和跟踪、工业自动化和质量控制。它被用于生产线上的视觉检测、医疗成像、安全监控和自动驾驶等领域。 |
半导体行业 | LabVIEW在半导体制造和测试中扮演着重要的角色,支持半导体设备的控制和监测、生产线上的自动化、晶圆制造和测试、IC设计验证等应用。它帮助半导体行业提高生产效率和产品质量。 |
汽车电子 | LabVIEW用于汽车测试、控制系统、数据采集、模拟仿真和故障诊断等应用。 |
教育和研究 | LabVIEW在教育领域得到广泛应用,用于教授工程原理和概念。同时,它也在研究领域用于开展各种实验和数据分析。 |
医疗设备和生命科学 | LabVIEW可用于设计和控制医疗设备、医学成像系统、生命科学研究和实验室设备。它在生物医学工程和生物医学研究中有广泛应用。 |
航空航天和国防 | LabVIEW用于模拟、控制和测试航空航天系统、雷达、导弹、通信设备和导航系统。它支持复杂的系统集成和测试任务。 |
能源管理 | LabVIEW用于监测和控制能源系统,包括电力系统、太阳能和风能系统、能源分布和管理。 |
环境监测和控制 | LabVIEW可用于监测环境因素,如气象、水质、大气污染等,以及实施相应的控制措施。 |
嵌入式系统 | LabVIEW支持嵌入式系统开发,可用于嵌入式控制、数据采集、嵌入式图像处理等领域。 |
二、LabVIEW环境
2.1 下载、安装及激活
首先,您需要访问National Instruments(NI)官方网站(下载LabVIEW)。在网站上,您可以找到关于LabVIEW的下载和安装信息,根据电脑系统是32位还是64位选择对应的应用程序位数;通常,最新版本的LabVIEW会提供更多的功能和更好的性能;下载前需要注册账户,按要求注册即可。下图红框部分分别是在线安装和离线安装,在线安装文件比较小,在安装过程中需联网边下载所需模块边安装。

这里演示在线安装步骤;下载在线安装包,如下图所示,双击在线安装包,按下列图所示点击下一步顺序执行即可


如果只是基础使用,可先按下图勾选安装的模块,若是机器视觉行业以及图像处理相关的,需要将红框内三个勾选上;另外最后一个JKI VI Package Manager一定要勾选上,后续一些工具包通过JKI VI Package Manager可较为方便的一键下载及安装,安装完成后桌面会显示VI Package Manager图标,后续篇章会深度讲解如何使用VI Package Manager。

下图选择项按默认选择即可,继续下一步进行安装。

安装过程中可能会弹出NI更新服务窗口,建议选择否。

安装最后阶段弹出激活窗口,点击取消,然后重启电脑。

激活方法请自行搜索,比较简单。
上述步骤完成后,可在点击电脑左下角开始按钮,最近添加里可找到NI LabVIEW,鼠标选中后拖动到桌面即可,方便随时打开。

激活完成后,打开NI LabVIEW后,显示如下图所示,表示你已成功安装LabVIEW了,接下来就可以尽情探索LabVIEW世界啦。

2.2 程序VI
LabVIEW中的Virtual Instrument(VI)是程序的基本单元,可将其理解为文本语言的函数,它包括前面板和后面板两个部分,分别用于用户界面交互和程序逻辑的搭建。在这一部分,我们将深入了解前面板、后面板、如何创建、加载、保存VI,以及进行VI的调试;VI可通过如下方式创建,创建后出现两部分,分别是前面板和后面板。


2.2.1 前面板
LabVIEW的前面板是用户与程序交互的界面,也是程序的可视化展示区。通过前面板,用户可以输入参数、观察数据、控制程序运行;前面板组成主要是一些控件元素,其中包括布尔按钮、数值框、文本框、图表等等,通过拖拽控件元素至前面板,调整大小并设置属性,即可构建直观友好的用户界面UI。下图展示为前面板控件面板组成,可在前面板鼠标点击右键弹出,红框1可将该控件面板保持固定在前面板之上,红框2,3,4,5,6分别表示不同样式风格的控件,可根据界面设计需要选择不同风格。下方给出程序范例搭建的双罐系统UI界面以供参考。


2.2.2 后面板
LabVIEW的后面板是LabVIEW程序的逻辑部分,用于实现程序的功能和算法。在后面板中,用户可以使用图标/连接器、常量、函数等元素来创建程序的逻辑和控制结构。通过拖拽和连接这些元素,用户可以构建程序的控制流程和数据处理流程。后面板有函数面板,同样在后面板鼠标右键可弹出函数面板并固定至后面板之上。同样给出范例双罐系统后面板代码,先有个直观概念。


2.2.3 VI的保存及调用
用户可以通过选择“File”菜单下的“New VI”选项来创建一个新的VI。创建完成后,用户需要为VI指定一个名称并保存到指定的文件夹中。VI的保存可以通过选择“File”菜单下的“Save”选项来完成。下图给出一个两数相加的VI保存名称为Untitled 5及调用过程,拖入调用VI后,只需传入两个相加的数,运行后即可输出结果,VI的调用可理解为文本语言的函数的调用,VI方便用户实现程序的模块化和重用性。


2.2.4 VI调试
在开发过程中,用户需要对VI进行调试以确保其功能和性能符合要求。LabVIEW提供了多种调试工具和功能,包括断点、单步执行、探针等。下图框出主要调试功能部分。

调试功能包含以下部分,各部分具体含义对应如下:
调试工具 | 解释 |
---|---|
![]() | 运行 运行VI。如有需要,LabVIEW对VI进行编译。工具栏上的运行按钮为白色实心箭头时表示VI可以运行,如左图所示。白色实心箭头还表明,如果你 ,为该VI创建一个连接器窗格 ,你可以将该VI作为一个子VI。 |
![]() | VI运行时,如果是顶层VI,运行按钮将如左图所示,表示不是子VI,没有调用方。 |
![]() | 如运行的是子VI,运行按钮将如左图所示。 |
![]() | 如VI保留为作为子VI调用,运行按钮将如左图所示。如果该VI是一个已经在运行的VI的子VI,或者该VI有一个 严格类型的VI引用 开放给它,就会出现这种情况。如VI已保留,则无法直接运行。 |
![]() | 创建或编辑VI时,如VI存在错误,运行按钮将显示为断开,如左图所示。单击断开的运行按钮,打开错误列表窗口,该窗口列出了所有错误。如果在你完成方框图的布线后, 运行 按钮仍然出现断裂,则说明 VI已经断裂,不能运行。 |
![]() | 连续运行 连续运行VI直至中止或暂停操作。 |
![]() | 中止执行 中止顶层VI的操作。多个运行中的顶层VI使用当前VI时,按钮显示为灰色。也可使用中止VI方法通过编程中止VI运行。**注意:**在VI完成当前迭代之前," 中止执行 "按钮会立即停止VI。中止使用外部资源(例如,外部硬件)的VI可能导致外部资源无法恰当复位或释放并停留在未知状态。因此,应当为VI设计一个停止按钮以防这类问题的发生 |
![]() | 暂停 暂停或恢复执行。单击暂停按钮,程序框图中暂停执行的位置将高亮显示。再按一次可继续运行VI。运行暂停时,暂停按钮为红色。 |
![]() | 当你点击 "运行 "按钮时,"高亮执行 "会显示一个框图执行的动画。如果 "突出显示执行 "按钮显示为黄色, 执行突出显示被启用。 |
![]() | 保存连线值 保存数据值。当你点击Retain Wire Values按钮时,LabVIEW会保存执行流程中每个点的数值,这样当你把探针放在电线上时,你可以立即获得通过电线的数据的最新数值。调试工具会影响VI的性能。 |
![]() | 单步步入 打开节点然后暂停。再次单击单步步入按钮时,将执行第一个操作,然后在子VI或结构的下一个操作前暂停。 |
![]() | 单步步过 执行节点并在下一个节点前暂停。 |
![]() | 单步步出 结束当前节点的操作并暂停。VI结束操作时,单步步出按钮将变为灰色。 |
2.3 LabVIEW项目
LabVIEW项目用于组合LabVIEW文件和非LabVIEW特有的文件,创建程序生成规范以及部署或下载文件至终端。应用程序必须通过项目才可创建。
2.3.1 创建项目
通过File»New,可打开创建项目对话框。对话框包含一组模板和范例,旨在帮助用户遵循可靠的设计模式和编程规范;对于初学者,打开范例学习是个不错的选择。下列图片展示创建项目对话框和建立完成的空项目。


2.3.2 添加文件夹至项目
基于上述项目浏览器窗口添加文件夹,为LabVIEW项目中的各项创建一个有组织的结构层次。添加文件夹类型可分为两种,一种是自动更新的文件夹(Auto-populating),即将磁盘上的目录添加至项目。LabVIEW将根据对项目和磁盘进行的改动,持续监控和更新文件夹。带黄色圆柱标志的蓝色的文件夹图标表明了该文件夹类型。添加自动更新的文件夹步骤如下:
- 在Items选项卡上,右键单击一个终端,或终端下的一个文件夹,从快捷菜单中选择Add»Folder (Auto-populating),打开文件对话框。也可选择一个终端,然后选择Add»Folder (Auto-populating)。
- 在磁盘上找到并选择添加至项目的目录。
- 单击选择文件夹按钮,将当前文件夹添加至项目。项目中将出现一个自动更新的文件夹。LabVIEW自动将文件夹中的所有内容添加至项目。如文件夹中的项已在项目中存在,这些项将移至自动更新的文件夹内。
- 在Files选项卡上,可移动、重命名、重新组织或移除自动更新的文件夹内的文件。Files选项卡上的项目操作将同时更新和反映磁盘上的内容。同样,如对磁盘上的目录有任何更改,LabVIEW也会更新项目中的文件夹。在项目中修改文件,而不是在磁盘上修改文件。这种做法的好处在于LabVIEW能检测出文件名的改动,并自动更新调用方VI。
下图展示一个范例项目添加的自动更新文件夹,后续章节EXE生成和Installer生成基于该项目介绍。

可添加的第二种文件夹类型是虚拟文件夹(Snapshot),虚拟文件夹是项目中用于组织项目项的文件夹,并不在磁盘上实际存在。该类文件夹用银色的文件夹图标表示。添加虚拟文件夹至项目步骤如下:
- 在Items选项卡上,右键单击一个终端,或终端下的一个文件夹,从快捷菜单中选择Add»Folder (Snapshot),打开文件对话框。也可选择一个终端,然后选择Add»Folder (Snapshot)。
- 在磁盘上找到并双击添加至项目的目录。
- LabVIEW将在项目中创建一个虚拟文件夹,名称与磁盘上的目录相同。LabVIEW还将创建代表目录下全部内容的项目项(包括子目录的文件和内容)。
注意:对磁盘上的目录进行任何改动不会更新虚拟文件夹。
2.3.3 保存项目
通过以下途径可保存LabVIEW项目:
- 选择File»Save。
- 选择Project»Save Project。
- 右键单击项目根目录,从快捷菜单选择Save。
- 单击项目工具栏中的Save All (this Project) 按钮。也可选择File»Save All (this Project),或右键单击项目根目录,从快捷菜单中选择File»Save All (this Project)。
2.3.4 exe生成
基于2.3.2所展示项目结构,来介绍exe生成,exe生成的前提是项目中调用VI无报错;生成步骤如下列图片所示:

弹出如下所示界面,点击Information,可根据需要更改生成exe的名称和位置。

点击Source Files,将启动vi添加至Startup VIs。这里提前说一个概念,动态调用VI,如果所依赖的有动态调用的VI以及本地的配置文件,都需要添加至Always Included栏中,对于静态调用的VI一般情况下无需添加至Always Included栏,下图仅作演示如何添加。

针对未做介绍的项,保留默认即可,点击Icon,这里可更改生成exe之后,打开界面的左上角显示图标,注意图标文件格式是.ico,浏览器搜索png转ico可方便生成所需ico文件,大小一般按下图显示即可。

点击Version Information,这里可定义生成exe的版本号及描述信息,方便版本管理。至此基础配置完成,可满足绝大多数项目需求,点击下方Build即可生成版本。

生成过程界面如下图所示,生成所需时间跟项目大小有关。完成后点击Explore可快速定位到生成位置,正常情况下在本机双击exe即可打开可执行程序。同时项目浏览器末尾Build Specification下会多出一项,双击可再次弹出生成exe的配置界面。

最终生成的exe目录结构如下,双击应用程序exe即可打开软件。

2.3.5 Installer生成
Installer安装文件生成的前提是已经生成exe,生成步骤如下列图片所示:

点击后弹出如下界面,点击Product Information,可根据需要更改生成Installer的名称和位置。

和生成exe类似,针对未做介绍的项,保留默认即可,点击Source Files,选中生成的exe,然后点击向右箭头。

点击Shortcuts,此页面可配置安装完成Installer后,所生成的exe的快捷方式位置,可根据需要更改Directory和Subdirectory,也可保持默认。

点击Additional Installers,此页面可将依赖的安装包一起打包进Installer,这样在新电脑安装Installer后即可自动安装所需依赖安装包,无需额外安装。该示例项目所依赖较少,仅供参考。

点击Advanced,System Requirements下拉可根据需要选择生成Installer支持的电脑系统版本。上述所有配置完成后,点击Build即可生成Installer,生成Installer过程和生成exe过程类似,同样完成后,项目浏览器末尾Build Specification下会再多出一项,双击可再次弹出生成Installer的配置界面。

生成的Installer目录结构如下,将Volume整体拷贝到其它电脑,双击Install按照步骤要求即可在其它电脑上安装可执行文件。

三、数据类型
在LabVIEW中,了解不同的数据类型是使用该工具的基础。本章将深入介绍LabVIEW中常见的数据类型,包括整型、浮点数、布尔值、字符串、数组、簇以及变体。
3.1 数值类型
LabVIEW以浮点数、定点数、整型数、无符号整型数以及复数表示数值数据类型。不同数值数据类型的差别在于存储数据使用的位数和表示的值的范围。(Windows) LabVIEW只能处理介于数值数据类型表范围内的数据,但可以文本格式显示±9.9999999999999999E999范围内的数据。对于数值控件和数值变量,其数据类型更改方式如下:

下表列出了LabVIEW可用的数值数据类型。LabVIEW以不同的方式存储每种数据类型,数据类型加粗部分表示编程常用的数据类型。
接线端 | 数值数据类型 | 位数 | 近似范围 |
---|---|---|---|
![]() | 单精度浮点型 | 32 | 最小正数:1.40e–45 最大正数:3.40e+38 最小负数:–1.40e–45 最大负数: –3.40e+38 |
![]() | 双精度浮点型 | 64 | 最小正数:4.94e–324 最大正数:1.79e+308 最小负数:–4.94e–324 最大负数:–1.79e+308 |
![]() | 扩展精度浮点型 | 128 | 最小正数:6.48e–4966 最大正数:1.19e+4932 最小负数:–4.94e-4966 最大负数:–1.19e+4932 |
![]() | 单精度浮点复数 | 64 | 与单精度浮点数相同,实部虚部均为浮点 |
![]() | 双精度浮点复数 | 128 | 与双精度浮点数相同,实部虚部均为浮点 |
![]() | 扩展精度浮点复数 | 256 | 与扩展精度浮点数相同,实部虚部均为浮点 |
![]() | 定点 | 64或72(如包括上溢状态) | 因用户配置而异 |
![]() | 单字节整型 | 8 | -128 ~ 127 |
![]() | 双字节整型 | 16 | -32,768 ~ 32,767 |
![]() | 有符号长整型 | 32 | -2,147,483,648 ~ 2,147,483,647 |
![]() | 64位整型 | 64 | -1e19 ~ 1e19 |
![]() | 无符号单字节整型 | 8 | 0 ~ 255 |
![]() | 无符号双字节整型 | 16 | 0 ~ 65,535 |
![]() | 无符号长整型 | 32 | 0 ~ 4,294,967,295 |
![]() | 无符号64位整型 | 64 | 0 ~ 2e19 |
3.2 布尔
布尔是LabVIEW中的基本逻辑数据类型,用于表示真(True)或假(False)。布尔在LabVIEW中广泛应用于条件判断、循环控制等控制结构中。下图分别是前面板和后面板布尔控件和布尔变量所在位置。

在程序框图中,布尔数据常用于条件判断和逻辑运算。例如,使用“与”、“或”、“非”等逻辑运算符来构建复杂的逻辑条件。
针对前面板布尔控件,具有机械动作;布尔控件的机械动作用于创建与真实仪器(如示波器和万用表等)类似的前面板行为。切换和触发动作的相同之处在于它们都改变布尔控件的值,不同之处在于它们如何恢复控件原值。下图框住部分从左到右,从上到下分别是单击时转换、释放是转换、保持转换直到释放、单击时触发、释放时触发、保持触发直到释放;下表列出适用场景及范例。
-
切换动作 - 如希望只能由用户将控件值恢复到前一个值时,使用该动作。
-
触发动作 - 如希望由读取控件的VI将控件值恢复到前一个值时,使用该动作。 此时用户也可将控件值恢复上 前一个值,但必须在VI读取控件之前进行。、
**注:**触发动作与局部变量不能结合使用,且与事件结构结合使用触发动作时, 通常将其接线端置于“值改变”事件结构内。

动作 | 适用场合 | 范例 |
---|---|---|
单击时转换 | 单击时立即改变控件当 前值,且保留新值直至 下一次单击控件。 | 照明灯开关 按下开关后灯立即点亮,并一直 保持点亮到再次按下开关为止。 |
释放时转换 | 释放鼠标按钮时改变控 件当前值,且保留新值 直至下一次单击控件。 | 复选框 只在释放鼠标按钮后才改变复选 框的值,单击后如将光标移至复 选框外再释放则复选框值不改变 ,因而有更多考虑空间。 |
保持转换直到释放 | 只在单击鼠标并保持鼠 标按钮按下期间改变当 前值并保持新值,释放 鼠标后将恢复原值。 | 门铃 按下按钮后门铃立即响起并保持 响声直至释放按钮。 |
单击时触发 | 单击时立即改变控件当 前值,且在VI读取该控 件新值后恢复原值。 | 紧急停止按钮 按下按钮后系统立即停止运行, 且按钮在系统读取值改变后立即 重置,从而允许被再次按下。 |
释放时触发 | 释放鼠标时改变控件当 前值,且在VI读取该控 件新值后恢复原值。 | 关闭按钮 只在释放鼠标按钮且应用程序读 取了值改变后才关闭程序,单击 后如将光标移至按钮外再释放则 不关闭,因而有更多考虑空间。 |
保持触发直到释放 | 只在单击鼠标并保持鼠 标按钮按下期间改变当 前值并保持新值。释放 鼠标按钮且VI读取控件 值后将恢复原值。 | 机器人移动控制器 按下控制器后控制器通知机器人 系统移动机器人。释放控制器按 钮后,机器人系统读取控件值, 机器人恢复不动的状态。 |
3.3 字符串
字符串用于表示文本数据,比如名字、提示信息等,由字符组成。在LabVIEW中广泛应用于文本处理、显示和存储等场景。前面板上,字符串控件是一个文本框,后面板程序框图中,连线是粉红色,下图红框处包含了可对字符串操作的各种函数,如拼接、截取、查找等

注意事项
- 字符串控件和指示器在前面板上可以设置为多行显示,方便显示较长的文本。
- 当从文本读取为字符串时,要注意编码和字符集的问题,确保文本的正确性和一致性。
3.4 数组
数组是一种将多个相同类型的数据元素有序排列的数据结构,比如一组数字、一组字符串等。在LabVIEW中,数组可以是一维的,也可以是多维的。
数组由元素和维度组成。元素是组成数组的数据。维度是数组的长度、高度或深度。数组可以是一维或多维的,在内存允许的情况下每一维度可有多达231– 1 个元素。
下图分别为前面板和后面板对应数组位置;在前面板右键单击,选择“数组、矩阵和簇 > 数组”,拖入一个数据类型(如数值控件)作为数组元素,数组类型即可创建完成,可根据需求调整拖入的数组元素。

上图右侧程序框图中,包含了可以对数组进行各种操作,如获取数组大小、索引元素、排序、查找等。
注意事项
- 数组的索引从0开始,即第一个元素的索引为0。
- 在处理多维数组时,要注意索引的顺序和维度的对应关系。
3.5 簇
簇是一种将多个不同类型的数据组合在一起的数据结构。在LabVIEW中,簇可以包含数值、布尔、字符串、数组等不同类型的数据元素,类似于C语言中的结构体。常见用途用于组织复杂数据,比如一个“学生”簇可能包含姓名(字符串)、年龄(数值)、是否在校(布尔)。
如何前面板上创建一个簇输入控件或簇显示控件,操作是在前面板上添加一个簇外框,再将一个数据对象或元素拖曳到簇外框中,数据对象或元素 可以是数值、布尔、字符串、路径、引用句柄、簇输入控件或簇显示控件,即可完成簇的控件创建。
如需在程序框图中创建一个簇常量,则从函数选板中选择一个簇常量,将该簇外框放置于程序框图上,再将字符串常量、数值常量、布尔常量或簇常量放置到该簇外框中。簇常量用于存储常量数据或同另一个簇进行比较。

“Bundle By Name(捆绑按名称)”和“Unbundle By Name(解捆绑按名称)”函数可以按名字访问簇中的元素。
注意事项
- 在将簇传递给子VI或函数时,要注意元素的类型和顺序是否匹配。
- 簇元素添加 / 删除需更新所有引用。
3.6 变体
变体是一种特殊的数据类型,可以存储LabVIEW 任意类型的数据。它的类型在运行时才确定。将其他数据转换为变体时,变体将存储数据和数据的原始类型,保证日后可将变体数据反向转换。例如,将字符串数据转换为变体,变体将存储字符串的文本,以及说明该数据是从字符串(而不是路径、字节数组或其他LabVIEW数据类型)转换而来的信息。
变体数据类型的另一个优点是可存储数据的属性。属性是定义的数据及变体数据类型所存储的数据的信息。例如,如需知道某个数据的创建时间,可将该数据存储为变体数据并添加一个时间属性来存储时间字符串。属性数据可以是任意数据类型。变体属性可用于通过某一特定属性对数据进行排序、标识生成数据的设备或应用程序,或对数据进行过滤以获取那些有特定属性的变体数据。

注意事项
- 如在变体数据上使用 “变体至平化字符串转换”函数,LabVIEW将平化变体及其 所有内容,包括其属性。但是,如使用“平化至字符串”函数,LabVIEW将只平 化变体,丢弃所有属性。
- 针对大数据存储,可考虑用变体属性方式,可极大提升效率。
- 变体适合动态程序,但会增加调试难度,初学者可先尽量少用。
四、LabVIEW程序基本结构
4.1 for循环
For 循环会按设定的次数重复执行循环内的代码。该代码称为子框图。总数接线端(N) 设置子程序框图重复执行的次数。代码每执行一次就称为循环一次。
在程序面板中,从函数选板Functions----->结构Structures,选择For Loop即可拖出For循环。

要使For循环在某条件发生时停止,可在For循环上添加一个条件接线端。如添加条件接线端,For循环在条件满足时或指定次数执行完毕后停止。添加方式为选中For循环子框图,鼠标右键点击,选择Conditional Terminal,程序框图会出现一个条件接线端,下图所示接线端为True时停止循环。

For循环之间传递数据,默认情况下,For循环不会将上一次循环的数据传递至下一次循环。如要将上一次循环 的数据传递至下一次循环,可在For循环上添加移位寄存器。例如,要在算术运算中 使用上一次循环的结果,可使用移位寄存器传递值。添加方式为鼠标放在子框图左侧或右侧边框上鼠标右键点击,弹出快捷方式选择Add Shift Register,子框图则会出现红框所示的图标,即为寄存器,寄存器为成对出现。接入所需数据即可。

寄存器右侧接线端含有一个向上的箭头,用于存储每次循环结束时的数据。LabVIEW将数据从移位寄存器右侧接线端传递到左侧接线端。循环将使用左侧接线端的数据作为下一 此循环的初始值。该过程在所有循环执行完毕后结束。循环执行后,右侧接线端将返回移位寄存器保存的值。 移位寄存器可以传递任何数据类型,并和与其连接的第一个对象的数据类型自动保持 一致。连接到各个移位寄存器接线端的数据必须属于同一种数据类型。如果连接一个错误簇到并行For循环的移位寄存器,移位寄存器将转换为错误寄存器 。 循环中可添加多个移位寄存器。如循环中的多个操作都需使用之上一次循环的值,可以通过多个移位寄存器保存结构中不同操作的数据值。
寄存器使用示例,比如将100次For循环索引相加,下图所示为程序框图。

若想提高For循环的执行速度,比如VI要求较高的执行效率,在运行程序的计算机有多个处理器,在不引起错误或警告的前提下可考虑启用For循环并行执行。启用并行循环时,处理器同步执行For 循环以提高运行速度。添加方式为选中For循环子框图,鼠标右键点击,在弹出快捷菜单上选择Configure Iteration Parallelism…,即可弹出下方左图所示窗口,勾选启用,其他参数保持默认即可,点击确定,For循环总数接线端(N) 下方会出现一个P,即代表该For循环执行时会并行执行。

4.2 While循环
While循环是 重复操作直到某一条件发生停止。常用于需要动态判断是否继续执行的场景,如数据采集的持续监测等。在程序面板中,从函数选板Functions----->结构Structures,选择While Loop即可拖出While循环。下图所示为While循环程序框图,While 循环执行子程序框图直到条件接线端(输入端)接收到某一特定的布尔值。 While 循环的条件接线端与For循环的条件接线端的作用相同。While循环没有固定的循环总数,如结束条件不发生,While循环将无限次执行。计数接线端(下图左下角i)是一个输出接线端,表示已完成的循环次数。While 循环的循环计数始终从零开始。

While循环同样可添加移位寄存器,在循环之间传递值,和For循环类似。
注意事项
- 确保条件设置合理,避免出现死循环(即条件一直为TRUE,循环无法停止)。
- 在循环内部,合理安排数据处理和条件更新的逻辑,确保循环能够正确地执行和终止。
4.3 条件结构
条件结构用于根据不同的条件执行不同的代码块,实现程序的分支逻辑。类似于其他编程语言中的if-else语句,在LabVIEW中条件结构可以处理多种条件分支情况。在程序面板中,从函数选板Functions----->结构Structures,选择Case Structure即可拖出条件结构。下图所示为条件结构程序框图,条件输入端用于接收条件判断的值,可以是布尔值、数值、字符串、枚举值等。根据条件输入的不同值,设置多个分支代码块。每个分支对应一种条件情况,当条件满足时,执行相应的分支代码。

注意事项
- 确保条件输入与分支设置相匹配,避免条件判断错误导致执行错误的分支。
- 合理规划分支代码块,使每个分支都能正确地处理对应的条件情况。
4.4 事件结构
事件结构用于响应用户交互或系统事件,实现程序的动态响应和交互控制。在LabVIEW中,事件结构可以捕获各种事件,如鼠标点击、键盘输入、定时器事件等,并根据事件类型执行相应的处理代码。在程序面板中,从函数选板Functions----->结构Structures,选择Event Structure即可拖出事件结构。
对于LabVIEW初学者,可先尽可能使用自带的事件结构,不用考虑自定义事件。添加事件结构操作如下,选中事件结构鼠标右键弹出快捷方式,点击Add Event Case…弹出右图所示界面,会列出前面板所有控件和系统的事件,按需选择对应事件即可。

事件结构一般配合While循环使用,组成事件循环框架,可灵活适应不同项目需求。
注意事项
- 事件分支内避免耗时操作,否则可能出现事件处理过长导致界面响应迟缓。
4.5 顺序结构
顺序结构保证按顺序执行代码,顺序结构包含一个或多个按顺序执行的子程序框图或帧。跟程序框图其他部分一样, 在顺序结构的每一帧中,数据依赖性决定了节点的执行顺序。顺序结构有两种类型:平铺式顺序结构和层叠式顺序结构。使用顺序结构应谨慎,因为部分代码会隐藏在结构中。故应以数据流而不是顺序结构为控制执行顺序的前提。 使用顺序结构时,任何一个顺序局部变量都将打破从左到右的数据流规范。
在程序面板中,从函数选板Functions----->结构Structures,选择Flat Sequence即可拖出顺序结构。默认是平铺式顺序结构,选中程序框图鼠标右键点击快捷方式Add Frame After,如左图所示。选中添加好的程序框图鼠标右键点击快捷方式Replace with Stacked Sequence,即变成右图所示的层叠式顺序结构。

当平铺式顺序结构的帧都连接了可用的数据时,结构的帧按照从左至右的顺序执行。 每帧执行完毕后会将数据至传递至下一帧。这意味着某个帧的输入可能取决于另一个帧的输出。在平铺式顺序结构中添加或删除帧时,结构会自动调整尺寸大小。
如果将平铺式顺序结构转变为层叠式顺序结构,然后再转变回平铺式顺序结构, LabVIEW 会将所有输入接线端移到顺序结构的第一帧中。最终得到的平铺式顺序结构 所进行的操作与层叠式顺序结构相同。将层叠式顺序转变为平铺式顺序,并将所有输入接线端放在第一帧中,则可以将连线移至与最初平铺式顺序相同的位置。
层叠式顺序结构将所有的帧依次层叠,因此每次只能看到其中的一帧, 并且按照第0帧、第1帧、直至最后一帧的顺序执行。层叠式顺序结构仅在最后一帧执行结束后返回数据。如需节省程序框图空间,可使用层叠式顺序结构。
注意事项
- 合理划分顺序结构中的帧,使每个帧的代码功能清晰、独立。
- 确保数据在帧之间的传递正确无误,避免数据丢失或格式不匹配的问题。
4.6 程序禁用结构
程序禁用结构是为了阻止代码执行,禁用结构含有多个子程序框图,每次只编译和执行一个子程序框图。要执行的子程序 框图在编译时决定。非活动子程序框图中的代码在运行时不执行也不编译。禁用结构可以用来禁用部分程序框图上的代码。常用于调试或功能模块隔离。
在程序面板中,从函数选板Functions----->结构Structures,选择Diagram Disable Structure即可拖出程序禁用结构。Disabled禁用区域代码显示为灰色半透明

五、LabVIEW高级功能进阶
5.1 局部变量
LabVIEW 使用程序框图接线端对前面板对象进行数据读写。每个前面板对象只有一个对应的程序框图接线端,但有时应用程序可能需要从多个不同位置访问该接线端中的 数据。局部变量和全局变量用于应用程序中无法连线的位置间的信息传递。通过局部变量访问位于单个VI中不同位置的前面板对象。全局变量可在多个VI之间访问和传递数据。
局部变量可对前面板上的输入控件或显示件进行数据读写。写入局部变量相当于传递 数据至其他接线端。但是,局部变量还可向输入控件写入数据和从显示控件读取数 据。实际上,使用局部变量可将前面板对象同时用作输入和输出。
下图为两种不同创建局部变量方式,创建方式如下:
- 前面板选中控件,鼠标右键点击,选择Create---->Local Variable;
- 从函数选板Functions----->结构Structures,选择Local Variable即可拖出未绑定控件的局部变量,防止程序面板后,点击该局部变量选择控件绑定。

局部变量特点:
- 支持读写操作(右键选择 “转换为读取” 或 “写入”)。
- 打破数据流顺序(可在任意位置访问控件值)。
- 一个控件可创建多个局部变量。
- 写入操作立即更新控件值(可能引发竞态条件)。
注意事项
- 避免循环内高频读写(易导致数据竞争)。
- 允许的情况下,优先使用数据流连线替代局部变量。
- 一个控件可以创建多个局部变量,但每个局部变量都会复制对应控件中的数据,因此对于大的数组等数据类型,使用局部变量可能会消耗较多内存。
5.2 全局变量
全局变量可以在多个VI之间进行数据共享和传递。它是一个只有前面板而没有程序框图的独立VI,也被称为容器。本质是隐藏式VI。
全局变量创建方式可通过LabVIEW的"File"菜单中选择“New”来创建全局变量,也可从函数选板Functions----->结构Structures,选择Global Variable即可拖出局部变量。如下图所示。

双击打开全局变量,只有一个前面板,向该面板拖入控件并保存全局变量为一个VI文件,在程序框图中拖入该文件即可使用全局变量。
全局变量一般应用在不同的VI程序之间共享数据。例如,在一个系统中,多个子VI需要访问同一个数据源,此时就可以使用全局变量实现数据的共享。
全局变量特点:
- 单个全局变量VI可拖入包含多个数据项。
- 可存储LabVIEW任意类型数据
注意事项
- 全局变量可以被多个VI同时访问和修改,所以在使用时需要注意数据的一致性和同步问题,避免出现数据竞争等现象。
- 建议程序启动前初始化全局变量,避免使用未初始化的全局变量引发未知问题。
- 过度使用全局变量,会使程序耦合度升高,不易维护。
5.3 属性节点
属性节点可用于获取和设置某一应用程序或VI的各种属性。这些属性包括控件的值、标签、大小、字体颜色等与控件自身相关的特性。
可使用一个节点读取或写入多个属性。但是,有的属性只能读不能写,有的属性只能写不能读。属性节点右边的小方向箭头表明当前读取的属性。属性节点左边的小方向箭头表明当前可写的属性。右键单击属性,在快捷菜单中选择转换为读取或转换为写入,可进行改变属性的操作。节点是按从上到下的顺序执行的。如属性节点执行前有错误发生,则属性节点将不执行,因此有必要经常检查错误发生的可能性。如果一个属性发生错误,LabVIEW会忽略其他属性,出现错误提示。右键单击属性节点,选择忽略节点内部错误,LabVIEW将执行节点内的其他属性。属性节点只返回第一个错误。错误输出簇包含引起错误的 属性信息。
属性节点常用创建方式如下,选中前面板或后面板控件,鼠标右键快捷方式选择Create—>Property Node,就会列出该控件所有属性,根据需要选择合适属性。

属性节点使用场景举例,比如当需要动态的修改控件的外观颜色、大小、可见性等属性时,可以使用属性节点。
注意事项
- 属性节点与全局变量相比,执行效率较低,因为它占用更多的CPU资源。
- 属性节点的使用可能会收到UI线程限制。
5.4 调用节点
调用节点用于执行控件或VI的方法。它也被称为方法节点,通过调用节点可以触发控件的某些操作或获取控件的某些信息。跟属性节点不同,单个调用节点只能执行单个应用程序或VI。
与属性节点类似,常用调用节点的创建方式需要选中控件,然后鼠标右键快捷方式选择Create—>Invoke Node,就会列出该控件所有方法,根据需要选择合适方法。

调用节点一般应用于执行控件的特定操作,比如初始化控件默认值,获取控件的某些状态信息等。
5.5 队列
队列是一种先进先出的数据结构,常用来缓存和传递数据。队列示意图如下所示:

LabVIEW中提供的队列函数如下图所示

这9种列操作函数功能如下表,用于创建在同一程序框图的不同部分间或不同VI间进行数据通信的队列。
Name | 名称 | 功能 |
---|---|---|
Obtain Queue | 获取队列引用 | 返回队列的引用 |
Enqueue Element | 元素入队列函数 | 在队列后端添加元素 |
Preview Queue | 预览队列元素函数 | 返回队列前端的元素且不删除该元素 |
Get Queue Status | 获取队列状态 | 返回队列的当前状态信息(例如,当前队列中的元素个数) |
Release Queue | 释放队列引用 | 释放队列引用 |
Lossy Enqueue Element | 有损耗元素入队列 | 在队列中添加元素。如队列已满,函数可通过删除队列前端的元素使新元素入队 |
Enqueue Element At Opposite End | 队列最前端插入元素 | 在队列前端添加元素 |
Dequeue Element | 元素出队列 | 删除队列前端的一个元素并返回该元素 |
Flush Queue | 清空队列 | 删除队列中的所有元素并通过数组返回元素 |
LabVIEW中队列使用是按顺序使用的,首先要使用获取队列引用,然后是元素的入队列、出队列等操作、最后是释放队列;以自带范例为例,下图表明队列的简单使用。

5.6 状态机
状态机是LabVIEW开发人员经常用来快速构建应用程序的基本架构之一。状态机架构可用于实现复杂的决策算法,决策算法可由状态图或流程图表示。可以使用固有的LabVIEW函数来实现状态机。该架构不需要其他工具包或模块。
什么是状态机
状态机是一种编程架构,支持根据以前的状态或用户输入的值动态流向状态。
此架构适用于符合以下所有情况的应用程序:
- 状态
- 决策逻辑,用于确定何时转移至特定的状态
状态可定义为在完成整体编程任务过程中的编程状态,比如,初始化、等待、运行计算、检查状态等。
逻辑语句有助于确定何时转移至新状态以及转移至何种状态。事件可用于触发从一种状态到另一种状态的转移,可以是编程事件,也可以是用户定义的事件,如按下按钮。
状态机中的每个状态都有独特的作用,也可调用其他状态。状态通信受某些条件或序列影响。要将状态程序框图转换为LabVIEW编程架构,您需要以下基础结构:
- While循环 — 不断执行各种状态
- 条件结构 — 每个条件都包含要针对每个状态执行的代码
- 移位寄存器 — 包含状态转换信息
- 转移代码 — 确定序列中的下一个状态

为何使用状态机
状态机适用于存在不同状态的应用程序。每个状态都可能触发另一个状态或多个状态,也可能结束流程。状态机按照用户的输入或状态内计算来确定下一个状态。许多应用程序需要一个“初始化”状态,后跟默认状态。默认状态可执行多种不同的操作。执行的操作取决于上一个状态及当前的输入和状态。“关闭”状态可以用于执行清理操作。
除了具有实现决策制定算法的强大能力之外,状态机还以功能的形式体现了应用程序规划。随着应用程序越来越复杂,对完善设计的需求也在增加。状态程序框图和流程图对设计有所助益,有时甚至是必不可少的。状态机不仅在应用规划方面颇有优势,而且也很容易创建。
创建状态机
LabVIEW面板File(文件)---->Create Project(创建项目),弹出界面选择Simple State Machine即可创建要给简易状态机模板项目。保存后打开项目如下图所示。


双击打开Main VI,初始化界面和事件等待界面分别如下所示。红框部分,通过枚举定义五个状态,初始化完成后即跳转至Wait For Event状态。在此可等待用户事件操作,进而进入不同分支做不同处理。图中示例当用户点击界面Do Something按钮后,即跳转至User State1,待执行完User State1业务逻辑后,又跳转至Wait For Event再次等待用户操作。



注意事项
- 同一时间只运行一种状态,由于采用了单个While循环,所有任务按相同速度执行。如需实现按多种速度执行或并行执行的任务,可考虑采用“队列消息处理器”或“操作者框架”模板,上述模板均可在**“创建项目”(Create Project)**对话框中找到,这两种是属于相对高阶的内容,初学者可先理解状态机使用。
- 针对上述简单状态机,“等待事件”(Wait for Event)状态是唯一能识别用户输入的状态。在接收用户输入时,状态机必须处于该状态下。
5.7 文件IO
文件I/O VI和函数用于打开和关闭文件、读写文件、在路径控件中创建指定的目录和文件、获取目录信息、将字符串、数字、数组和簇写入文件。
本选板上的VI和函数可执行常用及其它类型的I/O操作。使用此类VI和函数可读写各种数据类型的数据,如文本文件的字符或行、电子表格文本文件的数值,或二进制文件数据。
文件I/O选板以及高级文件选板上还包括可对各文件I/O操作进行单独控制的函数。此类函数可创建或打开文件,读写文件数据及关闭文件。此类函数也可用于创建目录,移动、复制或删除文件,列出目录内容,改变文件属性以及路径操作等。

5.7.1 文本
文本操作常用有两个函数,分别是写入文本函数(Write text File)和读取文本函数(Read text File),如下图所示。

写入文本函数可将字符串或字符串数组按行写入文件,读取文本函数用于从字节流文件中读取指定数目的字符或行。使用可参考下图所示范例,其中包括直接输入文本路径和引用的方式。


5.7.2 二进制
二进制文件操作常用有两个函数,分别是写入二进制文件函数(Write Binary File)和读取二进制文件函数(Read Binary File),如下图所示。

二进制文件可用来保存数值数据并访问文件中的指定数字,或随机访问文件中的数 字。与人可识别的文本文件不同,二进制文件只能通过机器读取。二进制文件是存储数据最为紧凑和快速的格式。
二进制文件占用较少的磁盘空间,且存储和读取数据时无需在文本表示与数据之间进 行转换,因此二进制文件效率更高。二进制文件可在1字节磁盘空间上表示256个 值。除扩展精度和复数外,二进制文件中含有数据在内存中存储格式的映象。因为二进制文件的存储格式与数据在内存中的格式一致,无需转换,所以读取文件的速度更 快。
二进制文件简单读写范例如下,可参考学习。


5.7.3 电子表格
电子表格文件以表的行列形式组织一维或二维数据。表格的每个单元格都是一维或二维数组的一个元素。电子表格操作常用有两个函数,分别是写入带分隔符电子表格函数(Write Delimited Spreadsheet)和读取带分隔符电子表格函数(Read Delimited Spreadsheet);使字符串、带符号整数或双精度数的二维或一维数组转换为文本字符串,写入字符串至新的字节流文件或添加字符串至现有文件。通过连线数据至二维数据或一维数据输入端可确定要使用的多态实例,也可手动选择实例。
写入带分隔符电子表格函数,使用该VI写入数据时,该VI先打开或创建该文件,并且在完成写操作时,关闭该文件。使用该VI可创建能为多数电子表格应用程序读取的文本文件。对应不同数据类型(DBL、I64、字符串)如下图所示:

读取带分隔符电子表格函数,可选择是否转置数组。VI在从文件中读取数据之前,先打开该文件,并且在完成读取操作后,关闭该文件。使用该VI可读取以文本格式存储的电子表格文件。对应不同数据类型(DBL、I64、字符串)如下图所示:

5.8 波形图和波形图表
波形图(Waveform Graph)和波形图表(Waveform Chart)的区别在于各自不同的数据显示和更新方式。如想显示整组数据并导出图形,宜使用波形图。波形图最适用于连续采集数据的快速过程。如想同步采集并显示数据,宜使用波形图表。波形图表最适用于每秒只绘制少数几个数据点的慢速过程。

5.8.1 波形图
波形图用于显示测量值为均匀采集的一条或多条曲线。波形图仅绘制单值函数,即在y=f(x)中,各点沿x轴均匀分布。例如一个随时间变化的波形。下列图片显示了一个波形图的范例。



波形图可显示包含任意个数据点的曲线。波形图接收多种数据类型,从而最大程度地降低了数据在显示为图形前进行类型转换的工作量。
在波形图中显示单条曲线
波形图接收多种数据类型以显示单条曲线。对于一个数值数组,其中每个数据被视为图形中的点,从x=0开始以1为增量递增x索引。波形图接受包含初始x值、△x及y数据数组的簇。波形图也接收波形数据类型,该类型包含了波形的数据、起始时间和时间间隔(△t)。
波形图还接收动态数据类型,用于Express VI。动态数据类型除包括对应于信号的数据外,还包括信号信息的各种属性,如信号名称、数据采集日期和时间等。属性决定了信号在波形图中的显示方式。当动态数据类型中包含单个数值时,波形图将绘制该数值,同时自动将图例及x标尺的时间标识进行格式化。当动态数据类型包含单个通道时,波形图将绘制整个波形,同时对图例及x标尺的时间标识自动进行格式化。
在波形图中显示多条曲线
波形图接收多种数据类型以显示多条曲线。波形图接收二维数值数组,数组中的一行即一条曲线。波形图将数组中的数据视为图形上的点,从x=0开始以1为增量递增x索引。将一个二维数组数据类型连接到波形图上,右键单击波形图并从快捷菜单中选择转置数组,则数组中的每一列便作为一条曲线显示。多曲线波形图尤其适用于DAQ设备的多通道数据采集。DAQ设备以二维数组的形式返回数据,数组中的一列即代表一路通道的数据。
波形图还接收包含了初始x值、△x和y二维数组的簇。波形图将y数据作为图形上的点,从x初始值开始以△x为增量递增x索引。该数据类型适用于显示以相同速率采样的多个信号。
波形图接收包含簇的曲线数组。每个簇包含一个包含y数据的一维数组。内部数组描述了曲线上的各点,外部数组的每个簇对应一条曲线。以下前面板显示了这样的y簇的数组。

如每条曲线所含的元素个数都不同,应使用曲线数组而不要使用二维数组。例如,从几个通道采集数据且每个通道的采集时间都不同时,应使用曲线数组而不是二维数组,因为二维数组每一行中元素的个数必须相同。簇数组内部数组的元素个数可各不相同。
波形图接收一个簇,簇中有初始值x、△x和簇数组。每个簇包含一个包含y数据的一维数组。捆绑函数可将数组捆绑到簇中,或用创建数组函数将簇嵌入数组。创建簇数组函数可创建一个包含指定输入内容的簇数组。
波形图接收包含了x值、△x值和y数据数组的簇数组。这种数据类型为多曲线波形图所常用,可指定唯一的起始点和每条曲线的x标尺增量。
波形图还接收动态数据类型,用于Express VI。动态数据类型除包括对应于信号的数据外,还包括信号信息的各种属性,如信号名称、数据采集日期和时间等。属性决定了信号在波形图中的显示方式。当动态数据类型包含多个通道时,波形图可显示每个通道的曲线并自动格式化图例以及图形x标尺的时间标识。
5.8.2 波形图表
波形图表是显示一条或多条曲线的特殊数值显示控件,一般用于显示以恒定速率采集到的数据。波形图表会保留来源于此前更新的历史数据,又称缓冲区。右键单击图表,从快捷菜单中选择图表历史长度可配置缓冲区大小。波形图表的默认图表历史长度为1,024个数据点。向图表传送数据的频率决定了图表重绘的频率。下列图片显示了一个波形图表的范例。




在波形图表中显示单条曲线
如一次向图表传递一个或多个数据值,LabVIEW会将这些数据作为图表上的点,从x=0开始以1为增量递增x索引。图表将这些输入作为单条曲线上的新数据。
波形图表接收波形数据类型,该类型包含了波形的数据、起始时间和时间间隔(△t)。创建波形模拟波形函数可在图表的x标尺上划分时间,并自动使用x标尺刻度的正确间隔。在指定了t0和单元素Y数组的波形中,各个数据点均拥有时间标识,因此适用于绘制非均匀采样的数据。
在波形图表中显示多条曲线
如需向波形图表传送多条曲线的数据,可将这些数据捆绑为一个标量数值簇,其中每一个数值代表各条曲线上的单个数据点。
如需在一次更新中向每条曲线传送多个点,可将一个数值簇数组连接到波形图表。每个数值代表各条曲线的单个y值点。
波形数据类型可用于在波形图表中创建多条曲线。“创建波形”函数可在图表的x轴上划分时间,并自动使用x标尺刻度的正确间隔。在指定了t0和单元素Y数组的一维数组波形中,各个数据点均拥有时间标识,因此适用于绘制非均匀采样的数据。
如在运行前无法确定需显示的曲线数量,或希望在单次更新中传递多个数据点用于多条曲线,可将一个二维数值或波形数组连接到图表。默认状态下,波形图表将数组中的每一列作为一条曲线。将二维数组数据类型连接到图表,右键单击该图表,从快捷菜单中选择转置数组可将数组中的每一行作为一条曲线。
波形数据类型
波形数据类型包含波形的数据、起始时间和时间间隔(△t)。可使用“创建波形”函数创建波形。默认状态下,很多用于采集或分析波形的VI和函数都可接收和返回波形数据类型。将波形数据连接到一个波形图或波形图表时,该波形图或波形图表将根据波形的数据、起始时间和△x自动绘制波形。将一个波形数据的数组连接到波形图或波形图表时,该图形或图表会自动绘制所有波形。
六、QMH框架和应用示例
6.1 QMH框架
Queued Message Handler(QMH,队列消息处理器),支持多段代码并行运行并实现相互间的数据传输。每段代码代表一个任务(例如:数据采集、数据记录、用户事件处理),其设计类似于状态机。基于此设计,您可将每个任务划分为多个状态。
QMH模板是生产者/消费者设计模式 (Producer/Consumer design pattern) 的变体,在生产者消费者设计模式中,用户界面(生产者)生成消息,任务模块(消费者)使用它们;但在QMH模板中,从消费者循环也可产生消息。
6.1.1 QMH的应用场景
QMH模板适用于需要多任务并行执行(常以不同速率运行)的应用。例如:某应用需持续采集、记录并显示两种信号:RS-232信号与模拟信号。由于信号速率不同,应用必须包含两个并行循环。每个循环划分为以下状态:
-
初始化数据采集硬件
-
采集数据
-
将采集数据记录至磁盘
-
在波形图表中显示数据
-
将硬件设置为安全状态
-
停止数据采集并关闭硬件
该应用要求用户界面保持响应(即:即使应用正在执行其他命令,用户仍可点击按钮)。因此需要第三个并行循环持续监控前面板事件,包括以下命令:
- 启动RS-232采集
- 停止RS-232采集
- 启用RS-232记录
- 禁用RS-232记录
- 启动模拟数据采集
- 停止模拟数据采集
- 启用模拟数据记录
- 禁用模拟数据记录
QMH模板为此类应用提供了开发起点。
6.1.2 LabVIEW QMH详解

该QMH模板重复执行以下步骤:
- 用户与前面板交互,触发事件处理循环(EHL)中的事件结构生成消息 → LabVIEW将消息存储至队列;
- 消息处理循环(MHL) 从消息队列读取消息(读取后移除该消息);
- 消息字符串匹配MHL中条件结构的某个子框图,触发执行对应子框图(称为"消息处理框图")代码;
- 可选步骤:消息处理框图可生成新消息并存入消息队列。
说明:
-
EHL是生产者循环。MHL是消费者循环。这些循环并行运行,并通过消息队列连接,两循环之间通过消息队列通信。
-
消息队列是一个存储待消费消息的LabVIEW队列。由于EHL将消息发送到此队列而不是直接发送到MHL,因此EHL可以在MHL未消费消息时生成消息。每个消息队列属于单个MHL。
-
MHL的每次迭代都会读取消息队列中最旧的消息,然后执行相应的消息处理框图。尽管MHL主要消费消息,但它也可以生成消息。
-
您的应用程序可以有多个MHL。每个MHL对应于应用程序执行的任务,例如采集或记录数据。
-
请注意上图中的UI Data簇。该簇是MHL中每个消息处理框图都可以访问和修改的数据。在此模板中,该簇被定义为类型定义UI Data.ctl。每个类型定义属于单个MHL。
6.1.3 创建QMH应用
LabVIEW包含此架构的模板项目,可以通过启动LabVIEW>>Create Project>>Templates>>Queued Message Handler来找到该项目。默认情况下,此模板包括一个事件处理循环和一个消息处理循环。下图为QMH程序框图。

6.2 连续测量和记录应用程序
通过启动LabVIEW>>Create Project>>Sample Projects>>Continuous Measurement and Logging来找到该示例项目。该示例项目是基于上述QMH框架所开发的,看懂该程序,就算基本入门LabVIEW学习了,由此可见QMH框架是LabVIEW学习过程中必不可少的程序框架,随着学习不断深入,可以发现一些新的框架(CSM、DQMH、JK状态机、Actor Framework、AMC)几乎都有QMH的身影。该实列程序前面板和程序框图如下:


Continuous Measurement and Logging 示例项目可持续获取测量数据并将其记录到磁盘中。它并行执行 5 个循环:
- 事件处理 (Main.vi)— 事件处理循环 (EHL),它根据前面板事件(例如用户单击**“开始**”或**“设置**”)生成消息。
- 用户界面消息收发 (Main.vi)— 一种消息处理循环 (MHL),它从 EHL 接收消息,并通过向其他 MHL 发送消息来做出响应。
- 采集数据 (Acquisition.lvlib:Acquisition Message Loop.vi)— 持续采集数据的 MHL。默认情况下,此模板模拟获取的数据。
- 记录数据 (Logging.lvlib:Logging Message Loop.vi)— 持续记录采集数据的 MHL。
- 显示数据 (Main.vi) - 使用采集的数据更新波形图的 While 循环。
此示例项目还提供了一个 Settings 对话框 (Settings.lvlib),可用于配置应用程序。
七、学习方法建议与资源推荐
7.1 学习方法建议
依稀记得10多年前,导师将一个已毕业师兄做的LabVIEW项目丢给自己维护的场景,在没有基础的情况下,硬着头皮学习看代码,期间走了不少弯路。这里提出一些自己的建议:
- 从易到难,通过本篇幅所介绍内容,对LabVIEW知识有个大概认识,可边看边对照学习LabVIEW所提供范例和文档,相信用不了一周时间即可入门。
- 针对性练习,入门后,可针对性练习,自己在前期学习时浪费了不少时间,但真正觉得开窍了是针对性的对数组和For循环的各种组合进行了系统练习,有了更深层次的认知;可定义一个个小目标,自己一步步将代码实现,会有很大的提升。
- 不畏难,再进一步就是要看懂且能更改维护已有项目,这一步就是要硬着头皮看,一遍不行就多遍,当你可以更改代码维护时,那么恭喜你已经学有所成了。
- 持续学习,LabVIEW的学习入门很简单,入门后即可满足大部分需求,这里很多人就会止步不前,觉得LabVIEW很简单;如果缺少持续学习的心态,要更进一步其实是有些难度的,这就需要自己不断浏览网站资源学习,加强自己的主动性。
7.2 学习资源推荐
- NI官方论坛和NI产品文档中心,这里有很多值得学习的内容,遇到问题也可以在官网搜索。
- Forums - LAVA,一个比较老牌的论坛,遇到问题可这里搜索。
- 电子发烧友,这里有很多小伙伴分享LabVIEW相关内容。
- CSDN,目前比较热门的学习网站。
- 哔哩哔哩,可针对性搜索相关教程。
- 微信公众号,可搜索LabVIEW关键词。
- LabVIEW大学实用教程,可用最新版书籍,入门学习必备。
总结
本文到此就结束了,仅仅简单介绍LabVIEW的基本内容,可关注博主,后续会针对重点知识点进行扩展,也会分享自己的工作学习知识点,帮助大家更好的学习和使用LabVIEW。
