资讯动态

LabVIEW中TDMS数据落盘实战:从基础写入到工程优化

发布时间:2026/10/4 10:21:04 来源:尧图企业网站定制
说起LabVIEW里的数据落盘我的第一反应就是TDMS。接触LabVIEW的前几年我也试过用文本文件、Excel表格直接存测试数据结果在长时间采集项目里被折磨得够呛文件越来越大、写入越来越慢、半路断电丢数据最痛苦的是采集完还得花一两个小时解析这些乱七八糟的文本。后来认真把TDMS文件的创建与写入研究了一遍才真正体会到这个格式对数据存储与读取的意义。这篇把自己实际使用的经验整理出来不打算只讲函数怎么摆而是把“为什么要这么写”“会遇到什么坑”也一并说清楚。示例就以很多人接触到TDMS时的第一道练习题为例用LabVIEW产生一个包含10个随机数的一维数组把这个数组写入TDMS文件。适合刚开始学LabVIEW的、也想搞清楚TDMS工作原理的人同样适合已经在用但想优化写入方式的工程师。1. 为什么是TDMS而不是文本或Excel存储选择背后的逻辑1.1 文本文件和Excel在持续采集场景下的三个硬伤先说说我自己的经历。早期用LabVIEW做温度循环试验的数据记录一个小时大概会产生几十万个数据点。当时图省事用“写入电子表格文件”函数每次都把数据追加到CSV里运行到第四十分钟的时候一次写入的时间从几毫秒涨到了快一秒。因为CSV每次追加都是往文件末尾写文件越大操作系统处理起来越慢采集循环被拖住时间戳歪得没法看。这还不是最要命的。CSV文件一旦写入过程中程序崩溃或电脑断电后面那一大段数据基本就废了。Excel更脆弱数据量大一点文件就损坏打不开。而且CSV没有结构概念你要记录“这个文件里存的是什么传感器的信号”只能在第一行塞一个奇怪的表头时间长了根本说不清。这三个问题——写入性能、数据安全、结构自描述——恰好就是TDMS设计时重点解决的问题。1.2 TDMS的设计逻辑测试测量场景下的通用格式TDMS的全称是Technical Data Management Streaming也叫TDM Streaming是NI在LabVIEW 8.0时期引入的文件格式重点服务数据采集与测试测量领域。它被设计成面向流式写入的格式写入速度非常快理论上瓶颈在磁盘本身而不是软件同时它支持层次化结构让数据在文件里就有清晰的逻辑组织更难得的是TDMS支持在文件里直接写属性把测试条件、采样率、硬件信息都封装在同个文件里。一句话概括TDMS想在单个文件里同时解决数据本体、数据结构说明、数据附属信息这三个问题。1.3 什么东西适合用TDMS时间序列信号、循环采集的数据、DAQ卡采集的波形、自动化测试中每个测试点产生的数值……这些都很适合。特别是在需要长期连续记录的场景TDMS的流式写入优势会更明显。顺便说一句不是所有东西都适合TDMS。比如你要给客户交付一个统计报表客户大概率只想要Excel或者PDFTDMS更适合作为“原始数据存档格式”而不是“最终报表格式”。平时采集存TDMS最后分析完再导出报表这是我的推荐套路。2. TDMS文件怎么打开先解决“tdms文件用什么软件打开”2.1 三种打开途径很多人拿到tdms文件第一个问题就是它用什么打开。其实途径很多我最常用的是三种。第一种是LabVIEW自带的“TDMS文件查看器”。菜单栏“工具”→“测量”→“TDMS文件查看器”浏览文件即可查看全部通道和属性还能导出为文本或Excel格式。这种方式最省事不需要额外安装任何东西。第二种是NI官方的TDM Excel Add-In。装了之后Excel可以像打开自己的工作表一样直接打开TDMS文件非常适合做数据复看和简单分析。这里有个高频坑插件位数必须和Office位数一致32位Office配32位插件64位Office配64位插件否则Excel里根本看不到加载项。第三种是第三方库最典型的是Python的npTDMS。做离线大数据分析时我会用Python读TDMS配上pandas、matplotlib做可视化和统计效率比LabVIEW里操作高不少。后面我会专门写一篇npTDMS的用法这次先不展开。2.2 Root-Group-Channel三层结构打开TDMS后你会看到一个三层结构根Root、组Group、通道Channel。这个结构非常重要我直接用会议室模型来解释整个TDMS文件 一个会议室组Group 会议室里的一块白板代表一个测试场景或一次试验通道Channel 白板上的一条曲线代表某一个传感器或变量的全部采样数据根是最顶层文件本身就是一个根。一个文件可以有很多组一个组可以有很多通道。读写时通过“组名/通道名”来定位数据查找和解析都很有条理。2.3 索引文件.tdms_index是什么这里特别说一下当你创建TDMS文件并选择“TDMS压缩文件格式”后磁盘上会同时出现两个文件xxx.tdms和xxx.tdms_index。.tdms_index是索引文件记录数据在文件中的存储位置让读取时能快速跳过无关区域。它只是辅助文件在正常关闭后会合并进.tdms文件。但如果在异常断电时索引文件可能残留这并不代表数据一定坏了先别急着删。至于什么时候该删、什么时候不该删我会在第6节详细讲。3. 从“10个随机数数组”开始的创建与写入实操3.1 需求拆解网上经常看到这样的练习题“产生一个包含10个随机数的一维数组将该一维数组的元素写入TDMS文件。”我猜这应该来自某本LabVIEW教材或者某个实验报告的题目。把这个需求拆开其实就是三件事生成一个一维数组元素为10个随机数创建一个TDMS文件并打开它将数组写入TDMS的某个组和某个通道然后关闭文件3.2 程序框图搭建步骤在LabVIEW中搭这个框图其实很简单我按顺序说一下。放一个For循环循环次数设为10循环体内放“随机数(0-1)”函数路径是“编程→数值→随机数”用自动索引隧道把循环产生的数据累加成一维数组在函数选板中找到“编程→文件→TDMS→TDMS Open”设置文件路径为“D:\test_data\random_data.tdms”操作选择“create or replace”接下来配置TDMS Write节点给它指定组名和通道名比如组名test_group通道名random_channel把一维数组连接到TDMS Write的data输入端最后接TDMS Close节点关闭文件句柄如果用文字表达整个流程逻辑是这样的打开文件TDMS Open 设置组名/通道名test_group / random_channel 写入数据一维随机数组 关闭文件TDMS Close这里提醒一个新手最容易忽略的点TDMS Open返回的是一个TDMS文件引用必须把它连到后面的TDMS Write和TDMS Close否则会产生句柄泄漏。句柄泄漏在调试时不容易被发现但程序跑久了就会出现“无法打开文件”或者“打开次数过多”的怪毛病。3.3 如何验证写入成功写完以后用第2节说的“TDMS文件查看器”打开刚才的路径检查文件里是否有test_group组和random_channel通道再看数组元素是否为当时生成的随机值。如果数据能正确显示说明整个“创建→写入→关闭”链路已经跑通。如果你在TDMS Open里选择的是“open or create”重复运行程序时数据会被追加到原有文件里如果每次运行都想覆盖就选择“create or replace”。这个操作的细节直接关系到你的数据是丢了还是留下了我在下一节单独展开。4. TDMS Write背后的关键细节操作模式与属性管理4.1 TDMS Open的操作模式怎么选TDMS Open函数的“操作”输入端有多个选项很多人第一次看到都会懵。我整理了一个对照表你直接按场景选就行。操作模式文件不存在时文件存在时典型案例open报错正常打开读取已有文件create创建新文件报错每天定时生成新文件open or create创建新文件打开并追加长期记录程序重启后续写replace or create创建新文件覆盖旧文件重跑试验结果无所谓保留replace报错覆盖旧文件明确知道旧文件可以被删除这个选择非常重要。如果你的采集程序一直在跑想每天生成一个新文件用文件名带日期 create模式更合理如果长期记录程序重启后要接着写就用open or create。最怕的是路径下已有重要历史数据却误选了replace模式直接覆盖连后悔药都没有。4.2 属性是TDMS的灵魂TDMS最容易被初学者忽略的是属性Property。属性可以挂在根、组、通道三个层级上用来存名称、单位、采样率、硬件信息、操作人员、备注等。我举个例子采样率如果只存在程序里文件拿给别人看的时候别人不知道数据的时间间隔是多少还得反复问。但把采样率写到通道属性里别人打开文件一眼就能看到。在LabVIEW中使用“编程→文件→TDMS→TDMS Set Properties”函数写入属性。属性名有讲究NI定义了一些以NI_开头的预定义属性比如NI_ChannelName用于设置通道名NI_UnitDescription用于设置单位描述。自定义属性建议用普通英文命名不要用NI_开头避免和预留名称冲突。属性写入可以在写数据之前或之后但我的习惯是在正式写数据之前把属性都写完。这样一旦开始持续采集就不会因为中途插入属性操作而影响写入节奏。4.3 多通道数据如何组织实际项目里不会只有一路随机数。多路信号建议一个物理传感器对应一个通道组织规则可以记成一句话设备或试验名作为组每一路信号作为通道。例如“温循试验”组下可以有两个通道一个叫“炉温”一个叫“样品温度”。在TDMS Write中只需要调用两次写入节点分别指定不同的通道名即可。更常用的做法是使用“写入TDMS文件”多态VI中的“波形”模式把波形数据的t0、dt、Y数组等信息一次写入读取时也能自动恢复成波形省去手动保存时间轴和采样率的麻烦。5. 性能调优与连续采集写入方式决定程序能不能长期跑5.1 数据攒一批再写TDMS虽然快但不代表可以无限频繁地调用写入函数。我见过有人把TDMS Write放在单次采样循环里每个数据点都调用一次写入结果采样率稍微提高一点CPU占用直接拉满。正确思路是攒一批再写。很多采集设备不是采样一个输出一个而是缓冲区里积累了一批样本LabVIEW每次读几千个点出来。这样一次写入的数据量大写入次数少效率高得多。在DAQmx中可以通过“每通道采样数”控制每次读取的样本数对底层串口或USB数据可以在程序里维护一个队列或数组攒够N个点再统一写入。5.2 缓冲、Flush与关闭时机TDMS写入有内部缓冲机制。TDMS Write先把数据递交到缓冲区操作系统再异步落盘这样I/O等待不会阻塞采集循环。但缓冲区也意味着一个潜在风险断电时可能有一部分数据还没真正写到磁盘上。如果你需要降低断电丢数据的风险可以定期调用TDMS Flush函数把缓冲区数据强制写入磁盘。但Flush会打断流式写入的节奏频繁调用会影响吞吐。我的习惯是一般场景不主动Flush让系统自然写入高价值试验中每写满一定数据量做一次Flush同时配合文件轮替。5.3 用生产者/消费者结构防止阻塞连续采集时最怕的就是写文件太慢拖垮采样。这里强烈推荐用生产者/消费者结构也就是队列结构采集循环作为生产者只管把数据放进队列写文件循环作为消费者从队列取出数据写入TDMS。这样即使磁盘偶发变慢采样循环也不会被拖住。我在实际项目中通常会把程序拆成三个循环采集循环、文件写入循环、界面显示循环。三个循环之间用队列或通知器通信互不阻塞。这个结构再加上“前面板显示、文件写入、日志记录”的分工整个程序的可维护性会高很多。5.4 采样率估算公式这里给一个参考计算。假设采样率是100 kS/s每个采样点用float64类型存储也就是8字节那么每秒的数据量就是100000 × 8 800 KB/s。运行一小时大约产生800 KB/s × 3600 s ≈ 2.8 GB数据。用这个公式你可以提前规划磁盘空间和文件切分策略。如果磁盘紧张可以考虑用float32类型存储数据量减半但精度会降低需要根据实际测量要求权衡。很多时候程序变慢不是LabVIEW的问题而是写文件策略不合理。6. 工程实战中踩过的坑断电、索引残留与文件分发6.1 强制断电后数据还在吗TDMS对写入过程中的文件损坏有一定的容错能力。正常情况下每次写入都会在文件里记录已写数据的位置。程序异常退出或断电后文件头部信息可能不完整但TDMS读取器仍能读取到断电前一段时间已经写入的数据。不过不能依赖这个“容错”。对于长时间试验正确做法是分段保存加定期切换文件。比如每隔1小时或每写满一定大小就关闭当前文件并新建下一个文件文件名带上时间戳experiment_20250601_120000.tdms这样即使某一段文件出问题损失也限制在一个小时内而不是整个试验数据全部报废。文件切换的成本很低新建文件后写入头属性、再开始写数据几毫秒就能完成。6.2 .tdms_index残留文件不能乱删我在一个项目里遇到过非常典型的情况从测试电脑拷贝TDMS文件到U盘时只复制了.tdms没有复制.tdms_index结果在另一台电脑上打开时软件提示数据异常。其实这不代表文件坏了因为索引文件丢失后许多TDMS读取器会扫描主文件重建索引但打开速度会慢很多。反过来如果关闭文件后仍然残留.tdms_index文件通常说明文件没有正常关闭或者磁盘发生了异常写入。残留索引文件不影响数据文件本身但拷贝时容易混淆建议排查一下程序退出时是否遗漏了TDMS Close或者杀毒软件是否占用了文件句柄。6.3 中文路径、通道名和超长路径的兼容性LabVIEW和TDMS本身都是Unicode编码中文路径基本能用。但如果文件要交给第三方软件处理比如Excel插件或Python库中文路径可能会带来额外风险。我之前用Python读一个放在中文路径下的TDMS文件就遇到过编码解析乱码的问题。稳妥的做法是工程目录统一用英文加日期命名例如“temp_cycle_20250601.tdms”通道名用英文缩写中文用途写在属性描述里。这只是一个建议LabVIEW本身不强制但能省去很多跨平台协作的麻烦。6.4 文件分发前做一次压缩归档LabVIEW里有一个“打包TDMS文件”的快捷操作本质上就是把.tdms_index合并入.tdms文件生成一个独立的、不依赖索引文件的完整TDMS文件。分发之前尽量先关闭文件并执行这个合并操作确保交付出去的是完整、单文件、可直接打开的数据。还有一点给文件写属性时先想好属性挂在哪个层级。我吃过“属性写在group上别人却在channel上找”的亏所以项目组内部会先统一约定属性层级避免交付后的沟通成本。最后再分享一个我自己的习惯凡是长期采集的项目我都会在TDMS文件里加一个“测试说明”属性把采集时间、硬件型号、采样率、量程倍率、操作人全部写进去。这个习惯帮我节省了很多沟通成本——半年后回头翻数据不用再去问别人“当时采样率设的是多少”打开文件属性一看就知道。如果你刚开始接触TDMS先照着第三章那个随机数的例子走一遍把“创建→写入→关闭→查看”的闭环跑通再慢慢去研究属性、缓冲和文件切分。数据存储与读取这件事底层原理并不复杂难的是在真实工程里把每个细节都照顾到。希望这篇经验能让你少走点弯路。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑