LabVIEW之TDMS文件

在很多场合,早期的LabVIEW版本不得不借助常规的数据库来做一些数据管理工作,但常规数据库对于中高速数据采集显然是不合适的,因为高速数据采集的数据量非常大,用一般的数据库无法满足存储数据的要求。

直到TDM(Technical Data Management)数据管理技术,TDMS流式技术的引入,使得快速存储和查询、管理采集数据成为可能。

TDM采用文件、通道组和通道三层结构来描述和记录数据。每一层都包含固有属性,也可以自定义属性。TDM文件可以理解成小型的关系数据库,其中文件相当于数据库;通道组相当于数据库的表;通道相当于不同的字段。

一个完整的TDM包括两个文件,文件扩展名分别为tdm和tdx。tdm类型文件记录的是属性信息,比如文件的作者、通道组名称、通道名称和信号单位等,tdm文件时XML格式的文件,可以使用常用的浏览器打开以粗略的查看它的具体内容。tdx文件时纯粹的二进制数据文件,用来记录动态数据类型信号。

TDM适用于高速数据采集场景的机制是:由于TDM采用各种属性来描述采集的数据(相当于数据库的索引方式),因此我们可以快速定位数据,从而提高了写入和查询速度。

TDM正在被LabVIEW8.2之后推出的TDMS逐步替代,TDMS的存取速度更快,编辑方式也与普通VI相同,更适合新用户使用。这里主要介绍TDMS文件。

1.TDMS文件

LabVIEW为操作TDM文件提供了一些快速VI。这些VI的输入输出端子既可以通过对话框配置,也可以引出供用户动态修改。LabVIEW的快速VI适于快速搭建数据采集存储系统,但是快速VI在简化编程的同时,也丧失了一定的灵活性,TDMS的快速VI选板如下图所示。

图1 TDMS的快速VI选板

TDMS文件的读写过程也遵循打开、读/写和关闭三个步骤。TDMS文件是NI公司新推出的数据管理系统,以二进制方式存储数据,所以文件尺寸更小、速度更快。因此它在具备二进制文件优点的同时,又具备关系型数据库的一些优点。据测试,TDMS格式文件的存取速度能够达到600MB/s。这样的存取速度是能够满足绝大多数数据采集系统存取的需要。

2.TDMS的基本构成

如此之快的存取速度得益于TDMS内部的结构,TDMS与TDM一样采用三层的逻辑结构。但是它们的物理结构是完全不同的。TDMS分为文件、通道组、通道三部分。三种对象的关系是逻辑层次关系,处于顶层的是文件对象。文件对象包含固定的属性信息和用户自定义的属性信息,每个文件对象可以包含任意数量的通道组对象。同样的,通道组对象也包含属性信息(如名称等),每个通道组对象可以包含任意数量的通道对象。通道对象也同样具有自己的属性信息(如信号、名称等)。在三层不同的属性中,只有通道属性包括原始数据,通常为一维数组。

LabVIEW专门提供了TDMS文件函数选板,其位于“文件IO”选板中,如下图所示。

图2 TDMS函数选板

3.简单文件读/写

TDMS的读/写与一般格式的文件基本相同,也包括打开、读写、关闭三个步骤。简单的文件读写过程如下图所示。结束循环后调用“TDMS文件查看器”函数。TDMS查看器用于浏览TDMS文件,该文件包括文件属性、组属性、通道属性、通道数据等信息。通道数据既可以用表格方式显示,也可以用波形图方式显示。

图3 利用TDMS文件存储随机数并显示

在图3中,写入数据时未指定组名称和通道名称,所以在文件查看器中组名、通道名均显示为“未命名”。“TDMS写入”函数可以接受各类数据类型数据作为输入(包括波形、一维二维波形数组、数字表格、动态数据、一维二维数组(数组元素类型可以为有符号或无符号整数、单双精度或扩展精度数值、不包含空字符串的有数字和字符组成的字符串、时间标识、布尔型数据))。

通过设置通道组和通道可以记录不同类型的数据。如下图所示在“测试组”中,包括三个通道,分别记录了双精度、时间标识和整形数据。

图4 在TDMS文件中写入多种类型数据

在读取TDMS文件时,需要指定文件名、通道组名称、通道名和通道的数据类型,如下图所示。“TDMS读取”函数还允许指定偏移量和总数,实现TDMS文件的随机读取。第一个数据偏移量规定为0。

图5 读取TDMS文件中多种类型数据

4.波形数据的写入和读取

TDMS文件高速存取的特性,使得它特别适合于海量数据存取。TDMS文件在数据采集应用中,经常用于存取波形数据。如下图所示在TDMS文件中同时写入多组波形数据。

图6 存储波形数据

写入波形数据后,按照上面读取数据的方式在TDMS文件中同时读取多组波形数据,如下图所示,波形数据既可以一次全部被读取,也可以随机读取。通过指定偏移量和总数。可以分段随机读取数据。

图7 读取波形数据

5.表格的写入和读取

TDMS允许存储二维数值数组或者字符串数组,数组的每一列作为一个通道,如下图所示。存储表格数据时需要注意,不允许有空字符串,遇到空字符串可以采用空格或其他不可打印字符替换,然后再存储。

图8 读取二维数值数组和字符串数组

6.TDMS文件的属性

通过“TDMS列出内容”函数,可以查看通道组名称和通道名称。若不输入“通道组名称”参数,函数将返回所有通道组名称和所有通道名称。输入“通道组名称”,则返回对应通道组的所有通道名称,“TDMS列出内容”函数的用法如下图所示。

通过“TDMS设置属性”函数和“TDMS获取属性”函数,可以设置或者取得文件、通道组、通道的属性,对文件、通道组和通道可以设定任意数量的属性。

图9 列出TDMS的通道组、通道名称

7.TDMS文件的内置属性

TDMS文件允许设置任意数量的属性。同时,TDMS文件也存在固有的属性。跟踪“TDMS查看器”函数,可以看到该函数使用了两个TDMS的内置属性:NI_DataType和NI_ChannelLength。前者返回通道存储数据的类型码,通过类型码可以判断通道存储的数据类型;后者返回通道包含元素的个数,即长度,通过通道长度可以判断是否读取到通道尾部。如下图所示。

图10 获取通道长度及元素数据类型

使用“TDMS设置属性”函数可重命名.tdms文件中的组和通道。将NI_UpdateGroupName端子连线至“属性”输入端可以对通道组重新命名;将NI_UpdateChannelName端子连线至“属性”输入端可以对通道重新命名。这个还有许多自定义的属性可以查看函数帮助具体了解。

以上就是TDMS文件比较完备的介绍了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/14491.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

设置IDEA的内存大小,让IDEA更流畅: 建议设置在 2048 MB 及以上

文章目录 引言I 更改内存设置基于窗口界面进行内存设置修改内存配置文件II IDEA中的一些常见问题及其解决方案引言 方式一:基于窗口界面进行内存设置方式二:修改内存配置文件I 更改内存设置 基于窗口界面进行内存设置 打开IDEA,上方菜单栏 Help > Change Memory Settin…

攻防世界ctf

1.题目名称-文件包含 if(isset($_GET[filename])){$filename $_GET[filename];include($filename);} 通过代码审计,我们发现这存在文件包含漏洞,由于没有很好的进行过滤,所以我们可以通过 URL 参数传递任意文件路径给参数$filename&#…

多线程操作

一.多线程 1.线程的创建 1.继承Thread类,重写run()方法创建线程 2.实现Runnable接口,重写run()方法 3.匿名内部类创建线程 4.匿名内部类实现Runnable接口创建线程 5.[常用]lambda表达式创建线程 2.启动线程 Thread类使用start方法,启动一个线程,对于同一个Thread对象只能…

根文件系统 Debian10【1】移植

1.开发背景 一般根文件系统使用 Busybox 或者是 Buildroot 构建,这样构建出来的文件系统比较小,但是不具备上网功能,扩展性比较差。随着 ARM 的日益强大,ARM 可以搭载更庞大复杂的系统,可以是 Ubuntu 或者 Debian 等发…

OpenSIPS-Dispatcher模块详解:优化SIP流量分发的利器

在 OpenSIPS 中,dispatcher 模块用于实现负载均衡和故障转移。通过 dispatcher 模块,你可以将 SIP 请求分发到一组后端服务器(如媒体服务器、代理服务器等),并根据配置的算法和策略动态调整分发逻辑。 模块功能使用样…

09vue3实战-----引入element-plus组件库中的图标

09vue3实战-----引入element-plus组件库中的图标 1.安装2.引入3.优化 element-plus中的icon图标组件的使用和其他平台组件(如el-button按钮)是不一样的。 1.安装 npm install element-plus/icons-vue2.引入 在这我们只讲述最方便的一种引入方法------完整引入。这需要从elem…

Docker 部署 GitLab

一、下载镜像 docker pull gitlab/gitlab-ce 二、运行容器 docker run -d --name gitlab-20080 \n -p 20443:443 -p 20080:80 -p 20022:22 \n -v /wwwroot/opt/docker/gitlab-20080/etc:/etc/gitlab \n -v /wwwroot/opt/docker/gitlab-20080/log:/var/log/gitlab \n -v /www…

优惠券平台(十七):实现用户查询/取消优惠券预约提醒功能

业务背景 当用户预约了一个或多个优惠券抢购提醒后,如果不再需要提醒,可以取消预约通知。不过,虽然用户可以取消提醒,但已经发送到 MQ 的消息不会被撤回,消费者在时间点到达时依然会收到消息。此时,我们不…

【个人开发】macbook m1 Lora微调qwen大模型

本项目参考网上各类教程整理而成,为个人学习记录。 项目github源码地址:Lora微调大模型 项目中微调模型为:qwen/Qwen1.5-4B-Chat。 去年新发布的Qwen/Qwen2.5-3B-Instruct同样也适用。 微调步骤 step0: 环境准备 conda create --name fin…

深入理解进程优先级

目录 引言 一、进程优先级基础 1.1 什么是进程优先级? 1.2 优先级与系统性能 二、查看进程信息 2.1 使用ps -l命令 2.2 PRI与NI的数学关系 三、深入理解Nice值 3.1 Nice值的特点 3.2 调整优先级实践 四、进程特性全景图 五、优化实践建议 结语 引言 在操…

大数据学习之SparkSql

95.SPARKSQL_简介 网址: https://spark.apache.org/sql/ Spark SQL 是 Spark 的一个模块,用于处理 结构化的数据 。 SparkSQL 特点 1 易整合 无缝的整合了 SQL 查询和 Spark 编程,随时用 SQL 或 DataFrame API 处理结构化数据。并且支…

k8s的操作指令和yaml文件

一、项目的生命周期 创建----》发布----》更新----》回滚----》删除 1.创建 kubectl create deployment nginx1 --imagenginx:1.22 --replicas3 #基于deployment控制器创建pod,控制器的名称是nginx1,pod使用的镜像是nginx:1.22,pod的数量有3个 2.发布 ku…

解锁 DeepSeek 模型高效部署密码:蓝耘平台全解析

💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也…

k8s部署rabbitmq

1. 创建provisioner制备器(如果已存在,则不需要) 1.1 编写nfs-provisioner-rbac.yaml配置文件 apiVersion: v1 kind: ServiceAccount metadata:name: nfs-client-provisionernamespace: wms --- kind: ClusterRole apiVersion: rbac.author…

评估大模型(LLM)摘要生成能力:方法、挑战与策略

大语言模型(LLMs)有着强大的摘要生成能力,为信息快速提取和处理提供了便利。从新闻文章的快速概览到学术文献的要点提炼,LLMs 生成的摘要广泛应用于各个场景。然而,准确评估这些摘要的质量却颇具挑战。如何确定一个摘要…

dmd-50

dmd-50 一、查壳 无壳,64位 二、IDA分析 main 下面的内容中数据经过R键转换,你就会知道v41的内容,以及是当v41成立时key是有效的。 v41870438d5b6e29db0898bc4f0225935c0 结合上面的函数知道:v41经过MD5解密后是key 注意是…

关于图像锐化的一份介绍

在这篇文章中,我将介绍有关图像锐化有关的知识,具体包括锐化的简单介绍、一阶锐化与二阶锐化等方面内容。 一、锐化 1.1 概念 锐化(sharpening)就是指将图象中灰度差增大的方法,一次来增强物体的轮廓与边缘。因为发…

全程Kali linux---CTFshow misc入门(38-50)

第三十八题: ctfshow{48b722b570c603ef58cc0b83bbf7680d} 第三十九题: 37换成1,36换成0,就得到长度为287的二进制字符串,因为不能被8整除所以,考虑每7位转换一个字符,得到flag。 ctfshow{5281…

vue3学习四

七 标签ref属性 设置标签ref属性&#xff0c;类似于设置标签id。 普通标签 <template name"test4"> <p ref"title" id"title" click"showinfo">VIEW4</p> <View3/><script lang"ts" setup>…

STM32 软件SPI读写W25Q64

接线图 功能函数 //写SS函数 void My_W_SS(uint8_t BitValue) {GPIO_WriteBit(GPIOA, GPIO_Pin_4, (BitAction)BitValue); }//写SCK函数 void My_W_SCK(uint8_t BitValue) {GPIO_WriteBit(GPIOA, GPIO_Pin_5, (BitAction)BitValue); }//写MOSI函数 void My_W_MOSI(uint8_t Bit…