TDMS文件格式是NI推荐易于交换、固有结构化、具有高速流传输能力的文件格式,用于将基于时间的测量数据保存到磁盘,以实现高性能、可用性和复用性。借助NI-DAQmx驱动,可以实现将数据快速传输到磁盘中,速率可高达1.2GB/s。
NI 定义了技术数据管理 (TDM) 解决方案,其中包括三个集成组件:
TDMS 文件格式采用三个层级结构,如图所示:文件、组和通道。
文件级别可以包含无限数量的组,每个组可以包含无限数量的通道。
在层次结构的每个级别,您可以存储无限数量的自定义标量属性。
每个级别都接受无限数量的自定义属性,以实现记录良好且可搜索的数据文件。
无需设计自己的标头结构。随着您的文档要求增加,您不必重新设计您的应用程序;您只需扩展模型即可满足您的特定需求。
您用于记录测量数据的自定义属性越多,日后通过使用 NI DataFinder 客户端(可从用户那里抽象出复杂的数据库通信)来定位测量数据就越容易。
数据以段为单位写入TDMS文件。每次将数据附加到TDMS文件时,都会创建一个新的数据段。有关此规则的例外情况,请参考本文的元数据和原始数据部分。数据段由以下三部分组成:
关于TDMS文件结构格式更详细的内容请看NI的链接:TDMS文件格式内部结构 - NI
最简单的方式是使用 写入测量文件ExpressVI。该Express VI 提供了基于对话框的简单配置,但牺牲了性能,并且不适合高速流或实时应用。
.lvm
中的文件扩展名 设置为 ..lvm
.tdm
中的文件扩展名设置 为 ..tdm
.xlsx
),这是一种开放的 XML 文件格式。文件名中的文件扩展名 设置为 .xlsx
.
使用 Express VI 配置对话框中的“操作”选项来配置文件保存选项。选项包括:
如果文件已存在,您可以选择以下选项:
右键单击 Express VI 并转到属性
在前面板上创建一个控件,用户可以在其中指定文件路径。
对于写入lvm文件
对于tdms文件,选择x value(time)columns为 one column only
如果未勾选时间戳选项,耶尔可以根据时间的相关信息进行计算
以这种方式呈现数据是为了减小 TDMS 文件的大小。如果时间戳作为值存储在每个测量组选项卡上,则 TDMS 文件将在磁盘上占用数倍的数据。
如何计算相对于测量开始时间的时间戳
要计算每个数据点的相对时间戳,我们可以使用以下公式:
time_relative = ' wf_start_offset' + 'wf_increment' x [样本数]
示例:计算每个数据点的相对时间戳时从上面的示例 TDMS 文件屏幕截图中的“组 1”中的“通道 1”,我们将得到以下结果。
如何使用绝对测量时间计算时间戳
要计算测量每个数据点的绝对时间,我们可以使用以下公式:
time_absolute = ' wf_start_time' + 'wf_increment' x [样本数]
示例:计算绝对时间戳时对于上面示例 TDMS 文件屏幕截图中“组 1”中的“通道 1”,我们将得到以下结果。
为了保证数据流盘的性能,最好是使用底层的文件函数。
注意: “Write Data” VI (写入数据VI)除信号输入外,还有两个输入:名称和单位。
通过双击 “Write Data” VI,可以选择要通过配置对话框保存的其他信息,类似于 "Write to Measurement File " Express VI 的过程。
TDMS读取自定义属性
NI的开发环境都是可以写入和读取TDMS文件,但是未安装NI软件的电脑就存在局限性,这时候就需要安装NI的TDM插件,他是微软Excel的免费插件,使得其他用户也可以自由访问TDMS文件。
下载TDM Excel Add-In for Microsoft Excel - NI
有时,在写入TDM数据文件后,必须对数据文件进行手动修改或扩展。用户可以使用免费的 TDM Excel 插件在 Excel 中打开 TDM 文件,并将其编辑保存到新的 Excel 文件中。只要对新 Excel 文件中的数据或属性所做的修改继续遵循原始数据布局(如本文档中所述),则可以使用 NI 件读取新 Excel 文件免费的 ExcelTDM 数据插件。只要维护架构,使用 Excel 进行手动修改的过程就可以无限期地重复。
DAQmx Configure Logging VI。此VI可用于配置在DAQ选板上的单个VI内如何将数据写入到TDMS文件中。 这样一来,此VI不仅易于使用,并且易于集成到现有的数据采集应用中,而且经过后台优化后,这也是将数据写入磁盘的最快方式。
这种将数据流式传输到磁盘的方法可以通过优化多个内存操作并绕过 Windows、LabVIEW 和 TDMS 缓冲区来实现最大效率,从而真正突破高速测量数据流的界限。使用 DAQmx 配置日志 VI 进行的测试已实现超过 1.2 GB/s 的数据流速率。
NI-DAQmx提供了一个非常简单的数据压缩方式,即将样本末端的位省略掉,并将得到的样本封装到内存。开发人员可将NI-DAQmx配置为省略样本中的一个或多个最低有效位。例如,可以将具有24位分辨率和32位采样容量的通道配置为仅返回20个最高位。这样总共省略了12个位,其中包括8个未使用的位,因而可将所需的磁盘空间减少37.5%。但在某些情况下,样本包含了未使用的位,这样省略掉这些位并不会“丢失”数据。例如,一个具有12位分辨率和16位采样容量的通道包含4个未使用的位。舍弃这4个位不会带来造成数据丢失,却可以减少25%的所需磁盘空间。NI-DAQmx不执行任何其他无损或有损压缩算法,例如LZW或JPEG。
有多种选项可以减小 TDMS 文件的大小:
DMS 内置了许多优化,以尝试使占用空间尽可能接近二进制。
当您编写具有相同频道列表和元数据的两个段时,TDMS 格式将跳过该段的元数据(甚至是开头),这意味着所使用的空间仅为原始数据的空间,从而提供有效的“压缩率”为100%。
假设我们将完全相同的通道重复写入文件,我们只得到一份元数据副本,其余的都是原始数据,这正是我们想要的。
但考虑一下这种情况:
在一种常见情况下,我们可能希望向文件写入两次。每次 TDMS 写入都会向文件写入一个段,在这种情况下,因为它将在两者之间交替,所以元数据确实会发生变化,并且每次都必须写入。这会导致文件碎片化。
在我们使用多个 TDMS 写入节点写入单个文件的任何场景中,都会发生这种情况。
您还可以看到碎片级别将取决于每次写入中包含的原始数据量。
如果我们每次写入10,000 个点,元数据仍然比原始数据小得多,虽然碎片化,但可能是可以接受的。
然而,如果我们每次写入1 个样本,那些绿色区域将会缩小很多,您最终可能会得到比实际数据更多的元数据!
我们可以通过查看使用文件时生成的 tdms_index 文件的大小来衡量碎片的影响。这本质上是从文件中提取的所有元数据。
在这里我们可以看到文件2.tdms正是我们想要的。1kB 元数据到 15MB 文件。然而, 0.tdms 的碎片很严重,36MB 文件中的 12MB 用于元数据(在这种情况下,文件0.tdms和1.tdms实际上包含完全相同的数据,但使用了稍后提到的一些技术,并在提到的示例中进行了演示)在最后)。
在处理碎片文件时,您还会看到库的内存使用量随着时间的推移而增加。这是因为 TDMS 库在内存中保存文件的模型,整理元数据,以便它可以执行诸如执行随机访问之类的操作。元数据越多,需要的内存就越多。
(相反,一些报告称,按照意外的严格定义,这并不是“内存泄漏”,它是完全可以预测的,并不是说它会让你感觉好很多!)
要减少内存,您需要减少碎片,或者定期关闭并打开新文件。
要将TDMS数据集导出到Excel,请参考以下步骤:
如果您的数据长度大于1,048,575,则在执行步骤1后将显示以下窗口。
这是由于Microsoft Excel支持的最大行数为1,048,576。因此,您必须确定导入的开始索引。也就是说,如果要将2,000,000个数据从TDMS文件的单个通道导出到Excel文件,则必须执行两次导出,其中第一次导出的起始索引为1,而第二次导出的起始索引为1,048,576。
未完成,后续更新其他文件格式和数据库