Labview - 存储 .cfg 配置文件

配置文件简介

在 LabVIEW 应用软件开发过程中,对于稍微大型一点的软件而言,一般都需要在本地文件中保存一些配置参数,如在 windows 系统中安装软件时,安装程序在 C 盘 documents 文件夹下自动创建的用户数据。对于需要更新的配置参数或者重要的常值参数,在 LabVIEW 中可以使用 .cfg 格式的配置文件进行存储与读取。

应用场合

  • 软件的全局配置参数(如:串口通讯参数,DAQ 采样参数,信号处理参数,···)
  • 软件主界面关闭前的输入、输出控件的最新数值
  • 报表生成时的默认信息(如:署名,标题,摘要,···)
  • 统计量(如:游戏最高分,排行榜排名,参与次数,···)
  • ···

.cfg 文件格式

如下所示,.cfg 文件的数据存储格式格式满足标记性语言的特点,有点类似于 JSONXML,但与之不同的是 .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 提供了以下函数供开发人员使用:

ConfigFunc.vi

但应用较多的与配置文件存取相关的函数主要有:

  1. 打开配置数据
  2. 关闭配置数据
  3. 转换至变体
  4. 从变体转换至数据
  5. 写入键
  6. 读取键

打开配置数据

OpenConfigData.vi

Open Config Data.vi 用于打开配置文件,如果文件不存在则先创建再打开,返回引用句柄用于后续的数据存取。

关闭配置数据

CloseConfigData.vi

该函数与 Open Config Data.vi 成对出现,在对配置文件进行存取操作后,需要使用 Close Config Data.vi 关闭对配置文件的引用,释放配置文件占用的内存。

转换至变体

ToVariant.vi

To Variant.vi 可将任意数据类型的数据转换为变体数据。

从变体转换至数据

VariantToData.vi

Variant To Data.viTo Variant.vi 的逆过程,通过指定数据类型,可以将变体数据还原为转换为变体前的数据。

写入键

WriteKey.vi

除错误簇外,Write Key.vi 包含4个输入:对应字符串类型的段名对应字符串类型的键名对应任意数据类型的键值引用句柄用于连接配置文件的引用句柄。说明:LabVIEW 中的引用句柄等同于 C/C++ 语言中的引用,即变量的别名。

该函数根据输入参数将键名和键值保存到配置文件的指定段中,如果是首次创建指定的段,则自动在配置文件中添加新的段及键;如果段已存在键不存在,则仅添加键;如果段与键均已存在,则仅用新键值替换旧键值。

读取键

ReadKey.vi

使用 Read Key.vi ,通过段名键名,我们可以从指定文件中获取所需的数据。

需要说明的是, Read Key.vi 是多态VI,其键值的数据类型是多态可选的,可选项参见 1.3

存储配置文件

说了一大堆,那到底如何存储呢,还是用程序框图来说话吧,一目了然。

  • RWConfigData.vi 写操作

RWConfigData.vi Write Data

该 VI 名为 RWConfigData.vi ,不涉及配置文件的打开与关闭,是配置文件打开以后的操作,文件的引用句柄为 refnum inrefnum out 。函数接口如下:

RWConfigData.vi Interface

插播一句,在 LabVIEW 中,许多函数的输入输出都是成对出现的,尤其是引用句柄和错误簇,这有点类似于 java 语言中用于返回当前对象的 this 指针,便于实现函数的链式调用,令代码更简洁,并增强代码的可读性。

言归正传,以上程序框图中,CMD 是个枚举变量,包含 WriteRead 两个值,分别对应文件的写操作和读操作;输入参数 DataParam 是一个簇,包含了需要存储的数据,簇包含的数据元素如下:

SectionName : 段名(单个字符串)
KeyName : 键名(一维的字符串数组)
DataType : 数据类型(一维的枚举数组,枚举包含了文中提及的 6 种数据类型)
VariantData : 键值数据(一维的变体数组)

用变体数组的方式可以批量处理待存参数,高效便捷,唯一繁琐的一点就是需要先将待存参数均都转换为变体数据。上面的程序框图仅显示了布尔型数据的存储方式,其它类型的数据的存储方式与之相似,每种类型的数据对应一个条件分支。

RWConfigData.vi Write Data

  • RWSingleElement.vi 写操作

对于单个参数的存储,同样可以使用该函数,结合配置文件的打开、关闭函数,具体代码实现如下:

RWSingleElement.vi Write Data

代码中的元素信息就是某个待存参数的相关信息,用到的存储子 VI 就是上面描述的 RWConfigData.vi 。该程序本身 RWSingleElement.vi 的函数接口如下:

RWSingleElement.vi Interface

读取配置文件

与存储相对应的操作是读取,上面提及的两个VI RWConfigData.viRWSingleElement.vi 对应的 Read 分支分别如下:

  • RWConfigData.vi 读操作

RWConfigData.vi Read Data

  • RWSingleElement.vi 读操作

RWSingleElement.vi Read Data

配置文件存储例程

下面给出一个非常简单的配置文件存取示例程序。

  • 示例程序前面板

RWConfigFileDemo.vi FrontPanel

  • 示例程序框图 写操作

RWConfigFileDemo.vi Block diagram: Write

  • 示例程序框图 读操作

RWConfigFileDemo.vi Block diagram: Read

  • 示例程序 执行结果

RWConfigFileDemo.vi Result File

下载链接

http://pan.baidu.com/s/1eRRVqRg

PS:最后友情说明一下,其实文件扩展名不一定要设为 .cfg ,其它类似 .ini , .sys 等扩展名也都是可以的。