0.3 LabVIEW的基本概念
LabVIEW是一个功能完整的程序设计语言,具有区别于其他程序设计语言的一些独特结构和语法规则。应用LabVIEW编程的关键是掌握LabVIEW的基本概念和图形化编程的基本思想。在深入学习LabVIEW之前,有必要先介绍一些LabVIEW中的基本概念术语和结构,这是理解与学习LabVIEW的基础。
0.3.1 VI与子VI
用LabVIEW开发的应用程序称为虚拟仪器(Virtual Instrument,VI)。
一个最基本的VI由前面板和后面板两部分组成。
VI运行采用数据流驱动,具有顺序、循环、条件等多种程序结构控制。
与其他编程语言一样,在LabVIEW中也存在子程序的概念。在LabVIEW中的子程序称为子VI。在程序中使用子VI有以下益处:
(1)将一些代码封装成为一个子VI(即一个图标或节点),可以使程序的结构变得更加清晰、明了。
(2)将整个程序划分为若干模块,每个模块用一个或者几个子VI实现,易于程序的编写和维护。
(3)将一些常用的功能编制成为一个子VI,在需要时可以直接调用,不用重新编写这部分程序,因而子VI有利于代码复用。
正因为子VI的使用对编写LabVIEW程序有很多益处,所以在使用LabVIEW编写程序时经常会使用子VI。基于LabVIEW图形化编程语言的特点,在LabVIEW环境中,子VI也是以图标(节点)的形式出现的,在使用子VI时,需要定义其数据输入和输出的端口,然后就可以将其当做一个普通的VI来使用了。
0.3.2前面板
前面板就是图形化用户界面,用于设置输入数值和观察输出量,是人机交互的窗口。由于VI前面板是模拟真实仪器的前面板,所以输入量称为控制,输出量称为指示。
在前面板中,用户可以使用各种图标,如旋钮、按钮、开关、波形图、实时趋势图等,这样可使前面板的界面同真实的仪器面板一样。图0-9 是一个波形发生器程序的前面板。
图0-9 波形发生器程序的前面板
前面板对象按照功能可以分为控制、指示和修饰三种。控制是用户设置和修改VI程序中输入量的接口;指示则用于显示VI程序产生或输出的数据。如果将一个VI程序比作一台仪器的话,那么控制就是仪器的数据输入端口和控制开关,而指示则是仪器的显示窗口,用于显示测量结果。
在本书中,为方便起见,将前面板中的控制和指示统称为前面板对象或控件。
值得一提的是,任何一个前面板对象都有控制和指示两种属性,在前面板对象的右键弹出菜单中选择“转换为显示控件”或“转换为输入控件”命令,可以在控制和指示两种属性之间切换。请注意,如果用于输入的前面板对象被设置为指示,或用于输出的前面板对象被设置为控制,则LabVIEW会报错。
修饰的作用仅是将前面板点缀得更加美观,修饰并不能作为VI的输入或输出来使用。在控制选板中专门有一个修饰子选板。当然,用户也可以直接将外部图片(BMP或JPEG格式)粘贴到前面板中作为修饰。
0.3.3框图程序
每一个前面板都有一个框图程序与之对应。框图程序是用图形化编程语言编写的,可以把它理解成传统编程语言程序中的源代码。用图形来进行编程,而不是用传统的代码来进行编程,这是LabVIEW最大的特色。
框图程序由节点、端口和连线组成。
1.节点
节点是VI程序中的执行元素,类似于文本编程语言程序中的语句、函数或者子程序。节点之间由数据连线按照一定的逻辑关系相互连接,以定义框图程序内的数据流动方向。0.3.2节中波形发生器的框图程序就是一个典型的例子,如图0-10所示。
图0-10 波形发生器框图程序
LabVIEW共有4种类型的节点,参见表0-6。
表0-6 LabVIEW节点类型
节点是LabVIEW作为G语言这种图形化编程语言的特色之一,是图形化的常量、变量、函数以及VIs和Express VIs。
一般情况下,LabVIEW中的每个节点至少有一个端口,用于向其他图标传递数据。
2.端口
节点之间、节点与前面板对象之间通过数据端口和数据连线来传递数据。
端口是数据在框图程序部分和前面板之间传输的通道接口,以及数据在框图程序的节点之间传输的接口。端口类似于文本程序中的参数和常数。
端口有两种类型:控制器/指示器端口和节点端口(即函数图标的连线端口)。控制或指示端口用于前面板,当程序运行时,从控制器输入的数据就通过控制器端口传送到框图程序。而当VI程序运行结束后,输出数据就通过指示器端口从框图程序送回到前面板的指示器。当在前面板创建或删除控制器或指示器时,可以自动创建或删除相应的控制器/指示器端口。上述控制程序有两个控制器端口、一个指示器端口,同时在框图程序中,Add功能函数在图标下隐含着节点端口。
3.连线
连线是端口间的数据通道,类似于文本程序中的赋值语句。数据是单向流动的,从源端口向一个或多个目的端口流动。不同的线型代表不同的数据类型,每种数据类型还通过不同的颜色予以强调。
连线点是连线的线头部分。
当需要连接两个端点时,在第一个端点上单击连线工具(从工具选板调用),然后移动到另一个端点,再单击第二个端点。端点的先后次序不影响数据流动的方向。
当把连线工具放在端点上时,该端点区域将会闪烁,表示连线将会接通该端点。当把连线工具从一个端口接到另一个端口时,不需要按住鼠标。当需要连线转弯时,单击一次鼠标,即可以正交垂直的方向弯曲连线,按空格键可以改变转角的方向。
接线头是为了保证端口的连线位置正确。当把连线工具放到端口上,接线头就会弹出。接线头还有一个黄色小标识框,显示该端口的名字。
节点/连接端口可以让用户把VI变成一个对象(SubVI,即VI子程序),然后在其他VI中像子程序一样被调用。图标作为SubVI的直观标记,当被其他VI调用时,图标代表SubVI中的所有框图程序。而连接端口表示该SubVI与调用它的VI之间进行数据交换的输入/输出端口,就像传统编程语言子程序的参数端口一样,它们对应着SubVI中前面板上的控制和指示。连接端口通常是隐藏在图标中的。图标和连接端口都是由用户在编制VI时根据实际需要创建的。
0.3.4数据流驱动
由于框图程序中的数据是沿数据连线按照程序中的逻辑关系流动的,因此,LabVIEW编程又称为“数据流编程”。“数据流”控制LabVIEW程序的运行方式。对一个节点而言只有当它的输入端口上的数据都被提供以后,它才能够执行。当节点程序运行完毕以后,它会把结果数据送到其输出端口中,这些数据很快地通过数据连线送至与之相连的目的端口。“数据流”与常规编程语言中的“控制流”类似,相当于控制程序语句一步一步地执行。
两数相加前面板如图0-11所示,两数相加框图程序如图0-12所示,这个VI程序把控制a和b中的数值相加,然后再把相加之和乘以100,结果送至指示c中显示。
图0-11 两数相加前面板
图0-12 两数相加框图程序
在这个程序中,框图程序从左向右执行,但这个执行次序不是由其对象的摆放位置来确定的,而是由于相乘节点的一个输入量是相加节点的运算结果。只有当相加运算完成并把结果送到相乘运算节点的输入端口后,相乘节点才能执行下去。注意,一个节点只有当其输入端口的所有数据全都有效地到达后才能执行下去,而且只有当它执行完成后,它才把结果送到输出端口。
再看另一个VI的框图程序,如图0-13所示。该程序是乘法节点和除法节点并行执行。这两个节点相互之间没有数据依赖的关系,它们是相互独立的,输入数据是同时到达减法节点,它们是并行执行的。但是如果根据某种要求,需要先执行除法,后执行乘法,该怎么办呢?用顺序结构可解决这个问题。