参考:
- 知乎labview快捷键
https://www.zhihu.com/question/287709225
- github 上 LabVIEW教程
https://lv.qizhen.xyz/
- LabVIEW 参考书籍
链接:https://pan.baidu.com/s/1irc0iftM0Gg3GCN2cBHCKw?pwd=y1mz 提取码:y1mz --来自百度网盘超级会员V7的分享
- LabVIEW编程基础:条件结构编程
https://blog.csdn.net/ba_wang_mao/article/details/119211808
- 细讲Labview事件结构用法(上)--入门篇------附用例讲解及用法拓展
https://blog.csdn.net/m0_52176775/article/details/134805242
x.1 LabVIEW简介
x.2 一些加快效率的快捷键
LabVIEW分为前面板和程序框图面板,快捷键都是在程序框图面板使用的。
ctrl+b:去除多余的线条
ctrl+u:快速整理所选区域的UI,并排列整齐
ctrl+h:调出帮助面板,help
ctrl+shift+n:调出导航面板,navigation
按住ctrl点选连线输入端:剪刀将交叉的线变不交叉
文件-属性:查看vi文件所在位置
x.3 基础知识
x.3.1 软件知识,开发流程
x.3.1.1 背景知识
LabVIEW 是美国国家仪器有限公司(National Instruments, NI)最核心的软件产品。LabVIEW 是一种编程语言,与其它常见的编程语言相比,最大的特点就在于它是一种图形化编程语言。G 语言是图形化编程语言(Graphical Programming Language)的缩写。
LabVIEW既是一种语言,又是一款IDE,使用NI LabVIEW 20xx
进行开发,使用语言为G语言,他的最大用途在于:可以用LabVIEW的驱动程序或者工具包来与硬件设备建立通讯,快速控制硬件设备。
LabVIEW兼容Windows、macOS、Linux,支持常见嵌入式设备如PDA、FPGA,以及运行 VxWorks 和 PharLap 系统的 RT 设备。
x.3.1.2 LabVIEW前后面板
LabVIEW分为前面板和程序框图面板,其中前面板用于搭建给用户看的前端的界面,通过数值控件+标签设置变量;
而重点是程序框图面板。该面板用于设置背后的逻辑,程序框图中所有的图形对象可以分为节点和连线。

程序框图面板中连线 的方向是很重要的,因为可以通过程序执行的顺序看出数据流流动的方向,一般我们默认数据流向从左到右,而一根数据线连在节点左侧默认为输入,右侧默认为输出。

是输入还是输出除了从数据流向来看,还可以通过控件类型来看。控件分为三类:常量控件(const),控制控件/输入控件(control),显示控件(indicator)。而控制控件为输入,显示控件为输出。


x.3.1.3 从LabVIEW属性中寻找文件存储路径
通过文件-vi属性
就能查看vi的存储路径。

x.3.1.4 流程/创建子VI过程(包括VI图标,接线板和调用)
我们一般在书写一个新的VI程序程序的时候,遵循以下步骤:
- 创建新VI;在前面板书写与人交互的图;在后面板/程序框图面板书写程序逻辑;
- 在前面板右键编写子VI图标,画一个新的LabVIEW图标,或者导入图标,需要一个大小为
32*32
,每一通道位深为256
的PNG图片; - 在前面板设计子VI的接线板并保存;
- 在父VI中,直接拖入/或者导入子VI图标,按照节点板连线;
x.3.1.5 循环运行
为了让程序一直保存运行,可以使用工具条上的"连续运行"按钮。除此之外还可以使用循环结构,推荐使用循环结构。

x.3.1.6 分享(代码片段分享和论坛上讨论)
为了分享代码片段可以在程序框图面板选中代码片段,选中后选择"编辑-从所选项创建VI片段",如此导出了png格式的代码片段。
如果想将PNG格式的代码片段导入,则新建VI,在程序框图面板拖入PNG便会将代码片段拖进。
LabVIEW的论坛可以在NI官网(需要挂梯子forums.ni.com
)和LAVA(https://lavag.org/
)上讨论。而代码分享则可以和origin上的分享一样直接点开,使用代码片段实现:
x.3.2 数据类型
x.3.2.1 数据基本类型
数据类型由在前面板创建与在程序框图面板创建,分为两种,分别是在程序框图面板创建的常量类型以及在前面板创建的变量类型。在前面板创建的变量类型可以通过右键-属性-标签
来设置变量名,该变量可以在程序框图面板使用局部变量调用变量名来进行调用。
数据类型根据是输入还是输出可以分为输入控件(control)和显示控件(indicator),由于labVIEW特性(数据流从左往右流动),所以输入控件的入口在控件左侧,而显示控件的出口在右侧,书写代码时遵循数据流向从左至右
。下图中从上至下分别是常量,输出,输入。

LabVIEW的数据类型一共有十五种,其中主要记忆数据类型有字符串类型U8(每个字符是U8, ASCII,结尾处不用\0,而是用字符串的长度表示字符串结尾),浮点型DBL(双浮点类型,64bit/8Byte),整型I32(4Byte),布尔类型U8(1Byte)。
其中字符串是粉色线,浮点型是橘色线,整型是蓝色线。

可以实现数据的强制类型转换,通过在函数选板 "编程 -> 数值 -> 转换" 来实现。

x.3.2.2 使用C语言+公式节点进行数据的计算
数值运算的方式有常见运算(用LabVIEW实现),表达式节点,公式Express VI,公式节点(用C实现计算)。这里推荐常见运算和公式节点:常见运算只能单一输入输出,公式节点适合多输入和多输出且C语言较好的人使用。二者区别如下,

x.3.2.3 簇
簇类似结构体,我们往往用簇来生成错误簇并连接。
在簇的前面板中,我们通过右键边缘调出功能面板,我们使用的主要功能有"重新排序簇中控件"和"自动选择大小 -> 垂直排列"。
- 往簇中存储数据
在程序框图面板,我们需要将数据捆绑后传入簇或者将簇中数据解绑后传入变量中。簇的创建,需要使用按名称捆绑,而按名称捆绑这个控件首先要有一个输入簇,这个簇提供的是簇里面各个控件的名称,之后就可以在"按名称捆绑"这个控件输入端左键点击选择各个名称了,生成的簇和你的输入簇格式一样。
创建簇,首先我们在前面板创建一个簇,并命名好变量名,如value1和value2,

在程序框图面板,拉入"按名称捆绑",我们需要给它外接一个簇,这个簇的作用只是告诉簇中的变量名是什么。接着把你需要给这些变量赋予的值转入,如此便构造了一个簇。你还可以选择后接一个输出簇2来显示簇里的变量和元素,

- 从簇中读取数据
而我们也可以使用簇来存储数据并读取,当我们需要从簇中读取数据时,我们需要使用按名称解绑,我们这两步都需要给簇中的变量名赋予标题(即变量名)。我们在前面板创建显示簇/输出簇,在后面按名称解绑,便可以获取到变量名和值,

x.3.2.4 数组
- 数组的创建
在前面板中创建数组。数组也是一种非常常见的复合数据类型,与簇的不同点在于数组中所有元素的数据类型都必须是同一种,同C的链表/顺序表。数组可以是多维的,可以在前面板的显示中添加滚动条。如下创建的是一个二维数组,

除了在前面创建数组,我们也可以在程序框图面板创建数组。我们需要使用初始化数组控件来创建数组,我们1指定用1填充所有元素,这里的2,3指定的是第一个维度大小是2,第二个维度大小是3,

前面板的显示如下图所示,

- 数组的加减操作

- 数组元素的添加
数组元素的添加,同append,使用build array实现。可以往数组的尾部添加元素,类似python的append。需要注意的是左侧两个矩形表示数组,而一个矩形表示元素。

- 数组的索引
数组的索引,在程序框图面板使用索引数组控件,有几个维度就给添加几个索引值。
- 数组的长度
使用数组大小控件,传入数组便可。
x.3.2.5 局部变量和全局变量
我们往往需要使用局部变量和全局变量,局部变量是指的在同一个vi文件中可以调用的变量。而全局变量是跨vi仍然可以调用的变量。
在程序框图面板,右键-结构-局部变量
,鼠标悬浮于局部变量上右键-选择项-
选择你需要映射的变量,注意簇中的变量是没办法直接映射的,

我们还可以右键,转换为读取,以此将局部变量变为读取控件,
x.3.2.6 代码注释与禁用
我们在程序框图面板直接双击便可以加入注释。我们还可以在代码框图面板右键,找到禁用面板来将整段代码给禁用,

x.3.3 逻辑结构
x.3.3.1 条件结构(即 if-else/switch 选择判断)
case structure根据输入数据类型的不同具有四种常见形式,有布尔型条件输入,数值型条件输入,枚举型条件输入,字符串型条件输入。
当我们选择连接处的数据类型不同,case中的条件类型也会不同,当我们创建条件结构,默认是布尔类型,连接输入也为布尔类型,他就只会有真假两种输出,

当我们的连接处为数值的时候,他的条件类型也会默认为数值,

当我们输入为字符串类型的时候,他的默认条件也会是字符串类型,

当我们输入为枚举的时候,他的默认条件也会是枚举类型。我们首先在前面板新建枚举变量,

接着我们右键-属性-编辑项,添加key和value,key即项,value即值。如此便创建了枚举变量。

在程序框图面板,我们将枚举变量和条件结构连接,在条件结构中不停添加项便完成了结构的创建。
当然,我们右键也可以设置默认分支,但是不推荐设置默认分支,会使得bug难以复现。

x.3.3.2 顺序结构
顺序结构很好的解决了同步异步问题,下一帧会在上一帧运行完后再执行。在程序框图面板进行创建。

x.3.3.3 循环结构
循环结构常见有两种结构,for循环结构和while循环结构。for循环的运行效率比while循环效率高,


在for循环结构中通过添加条件接线端来增加条件终止,

在循环结构中难的是隧道和数组相结合,以及移位寄存器和局部变量相结合,
- 输入隧道
输入隧道有两种模式。
在输入隧道中,如果隧道是一个小实心,则循环每次迭代都会读入同一个输入数据;如果输入的数据一个数组,且隧道是一个空心的小矩形,则在隧道的右键菜单中可以选择启用索引/禁用索引,这样的话每次迭代将依次从数组中取出一个元素。
注意,使用了索引隧道的 for 循环结构,可以不用提供循环次数,即不必输入 N 值,循环迭代次数由输入数组的长度决定,迭代次数即数组长度。但我们并不建议这样使用,指定N值会增加程序可阅读性。
注意,如果与索引输入隧道相连的是一个多维数组,每通过一次索引输入隧道,数组会降低一维。对于二维数组,使用两层嵌套的循环结构,即可得到它的每一个元素。
- 输出隧道
输出隧道有三种模式。分别是实心方块,空心方块和带横条方块。
实心方块只会将最后一次循环迭代传递给隧道,推荐实心。
空心方块,把每一次循环迭代传递给隧道的数据作为数组元素,合并成一个数组传递出去。注意使用空心方块会升高维度。
带横条纹方块基本不用。
- 移位寄存器
移位寄存器往往是一对一对实现的,上一次循环的值会存储下来,在下一次循环中调用。通过在程序框图面板右键添加移位寄存器来增加移位寄存器。
一对移位寄存器由两部分组成,分别位于循环结构的左右两侧。一次迭代结束时,数据流入循环结构右侧的移位寄存器;在下一迭代开始时,该数据会从同一移位寄存器的左侧端流出。

x.3.3.4 事件结构
事件结构类似于JavaScript中的循环event监听,在LabVIEW中他也往往需要和循环结构搭配使用,类似setonclicklistener,也可以搭配队列使用。
在程序框图面板,我们右键,在结构中添加事件结构。我们右键事件结构边框-编辑事件来添加监听事件,我们往往使用值改变来添加事件,

如此,我们便添加了事件结构,

x.3.4 同步
x.3.4.1 队列操作
同步中的队列操作是一个常使用的操作,我们使用队列来控制程序的顺序执行,我们使用obtain queue来生成队列;使用enqueue来入队;使用dequeue来出队;下图的-1是无限的意思,即队列长度无限。

我们常用事件+队列+选择+循环来进行事件监听与运行,
连线端具有默认值。当你在进入需要切换的结构,例如case结构时候,你切换之后可能有的线会断掉,这个时候你需要在断点处右键-未连线时使用默认。

案例如下(可运行),

x.3.5 图形化显示数据

波形图表和波形图是最常见的画一维图的控件,XY图用于绘制二维图。
x.3.6 DEBUG
Debug时使用小灯泡便可以逐步执行,
