主要内容

使用 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
      "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 1 网络记录的。上面的输出显示来自 CAN 1 网络的数据已存储在 MDF 文件的通道组 3 中。通过指定 GroupNumber 选项,使用 mdfChannelGroupInfo 函数查看有关通道组 3 的详细信息。

mdfChannelGroupInfo("MDF_ARXML.mf4", GroupNumber=3)
ans=1×13 table
    3    CAN1    <undefined>    6070    163890    1    <undefined>    CAN_DataFrame    <undefined>    2    2    1    0

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

mdfChannelInfo("MDF_ARXML.mf4", GroupNumber=3)
ans=13×13 table
         "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
    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]
      ⋮

使用 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
    0.050294 sec         2048    1    'Frame2'                [250,0,16,0,4,0,1,0]    8    1×1 struct    0    0
    0.050526 sec            3    0    'Frame4'    [210,236,104,118,52,187,124,192]    8    1×1 struct    0    0
    0.050694 sec           16    0    'Frame5'                        [0,3,89,100]    4    1×1 struct    0    0
    0.050898 sec         2047    0    'Frame1'             [226,99,235,64,255,255]    6    1×1 struct    0    0
    0.051184 sec    536870911    1    'Frame3'           [0,0,45,10,68,26,184,161]    8    1×1 struct    0    0
     0.10029 sec         2048    1    'Frame2'                [237,0,12,0,6,0,0,0]    8    1×1 struct    0    0
     0.10053 sec            3    0    'Frame4'          [0,56,252,27,254,13,75,64]    8    1×1 struct    0    0
     0.10071 sec           16    0    'Frame5'                      [0,252,200,92]    4    1×1 struct    0    0
     0.10091 sec         2047    0    'Frame1'               [68,41,41,64,249,255]    6    1×1 struct    0    0
      0.1012 sec    536870911    1    'Frame3'          [0,64,126,0,196,46,248,98]    8    1×1 struct    0    0
     0.15029 sec         2048    1    'Frame2'                [118,0,24,0,4,0,0,0]    8    1×1 struct    0    0
     0.15052 sec            3    0    'Frame4'        [120,21,188,10,94,69,132,64]    8    1×1 struct    0    0
     0.15069 sec           16    0    'Frame5'                      [0,252,161,14]    4    1×1 struct    0    0
     0.15089 sec         2047    0    'Frame1'              [41,48,20,192,254,255]    6    1×1 struct    0    0
      ⋮

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

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

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

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

signalTimetable = canSignalTimetable(decodedData, "Frame2")
signalTimetable=1214×2 timetable
    0.050294 sec         27         7
     0.10029 sec    20.5000    6.5000
     0.15029 sec         89         8
     0.20029 sec        -22         8
     0.25029 sec         68         7
     0.30029 sec    10.5000         7
     0.35029 sec        -19    7.5000
     0.40029 sec         13         6
      0.4503 sec    40.5000    5.5000
     0.50029 sec    51.5000    6.5000
     0.55029 sec         -4    6.5000
     0.60029 sec         -8    6.5000
     0.65029 sec        -14    5.5000
     0.70029 sec        -28    6.5000
      ⋮

为了可视化感兴趣的信号,可以绘制信号时间表中的列随时间变化的图,以便进一步分析。该图将显示 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