Labview - 存储 .cfg 配置文件
配置文件简介
在 LabVIEW 应用软件开发过程中,对于稍微大型一点的软件而言,一般都需要在本地文件中保存一些配置参数,如在 windows 系统中安装软件时,安装程序在 C 盘 documents 文件夹下自动创建的用户数据。对于需要更新的配置参数或者重要的常值参数,在 LabVIEW 中可以使用 .cfg
格式的配置文件进行存储与读取。
应用场合
- 软件的全局配置参数(如:串口通讯参数,DAQ 采样参数,信号处理参数,···)
- 软件主界面关闭前的输入、输出控件的最新数值
- 报表生成时的默认信息(如:署名,标题,摘要,···)
- 统计量(如:游戏最高分,排行榜排名,参与次数,···)
- ···
.cfg 文件格式
如下所示,.cfg
文件的数据存储格式格式满足标记性语言的特点,有点类似于 JSON
和 XML
,但与之不同的是 .cfg
不支持数据嵌套。.cfg
文件以段为基本单位、以键为最小单位组织数据,段包含了相应的段名及该段包含的所有键,每个键包含了相应的键名和键值,中间用等号连接。
[段名1]
键名1 = 键值1
键名2 = 键值2
键名3 = 键值3
[段名2]
键名4 = 键值4
键名5 = 键值5
键名6 = 键值6
[段名3]
键名7 = 键值7
键名8 = 键值8
举例说明:某人要保存自己每日的就餐时间,此时可用一个段来存储,段名为“就餐时间”,三个键名依次为早餐、午餐和晚餐,具体的时间以字符串格式存储,存储后的结果如下:
[就餐时间]
早餐 = 07:30
午餐 = 12:00
晚餐 = 05:30
数据类型
LabVIEW 提供的与配置文件存取相关的函数支持以下6种数据类型,其中布尔型即开关量,仅包含 TRUE
, FALSE
两个值;路径指的是文件或文件夹的路径。
- 有符号整型:
I8
,I16
,I32
- 无符号整型:
U8
,U16
,U32
- 浮点型:
DBL
,SGL
- 布尔型:
BOOL
- 字符串:
STRING
- 路径:
PATH
变体
LabVIEW 提供了一种特殊的数据类型——变体,变体类似于 C 语言中的空类型指针 void*
,不代表具体的类型,但可以存储任意类型的数据。
在存储配置文件时,可以先将满足 1.3 中类型的数据转换为变体数据,然后以变体数组形式存储,方便统一管理;同样,在读取配置文件时,也可以先将数据读取到变体数组中,后续再进一步解析。具体操作步骤后面会有详述。
代码实现
了解了配置文件的格式及数据类型,下面介绍如何在 LabVIEW 实现配置文件的存取。
配置函数
LabVIEW 提供了以下函数供开发人员使用:
但应用较多的与配置文件存取相关的函数主要有:
- 打开配置数据
- 关闭配置数据
- 转换至变体
- 从变体转换至数据
- 写入键
- 读取键
打开配置数据
Open Config Data.vi
用于打开配置文件,如果文件不存在则先创建再打开,返回引用句柄用于后续的数据存取。
关闭配置数据
该函数与 Open Config Data.vi
成对出现,在对配置文件进行存取操作后,需要使用 Close Config Data.vi
关闭对配置文件的引用,释放配置文件占用的内存。
转换至变体
To Variant.vi
可将任意数据类型的数据转换为变体数据。
从变体转换至数据
Variant To Data.vi
是 To Variant.vi
的逆过程,通过指定数据类型,可以将变体数据还原为转换为变体前的数据。
写入键
除错误簇外,Write Key.vi
包含4个输入:段对应字符串类型的段名,键对应字符串类型的键名,值对应任意数据类型的键值,引用句柄用于连接配置文件的引用句柄。说明:LabVIEW 中的引用句柄等同于 C/C++
语言中的引用,即变量的别名。
该函数根据输入参数将键名和键值保存到配置文件的指定段中,如果是首次创建指定的段,则自动在配置文件中添加新的段及键;如果段已存在键不存在,则仅添加键;如果段与键均已存在,则仅用新键值替换旧键值。
读取键
使用 Read Key.vi
,通过段名和键名,我们可以从指定文件中获取所需的数据。
需要说明的是, Read Key.vi
是多态VI,其键值的数据类型是多态可选的,可选项参见 1.3。
存储配置文件
说了一大堆,那到底如何存储呢,还是用程序框图来说话吧,一目了然。
RWConfigData.vi
写操作
该 VI 名为 RWConfigData.vi
,不涉及配置文件的打开与关闭,是配置文件打开以后的操作,文件的引用句柄为 refnum in
和 refnum out
。函数接口如下:
插播一句,在 LabVIEW 中,许多函数的输入输出都是成对出现的,尤其是引用句柄和错误簇,这有点类似于 java 语言中用于返回当前对象的 this 指针,便于实现函数的链式调用,令代码更简洁,并增强代码的可读性。
言归正传,以上程序框图中,CMD
是个枚举变量,包含 Write
和 Read
两个值,分别对应文件的写操作和读操作;输入参数 DataParam
是一个簇,包含了需要存储的数据,簇包含的数据元素如下:
SectionName : 段名(单个字符串)
KeyName : 键名(一维的字符串数组)
DataType : 数据类型(一维的枚举数组,枚举包含了文中提及的 6 种数据类型)
VariantData : 键值数据(一维的变体数组)
用变体数组的方式可以批量处理待存参数,高效便捷,唯一繁琐的一点就是需要先将待存参数均都转换为变体数据。上面的程序框图仅显示了布尔型数据的存储方式,其它类型的数据的存储方式与之相似,每种类型的数据对应一个条件分支。
RWSingleElement.vi
写操作
对于单个参数的存储,同样可以使用该函数,结合配置文件的打开、关闭函数,具体代码实现如下:
代码中的元素信息就是某个待存参数的相关信息,用到的存储子 VI 就是上面描述的 RWConfigData.vi
。该程序本身 RWSingleElement.vi
的函数接口如下:
读取配置文件
与存储相对应的操作是读取,上面提及的两个VI RWConfigData.vi
和 RWSingleElement.vi
对应的 Read
分支分别如下:
RWConfigData.vi
读操作
RWSingleElement.vi
读操作
配置文件存储例程
下面给出一个非常简单的配置文件存取示例程序。
- 示例程序前面板
- 示例程序框图 写操作
- 示例程序框图 读操作
- 示例程序 执行结果
下载链接
http://pan.baidu.com/s/1eRRVqRg
PS:最后友情说明一下,其实文件扩展名不一定要设为 .cfg
,其它类似 .ini
, .sys
等扩展名也都是可以的。
版权声明:本博客所有文章除特殊声明外,均采用 CC BY-NC 4.0 许可协议。转载请注明出处 litreily的博客!