Labview - 手自动存储TDMS文件的区别

在Labview的软件开发过程中,少不了使用DAQ(Data Acquisition)助手,在使用DAQ助手采集数据时,通常需要存储数据,此时我们可以使用DAQ助手的配置界面设置TDMS(Technical Data Management Streaming)文件路径。而TDMS文件是NI主推的一种二进制记录文件,可以大大减小数据的存储容量。

为了研究使用DAQ助手自动存储TDMS文件产生的数据大小,我专程写了个测试程序,使用NI MAX创建的模拟采集卡生成模拟正弦波信号,通过测试程序进行采集和存储。

示例程序

程序名称:仿DAQ设计.vi

  • 前面板

前面板

  • 程序框图

程序框图

程序测试

采样信息

  • 模拟采集卡:NI USB-6341
  • 采样频率:100Hz;
  • 采样点数:100;
  • 采样时间:5分钟;
  • 物理通道:ai0,ai1,ai2;

采样过程

  • 程序运行中

saveTdms

  • 程序运行结束

saveTdmsEnd

采样结果

总采样点数:30000*3 = 90000
.tdms文件大小:180kB(185,132Bytes)
185216(Bytes)/90000 ≈ 2.057956Bytes ≈ 2Bytes
.tdms_index文件大小:5.01kB(5132Bytes)

说明每个采样点对应的存储大小为2Bytes左右。如果使用普通文件(如:.txt/.dat等)存储,一个双精度型数据需要占用8Bytes的空间,对应其文件大小将是tdms文件的4倍左右。

说明

局限性

  1. 如果使用DAQ助手自动存储TDMS文件,它将存储已创建的所有虚拟通道的数据,无法单独存储某一通道的数据。

  2. 对于同一个采集卡设备,当用户需要连续采集多路通道的电压/电流信号时,因为采集卡的多路通道使用相同的参考时钟源和多路复用器,所以只能使用一个DAQ助手。此外,该设备的所有通道对应的采样频率也必须一致。但如果用户的多路通道不是同一类型,例如:电压和计数值,像这种情况,用户能且只能使用多个DAQ助手。

手动存储TDMS文件

为了解决局限性提到的第2个问题,我尝试手动添加TDMS存储文件,用以替代DAQ自动存储TDMS方式。为此,我修改了部分程序,在保留DAQ自动存储的同时,在获取数据后再次存储。修改部分如下图所示:

manualSaveTDMS

再次运行程序,自动存储的tdms文件大小与上述一致,手动存储的tdms文件大小为:

704kB(720,998Bytes) ≈ 90000 * 8.011089 (Bytes) ≈ 90000 * 8 (Bytes)

可以看出,在手动存储时,每个数据的数据量为8个字节左右,恰好是双精度数据的大小。所以在一般情况下,我们优先考虑DAQ的自动存储功能,如果为了减少数据量使用手动存储方法,即使减少通道数,也未必能达到效果,除非减少后的通道数小等于总通道数的1/4.

文件属性对比

  • 自动存储文件的属性

AutoSaveTdmsProperties

  • 手动存储文件的属性

ManualSaveTdmsProperties

通过属性对比可以看出,自动存储文件比手动存储文件多了一些属性值,包括换算数量NI_Number_Of_Scales换算阶数和配置NI_Scale[n]_config以及换算的启用状态NI_Scaling_Status。为了验证数据存储文件大小不一致是否与这些多出属性有关,我进行了进一步测试,在手动存储过程中设置了tdms文件属性,使其与自动存储文件的属性一致。

SetTdmsProperties

但结果依旧令人失望,文件大小并未因此而减小。理论上肯定有方法减小Tdms文件大小,但我现在还不知晓,路漫漫其修远兮,吾将上下而求索。