字符串
字符串是ASCII码字符的集合,当用户与GPIB和串行设备的通信,读写文本文件以及传递文本信息时,字符串都是非常有用的。字符串中的字符有些是可显示的,有些则是不可显示的。
LabVIEW在功能模板上的字符串子模板中提供了一整套的字符串处理函数,能够完成各种字符串处理功能。常用的字符串对象包括字符串输入控件和字符串显示控件,它们位于控件→新式→字符串与路径→字符串输入控件,字符串显示控件。如图:
字符串的显示方式:
在前面板上放置一个字符串输入控件,右击鼠标,弹出如图所示的菜单:
从上图中可以看出字符串有4种显示方式
下图是“www avrvi.com”分别用这4种方式显示,如图:
字符串函数
打开程序框图中的字符串函数,如图:
字符串函数模板除了包含一般的字符处理函数以外,还包含各种字符常量,以及字符串与数字量,路径的相互转换函数。
其中最后一行包含了各种常量,可以方便的使用。
字符串应用举例:
例一:组合字符串
该例的目的是将一些字符串和数值转化成一个新的输出字符串。
- 新建一个VI,在前面板上放置字符串输入控件“命令字”和“单位”,符串显示控件“输出命令字符”,数值输入控件“数值”和数值显示控件“字符串长度”。
- 切换到程序框图,在字符串函数模板中选择“格式化写入字符串”,如图连线:
- 双击“格式化写入字符串”函数,弹出如图所示对话框 对它进行参数设定,将分数的长度改为4,如图:
- 同样在程序框图中添加“字符串长度”函数计算字符串的长度,它用于返回输出的命令字符串的长度。
- 完成连线,如图: 运行结果如图:
例二:字符串子集和数值的提取
实际应用中很多情况下,必须把字符串转换成数值,例如需要将从仪器中得到的数据字符串转换成数值。
该例的目的是从一个输入的字符串中,提取一个子字符串,另外扫描字符串,将子字符串转换为数据。
- 新建一个VI,按照如图所示放置输入和输出控件。
- 切换到程序框图,从字符串函数模板中,选择“部分字符串”函数,在该例中,它的功能是返回从偏移地址开始的指定长度的子字符串。
- 选择“扫描字符串”函数,它用于扫描字符串,并将有效的数值(0~9,正,负,e和E)转换成数值。如果连接了一个格式字符串,它将根据字符串指定的格式进行转换,否则将进行默认格式的转换,该函数的初始扫描位置参数用于设置初始扫描位置,它与“数字相对偏移量”相连。
- 完成连线,如图: 运行结果如图: 注意:LabVIEW的偏移地址是从0开始计数的。
文件I/O
文件输入输出是程序设计中的一个重要概念,一般来说,文件是存储在磁盘伤的数据的集合。文件输入与输出就是要在磁盘文件中保存和读取信息数据,以文件形式存储起来的数据具有“永久性”,数据文件不仅可以与LabVIEW语言编写的其他VI交换数据,而且可以被其他程序共享。
文件输入与输出操作主要包括3个基本的步骤:新建或者打开一个已有的文件,对文件进行读写和关闭文件。
LabVIEW支持的文件格式主要包含以下3种:
- ASCII码文本格式文件
- 二进制格式文件
- LabVIEW数据记录文件
- ASCII码文本格式文件
文本文件又称为ASCII码文件或字符文件,它的每一个字节代表一个字符,存放的是这个字符的ASCII码。文本文件的优点是它几乎在任何应用程序中都是可读的,这种文件最易于进行整体互换,用户可以用其他的软件来访问数据,例如字处理软件Word或者Excel等,在仪器控制系统中的大部分控制指令也是用文本字符串。当然在写文件之前必须要将所有的数据都变成ASCII字符串格式,读文件之后要将字符串恢复为原数据值。
文本文件的缺点是占用的磁盘空间较大,比如存储一个浮点数-864.39571,因为每个字符要占用一个字节,所以需要10个字节空间。文本文件的存取数据过程中存在ASCII码与机器内码的转换,所以存取数据的速度也比较慢。
- 二进制格式文件
二进制文件是把数据按其在内存中存储的形式(机器内码)原样输出到磁盘上,所以它的存取速度最快,格式也最紧凑。二进制格式占用的磁盘空间比ASCII码文本文件要小得多,对于上诉的浮点数-864.39571,如果存储为单精度型,只占用4个字节,要是存储为双精度型,则占用8个字节。
用户在读写二进制文件时,必须明确文件使用的时哪一种数据类型,各种类型的二进制文件之间是不能通用的。二进制格式文件可以随机的访问其中的某一数据。而这一点是文本文件无法比拟的,要想在文本文件中访问某一数据,则必须把它之前的数据全部都读出来,才可以访问所需要的数据。
- 数据记录文件
数据记录文件也是一种二进制格式的文件,只有LabVIEW才可以对它进行读取和处理。数据记录文件可以看成是数据库文件格式,它将数据存储为一系列相互独立的有各自数据类型的记录,就像簇一样,每一个记录可以包含不同类型的数据,这些数据类型是由用户事先指定的。LabVIEW允许用户自由读取数据记录文件,在各个记录中索引出不同数据类型的数据,并且每一个记录文件都包含由时间标记。
LabVIEW在程序框图上的为我们提供了一整套功能强大而且方便灵活的文件输入/输出函数,如图:
具体每个控件的作用和功能不在这里向大家详细地介绍,下面将通过一系列地例子来说明各种文件的读取。
例一:
使用“写文本文件”函数写文本文件
1.新建一个VI,在前面板上放置一个“波形图表”,将标签内容改为“温度”,取消显示曲线图注和X,Y坐标轴标签,同时放置一个数字输入控件,将标签改为“采样点数”。再放入一个“文件路径输入控件”,它位于控件→新式→字符串与路径→文件路径输入控件,如图:
2.后面板程序如图:
其中用到了一个LabVIEW自带的程序Digital Thermometer.vi,在程序框图中点击“选择VI…”,如图:
系统会自动打开一个对话框,如图:
在我的计算机里,它位于labview8.2→Activity→Digital Thermometer,如图:
其中在“格式化写入字符串”函数上的“%3.f\n”是转换后保留三位小数,字符串间以回车间隔。
回到前面板,点击“路径”右边的小图标:
打开一个对话框,选择文件的存储路径,如图:
选择完后,程序即可运行,运行结果如图:打开记事本,即可看到写入的文件,如图:
此程序中利用了For循环自动索引的功能,一次产生了10个数据,然后逐一写入文本。正因为此,“写入文本文件”是高层文件I/O操作函数,高层文件I/O操作函数每调用一次就会实现创建或打开文件,读写文件,关闭文件的整个过程。如果需要向文件中连续写入数据,这样的效率是非常低的。如果想要提高效率,可以采用底层文件I/O操作函数来实现写文本文件。
例二:
使用底层文件I/O操作函数向文本文件写入数据。
图中框起来的便是底层文件I/O函数
前面板的构建和例一类似,下面是程序框图:
从途中可以看出,程序进行循环后,文件则被打开,这样就可以一直向文件中输入数据,直到循环结束,才关闭文件,它大大提高了写文件的效率。
运行结果如图:
从上图可以看出,每两个数字之间正好间隔一个Tab定界符。
例三:写电子表格文件
“写入电子表格文件”函数的应用与“写入文本文件”函数的应用十分相似。它能直接写入一维或是二维的数据。程序框图如图:
图中Generate Waveform.vi也使LabVIEW自带的一个VI,它与前面所讲的Digital Thermometer.vi在同一个文件夹里,它是用于模拟产生抽样信号的。该函数默认的是将数据在表格中按行排列,那么一个二维数组的记录则只有两行,若在该接口中给其赋值“真”,则数据会按列排列。
运行结果如图:
打开保存的电子表格文件,即可看到数据
例四:读文本文件
该例采用在例一中保存的文件,程序框图如图:
说明:其中用到了一个LabVIEW自带的子VI:Extract Numbers,它位于LabVIEW8.2→examples→general→strings,如图:
单击确定后,系统会弹出下面的对话框:
选择Extract Numbers.vi,它的作用是提取由逗号,分行符号,非数值字符等分隔开的数据所组成的ASCII字符串,并将它们转换成数值数组,用于将读取的字符串转换为双精度数据类型的一维数组。运行结果如图:
例五:另一种读取文本文件的方法
上面的例子是用一个函数完成了,文件的打开,读取,关闭。和写入文本文件时一样,我们也可以通过三个函数来实现以上的三个步骤,程序框图如图:
其中For循环默认的是自动索引,在连线后,需将图中框起来的两个节点禁用索引。运行结果如图:
例六:读取电子表格文件
本例使用例三所产生的表格文件。
程序框图如图:
运行结果如图:
从结果中可以看到,因为例三在生成表格文件时采用的格式为“%.3f\t”,所以从该电子表格中读取数据时,中间的一行空白LabVIEW会自动把它们默认为0数组,从而在波形图表中显示的时候会出现中间的一行红线。