人类的悲欢并不相通,我只觉得他们吵闹
一、 为什么要使用ini文件?
作为工控人员,在开发上位机的过程中,经常会碰到这种需求:甲方要求在每次运行软件时,软件的初始配置信息需要和上次退出时的配置信息保持相同,如上一次使用过程中设置的温度报警值、压力报警值等参数的设置信息;本此试验过程中,会根据实际情况重新设置新的报警值并保存下来,方便下一次试验时直接使用。
要实现这个目标,可以使用ini文件,将这些配置信息存储到ini文件中,当程序开始运行并初始化时,读取该ini文件里面的内容进行软件的初始化,在程序运行过程中,一旦用户修改配置信息,软件就及时将当前的修改配置信息保存到ini文件中。
二、 ini文件简介
ini是英文“初始化”(initialization)的缩写,一种文件扩展名,也就是一种文件格式。正如其英语所表示的意思,ini文件被用来对操作系统或特定程序初始化或进行参数设置,是某些平台或软件上配置文件的非正式标准,常见于Windows操作系统。打开Win平台电脑的C盘,在一些系统文件的根目录中可以很轻松的找到这种类型的配置文件,如下图所示:
随着Windows操作系统引入注册表以后,其逐渐取代了ini文件统管Windows各项配置的功能,ini类型的配置文件才在系统中大幅减少。但是其配置参数的理念被广泛使用到其它各种应用软件中,用于保存程序的一些固定参数,如应用软件登录的用户名和密码、温度报警的阈值等信息。
ini文件的类容格式主要由:[section]段(或节)和key - value(键值对)组成。“段”用方括号括起来,单独占一行,“键值对”另占一行。个人感觉与python的字典dict数据类型有点相似,只是表现形式有点差别,ini文件格式如下图所示:
同一个ini文件中的段名必须唯一。每个字段由一系列“=”隔开的键和键值组成,键名代表配置选项,值代表该选项的设置,同一个段内键名必须唯一,但不同段之间的键名并无关系。等号左边的字符串为键名,右边的字符串为键值。
三、如何新建 ini文件
1、在电脑桌面右键新建一个文本文档,也就是txt文件,然后重命名该文件,将该文件的后缀由“.txt”修改为“.ini”,然后点击回车、点确定就OK了,如下图所示的ini文件:
2、由于ini文件本质上还是文本文件,在Windows操作系统上直接双击打开就可以进行内容的编辑了。由于人人可以编辑,微软后来就用注册表逐渐取代了ini文件的配置功能。但是ini文件还是由自己的优势的,简单易懂,易于编辑,复制简便,这都是ini文件的优点。
3、特别注意
我们在新建txt文件的时候,txt文件有两种格式,一个是“UTF-8”格式,如下图所示:
另一种格式是“ANSI”,实际上就是GBK格式,如下图所示:
我为什么要把txt文件的两种格式拿出来单独说呢?
主要是从txt文件变来的ini文件,编码模式与txt是一样的。而我在实际的编程过程中发现:LabVIEW无法识别“UTF-8”格式的ini文件,即便你写的所有步骤都是正确的,程序仍然读不到配置文件中的信息。
而当所有程序不变,把ini文件改为“ANSI”格式后,程序就可以顺利读到配置文件里的信息了。至于如何把txt文件的编码格式改为“ANSI”,大家就自行百度吧,貌似要修改注册表。一个比较简便的方法是,找一个ANSI格式的ini文件,复制过来,然后按自己的需要进行修改就可以了。当然,如果你电脑txt文件的默认格式就是ANSI,就不用管我说的这些废话。
新建的ini配置文件放在LabVIEW项目所在的文件根目录里,方便后面vi程序的读取和写入。
四、实战练习
LabVIEW实战练习主要分为3个部分:读取ini文件、写入ini文件以及同时读取和写入ini文件。单独的read和write相对简单一些,同时read和write更接近我们实际的项目编程。
LabVIEW中提供了一组用于操作配置文件的函数集,位于函数选板“编程”“文件I/O”“配置文件VI”子选板中,如下图所示:
这些函数集实际是经过二次封装的VI程序,可以完成对ini配置文件的打开及关闭操作、段和键的读写及删除操作等功能。而“读取健”模块本身是一个多态VI,如下图所示:
点击该多态vi图标上的小三角形,我们可以看到,该多态vi可以读取的数据类型包括:布尔、双精度浮点数、I32、路径、字符串和U32。如果我们需要读取float型数据,直接选择双精度就可以了,或者用默认的自动状态,程序会根据具体的实际情况,将读取的配置文件数据转换相应的数据类型。至于啥是多态vi,我们暂时不要管它,先用再说,等以后对LabVIEW了解得比较深入了,理解这些概念都不难。LabVIEW中对配置文件的编程方式同普通文本文件类似,遵循着打开、读写及关闭的三步原则。后面给出的示例都是遵循该思路来进行操作的。
1、我的开发环境
Windows10(64bit),LabVIEW2017(32bit)
2、读取ini文件
这部分要达到的功能比较简单,就是将上图(ANSI格式文件)中的温度、压力和流量对应的数据进行读取并在前面板对应的数值显示框中显示出来。具体实现代码如下图所示:
从上图可以看到,前面板只有3个数值显示框,程序面板主要包括“打开”、“读取”、“关闭”3个函数模块。“打开”模块需要填写ini文件的文件路径,才能打开相应的配置文件;ini文件中有三个键值对,所以我使用了3个Read Key.vi模块来同时读取这3个数据,读取配置信息完成后,使用“Close Config Data.vi”关闭该配置文件。程序运行的结果如下图所示:
从上图中我们可以看到,LabVIEW程序成功读到了文件名为“配置.ini”文件中对应的数据,并在前面板中显示出来。这个时候就有个问题,上文中ini文件的字段中有3个键值对,要使用3个Read Key.vi模块来进行读取,如果配置文件中字段的键值对有10个或者20个,难道也要用20个Read Key.vi模块来进行读取吗?那程序也太长了吧?
答案显然是不需要,当然你非要使用这种一字长蛇阵也不是不可以。当数量比较多的时候,我们第一个需要考虑点就是使用for循环,有几个数据,就循环几次,这样程序看起来会简洁很多,也方便自己后期阅读和修改。
同样也是读取上图中文件名为“配置.ini”的文件,加入for循环后,可以达到同样的效果,实现程序如下图所示:
上图中最主要的改变就是把需要读取的健名全部放到一个字符串数组中,最后读取的数据也被放到一个数组中,后面索引一下数组就可以得到相应的数据。程序运行的结果与上面的结果是一样的,就不贴出来了。
3、写入ini文件
写入部分的程序也比较简单,主要思路是通过在前面板的数值输入框中输入自己想要设定的数据,新的数据就写入到了对应的ini配置文件里,以实现vi程序对ini文件的写入操作,具体实现代码如下图所示:
前面板就是3个数值输入框,分别对应温度、压力、流量;程序面板也遵循打开、读写及关闭的三步原则。Write Key.vi函数模块放在了for循环中,该模块的输入端参数分别是段名、键名和将要写入的数值3个部分,段名和写入的值有3个,所以用数组来进行输入。不然,就要使用3个Write Key.vi函数模块进行写入操作,不是特别简洁。程序运行的结果如下图所示:
从上述结果可以看到,ini文件的原始数据分别是20.0、30.0、40.0,运行程序后,在前面板的数值输入框输入新的值,关闭vi程序后,新的数据其实已经写入到了ini文件中,但是ini文件无法自动刷新数据,所以需要重新打开ini文件,新的数据就刷新出来了。由于在LabVIEW中,双精度浮点数默认是精确到小数点后第六位,所以我们会看到,写入并保存到ini文件中的数据,小数点后都有6个0。
这里面还有小问题,就是点击程序运行的时候,由于每个数值输入框都有一个默认值0,这个时候,程序一运行,这3个数值输入框的默认值0其实已经写入到了ini文件中了,只是我们手动输入新值后,新值才把这个写入默认值0替换掉了。
先卖个关子,下面会讲到如何规避这个问题。
4、同时读取和写入ini文件
同时读/写ini文件的编程思路是:第一、程序运行时,直接读取ini配置文件中的原始数据并在前面板显示出来;第二、自定义的其他功能程序;第三、在前面板数值输入框中输入自己想要修改的数据,程序会自动写入到ini文件并保存下来。3个部分采用平铺式顺序结构进行编写,具体的实现程序如下图所示:
由上图可知,顺序结构的第一帧是ini文件的读取部分,在程序开始运行时,读取原始ini文件中的内容,在上面的代码中,首先在当前vi程序目录下使用“Open Config Data.vi”函数模块打开“配置.ini”文件,将该函数模块的参数“在必要时创建文件”设为假,即文件不存在时不要创建文件,若文件不存在,则该函数会返回一个错误,此时不作任何处理,否则读取该ini文件。此部分与本节第2小节的程序基本一致,就不做过多解释。
顺序结构的第二帧是实现自定义功能的部分,如果没有其他功能需求,也可以直接删掉
顺序结构的第三帧是ini文件的写入部分,程序使用事件结构,就是为了规避上面第3小节提到的程序已运行就把输入框的默认值写入到ini文件中,使用事件结构后,只有当相应的输入框的数值发生变化,才会将新值写入到ini文件中。程序的具体细节与上面第3小节基本一样,也不做过多解释。程序运行的结果如下图所示:
从运行结果图中可以看到,程序一运行时,就读到了ini文件的原始数据,随着我在数据输入框输入新的数值,数值就写入到了ini文件,重启ini文件可以到新的数据已保存到其中。
五、小结
1、注意txt文件的编码格式,如果不是ANSI格式,需要将其更改为ANSI格式,否则LabVIEW无法读写该配置文件;
2、写入部分的程序尽量使用事件结构,可以规避输入框默认值直接写入到配置文件中;
3、本文只列举了双精度浮点数的读写实现过程,其他类型数据的读写程序都差不多,最重要的是理解编程的思路,并学会举一反三;
4、记得多学多练,活学活用。