第3章 编辑程序代码.docx
《第3章 编辑程序代码.docx》由会员分享,可在线阅读,更多相关《第3章 编辑程序代码.docx(21页珍藏版)》请在冰豆网上搜索。
![第3章 编辑程序代码.docx](https://file1.bdocx.com/fileroot1/2022-11/21/288bf934-325d-4b37-8f74-50a68d2a8163/288bf934-325d-4b37-8f74-50a68d2a81631.gif)
第3章编辑程序代码
第三章编辑程序代码
本章主要介绍LabVIEW代码创建和编辑,与其他文本类的编程语言一样,LabVIEW有自己的数据类型、逻辑结构和运算函数。
但作为以图标为最小单位的编程语言,LabVIEW的程序设计方法有着自己独特的风格。
用户在前面板创建的所有的控件对象(控制件和显示件)都自动的在代码窗口产生相应的数据变量图标,以便通过代码对控件对象的属性和行为进行控制。
控件对象上的标签与数据变量图标的标签是一致的,同时变量图标的颜色代表着自身的数据类型。
3.1LabVIEW的数据类型
LabVIEW的数据类型按其功能可以分为两类即常量和变量,变量又分为控制类变量和显示类变量。
按其特征基本上也可以分为两大类,数字量类型和非数字量类型,并用不同的图标来代表不同的数据类型。
原则上数据是在相同的数据类型的变量之间进行交换的,但LabVIEW同时拥有自己的数据类型转换机制,这也提供了一种程序的容错机制。
3.1.1LabVIEW的数字量数据类型
1.单字节整数类型:
以8位二进制代码表示的整数(8-bit)。
包含有符号的单字节整数类型(取值范围是0~255)和无符号的单字节整数类型(取值范围是-128~127)两种,分别以蓝色线框图标
和
来表示。
2.双字节整数类型:
以16位二进制代码表示的整数(16-bit)。
包含有符号的双字节整数类型(取值范围是0~65,535)和无符号的双字节整数类型(取值范围是–32,768~32,767)两种,分别以蓝色线框图标
和
来表示。
3.长整数类型:
以32位二进制代码表示的整数(32-bit)。
包含有符号的长整数类型(取值范围是0~4,294,967,295)和无符号的长整数类型(取值范围是–2,147,483,648~2,147,483,647)两种,分别以蓝色线框图标
和
来表示。
4.单精度浮点数类型:
LabVIEW以32-bitIEEE标准格式存储单精度浮点数,分为实数单精度浮点数类型和复数单精度浮点数类型(正数取值范围是1.40e-45~3.40e+38,负数的取值范围是-1.40e-45~-3.40e+38,取值范围对复数的实数部分和虚数部分均有效)。
分别以橙色线框图标
和
来表示。
5.双精度浮点数类型:
LabVIEW以64-bitIEEE标准格式存储双精度浮点数,分为实数双精度浮点数类型和复数双精度浮点数类型(正数取值范围是4.94e–324~1.79e+308,负数的取值范围是-4.94e–324~-1.79e+308,取值范围对复数的实数部分和虚数部分均有效)。
分别以橙色线框图标
和
来表示。
6.扩展精度的浮点数类型:
分为实数扩展精度的浮点数类型和复数扩展精度的浮点数类型。
该数据类型的精度和占用内存的大小根据不同的操作系统而异。
在Windows和Linux平台中的取值范围是:
正数取值范围是6.48e–4966~1.19e+4932,负数的取值范围是-6.48e–4966~-1.19e+4932,取值范围对复数的实数部分和虚数部分均有效。
分别以橙色线框图标
和
来表示。
上述6种数据类型,随着精度和取值范围的不断扩大,相应的变量和常量占用的内存也是不断增大的。
因此一般在设计程序时,在满足变量取值范围的前提下,尽可能的选用比较小的数据类型。
当然有些情况下变量的取值范围是不能确定的,这时可以取较大的数据类型以保证程序的安全性。
以上给出数据类型的图标都是控制量图标,相应显示量图标与控制量图标的不同之处在于显示量图标的边框比较薄。
如
和
分别代表双精度浮点数类型的控制量和显示量。
其它数据类型的控制量和显示量图标与之雷同。
3.1.2LabVIEW的非数字量数据类型
1.布尔量数据:
LabVIEW使用8-bit(一个字节)的数值来存储布尔量数据。
如果数值为0,布尔量数据为FALSE,其他非0数值代表TRUE。
LabVIEW用绿色线框的图标表示布尔量数据
。
2.数组类型:
LabVIEW以句柄或指针(包含长整形的每一维的大小,及相应的数据)来存储数组数据类型。
如果句柄为0,表示数组为空数组。
不同数据类型的数组的图标是将原来数据类型的图标中的文本部分加上括号([])。
如
和
分别代表布尔类型控制量及其数组的图标。
关于数组和簇的详细介绍请参考第四章。
3.字符串类型:
LabVIEW以单字节整数的一维数组来存储字符串数据。
字符串数据类型以粉红色边框的图标
来表示。
4.路径数据类型:
LabVIEW以句柄或指针(包含路径类型、及路径成员的数量和路径成员)来存储数据类型。
以绿色边框的图标
表示。
5.簇数据类型:
LabVIEW根据簇中成员的顺序使用相应的数据类型来存储不同的成员。
数字量簇以图标
表示,混合类型的簇以图标
表示。
6.参考数据类型:
LabVIEW使用参考来作为某一对象的唯一标识符,对象可以是文件、设备和网络连接等。
由于参考是指向某一对象的临时指针,因此它仅在对象被打开时有效,一旦对象被关闭,LabVIEW就断开了与参考与对象的连接。
以绿色边框的图标
来表示。
7.波形数据类型:
代表由数学函数产生的波形数据。
类似于簇的数据类型,以橙色边框的图标
来表示。
8.IO通道名类型:
用来表示DAQ的IO通道名称。
以紫色边框的图标
来表示。
9.多义数据类型:
指一个变量可以连接不同的数据类型。
比如对于LabVIEW内置的加法函数
,其输入端口可以同时连接整形数据也可以同时连接浮点型数据。
大多数LabVIEW函数都提供多义数据接口。
以紫色边框的图标
来表示。
10.可变数据类型:
这是LabVIEW提供的一种比较通用数据类型,以紫色边框的图标
来表示,这种数据类型可以和以下的LabVIEW数据类型相互转换:
所有的数字类型包括有符号和无符号的整数或浮点数,布尔量数据类型,字符串数据类型,参考数据类型,上述所提到的数据类型的数组和簇。
3.2程序代码的基本元素
3.2.1常数、函数和VI
LabVIEW提供的编程元素都放置在函数模板中,关于函数模板的介绍请参见第一章的内容。
函数模板及其子模板中的各个对象可以分为常数、函数和VI程序。
函数是LabVIEW系统内建的程序,用户无法看到该程序的代码,一般函数的图标的底色为黄色。
函数模板上的VI程序是系统提供的LabVIEW程序,用户可以阅读该函数的代码,这样可以很容易的在此基础上进行修改以形成用户自己的程序。
LabVIEW同其他编程语言一样,具有模块化的层次结构,因此,基本的程序元素除常数、系统提供的函数和VI程序外还有用户的子程序,用户的子程序与系统提供的VI程序具有相同的属性。
3.2.2程序和函数端口
图3.1
代码窗口中的程序元素一般都提供与外部调用者之间的接口,这个接口我们称之为端口。
LabVIEW的程序数据流按照一定的规则在端口之间流动。
当鼠标选择了接线工具后,当鼠标在函数或VI程序上移动时,端口会动态的出现,以便于完成连线工作。
对于变量而言,根据其端口的位置就可以很容易的分辨出该变量是控制量还是显示量。
控制量端口在图标的右端,显示量端口在图标的左端如图3.1所示。
对于VI程序而言,端口分为输入端口和输出端口,输入端口只能连接控制量,输出端口只能连接显示量。
函数和VI程序的端口的数量和位置根据其功能的不同而各异。
3.2.3基本的运算函数
图3.2
系统的函数模板包含了所有的代码元素,并分类存放于不同的子模板中。
不同功能的函数子模板将在后续的相应的章节中介绍。
在文本编程语言中,如VB、VC++,算术运算符和逻辑运算符单独作为关键字提出,而在LabVIEW中,这些基本的运算符都是作为函数放在函数模板中。
此处我们介绍最基本的运算函数,即函数模板中的数字量子模板和布尔量子模板中的基本运算函数如图3.2所示。
数字量运算函数依次为加法函数、减法函数、乘法函数、除法函数、加1函数、减1函数、数组加法函数、数组乘法函数。
布尔量运算函数依次为与逻辑函数、或逻辑函数、异或逻辑函数(输入不同则为True,否则为False)、反(非)逻辑函数、与非逻辑函数、或非逻辑函数、同或逻辑函数(输入相同则为True,否则为False)、隐含逻辑函数。
3.3代码图标的编辑和控制
3.3.1代码的创建
图3.3
图3.4
在前面板设计过程中,面板上每增加一个显示件或控制件,在代码窗口中就相应的增加一个显示量或控制量。
除此之外的其他代码就需要通过函数模板来创建,而且在代码窗口也可以直接创建显示量和控制量,则在前面板同时出现相应的显示件和控制件。
以下介绍如何在代码窗口中创建代码。
创建新的程序”代码连线.vi”。
激活代码窗口,函数模板Functions»Numeric»Multiply,完成了乘法函数
的选取,用鼠标拖动放置在代码窗口中。
该函数有两个输入端口(乘数和被乘数)及一个输出端口(积)。
用鼠标选择连线工具,当鼠标依次靠近每一个端口时,系统提示该端口的用法提示,如图3.3所示。
下面在X端口创建数字量控制件,在Y端口创建常数。
图3.5
在X端口处鼠标右击,在弹出的快捷菜单中选择Create»Control,如图3.4所示。
则系统直接在该端口连接一个数字量控制件;同样在Y端口处鼠标右击,选择Create»Constant,输入常量5.0;在X*Y端口处鼠标右击,选择Create»Indicator。
这样就完成了简单的乘法运算的基本程序,如图3.5所示。
现在我们在给程序增加一点简单的程序控制结构,while循环,Functions»Structures»WhileLoop。
右键单击循环控制图标
,选择菜单StopIfTrue,是循环控制图标变为
。
选择接线工具,右键单击图标
,选择菜单CreateControl,则在前面板创建布尔量控制按钮Stop,程序运行后如图3.6所示。
在程序代码窗口中通过快捷方式创建的对象,也可以在前面板中通过控件模板来创建。
而常量也可以在函数模板中创建,Functions»Numeric»Constant,
。
图3.6
3.3.2代码图标的大小及调整
对于某些类型的变量图标或函数图标,如属性节点和数组函数等,可以通过鼠标来调整图标的大小来改变图标的端口数量。
图3.7
创建新的程序”调整图标大小.vi”。
激活代码窗口,函数模板Functions»Numeric»CompoundArithmetic,这是一个复合数学函数,可以对任意数量的数字量或布尔量进行加法运算、乘法运算、与逻辑运算、或逻辑运算、异或逻辑运算。
由于输入端口的数量和类型可变,我们称这种函数具有多义性。
多义现象是函数对不同类型、不同维度输入数据的调节能力。
大多数LabVIEW函数都具有多义调节的能力。
例如加法函数可以把一个标量和一个数组加在一起,也可以把两个数组相加。
前者是把标量加到数组每个元素上,后者是把两个数组对应元素相加。
不同LabVIEW函数的多义调节能力是不同的。
有些函数可以接收数值量和布尔量输入,另一些也许可以接收任何数据类型的组合。
图3.8
现在将这个数学复合函数的输入端口改为3个,把鼠标接近图标的下边缘的中间位置,出现图标编辑标记,按下鼠标拖动,直到出现要求的端口数量为止,如图3.7所示。
激活前面板,增加三个控件,Controls»Numeric»VerticalPointerSlide,输入名称“输入1”;Controls»Numeric»VerticalPointerSlide,输入名称“比例”,Controls»Boolean»StopButton。
激活代码窗口,增加随机数和加法运算符Functions»Numeric»RandomNumber
;Functions»Numeric»Multiply,添加While循环结构,并按照图3.8所示进行连线。
这里我们只是为了说明改变某些可变大小的图标的方法,对于多数的数组操作函数和簇操作函数都具有函数的多义性,因此图标大小可变。
此处提到的数学复合函数是LabVIEW6.1版本提供的新函数,具有非常大的灵活性,不仅输入端口的数量可变,而且函数本身的功能也时可选的。
鼠标右击函数的图标,在快捷菜单ChangeMode中有4个选项,分别是Add(加法)、Multiply(乘法)、And(逻辑与)、Or(逻辑或)、XOR(逻辑异或)。
该函数还提供对所有的端口进行取反的功能,在端口处鼠标右击,选择快捷菜单中的Invert,对于加法运算,函数取该端口数值的相反数,对于乘法运算,函数取该端口数值的倒数,对于布尔运算,函数取该端口逻辑的反逻辑。
3.4连线与数据转换
图3.9
LabVIEW通过在不同的图标端口之间进行连线来控制数据流的流动方向,类似于文本语言的变量赋值过程。
LabVIEW不同数据类型的变量图标可以用颜色来区别,同样在相同数据类型的端口之间的连线的颜色与该数据类型图标的颜色相同。
LabVIEW实现端口之间的连线的方法有自动连线和手工连线。
3.4.1自动连线
只有已经设置了自动连线的选项才能实现自动接线。
自动连线的设置如下:
选择菜单Tools»Options,出现选项对话框,在下拉列表框中选择BlockDiagram,选择复选框EnableAutoWiring,这样就激活了自动连线功能,如图3.9所示。
对话框中还有两个文本框,用来决定自动连线的两个对象之间的最大距离和最下距离,单位为像素。
图3.10
创建新的程序”连线.vi”。
激活前面板,Controls»Numeric»Knob,Controls»Numeric»DigitalIndicator,快捷键Ctrl-E可以切换到代码窗口,函数模板Functions»Numeric»Add,将加法图标的左端靠近数字量Knob的右端,当两者之间的距离在自动连线设置的最大和最小距离之内时,LabVIEW在两者之间创建可行的连线。
在默认状态下,当用选择工具在函数模板上选择对象或克隆已经存在的代码对象时,自动连线功能有效,当用定位工具移动对象时,自动连线功能无效。
但是可以在拖动对象时,通过按下空格键来取消或选择自动连线功能。
Functions»Numeric»NumericConstant,将这个常数放置在任意位置,并输入20.0。
用鼠标移动显示量,移动过程中按下空格键,出现接线端口,当靠近加法函数的输出端口时,自动连线。
同样的方法移动常量并自动连接到加法函数的Y端口,如图3.10所示。
3.4.2连线的手工编辑
自动连线是LabVIEW的新增加的功能,对于比较复杂的连线和编辑工作还是应该由手工来完成。
连线就是在一个数据端口上点击鼠标,然后移动到另外相同数据类型的端口上点击鼠标,就完成了两个端口之间的数据流的连接,连线只能是水平的或垂直的。
但为了使代码清晰可读性强,对于连线的排列和分布需要做一定的编辑,这里我们介绍一些编辑技巧。
要移动或删除连线时,要先选择被操作的连线。
图3.11
选择定位工具,鼠标单击既可选择连线的一段,双击会选择连线的一个分支,连续的点击3次可以全部连线如图3.11所示。
选择定位工具,并保持按下Shift键,鼠标多次单击连线的一段,则被单击的对象全部被选中。
对于被选择的对象,按下Delete或Backspace(退格)键可以删除;用鼠标拖动则可以将被选对象移动到新的位置。
3.4.3数据类型的转换
当在不同的数据类型的端口连线时,LabVIEW将要根据以下规则进行数据类型的转换:
1.有符号或无符号的整数可转换为浮点数,这种转化除长整形转化为单精度浮点数外,都没有精度损失。
长整形转化为单精度浮点数时,LabVIEW将数据长度从32位降低为24位。
2.浮点数转换为有符号或无符号的整数时,LabVIEW会产生数据溢出而是转化后的数据为整形数的最大值或最小值。
比如转化任意负的浮点数为一个无符号的整数,都将变为整数的最大值。
3.枚举数据类型(Enums)被认为是无符号的整数。
如果要转换浮点数-1为无符号的整数,则转换后的数值被强制于该枚举类型的范围内,如该枚举类型的范围是0-25,则-1被转化为25(枚举类型的最大值)。
4.整数之间的转换,LabVIEW不会产生数据溢出。
如果源数据类型比目标数据类型小,则LabVIEW自动以0填充,以和目标数据类型一致。
如果源数据类型比目标数据类型大,LabVIEW只拷贝源数值的最小有效位数。
一般我们使用的控制量和显示量都是32位双精度浮点数。
但是LabVIEW包含丰富的数值型数据类型,它们可以是整型(一个字节长、一个字长或长整型),也可以是浮点型(单精度、双精度或扩展精度)。
一个数值型量的默认类型是双精度浮点型。
如果把两个不同数据类型的端口连接在一起,LabVIEW自动把它们转化一致,并且在发生转化的端口留下一个小灰点,叫做“强制转换符”作为标记。
例如,For循环的计数端口要求长整型量,如果我们给它连接了一个双精度浮点数,LabVIEW语言就把它转化为长整型数,并且在计数端口留下一个小灰点。
LabVIEW在把浮点数转化为整型数时将它圆整到最接近的整数。
如果恰好在两个数中间,则圆整到最接近的偶数。
例如6.5圆整到6,7.5圆整到8。
这是国际电器工程师协会(IEEE)规定的数值圆整方法。
如果在根本不能相互转换的数据类型之间连线,比如把数字控制件的输出连接到显示件的数组上,则连接不会成功,直线以虚线表示,并且运行按钮以断裂的箭头表示
。
3.5定义按钮的机械动作
从以前的一些例子中可看出,按钮经常用来控制程序的运行或其他功能的调用,LabVIEW允许用户自定义按钮每一个动作逻辑。
布尔型控制量的机械动作可以用图3.12表示。
第一行(m)表示鼠标的动作;
第二行(v)表示控制量的值;
第三行是开关符号;或程序读取控制量值的时间点(RD)。
共有六种机械动作可以选择。
(1)当按下时转换动作,
每次用操作工具点击控制量时,即改变控制量的值。
此种动作与照明灯开关的动作类似。
它不受程序读取控制量值次数的影响。
(2)当松开时转换动作,
鼠标在控制量图标内点击后,当松开鼠标按键,控制量的值发生改变。
这种动作不受程序读取控制量值次数的影响。
(它与点击对话框中的确认标记动作类似,它只是变为高亮度,但是只有松开鼠标才起作用。
)
(3)松开前处于转换状态
点击控制量时,就转换为新值,并保存此值直到松开鼠标按键。
这种动作类似于门铃。
它不受程序读取控制量值次数的影响。
(4)当按下时锁定动作
点击控制量时它就改变控制值,并保存这个值,直到程序读取这个值一次,它才恢复缺省值。
这个动作的发生与是否还按着鼠标无关。
(这种动作类似于电路中的断路器。
)它常用于终止While循环,或在设定控制值后,使程序只执行某项操作一次。
(5)当松开时锁定动作
当松开鼠标按键时控制量的值改变。
当程序读取控制值一次后,控制值恢复原来的值。
这种动作可以保证新的控制值被读取一次。
(这种动作类似于对话框中的按钮,点击时按钮变为高亮度,松开时锁定,等待读取。
)用这种动作终止While循环,使下一次运行便利。
(6)松开前处于锁定状态
点击控制量时它就改变控制值,并保存这个值,直到松开了鼠标并且程序读取这个值一次。
后三个动作与前三个对应,只是与程序读取有关。
为了说明以上按钮的实际工作情况,创建例子”按钮的机械动作.vi”。
在前面板上放置6个Button按钮,6个布尔量指示灯,6个数字量计数器和一个控制程序停止的按钮。
如图3.13所示。
图3.13
当按钮接通时,对应的指示灯亮。
程序每一秒钟循环一次,在对应的数字量显示件中记录按钮接通的次数。
程序代码如图3.14所示。
图3.14
3.6创建图标与接口板
用户可以将已经编制好的程序作为子程序被其他的程序来调用,这时需要为程序创建图标和接口板。
图表就是这个VI程序的图形表示,创建的程序图标将来可以直接放入其他程序的代码窗口中,接口板则定义了该子程序的输入和输出端口。
3.6.1创建图标
LabVIEW为所有的程序创建默认的图标,位于程序前面板和代码窗口的右上角。
图标可以包含文本、图像或两者的混合。
用户何以根据需要设计单色、16色和256色的图标。
创建新的程序”图标与接口板.vi”。
图3.16
图3.15
在程序的前面板或代码窗口的右上角的程序图标上单击鼠标右键,在快捷菜单中选择EditIcon打开程序图标编辑窗口。
也可以从菜单File»VIProperties…,在下拉菜单中选择General,单击按钮EditIcon来打开程序图标编辑窗口如图3.15所示。
该图标编辑器与Windows的画图程序(MsPaint.exe)极其类似,该程序默认创建256色的图标。
鼠标点击选择工具
,选取图标区域黑色框线以内的区域,按Delete键删除,点击文本工具
,在图标区输入“AnyRand”,如图3.16所示,点击OK按钮保存图标并返回。
此处我们仅以文本图标为例说明程序图标的设计方法。
除了使用程序提供的工具进行设计和编辑外,还可以使用现有的图标文件,将其内容直接粘贴到图标区域。
方法是在资源管理器中选择适当的图标文件,直接将其拖放到前面板或代码窗口右上角的图标区域即可。
3.6.2接口板的创建和编辑
图3.17
为了说明接口板的设计过程,首先完成程序”图标与接口板.vi”的前面板和代码设计。
激活前面板Controls»Numeric»DigitalIndicator,名称输入“结果”,Controls»Numeric»DigitalControl,名称输入“比例”,同样创建DigitalControl名称为“基数”。
在代码窗口中按照图3.17所示进行设计和连线,此处不再详述。
一般只有在创建了接口板后,VI程序才能被当作子程序subVI调用。
接口板实际上就是对应于控制件和显示件的端口集,类似于文本编程语言中的函数的参数表。
要察看”图标与接口板.vi”程序的接口板,右击前面板右上角图标选择菜单ShowConnector,则程序图标转换为接口板
。
系统根据前面板的对象的数量和类型给出默认的接口板,本例中由于有两个控制件和一个显示件,所以默认的接口板左侧两个输入端口,右侧一个输出端口。
需要把默认的端口与前面板上的控件连接起来,端口才具有意义。
鼠标选择接线工具,点击接口板的左上角端口,再点击控件“基数”,将控件分配给了第一个输入端口。
端口的颜色变为橙色,表示双精度浮点数。
同样的方法将控件“比例”分配给第二个输入端口,将显示件“结果”分配给输出端口,接口板变成
。
如果操作后接口板上的端口没有改变颜色(保持白色),则说明控件没有成功的分配给指定的端口,需要重新操作。
图3.18
对于不满意的连接,可以将之删除(实际为断开端口和控件之间的连接)后从新创建。
删除的方法如此下:
在要删除的端口上单击鼠标右键,选择菜单DisconnectThisTerminal,端口边为白色,连接已不存在。
注意快捷菜单中的选项RemoveTerminal,表示不仅可以断开端点和控件的连接而且还删除掉接口板上的端口。
快捷菜单中的选项DisconnectAllTerminals则表示一次性删除所有的连接。
当然对于输入和输出参数较多或前面板上具有较多控件的VI程序,直接使用系统给定的接口板未必适合,这时可以自己选择接口板样式。
方法如下:
在接口板上单击鼠标右键,选择菜单Patterns,菜单列出所有的接口板样式,根据所需端口的数量和类型选择。
对于选定的接口板还可以通过快捷菜单进行编辑,选择菜单AddTerminal可