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]));
Close ARXML File
Close access to the ARXML file by clearing its variable from the workspace.
clear arxmlObj