1. 数据

表达式节点:在表达式节点中只允许有一个字符串代表输入参数,即只能计算单变量函数。
Express VI:如果运算有多个输入,则可以使用公式Express Vl。
公式节点(Formula Node):在较为复杂的数学运算程序中,使用公式节点可以让程序的可读性和可维护性得到提高。公式节点中的代码无法设置断点和进行调试。为了保证公式节点中代码的正确性,可以先在一个C 语言编译器中对其进行编译调试,在保证其正确性后再放入LabV1EW 公式节点中使用。
MathScript脚本节点:MathScript 提供了更加丰富的计算功能,适用于得要大量复杂科学运算的场合,但运行效率上逊色于公式节点。

1.1 数据类型

枚举型

下拉菜单与枚举类型:
image.png
image.png
在程序中,表示有限的几种物件、几个状态等含义时,应尽量使用枚举控件而不是下拉列表。因为枚举控件的数据类型更加严格,可以防止程序中的某些错误。并且,这样的数据在程序中通常会与选择结构相连,以对不同的状态、事件分别进行处理.而枚举控件按照条目标签来选择分支,可以增加程序的可读性和可维护性。
当程序需要表示的依然是一个数值,只不过需要把用户的输入限定在某几个特定值时,应当使用下拉列表控件。比如,编写一段程序,用于模拟一台示波器,它有3种触发模式:边沿触发、脉宽触发和斜率触发。此时程序应该选用枚举类型的控件表示触发模式。这台示波器可显示的波形幅值范围也有3 挡,分别是0 . 1 V 、0.2 5 V 和1 V。它们是离散的数值,应该用下拉列表来表示这3 个幅值范围。
单选按钮(Radio buttons):
image.png
单选按钮控件的优点是,所有可选的条目都直接显示在界面上,而枚举控件则必须在按下控件后才能查看条目内容; 缺点是单选控件占用界面的尺寸比下拉式的枚举型控件大。

布尔型

机械动作为触发型(门铃)的布尔控件,是不能够使用局部变量和”值”属性节点的。

数组类型

对数组进行编程运算时,需要注意数组长度是否正确,尤其注意输入的数组是否可能为空。有时程序需要对输入的空数组进行特殊处理以避免出错。
数组元素的比较:”比较元素”的意思是对两个数组中对应的每一个元素分别进行对比,比较的结果构成了一个同长度的布尔型嗷组”比较集合”则是把数组整体作为一个数据,同另一个数组相比较,其结果为一个单个的”真”或”假”。(Elements or Aggregates).
索引数组:若输入”索引”均为空,其默认值依次为0 、1 、2 …即输出依次为数组的第一个元素、第二个元素,第三个元素… z 若输入”索引”在某一项索引后为空,则对应空索引的输出依次为非”空”的那-项+1 、+2 …。

在程序中应尽量使用”按名称捆绑/松绑”,而不是直接”捆绑/松绑”。

字符串类型

组合框控件的数据类型也是字符串,可以利用它来限定用户只能选择某几个字符串,组合框与字符串控件的关系很类似于下拉列表控件与普通数值控件之间的关系。

路径

在程序中使用路径数据的时候,应当尽量使用相对路径。以程序主V1 为基准,记录相对路径,所以在程序的主VI 中使用了”当前VI 路径”常量来得到当前VI 的位置。若主VI 所在的路径发生了变动,这个常量的值也会随之变化。
image.png

1.2 数据类型之间的转换

数值表示法之间的转换

强制转换点(小红点)。如果程序中确实需要进行强制转换,则可以使用表示法转换函数〈在函数选板”编程→数值→转换”中) 。这样一来,可以避免无意识下造成的数值转换错误。

数值与字符串之间的转换

二者之间的相互转换都要根据数值是何种进制、是否小数或指数等情况选择相应的函数。”编程→字符串”函数选板上还有两个功能更加强大的转换函数:格式化写人字符串”和”扫描字符串”。

路径与真他数据类型之间的转换

与路径转换相关的转换函数都位于函数选板”编程→文件1/0→高级文件函数”上。最常用的是路径与字符串类型之间转换的两个函数”路径至字符串转换”和”字符串至路径转换。
“引用句柄至路径转换”函数可以从文件的引用句柄中得到文件路径信息。比如可以利用这个函数把”打开/创建/替换文件”中各函数输出的句柄转换为路径,还可以得到TDMS 文件的路径.但由于LabVIEW 中对每种文件的打开机制不一样,这个函数并不适用于LabVIEW 文件类型。例如,不能用它得到LabVIEW 中使用”打开配置数据”VI 打开的INI 文件的路径。
Get Date/Time String Function解释:
image.png
image.png
分割开后一个显示的是日,一个显示的时间。
image.png

变体

变体是LabVIEW 中一种比较特殊的数据类型,其他任何数据类型都可以通过”编程→簇、类与变体→变体→转换为变体”函数转换成变体数据类型.需要时,可再通过”变体至数据转换”函数将其转换为原数据类型。”变体至数据转换”只能将变体转换回原数据类型,而不能转换为其他任何类型。
变体的应用:一般来说, LabVIEW 子VI 的参数数据类型是固定的,一个子VI 只能针对一种特定类型的数据进行操作。但是,有些算法也可以适用于多种数据类型。针对多种不同的数据类型,为这一算法编写多个不同的子VI ,这显然不是一个高效的办法,较为行之有效的办法是选用变体数据类型作为子”的参数。这样,任何类型的数据在转变为变体后,都可调用这个子VI 了.类似的应用还有2 不同类型的数据是不能够放在同一个数组中的。但遇到需要把不同元素放在同一数组中时,可以先把所有数据都转为变体类型,然后构成一个变体类型数组。
image.png
在程序中,若需要得到变体数据原本的类型,则可以使用一个LabVIEW 自带d的VI:LabVIEW2010\LabVIEW2010\vi.lib\Utility\VariantDataType\GetTypeInfo.vi
image.png

变体的应用:一般来说, LabVIEW 子VI 的参数数据类型是固定的,一个子VI 只能针对一种特定类型的数据进行操作。但是,有些算法也可以适用于多种数据类型。针对多种不同的数据类型,为这一算法编写多个不同的子VI ,这显然不是一个高效的办法,较为行之有效的办法是选用变体数据类型作为子”的参数。这样,任何类型的数据在转变为变体后,都可调用这个子VI 了.类似的应用还有2 不同类型的数据是不能够放在同一个数组中的。但遇到需要把不同元素放在同一数组中时,可以先把所有数据都转为变体类型,然后构成一个变体类型数组。

利用变体实现Dictionary 容器(字典窑器〉功能

image.png
变体数据的属性由一个名字和一个数据组成:每个属性的名字都必须是唯一的,数据可以是任意的数据类型。
image.png
变体的属性在LabVIEW中是以哈希表格式存储的。它的查询效率极高,特别适于需要查询大量数据的程序,但它毕竟不是一个真正的容器,还有一些局限性,比如它的标识只能使用字符串。

数据平化至字符串

image.png
将树状结构转换成这种连续连贯的表达方式的过程,称为“平化”。树状结构变成了一块连续的平整内存。”平化至字符串”可以把任何数据类型平化,不论它是否原本就是”平”的。它的输出结果是一个字符串,这个字符串表达的并非是一段有意义的文字,而是以字符串方式表达的一块连续内存中的数据。

数据平化至XML

XML 的全称是可扩展标记语言。由于XML 具备可被人和机器共同理解的优点,它已经被广泛地应用于网络、数据库等众多领域。编程时遇到需要把数据保存成文本文件或者以文本方式传输时,可以考虑把数据转换成XML 格式。XML 文本的缺点是效率较低.因为把数据转为XML 格式后,增加了很多标签,这些标签会占用额外的存储空间,解析标签也会增加程序的运算负担.对于空间效率和运行效率要求较高的程序不适合使用XML 格式的数据。
image.png

强制转换

普通转换方式,数据类型以及数据在内存中的二进制数值都发生了变化,但数据传递的含义不变。强制转换,则恰好相反,在转换过程中,内存中记录的数据不发生变化,但用户看到的显示内容却变了。

布尔与U8之间的转换

布尔型数据和U8 ( 或18) 在内存中同样是用一个字节来存储的,因此这两种数据相互之间的强制转换是有意义的。
image.png

字符串与U8 数组之间的转换

字符串数据在内存中存储数据的方式与U8 数组相同,所以这两种数据之间的类型转换也是有意义的a 转换成的U8 数组中每个元素是字符串中每个字母的ASCII 码,使用十六进制显示字符串时, 看到的也是字符串中每个字符的ASCII 码。不过LabVIEW 已经提供了专门在字符串与U8 数组之间转换的函数”字符串至字节数组转换”和”字节数组至字符串转换”,不必使用强制类型转换.
image.png

引用句柄数据类型

在实际编程中,强制类型转换多用于”引用句柄”数据类型。”引用句柄”在LabVIEW内部用一个132 数值表示,并且没有专门的函数用于其间的转换。所以经常会使用强制类型转换函数在引用句柄和132 之间,以及不同类型的引用句柄之间进行转换。

1.3 控件和数据在程序中的使用

控件的意义

控件在LabVIEW 程序中主要是用来输入输出数据的z 一是作为用户界面,与用户交互3 二是在子VI 中用于与上层程序交换数据.在编写LabVIEW 代码的时候,遇到一个数据从某节点传出,需要暂时保存一下,留给后续某个节点使用的情况时,先不要考虑给这个数据新建一个控件或者全局变量来保存它,而是应该考虑如何连一条数据线,把数据引出,再传递到需要使用它的那个节点。

控件的标签和标题

LabVIEW 的控件有标签和标题这两个非常相似的属性, 二者的共同点都是为了给控件一个有意义的名称;它们的主要区别是:
标签是控件唯一的标识,每个控件的标签应当是唯一的。标签在程序运行过程中是不可以改变的. LabVIEW 提供的某些高级函数可以在程序运行时,根据控件的标签找到一个控件,并对其操作。尽管LabVIEW 并没有禁止给不同的控件使用同一标签名,但这种编程习惯极其有害,会为程序留下隐患。因此,编程时一定要注意,控件不能使用同一VI上重复的标签或空白标签.
标题更侧重的是界面上显示出来的名称,是可以在运行时改变的。有些控件在程序中可能有多个含义,在表示不同含义时需要给予不同的文字提示。此时,就可以在界面上显示控件的标题,并在程序中动态对其进行修改。标题的另一个重要用途是软件本地化的需要.标签作为控件的唯一标识在程序的各种语言版本中都应当相同,而能够改变的文字就是标题了.所以,需要本地化的软件,应当把控件的标签隐藏起来而显示其标题。
image.png

局部变量

子VI 的控件是用于与高层程序或用户交互数据的,而不是用于暂存和传递VI 运行中产生的临时数据的.控件局部变量的用途与控件相同,只是起辅助作用。.在VI内部传递数据的功能应当由数据连线完成,只有在不得不使用局部变量的情况下,才应该考虑使用它。
一般,在把数据写入控制控件或从显示控件读取数据,多线程间的共享数据时,可以考虑使用局部变量。
image.png
在这个例子中,”字符串”控f件牛必须在其鼠标右键莱单中被设置为”键入时刷新(synchronous display)“这样, 每输入一个字符,程序都会自动检查一下,看看当前字符串的值是否需要修改。否则, 程序会等到用户在字符串控件上输入完所有字符后,才更新字符串控件的值。
应用于多线程间的共享数据:
image.png
程序对比,LabVIEW 的循环体具有如下特点z若有数据从循环外流入循环体内,则程序认为循环体内既然需要这一数据,就只有等接收到这一数据后,循环才能开始迭代运行;若有数据流出循环体,程序考虑到每一次循环迭代,其数据都可能发生变化,所以只有当循环结束才能输出一个最终的确定值。数据线从上方循环体内引到循环体外,再引入到下方另一个循环体内。也就是说,下面这个循环需要上面那个循环的输出值,两个循环间形成了顺序上的依赖关系.实际运行程序时,框图上面的循环会先开始运行,直到用户单击”停止”按钮循环结束,才能把”停止”控件的值传递出循环体。”停止”数据流入下方的循环,下方的循环才开始迭代运行。由于这个”停止”值是”真”,下方循环迭代一次即停止,这样的运行逻辑就不可能完成设计中让两个循环同时运行的功能。

属性节点

在属性项中,有一项名为”值”,其作用相当于局部变量.但是程序运行时,属性节点的效率要大大低于局部变量。另一项名为”值(信号)”的属性则是用来作为该控件发出”值改变”事件信号的。

调用节点

调用节点的创建、使用方法与属性节点类似,区别在于调用节点用于选择方法,以完成控件的某些行为. 每个调用节点只能选择一种方法。

1.4 应用实例

字符串公式求值

数值—脚本与公式—1D-多D—vi

字符串转换为布尔数组

输入一个十六进制的字符,输出一个与十六进制字符等值的4 位布尔型数组。
image.png
image.png

程序运行申改变控件标题

在界面上放置一个数值型控件,既可用于输入一个长度值,也可用于输入一个重量值;再放置一个枚举类型单选按钮控件,用户可通过其输入选择数值控件的标题,显示是输入长度还是重量.
image.png

禁止枚举控件中的某些项

只需要用到属性:DisableItems[]
image.png

在字符串中显示多种字体

输出一个字符串”LabVIEW 真好用!”,并突出强调”好用”两个字。
image.png``

为列表框控件添加自定义的图标

image.png