技术数据管理流(TDMS)是NI软件最常用于存储所采集数据通道的文件格式,同时它也对第三方工具开放。 如需了解TDMS文件格式的优势以及可读写该文件格式的程序和API,请阅读以下文档:
如需了解TDMS文件的比特层面的二进制结构,请阅读以下文档:
Developer Zone教程: TDMS文件格式内部结构
通常情况下,只写入一个有效的TDMS文件是不够的。 该文档介绍了创建TDMS文件的最佳实践,以便用户能够以最佳方法查找、分析、比较和报告所采集的数据通道。 采用这些TDM文件的相关建议可帮助用户实现更多的数据管理功能,提高通道定时清晰度并优化加载速度。
TDMS数据文件一般包含两种类型的信息: 采集的数据阵列,通常称为 批量数据传送,以及设置条件和/或纯量结果,通常称为 元数据。 TDMS文件总是将批量数据存储在单个一维阵列中,即 通道。 TDMS文件可将元数据存储为纯量名值对,即 属性。 它们可关联至三个层次:文件、通道组或通道。 存储为属性的信息(即这些属性关联的层次)以及每个属性的命名都会对元数据的数据管理可用性产生影响。
将元数据写入属性,而非通道
元数据应始终存储为可搜索的属性,而非不可搜索的数据通道。 TDMS数据通道是针对用于绘制图形和分析的数据阵列而设计。 将纯量设置信息和纯量结果值存储至单值数据通道会使读取应用程序产生混淆,因为这会将“真”数据通道与“伪”数据通道混合在一起。 而如果将已命名的纯量信息存储到属性中,则可极大提升NI LabVIEW和DIAdem等许多TDMS读取应用程序的浏览和搜索体验。 例如,下图直观同步地显示了数据通道值(曲线图)和通道属性(表格):
图1. 通道数据和属性
使用有效的名称写入属性
TDMS属性包含三个部分: 属性值、属性名称和属性层次。 TDMS文件格式的属性值可使用任何字符,但许多TDMS文件读写应用程序却有属性名称限制。 以下属性命名建议可确保无论使用哪种TDMS读取程序,属性名称都会保持不变。
下表列出了用于所有TDMS文件的两种特殊属性名称。
表1. 特殊属性名称
层次 | 姓名 | 描述 |
文件 | DateTime | 整个TDMS文件的开始日期和时间 |
通道 | Unit_String | 通道单元的字符串显示 |
将属性写入正确的TDMS层
TDMS属性包含三个部分: 属性值、属性名称和属性层次。 TDMS文件格式可允许用户将属性保存至文件、文件中的任何通道组或任何通道组中的任何通道。 属性的保存位置对于其可用性有非常大的影响。 以下建议可帮助用户更好地根据一个或多个属性条件搜索所需的TDMS文件部分。
反之亦然:
常见的错误是将一系列设置属性(称为 设置信息)写入通道组,但没有包括任何通道信息。 这就无法搜索满足设置属性条件的选定通道组或通道。
所采集的数据通道具有隐式(恒定采样率)或显式(时间值通道)关联的时间信息。为了实现自动分析,需要在读取TDMS文件时可靠地找到该时间信息。 请注意此处的术语时间 包含其他关联X轴的物理量。
通常,所采集的数据是相对X轴上的时间信息绘制出,但也包括其他相关X轴物理量如角度、频率、位移等。 尽管下文为了方便仅使用“时间”一词,但以下建议也适用于这些相关的X轴物理量。两种常用于录制相关时间信息的方法是隐式波形信道属性和显式日期/时间通道。 两种方法都需要许多额外通道属性才能完成文档说明。
时间通道与数据通道的关联
如果TDMS文件中与所采集数据通道相关的时间值存储在一个或多个显式时间通道,那么就需要制定一条规则来说明哪个采集数据通道与哪个显式时间通道关联。 这里需要制定一条规则是因为TDMS文件格式不具有内置功能来进行此关联。
最明显最简单的方法是每个通道组始终仅有一个显式时间通道,并始终将该显式时间通道置于该通道组的第一个通道。 这会出现两种常见的情况: 每个通道组包含一个显式时间通道以及一个采集数据通道(XY) ,或每个通道组包含一个显式时间通道以及多个采集数据通道(XYYY),如下图所示:
Figure 2. XY Channel Group
Figure 3. XYYY Channel Group
写入完整的日期时间通道和属性
TDMS文件提供了用于属性和数据通道的本地日期时间数据类型。 保存日期时间信息时,请务必使用这一内置时间日期选项。仅写入使用秒数的数字值并不能充分地记录时间日期信息,因为不同的TDMS文件读写应用程序对于起始日期时间值和增量单位(秒或天)有不同的规定。 对于NI LabVIEW程序,用户应将褐色的 日期时间线 直接连线到属性值或通道数据输入,如下图所示:
图4. NI LabVIEW中的日期时间属性和数据通道
日期时间值的另一个考虑因素是地理位置(时区)的记录和读取。 一些TDMS文件读取应用程序具有地域相对性(假设处于同一时间区域),而其他程序则具有地域绝对性(UTC,基于英格兰格林威治时间)。 如果TDMS读写应用程序与其地理区域设置不匹配,则读取的日期时间值可能与写入的日期时间值不同。 为了防止这种可能性的发生,最好的方法是保存一个额外的 UTC_Offset 属性(为实数值),以存储TDMS写入应用程序与格林威治标准时间之间的小时差(分数)。
写入完整的波形通道
如果数据通道是以不规则的时间间隔采集的,则需要显式时间通道来准确记录时间。 但是,通常情况下所有数据通道通过硬件定时以恒定的采样率进行采集。 在本例中,将时间信息存储为一组通道属性集对于正确记录时间信息是一个有效而且绝对够用的方法——无需显式时间通道。 下表列出了TDMS文件的标准波形属性名称。 请注意 wf_xname 和 wf_xunit_string 属性并不是NI LabVIEW的默认设置——用户需要自己将这些属性添加到TDMS文件中的每个波形通道:
表2. 标准波形属性名称
Name | Example | Required? | Description |
Wf_XName | 时间 | 必需 | X轴数字的名称 |
Wf_XUnit_String | s | 必需 | X轴数字的单位 |
Wf_Start_Offset | 0 | 必需 | X轴的初始偏置值 |
Wf_Increment | 0.001 | 必需 | X轴的增量值 |
Wf_Start_Time | 可选 | 时间轴的初始日期时间值 | |
Wf_Samples | 必需 | X轴数值的数量 |
TDMS文件格式的设计目的是在尽可能快地读写数据的同时仍保持足够的灵活性来适应采集过程中通道数量和采样率的变化。 但是数据读写速度快的文件未必可快速加载。 TDMS文件是一个完全的二进制文件,由多个部分数据段组成,在写入文件时每个数据段叠加在另一个数据段之上。 这些数据段包含分配到一个或多个通道数据值缓冲区以及/或关联至一个或多个层次的元数据属性。 通常,TDMS文件包含的数据段越少,加载速度越快。
每次写入或读取TDMS文件时便会生成一个 TDMS_Index 文件,该文件包含二进制数据段的分布图。 之后如果读取同一个TDMS文件,系统会询问TDMS_Index文件以确定正确的比特位置来读取TDMS文件的每个通道和属性集合。 一般来说,如果生成的TDMS_Index文件大小与TDMS文件相似,则该TDMS文件被“碎片化”,也就是说该文件包含的数据段多于所需的数据段,因此加载速度变慢。 无论在采集过程中还是采集后,均可采用多种方法来最小化多余数据段的数量,以达到最大的TDMS文件读取速度。
以最少碎片写入TDMS文件
首先,如果使用NI数据采集硬件来采集数据,则可考虑使用NI-DAQmx TDMS写入功能,因为该功能可自动写入未碎片化的TDMS文件。 如果使用NI LabVIEW采集数据通道,则可从 TDMS高级选项 选板中选择VI,以写入碎片化程度最小的TDMS文件。 如果使用标准TDMS写入函数,则以下技巧可以最大程度减少TDMS文件的碎片化。
采集后对TDMS文件进行碎片整理
即时由于数据采集限制而不得不创建碎片化的TDMS数据文件,用户仍可在采集后解决这个问题。 如果使用的是NI LabVIEW, TDMS碎片整理 功能能够以最低程度的碎片化重新写入TDMS文件。 或者,如果将TDMS数据文件加载到NI DIAdem并重新保存,则生成的TDMS数据文件也具有最低程度的碎片化。
写入加载速度提高通道属性
如果读取TDMS文件的目标应用程序是NI DIAdem,则可通过创建以下四个TDMS文件中每个数据通道的属性来大幅提高加载到NI DIAdem的速度。 如果这四个属性都没有出现且加载指定TDMS数据通道时填充了一个有效值,则NI DIAdem将会自动计算这四个属性来加快图轴的自动换算速度。 如果这些属性已经创建并填充了有效值且关联至TDMS文件的每个数据通道,则该TDMS文件加载到NI DIAdem的速度将会快很多。
表3. 提高NI DIAdem内文件加载速度的属性
名称 | 范例 | 描述 |
最小值 | -3.14 | 通道的最小值 |
最大值 | 3.14 | 通道的最大值 |
单调性 | 非单调 | 如果通道是单调递增或者递减 |
NoValueKey | No | 如果通道中存在任何NaN值 |
您采集数据的目的是进行决策。 但是,没有效率地组织原始数据会导致数据分析时出现问题。 整理应用程序中的原始数据时应着重考虑当前系统需求以及文件如何适应未来应用程序的需求
|