使用 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
观测信号值。该示例将检查 Frame2
中 Signal5
的值。
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]));
关闭 ARXML 文件
通过从工作区中清除 ARXML 文件的变量,关闭对该 ARXML 文件的访问。
clear arxmlObj