主要内容

使用 ARXML 从 MDF 文件中读取数据

此示例说明如何使用 ARXML 作为数据库从 MDF 文件读取数据。

查看 MDF 文件的详细信息

使用 mdfInfo 函数查看 MDF 文件的元数据。

mdfInfo("MDF_ARXML.mf4")
ans = 
  MDFInfo with properties:

   File Details
                  Name: "MDF_ARXML.mf4"
                  Path: "C:\ExampleManager772791\user.Example_ARXMLCANDecoding\vnt-ex37098395\MDF_ARXML.mf4"
                Author: ""
            Department: ""
               Project: ""
               Subject: ""
               Comment: ""
               Version: "4.20"
      InitialTimestamp: 2024-11-15 23:06:16.345000000

   Creator Details
     ProgramIdentifier: "MDF4Lib"
     CreatorVendorName: "Vector Informatik GmbH"
       CreatorToolName: "CANoe"
    CreatorToolVersion: "18.2.65"
       CreatorUserName: "siyingl"
        CreatorComment: "Created using MdfLog version 1.7.7.0 and Mdf4Lib version 1.9.0.0 X64 (2022-08-31)"

   File Contents
            Attachment: [5×7 table]
     ChannelGroupCount: 5
                 Event: [0×8 eventtable]

标识 CAN 数据帧

根据总线日志记录的 ASAM MDF 相关联标准,为 CAN 总线系统定义的事件类型可以是“CAN_DataFrame”、“CAN_RemoteFrame”、“CAN_ErrorFrame”或“CAN_OverloadFrame”。此示例的重点是提取 CAN 数据帧,因此将使用“CAN_DataFrame”事件类型作为示例来讨论总线日志记录标准。此外,请注意,标准 CAN 数据帧的有效负载最多包含 8 个字节,用于传输信号值。

该标准规定事件结构体的通道名称应以事件类型名称为前缀,例如“CAN_DataFrame”。通常,使用点作为分隔符来指定成员通道,例如“CAN_DataFrame.ID”或“CAN_DataFrame.DataLength”。

使用 mdfChannelInfo 函数查找与“CAN_DataFrame.*”匹配的通道名称。返回包含匹配通道信息的表。

mdfChannelInfo("MDF_ARXML.mf4", Channel="CAN_DataFrame.*")
ans=24×13 table
                Name                 GroupNumber    GroupNumSamples    GroupAcquisitionName    GroupComment    GroupSourceName    GroupSourcePath      DisplayName         Unit                                 Comment                              ExtendedNamePrefix    SourceName     SourcePath
    _____________________________    ___________    _______________    ____________________    ____________    _______________    _______________    _______________    ___________    __________________________________________________________    __________________    ___________    __________

    "CAN_DataFrame.BitCount"              2                 6                  CAN2            <undefined>       <undefined>       CAN_DataFrame     "BitCount"         <undefined>    Frame length in bits.                                                CAN2           <undefined>       CAN2   
    "CAN_DataFrame.BitCount"              3              6070                  CAN1            <undefined>       <undefined>       CAN_DataFrame     "BitCount"         <undefined>    Frame length in bits.                                                CAN1           <undefined>       CAN1   
    "CAN_DataFrame.BusChannel"            2                 6                  CAN2            <undefined>       <undefined>       CAN_DataFrame     "BusChannel"       <undefined>    Logical bus channel number the frame was sent or received.           CAN2           <undefined>       CAN2   
    "CAN_DataFrame.BusChannel"            3              6070                  CAN1            <undefined>       <undefined>       CAN_DataFrame     "BusChannel"       <undefined>    Logical bus channel number the frame was sent or received.           CAN1           <undefined>       CAN1   
    "CAN_DataFrame.DLC"                   2                 6                  CAN2            <undefined>       <undefined>       CAN_DataFrame     "DLC"              <undefined>    Data length code.                                                    CAN2           <undefined>       CAN2   
    "CAN_DataFrame.DLC"                   3              6070                  CAN1            <undefined>       <undefined>       CAN_DataFrame     "DLC"              <undefined>    Data length code.                                                    CAN1           <undefined>       CAN1   
    "CAN_DataFrame.DataBytes"             2                 6                  CAN2            <undefined>       <undefined>       CAN_DataFrame     "DataBytes"        <undefined>    Payload data bytes containing the signal values.                     CAN2           <undefined>       CAN2   
    "CAN_DataFrame.DataBytes"             3              6070                  CAN1            <undefined>       <undefined>       CAN_DataFrame     "DataBytes"        <undefined>    Payload data bytes containing the signal values.                     CAN1           <undefined>       CAN1   
    "CAN_DataFrame.DataLength"            2                 6                  CAN2            <undefined>       <undefined>       CAN_DataFrame     "DataLength"       <undefined>    Length of stored payload in bytes.                                   CAN2           <undefined>       CAN2   
    "CAN_DataFrame.DataLength"            3              6070                  CAN1            <undefined>       <undefined>       CAN_DataFrame     "DataLength"       <undefined>    Length of stored payload in bytes.                                   CAN1           <undefined>       CAN1   
    "CAN_DataFrame.Dir"                   2                 6                  CAN2            <undefined>       <undefined>       CAN_DataFrame     "Dir"              <undefined>    Bit signal indicating the direction (Rx, Tx).                        CAN2           <undefined>       CAN2   
    "CAN_DataFrame.Dir"                   3              6070                  CAN1            <undefined>       <undefined>       CAN_DataFrame     "Dir"              <undefined>    Bit signal indicating the direction (Rx, Tx).                        CAN1           <undefined>       CAN1   
    "CAN_DataFrame.Flags"                 2                 6                  CAN2            <undefined>       <undefined>       CAN_DataFrame     "Flags"            <undefined>    Combination of bit flags for the message.                            CAN2           <undefined>       CAN2   
    "CAN_DataFrame.Flags"                 3              6070                  CAN1            <undefined>       <undefined>       CAN_DataFrame     "Flags"            <undefined>    Combination of bit flags for the message.                            CAN1           <undefined>       CAN1   
    "CAN_DataFrame.FrameDuration"         2                 6                  CAN2            <undefined>       <undefined>       CAN_DataFrame     "FrameDuration"    ns             Duration for transmission of the frame in nanoseconds.               CAN2           <undefined>       CAN2   
    "CAN_DataFrame.FrameDuration"         3              6070                  CAN1            <undefined>       <undefined>       CAN_DataFrame     "FrameDuration"    ns             Duration for transmission of the frame in nanoseconds.               CAN1           <undefined>       CAN1   
      ⋮

感兴趣的数据是从 CAN 1 网络记录的。上面的输出显示来自 CAN 1 网络的数据已存储在 MDF 文件的通道组 3 中。通过指定 GroupNumber 选项,使用 mdfChannelGroupInfo 函数查看有关通道组 3 的详细信息。

mdfChannelGroupInfo("MDF_ARXML.mf4", GroupNumber=3)
ans=1×13 table
    GroupNumber    AcquisitionName      Comment      NumSamples    DataSize    Sorted    SourceName      SourcePath      SourceComment    SourceType    SourceBusType    SourceBusChannelNumber    SourceSimulated
    ___________    _______________    ___________    __________    ________    ______    ___________    _____________    _____________    __________    _____________    ______________________    _______________

         3              CAN1          <undefined>       6070        163890     true      <undefined>    CAN_DataFrame     <undefined>        Bus             CAN                   1                    false     

使用 mdfChannelInfo 查看通道组 3 中所有通道的详细信息。

mdfChannelInfo("MDF_ARXML.mf4", GroupNumber=3)
ans=13×13 table
                Name                 GroupNumber    GroupNumSamples    GroupAcquisitionName    GroupComment    GroupSourceName    GroupSourcePath      DisplayName         Unit                                 Comment                              ExtendedNamePrefix    SourceName     SourcePath 
    _____________________________    ___________    _______________    ____________________    ____________    _______________    _______________    _______________    ___________    __________________________________________________________    __________________    ___________    ___________

    "CAN_DataFrame.BitCount"              3              6070                  CAN1            <undefined>       <undefined>       CAN_DataFrame     "BitCount"         <undefined>    Frame length in bits.                                                CAN1           <undefined>    CAN1       
    "CAN_DataFrame.BusChannel"            3              6070                  CAN1            <undefined>       <undefined>       CAN_DataFrame     "BusChannel"       <undefined>    Logical bus channel number the frame was sent or received.           CAN1           <undefined>    CAN1       
    "CAN_DataFrame.DLC"                   3              6070                  CAN1            <undefined>       <undefined>       CAN_DataFrame     "DLC"              <undefined>    Data length code.                                                    CAN1           <undefined>    CAN1       
    "CAN_DataFrame.DataBytes"             3              6070                  CAN1            <undefined>       <undefined>       CAN_DataFrame     "DataBytes"        <undefined>    Payload data bytes containing the signal values.                     CAN1           <undefined>    CAN1       
    "CAN_DataFrame.DataLength"            3              6070                  CAN1            <undefined>       <undefined>       CAN_DataFrame     "DataLength"       <undefined>    Length of stored payload in bytes.                                   CAN1           <undefined>    CAN1       
    "CAN_DataFrame.Dir"                   3              6070                  CAN1            <undefined>       <undefined>       CAN_DataFrame     "Dir"              <undefined>    Bit signal indicating the direction (Rx, Tx).                        CAN1           <undefined>    CAN1       
    "CAN_DataFrame.Flags"                 3              6070                  CAN1            <undefined>       <undefined>       CAN_DataFrame     "Flags"            <undefined>    Combination of bit flags for the message.                            CAN1           <undefined>    CAN1       
    "CAN_DataFrame.FrameDuration"         3              6070                  CAN1            <undefined>       <undefined>       CAN_DataFrame     "FrameDuration"    ns             Duration for transmission of the frame in nanoseconds.               CAN1           <undefined>    CAN1       
    "CAN_DataFrame.ID"                    3              6070                  CAN1            <undefined>       <undefined>       CAN_DataFrame     "ID"               <undefined>    ID of the CAN message.                                               CAN1           <undefined>    CAN1       
    "CAN_DataFrame.IDE"                   3              6070                  CAN1            <undefined>       <undefined>       CAN_DataFrame     "IDE"              <undefined>    Identifier Extension bit.                                            CAN1           <undefined>    CAN1       
    "CAN_DataFrame.SingleWire"            3              6070                  CAN1            <undefined>       <undefined>       CAN_DataFrame     "SingleWire"       <undefined>    Bit flag indicating a single wire operation.                         CAN1           <undefined>    CAN1       
    "CAN_DataFrame.WakeUp"                3              6070                  CAN1            <undefined>       <undefined>       CAN_DataFrame     "WakeUp"           <undefined>    Bit flag indicating a wake-up message (high voltage).                CAN1           <undefined>    CAN1       
    "t"                                   3              6070                  CAN1            <undefined>       <undefined>       CAN_DataFrame     ""                 s              <undefined>                                                          CAN1           <undefined>    <undefined>

从 MDF 文件读取 MDF 数据

使用 mdfRead 函数将通道组 3 中所有通道的所有数据读入一个时间表中。时间表的结构遵循 ASAM MDF 标准日志记录格式。每行表示来自总线的一个原始 CAN 帧,而每列表示指定通道组中的一个通道。

mdfData = mdfRead("MDF_ARXML.mf4", GroupNumber=3);
mdfData{1}
ans=6070×12 timetable
             t          CAN_DataFrame.BusChannel    CAN_DataFrame.Flags    CAN_DataFrame.Dir    CAN_DataFrame.SingleWire    CAN_DataFrame.WakeUp    CAN_DataFrame.ID    CAN_DataFrame.IDE    CAN_DataFrame.FrameDuration    CAN_DataFrame.BitCount    CAN_DataFrame.DLC    CAN_DataFrame.DataLength         CAN_DataFrame.DataBytes      
        ____________    ________________________    ___________________    _________________    ________________________    ____________________    ________________    _________________    ___________________________    ______________________    _________________    ________________________    __________________________________

        0.050294 sec               1                         1                   "Tx"                      0                         0                 2147485696               1                      288000                        147                      8                       8                {[            250 0 16 0 4 0 1 0]}
        0.050526 sec               1                         1                   "Tx"                      0                         0                          3               0                      226000                        116                      8                       8                {[210 236 104 118 52 187 124 192]}
        0.050694 sec               1                         1                   "Tx"                      0                         0                         16               0                      162000                         84                      4                       4                {[                    0 3 89 100]}
        0.050898 sec               1                         1                   "Tx"                      0                         0                       2047               0                      198000                        102                      6                       6                {[         226 99 235 64 255 255]}
        0.051184 sec               1                         1                   "Tx"                      0                         0                 2684354559               1                      280000                        143                      8                       8                {[       0 0 45 10 68 26 184 161]}
        0.10029 sec                1                         1                   "Tx"                      0                         0                 2147485696               1                      286000                        146                      8                       8                {[            237 0 12 0 6 0 0 0]}
        0.10053 sec                1                         1                   "Tx"                      0                         0                          3               0                      236000                        121                      8                       8                {[      0 56 252 27 254 13 75 64]}
        0.10071 sec                1                         1                   "Tx"                      0                         0                         16               0                      166000                         86                      4                       4                {[                  0 252 200 92]}
        0.10091 sec                1                         1                   "Tx"                      0                         0                       2047               0                      196000                        101                      6                       6                {[           68 41 41 64 249 255]}
        0.1012 sec                 1                         1                   "Tx"                      0                         0                 2684354559               1                      282000                        144                      8                       8                {[      0 64 126 0 196 46 248 98]}
        0.15029 sec                1                         1                   "Tx"                      0                         0                 2147485696               1                      286000                        146                      8                       8                {[            118 0 24 0 4 0 0 0]}
        0.15052 sec                1                         1                   "Tx"                      0                         0                          3               0                      226000                        116                      8                       8                {[    120 21 188 10 94 69 132 64]}
        0.15069 sec                1                         1                   "Tx"                      0                         0                         16               0                      162000                         84                      4                       4                {[                  0 252 161 14]}
        0.15089 sec                1                         1                   "Tx"                      0                         0                       2047               0                      196000                        101                      6                       6                {[          41 48 20 192 254 255]}
        0.15118 sec                1                         1                   "Tx"                      0                         0                 2684354559               1                      278000                        142                      8                       8                {[      0 128 93 2 67 178 109 45]}
        0.20029 sec                1                         1                   "Tx"                      0                         0                 2147485696               1                      284000                        145                      8                       8                {[            152 0 24 0 4 0 1 0]}
      ⋮

使用 ARXML 文件对象对 CAN 报文进行解码

使用 arxmlDatabase 函数打开 ARXML 文件 DecodingExample.arxml

arxmlObj = arxmlDatabase("DecodingExample.arxml")
arxmlObj = 
  Database with properties:

    Name: "DecodingExample.arxml"
    Path: "C:\ExampleManager772791\user.Example_ARXMLCANDecoding\vnt-ex37098395\DecodingExample.arxml"
     CAN: [1×1 shared.vnt.arxml.protocol.CAN]

通过调用 canMessageTimetable 函数创建解码的 CAN 报文时间表。ASAM 标准日志记录格式数据的时间表转换为 Vehicle Network Toolbox™ CAN 报文时间表。arxmlObj 用于函数的 Database 输入参量的值,该参量将提供解码数据的参考数据库信息。

decodedData = canMessageTimetable(mdfData{1}, arxmlObj)
decodedData=6070×8 timetable
        Time           ID        Extended       Name                      Data                   Length      Signals       Error    Remote
    ____________    _________    ________    __________    __________________________________    ______    ____________    _____    ______

    0.050294 sec         2048     true       {'Frame2'}    {[            250 0 16 0 4 0 1 0]}      8       {1×1 struct}    false    false 
    0.050526 sec            3     false      {'Frame4'}    {[210 236 104 118 52 187 124 192]}      8       {1×1 struct}    false    false 
    0.050694 sec           16     false      {'Frame5'}    {[                    0 3 89 100]}      4       {1×1 struct}    false    false 
    0.050898 sec         2047     false      {'Frame1'}    {[         226 99 235 64 255 255]}      6       {1×1 struct}    false    false 
    0.051184 sec    536870911     true       {'Frame3'}    {[       0 0 45 10 68 26 184 161]}      8       {1×1 struct}    false    false 
    0.10029 sec          2048     true       {'Frame2'}    {[            237 0 12 0 6 0 0 0]}      8       {1×1 struct}    false    false 
    0.10053 sec             3     false      {'Frame4'}    {[      0 56 252 27 254 13 75 64]}      8       {1×1 struct}    false    false 
    0.10071 sec            16     false      {'Frame5'}    {[                  0 252 200 92]}      4       {1×1 struct}    false    false 
    0.10091 sec          2047     false      {'Frame1'}    {[           68 41 41 64 249 255]}      6       {1×1 struct}    false    false 
    0.1012 sec      536870911     true       {'Frame3'}    {[      0 64 126 0 196 46 248 98]}      8       {1×1 struct}    false    false 
    0.15029 sec          2048     true       {'Frame2'}    {[            118 0 24 0 4 0 0 0]}      8       {1×1 struct}    false    false 
    0.15052 sec             3     false      {'Frame4'}    {[    120 21 188 10 94 69 132 64]}      8       {1×1 struct}    false    false 
    0.15069 sec            16     false      {'Frame5'}    {[                  0 252 161 14]}      4       {1×1 struct}    false    false 
    0.15089 sec          2047     false      {'Frame1'}    {[          41 48 20 192 254 255]}      6       {1×1 struct}    false    false 
    0.15118 sec     536870911     true       {'Frame3'}    {[      0 128 93 2 67 178 109 45]}      8       {1×1 struct}    false    false 
    0.20029 sec          2048     true       {'Frame2'}    {[            152 0 24 0 4 0 1 0]}      8       {1×1 struct}    false    false 
      ⋮

来自 CAN 原始报文的解码信号存储在 Signals 列中。

decodedData.Signals{1}
ans = struct with fields:
     Signal5: 27
    Signal11: 7

重新打包并可视化感兴趣的信号值

使用 canSignalTimetable 观测信号值。该示例将检查 Frame2Signal5 的值。

signalTimetable = canSignalTimetable(decodedData, "Frame2")
signalTimetable=1214×2 timetable
        Time        Signal5    Signal11
    ____________    _______    ________

    0.050294 sec        27         7   
    0.10029 sec       20.5       6.5   
    0.15029 sec         89         8   
    0.20029 sec        -22         8   
    0.25029 sec         68         7   
    0.30029 sec       10.5         7   
    0.35029 sec        -19       7.5   
    0.40029 sec         13         6   
    0.4503 sec        40.5       5.5   
    0.50029 sec       51.5       6.5   
    0.55029 sec         -4       6.5   
    0.60029 sec         -8       6.5   
    0.65029 sec        -14       5.5   
    0.70029 sec        -28       6.5   
    0.75029 sec      -11.5         7   
    0.8003 sec          61         7   
      ⋮

为了可视化感兴趣的信号,可以绘制信号时间表中的列随时间变化的图,以便进一步分析。该图将显示 Signal5 的前 5 秒值。

plot(signalTimetable.Time, signalTimetable.Signal5); 
xlim(seconds([0 5])); 

Figure contains an axes object. The axes object contains an object of type line.

关闭 ARXML 文件

通过从工作区中清除 ARXML 文件的变量,关闭对该 ARXML 文件的访问。

clear arxmlObj