将时间表数据写入 MDF 文件的快速入门
此示例说明如何将时间表数据写入 MDF 文件。此示例 MDFTimetables.mat
中使用的 MAT 文件包含两个时间表。
时间表
TT1
具有数值数据类型的变量,包括 uint8、uint16、uint32、uint64、int8、int16、int32、int64、single 和 double。时间表
TT2
具有字符串和字节数组数据类型的变量,包括固定长度和可变长度数据。
简介
表示 ASAM MDF 文件结构的简化模型是由文件、通道组和通道组成的三级层次结构。一个文件由若干通道组组成;一个通道组由若干通道组成。
MDF 文件的内容有两个重要元素:数据和元数据。
写入 MDF 文件的信号或通道数据通常是通过采集或计算获得的。汽车应用的典型信号是传感器数据、ECU 内部变量/状态、车辆网络中的总线流或内部计算的值。在大多数应用中,通道组中所有通道的数据按时间同步,但它们也可能按角度、距离或索引同步。在极少数情况下,可能没有同步域或有多个同步域。当前,MATLAB® 中的 MDF 函数仅支持一个按时间的同步域。
元数据是关于测量环境的附加描述性信息。它们适用于三个层级:文件、通道组和通道。每个层级都有一组按 ASAM MDF 标准定义的元数据字段。
在此示例中,将 TT1
和 TT2
中的数据分别写入一个新 MDF 文件的通道组 1 和 2。如果不需要在三个层级中的任一层级自定义元数据,则应使用此工作流。
如果您需要在写入 MDF 文件时自定义元数据,请使用示例将时间表数据写入 MDF 文件时自定义元数据中的高级工作流。
将时间表加载到工作区
将时间表变量 TT1
和 TT2
,从 MDFTimetables.mat
加载到工作区。
load("MDFTimetables.mat")
将时间表数据直接写入新 MDF 文件
使用 mdfWrite
函数,将目标 MDF 文件名和时间表变量 TT1
指定为输入参量。由于目标文件 TimetableBasic.mf4
尚不存在,因此该函数会自动创建该文件并显示一条警告,告知新创建文件的路径。TT1
中的数据写入文件的第一个可用通道组索引,该索引为通道组 1,因为 TimetableBasic.mf4
是一个新创建的文件。
mdfWrite("TimetableBasic.mf4", TT1)
Warning: Specified target file did not exist. Created file: /tmp/Bdoc24a_2511836_3070643/tp8879c7f7/vnt-ex65847646/TimetableBasic.mf4
再次调用 mdfWrite
以将 TT2
写入下一个可用的通道组索引 2。
mdfWrite("TimetableBasic.mf4", TT2)
检查默认文件元数据
使用此工作流时,文件元数据的默认值由 mdfWrite
在创建 MDF 文件时应用。要检查 TimetableBasic.mf4
的文件元数据,请使用指定的 MDF 文件名调用 mdfInfo
。
info = mdfInfo("TimetableBasic.mf4")
info = MDFInfo with properties: File Details Name: "TimetableBasic.mf4" Path: "/tmp/Bdoc24a_2511836_3070643/tp8879c7f7/vnt-ex65847646/TimetableBasic.mf4" Author: "" Department: "" Project: "" Subject: "" Comment: "" Version: "4.20" InitialTimestamp: 2024-01-26 01:58:22.000000000 Creator Details ProgramIdentifier: "MATLAB" CreatorVendorName: "The MathWorks, Inc." CreatorToolName: "MATLAB" CreatorToolVersion: "24.1.0.2498408 (R2024a) Prerelease Update 3" CreatorUserName: "" CreatorComment: "" File Contents Attachment: [0x7 table] ChannelGroupCount: 2
检查通道组元数据
使用 mdfChannelGroupInfo
检查写入 TimetableBasic.mf4
的两个通道组的元数据。元数据字段(如 AcquisitionName
和 Comment
)被赋予默认值。其他字段(如 NumSamples
、DataSize
和 Sorted
)则依赖于数据。
chanGrpInfo = mdfChannelGroupInfo("TimetableBasic.mf4")
chanGrpInfo=2×13 table
GroupNumber AcquisitionName Comment NumSamples DataSize Sorted SourceName SourcePath SourceComment SourceType SourceBusType SourceBusChannelNumber SourceSimulated
___________ _______________ ___________ __________ ________ ______ ___________ ___________ _____________ ___________ _____________ ______________________ _______________
1 <undefined> <undefined> 100 5000 true <undefined> <undefined> <undefined> Unspecified Unspecified 0 false
2 <undefined> <undefined> 10 340 true <undefined> <undefined> <undefined> Unspecified Unspecified 0 false
检查通道元数据
使用 mdfChannelInfo
检查通道组 1 中通道的元数据。将 AdditionalMetadata
选项指定为 true
可以查看其他元数据。
时间表的行时间写入一个时间通道,而时间表的变量则写入各自的数据通道。
元数据字段 Type
、DataType
和 NumBits
由 mdfWrite
从存储在对应时间表变量中的数据派生。例如,TT1
中名为 uint8_data
的变量包含 8 位无符号整数,因此通道的 Type
是 asam.mdf.ChannelType.FixedLength
(0),DataType
是 asam.mdf.ChannelDataType.IntegerUnsignedLittleEndian
(0),而 NumBits
是 8。
其他元数据字段则被 mdfWrite
赋予默认值。对于时间通道,Unit
被视为第二个,因此对它的赋值为 's'
。
chanGrp1Info = mdfChannelInfo("TimetableBasic.mf4", GroupNumber=1, AdditionalMetadata=true)
chanGrp1Info=11×25 table
Name GroupNumber GroupNumSamples GroupAcquisitionName GroupComment GroupSourceName GroupSourcePath DisplayName Unit Comment ExtendedNamePrefix SourceName SourcePath Type SyncType DataType NumBits ComponentType CompositionType ConversionType SourceComment SourceType SourceBusType SourceBusChannelNumber SourceSimulated
_____________ ___________ _______________ ____________________ ____________ _______________ _______________ ___________ ___________ ___________ __________________ ___________ ___________ ___________ ________ ___________________________ _______ _____________ _______________ ______________ _____________ ___________ _____________ ______________________ _______________
"Time" 1 100 <undefined> <undefined> <undefined> <undefined> "" s <undefined> <undefined> <undefined> <undefined> Master Time RealLittleEndian 64 None None Unspecified "" Unspecified Unspecified 0 false
"double_data" 1 100 <undefined> <undefined> <undefined> <undefined> "" <undefined> <undefined> <undefined> <undefined> <undefined> FixedLength None RealLittleEndian 64 None None Unspecified "" Unspecified Unspecified 0 false
"int16_data" 1 100 <undefined> <undefined> <undefined> <undefined> "" <undefined> <undefined> <undefined> <undefined> <undefined> FixedLength None IntegerSignedLittleEndian 16 None None Unspecified "" Unspecified Unspecified 0 false
"int32_data" 1 100 <undefined> <undefined> <undefined> <undefined> "" <undefined> <undefined> <undefined> <undefined> <undefined> FixedLength None IntegerSignedLittleEndian 32 None None Unspecified "" Unspecified Unspecified 0 false
"int64_data" 1 100 <undefined> <undefined> <undefined> <undefined> "" <undefined> <undefined> <undefined> <undefined> <undefined> FixedLength None IntegerSignedLittleEndian 64 None None Unspecified "" Unspecified Unspecified 0 false
"int8_data" 1 100 <undefined> <undefined> <undefined> <undefined> "" <undefined> <undefined> <undefined> <undefined> <undefined> FixedLength None IntegerSignedLittleEndian 8 None None Unspecified "" Unspecified Unspecified 0 false
"single_data" 1 100 <undefined> <undefined> <undefined> <undefined> "" <undefined> <undefined> <undefined> <undefined> <undefined> FixedLength None RealLittleEndian 32 None None Unspecified "" Unspecified Unspecified 0 false
"uint16_data" 1 100 <undefined> <undefined> <undefined> <undefined> "" <undefined> <undefined> <undefined> <undefined> <undefined> FixedLength None IntegerUnsignedLittleEndian 16 None None Unspecified "" Unspecified Unspecified 0 false
"uint32_data" 1 100 <undefined> <undefined> <undefined> <undefined> "" <undefined> <undefined> <undefined> <undefined> <undefined> FixedLength None IntegerUnsignedLittleEndian 32 None None Unspecified "" Unspecified Unspecified 0 false
"uint64_data" 1 100 <undefined> <undefined> <undefined> <undefined> "" <undefined> <undefined> <undefined> <undefined> <undefined> FixedLength None IntegerUnsignedLittleEndian 64 None None Unspecified "" Unspecified Unspecified 0 false
"uint8_data" 1 100 <undefined> <undefined> <undefined> <undefined> "" <undefined> <undefined> <undefined> <undefined> <undefined> FixedLength None IntegerUnsignedLittleEndian 8 None None Unspecified "" Unspecified Unspecified 0 false
同样,检查通道组 2 中通道的元数据。元数据字段 Type
、DataType
和 NumBits
也是由 mdfWrite
从存储在对应时间表变量中的数据派生的。
TT2
的变量fixed_length_string_data
和fixed_length_byte_array_data
中的数据采样的长度是固定的,因此这两个通道的Type
是asam.mdf.ChannelType.FixedLength
(0)。变量variable_length_string_data
和variable_length_byte_array_data
包含长度可变的数据采样,因此这两个通道的Type
为asam.mdf.ChannelType.VariableLength
(1)。对于包含字符串数据的
fixed_length_string_data
和variable_length_string_data
变量,DataType
为asam.mdf.ChannelDataType.StringASCII
(6)。对于包含字节数组数据fixed_length_byte_array_data
和variable_length_byte_array_data
变量,DataType
为asam.mdf.ChannelDataType.ByteArray
(10)。固定长度通道的
NumBits
是从数据中派生的。对于可变长度通道,NumBits
的默认值为 64。
chanGrp2Info = mdfChannelInfo("TimetableBasic.mf4", GroupNumber=2, AdditionalMetadata=true)
chanGrp2Info=5×25 table
Name GroupNumber GroupNumSamples GroupAcquisitionName GroupComment GroupSourceName GroupSourcePath DisplayName Unit Comment ExtendedNamePrefix SourceName SourcePath Type SyncType DataType NumBits ComponentType CompositionType ConversionType SourceComment SourceType SourceBusType SourceBusChannelNumber SourceSimulated
_________________________________ ___________ _______________ ____________________ ____________ _______________ _______________ ___________ ___________ ___________ __________________ ___________ ___________ ______________ ________ ________________ _______ _____________ _______________ ______________ _____________ ___________ _____________ ______________________ _______________
"Time" 2 10 <undefined> <undefined> <undefined> <undefined> "" s <undefined> <undefined> <undefined> <undefined> Master Time RealLittleEndian 64 None None Unspecified "" Unspecified Unspecified 0 false
"fixed_length_byte_array_data" 2 10 <undefined> <undefined> <undefined> <undefined> "" <undefined> <undefined> <undefined> <undefined> <undefined> FixedLength None ByteArray 40 None None Unspecified "" Unspecified Unspecified 0 false
"fixed_length_string_data" 2 10 <undefined> <undefined> <undefined> <undefined> "" <undefined> <undefined> <undefined> <undefined> <undefined> FixedLength None StringASCII 40 None None Unspecified "" Unspecified Unspecified 0 false
"variable_length_byte_array_data" 2 10 <undefined> <undefined> <undefined> <undefined> "" <undefined> <undefined> <undefined> <undefined> <undefined> VariableLength None ByteArray 64 None None Unspecified "" Unspecified Unspecified 0 false
"variable_length_string_data" 2 10 <undefined> <undefined> <undefined> <undefined> "" <undefined> <undefined> <undefined> <undefined> <undefined> VariableLength None StringASCII 64 None None Unspecified "" Unspecified Unspecified 0 false
检查数据
要验证数据是否已成功写入文件,请使用 mdfRead
从两个通道组读取数据并检查结果。
data = mdfRead("TimetableBasic.mf4")
data=2×1 cell array
{100x10 timetable}
{ 10x4 timetable}
chanGrp1Data = data{1}
chanGrp1Data=100×10 timetable
Time uint8_data uint16_data uint32_data uint64_data int8_data int16_data int32_data int64_data single_data double_data
_______ __________ ___________ ___________ ___________ _________ __________ __________ __________ ___________ ___________
0 sec 0 200 600 1400 -99 -198 -396 -794 -9.8 -19.6
0.1 sec 2 204 608 1416 -97 -194 -388 -778 -9.6 -19.2
0.2 sec 4 208 616 1432 -95 -190 -380 -762 -9.4 -18.8
0.3 sec 6 212 624 1448 -93 -186 -372 -746 -9.2 -18.4
0.4 sec 8 216 632 1464 -91 -182 -364 -730 -9 -18
0.5 sec 10 220 640 1480 -89 -178 -356 -714 -8.8 -17.6
0.6 sec 12 224 648 1496 -87 -174 -348 -698 -8.6 -17.2
0.7 sec 14 228 656 1512 -85 -170 -340 -682 -8.4 -16.8
0.8 sec 16 232 664 1528 -83 -166 -332 -666 -8.2 -16.4
0.9 sec 18 236 672 1544 -81 -162 -324 -650 -8 -16
1 sec 20 240 680 1560 -79 -158 -316 -634 -7.8 -15.6
1.1 sec 22 244 688 1576 -77 -154 -308 -618 -7.6 -15.2
1.2 sec 24 248 696 1592 -75 -150 -300 -602 -7.4 -14.8
1.3 sec 26 252 704 1608 -73 -146 -292 -586 -7.2 -14.4
1.4 sec 28 256 712 1624 -71 -142 -284 -570 -7 -14
1.5 sec 30 260 720 1640 -69 -138 -276 -554 -6.8 -13.6
⋮
chanGrp2Data = data{2}
chanGrp2Data=10×4 timetable
Time fixed_length_string_data fixed_length_byte_array_data variable_length_string_data variable_length_byte_array_data
_____ ________________________ ____________________________ ___________________________ _______________________________
0 sec "abcd" {[255 255 255 255 255]} "zero" {[ 255 255]}
1 sec "efgh" {[ 18 35 52 69 86]} "one" {[ 18 35 52 69 86]}
2 sec "ijkl" {[ 0 1 2 3 4]} "two" {[ 0 1 2 3 4 5 6 7]}
3 sec "mnop" {[ 4 3 2 1 0]} "three" {[ 4 3 2 1 0]}
4 sec "qrst" {[255 254 253 252 251]} "four" {[ 253 252 251]}
5 sec "uvwx" {[250 249 248 247 246]} "five" {[250 249 248 247 246]}
6 sec "yzAB" {[245 244 243 242 241]} "six" {[245 244 243 242 241]}
7 sec "CDEF" {[240 239 238 237 236]} "seven" {[ 240 238 236]}
8 sec "GHIJ" {[235 234 233 232 231]} "eight" {[ 235 233 231]}
9 sec "KLMN" {[255 255 255 255 255]} "nine" {[255 255 255 255 255]}