4. 文件I/O基础与数据持久化
在LabVIEW测试系统中,采集到的数据最终必须落到磁盘上,才能被报告生成、追溯分析和归档流程使用。LabVIEW提供了三层文件I/O能力:最底层的文本文件、紧凑高效的二进制文件,以及专为测试测量设计的TDMS文件。理解三者的写入读取方式和适用边界,是构建可靠数据持久化链路的基础。
一、三种格式的本质差异
文本文件以ASCII字符存储数据,人类可读,用记事本即可打开,但每个数值都要转成字符串,浮点数会损失精度,文件体积也最大。二进制文件直接按字节写入原始数据类型,读写速度最快、体积最小,但内容不可直接阅读,且必须知道写入时的数据类型和字节序才能正确还原。TDMS(Technical Data Management Streaming)是NI定义的二进制格式,它在二进制的高效性之上,增加了通道分组、属性元数据和流式写入能力,一个.tdms文件由索引文件(.tdms_index)和原始数据文件(.tdms)配合工作,索引中保存了通道结构、单位、采样率等属性,读取时无需重新解析整个数据体。
三者的核心区别可以用一句话概括:文本换可读性,二进制换性能,TDMS换结构化的性能。选择哪种格式,取决于数据后续要被谁使用、以什么方式使用。
二、文本文件的写入与读取
文本写入的典型做法是先用格式化写入字符串把数值数组转成带分隔符的字符串,再用写入文本文件或写入电子表格文件落盘。例如一个温度采集任务,采样率10 Hz,采集5秒共50个点,温度值范围25.0~30.0 ℃。若直接写入,可构造格式字符串 %.3f,以逗号分隔,每行一个采样点,同时写入时间戳列。写入电子表格文件时,分隔符设为逗号,转置设为“是”可让每列成为一个通道。
读取时使用读取电子表格文件,指定分隔符和每行读取的列数,输出为二维字符串数组,再用小数数字符串至数字转换函数逐元素转回数值。这里有一个常见陷阱:如果写入时用了逗号分隔,读取时也必须用逗号,否则整行会被当作一个字符串。另外,文本文件不保存数据类型信息,读取端必须自行约定“第1列是时间、第2列是温度”,一旦写入端列顺序改变,读取端就会错位。
三、二进制文件的写入与读取
二进制写入使用写入二进制文件函数,输入端直接连接数值数组,函数会按数组元素的数据类型(如DBL,8字节双精度)连续写入。读取时使用读取二进制文件,必须指定“数据类型”为DBL、“数据大小”为数组元素个数,否则读出的字节会被错误解释。例如写入50个DBL温度值,文件大小应为50×8=400字节;读取时若把数据类型误设为SGL(4字节),就会读出100个错误数值。
二进制文件的关键约束是写入端与读取端必须严格约定数据类型、字节序和排列顺序。LabVIEW默认使用大端序(Big-Endian)写入,若与C语言程序交换数据,需注意C通常是小端序,必要时用“交换字节”函数处理。二进制适合高速采集的原始波形缓存,但不适合作为最终归档格式,因为一旦约定丢失,数据就难以还原。
四、TDMS的写入与读取
TDMS的写入遵循“打开—写入—关闭”三段式。使用TDMS打开函数,指定路径和操作模式(新建/替换/打开),得到TDMS文件引用;再用TDMS写入函数,指定“组名”和“通道名”,把波形数据写入。组名可设为“温度测试”,通道名可设为“CH1_温度”,同时通过TDMS设置属性写入单位“℃”、采样率“10”、测试人员“张三”等元数据。最后用TDMS关闭函数释放引用。
读取时同样先TDMS打开,再用TDMS读取,指定组名和通道名,即可取回波形数据;用TDMS获取属性可读出单位、采样率等元数据。TDMS的优势在于:读取端不需要知道写入时的列顺序,只要知道组名和通道名就能定位数据;元数据随文件保存,报告生成时可直接引用采样率和单位,无需人工填写。
五、选型判断与持久化链路
实际项目中,三种格式往往不是互斥的,而是形成一条持久化链路:采集循环中先用二进制或TDMS做高速缓存,测试结束后把关键结果以TDMS归档,同时导出CSV供人工查看或交付。判断依据可以归纳为三点:数据是否要被人直接阅读——要,选文本;是否追求极致速度和体积——是,选二进制;是否需要保留通道结构和元数据供报告自动生成——需要,选TDMS。
| 对比维度 | 文本文件 | 二进制文件 | TDMS文件 |
|---|---|---|---|
| 可读性 | 高,记事本可开 | 低,需专用读取 | 中,需TDMS读取函数 |
| 写入速度 | 慢 | 最快 | 快 |
| 文件体积 | 最大 | 最小 | 较小 |
| 元数据支持 | 无(需自行约定) | 无 | 内置组/通道/属性 |
| 精度 | 受格式字符串限制 | 无损 | 无损 |
| 典型用途 | 配置、日志、交付报表 | 高速缓存、临时数据 | 测试归档、报告数据源 |
以本课程后续要实现的报告自动生成流程为例,推荐的数据持久化方案是:采集阶段用TDMS按“组名=测试项目、通道名=被测通道”写入,同时把采样率、单位、测试时间、操作员写入TDMS属性;报告生成阶段用TDMS读取函数按组名和通道名取数,直接读取属性填充报告表头,再按需导出CSV附件。这样既保留了二进制的高效,又让报告生成端不必依赖脆弱的列顺序约定,是测试数据归档中较为稳妥的做法。