Main Content

将时间表数据写入 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 标准定义的元数据字段。

在此示例中,将 TT1TT2 中的数据分别写入一个新 MDF 文件的通道组 1 和 2。如果不需要在三个层级中的任一层级自定义元数据,则应使用此工作流。

如果您需要在写入 MDF 文件时自定义元数据,请使用示例将时间表数据写入 MDF 文件时自定义元数据中的高级工作流。

将时间表加载到工作区

将时间表变量 TT1TT2,从 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 的两个通道组的元数据。元数据字段(如 AcquisitionNameComment)被赋予默认值。其他字段(如 NumSamplesDataSizeSorted)则依赖于数据。

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 可以查看其他元数据。

时间表的行时间写入一个时间通道,而时间表的变量则写入各自的数据通道。

元数据字段 TypeDataTypeNumBitsmdfWrite 从存储在对应时间表变量中的数据派生。例如,TT1 中名为 uint8_data 的变量包含 8 位无符号整数,因此通道的 Typeasam.mdf.ChannelType.FixedLength (0),DataTypeasam.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 中通道的元数据。元数据字段 TypeDataTypeNumBits 也是由 mdfWrite 从存储在对应时间表变量中的数据派生的。

  • TT2 的变量 fixed_length_string_datafixed_length_byte_array_data 中的数据采样的长度是固定的,因此这两个通道的 Typeasam.mdf.ChannelType.FixedLength (0)。变量 variable_length_string_datavariable_length_byte_array_data 包含长度可变的数据采样,因此这两个通道的 Typeasam.mdf.ChannelType.VariableLength (1)。

  • 对于包含字符串数据的 fixed_length_string_datavariable_length_string_data 变量,DataTypeasam.mdf.ChannelDataType.StringASCII (6)。对于包含字节数组数据 fixed_length_byte_array_datavariable_length_byte_array_data 变量,DataTypeasam.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]}