Main Content

Read Data from MDF Files Using ARXML

This example shows you how to read data from an MDF file using ARXML as the database.

View Details of the MDF File

View metadata of an MDF file using the mdfInfo function.

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]

Identify CAN Data Frames

According to the ASAM MDF associated standard for bus logging, the event types defined for a CAN bus system can be "CAN_DataFrame", "CAN_RemoteFrame", "CAN_ErrorFrame" or "CAN_OverloadFrame". This example focuses on extracting the CAN data frames, so the bus logging standard will be discussed using "CAN_DataFrame" event type as example. Additionally, note that a standard CAN data frame has up to 8 bytes for its payload and is used to transfer signal values.

The standard specifies that the channel names of the event structure should be prefixed by the event type name, for instance, "CAN_DataFrame". Typically a dot is used as separator character to specify the member channels, for instance, "CAN_DataFrame.ID" or "CAN_DataFrame.DataLength".

Use the mdfChannelInfo function to locate channel names matching "CAN_DataFrame.*". A table with information on matched channels is returned.

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   
      ⋮

The data of interest was logged from the CAN 1 network. The output above shows that the data from CAN 1 network has been stored in channel group 3 of the MDF file. View details about channel group 3 using the mdfChannelGroupInfo function by specifying the GroupNumber option.

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     

View details about all the channels within channel group 3 using mdfChannelInfo.

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>

Read MDF Data from the MDF File

Read all data in channel group 3 into a timetable using the mdfRead function. The timetable is structured to follow the ASAM MDF standard logging format. Each row represents one raw CAN frame from the bus, while each column represents a channel within the specified channel group.

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]}
      ⋮

Decode CAN Messages Using the ARXML File Object

Open the ARXML file DecodingExample.arxml using arxmlDatabase function.

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]

Create the decoded CAN Message Timetable by calling the canMessageTimetable function. The timetable of ASAM standard logging format data is converted into a Vehicle Network Toolbox™ CAN message timetable. The arxmlObj is used for the value of the Database input argument for the function, that will provide the reference database information for decoding the data.

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 
      ⋮

Decoded signals from the CAN raw message are stored in the Signals column.

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

Repackage and Visualize Signal Values of Interest

Use the canSignalTimetable to observe the signal values. The example will examine the value of the Signal5 in the Frame2.

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   
      ⋮

To visualize the signals of interest, columns from the signal timetables can be plotted over time for further analysis. The plot will show the first 5 seconds value for the Signal5.

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

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

Close ARXML File

Close access to the ARXML file by clearing its variable from the workspace.

clear arxmlObj