从 Vector ASC 文件解码 CAN 数据
此示例说明如何在 MATLAB® 中从 Vector ASC 文件中导入和解码 CAN 数据进行分析。此示例中使用的 ASC 日志和 CAN 数据库文件与从 BLF 文件解码 CAN 数据示例中使用的文件类似。
打开 DBC 文件
使用 canDatabase 函数打开描述源 CAN 网络的数据库文件。
canDB = canDatabase("PowerTrain_ASC.dbc")canDB =
Database with properties:
Name: 'PowerTrain_ASC'
Path: '/tmp/Bdoc26a_3233028_2210314/tp94d33388/vnt-ex25623565/PowerTrain_ASC.dbc'
UTF8_File: '/tmp/Bdoc26a_3233028_2210314/tp94d33388/vnt-ex25623565/PowerTrain_ASC.dbc'
Nodes: {2×1 cell}
NodeInfo: [2×1 struct]
Messages: {12×1 cell}
MessageInfo: [12×1 struct]
Attributes: {11×1 cell}
AttributeInfo: [11×1 struct]
UserData: []
从 ASC 文件中读取数据
感兴趣的数据是通过动力总成系统总线记录的,并存储在 ASC 文件的通道 2 中。使用 canMessageImport 函数读取 CAN 数据。您还可以向函数调用提供 DBC 文件,该函数调用将启用报文名称查找和信号值解码。
ascData = canMessageImport("Logging_ASC.asc", "Vector", canDB, ChannelID=2, OutputFormat="timetable")
ascData=7575×8 timetable
Time ID Extended Name Data Length Signals Error Remote
__________ ____ ________ __________________ ______________________________ ______ ____________ _____ ______
2.2611 sec 103 false {'Ignition_Info' } {[ 1 0]} 2 {1×1 struct} false false
2.281 sec 103 false {'Ignition_Info' } {[ 1 0]} 2 {1×1 struct} false false
2.3011 sec 100 false {'EngineData' } {[ 238 2 25 1 0 0 238 2]} 8 {1×1 struct} false false
2.3016 sec 201 false {'ABSdata' } {[ 0 0 0 0 172 38]} 6 {1×1 struct} false false
2.3014 sec 102 false {'EngineDataIEEE'} {[ 0 128 59 68 0 0 0 0]} 8 {1×1 struct} false false
2.3015 sec 103 false {'Ignition_Info' } {[ 1 0]} 2 {1×1 struct} false false
2.3016 sec 1020 false {'GearBoxInfo' } {[ 1]} 1 {1×1 struct} false false
2.321 sec 103 false {'Ignition_Info' } {[ 1 0]} 2 {1×1 struct} false false
2.3412 sec 103 false {'Ignition_Info' } {[ 1 0]} 2 {1×1 struct} false false
2.3512 sec 100 false {'EngineData' } {[ 4 0 25 2 119 1 238 2]} 8 {1×1 struct} false false
2.3515 sec 201 false {'ABSdata' } {[ 0 0 0 0 35 40]} 6 {1×1 struct} false false
2.3514 sec 102 false {'EngineDataIEEE'} {[53 127 119 64 0 128 187 67]} 8 {1×1 struct} false false
2.3516 sec 1020 false {'GearBoxInfo' } {[ 1]} 1 {1×1 struct} false false
2.3609 sec 103 false {'Ignition_Info' } {[ 1 0]} 2 {1×1 struct} false false
2.381 sec 103 false {'Ignition_Info' } {[ 1 0]} 2 {1×1 struct} false false
2.4011 sec 100 false {'EngineData' } {[ 10 0 25 3 119 1 238 2]} 8 {1×1 struct} false false
⋮
查看来自“EngineData”报文的信号。
ascData.Signals{3}ans = struct with fields:
PetrolLevel: 1
EngPower: 7.5000
EngForce: 0
IdleRunning: 0
EngTemp: 0
EngSpeed: 750
重新打包并可视化感兴趣的信号值
使用 canSignalTimetable 函数将来自总线上每个唯一报文的信号数据重新打包为一个信号时间表。此示例根据 CAN 报文时间表,为三个感兴趣的报文“ABSdata”、“EngineData”和“GearBoxInfo”创建三个单独的信号时间表。
signalTimetable1 = canSignalTimetable(ascData, "ABSdata")signalTimetable1=1136×4 timetable
Time AccelerationForce Diagnostics GearLock CarSpeed
__________ _________________ ___________ ________ ________
2.3016 sec -100 0 0 0
2.3515 sec 275 0 0 0
2.4015 sec 275 0 0 0
2.451 sec 275 0 0 0
2.501 sec 275 0 0 0
2.5512 sec 275 0 0 0
2.6011 sec 275 0 0 0
2.651 sec 275 0 0 0
2.7013 sec 350 0 0 0
2.7509 sec 425 0 0 0.5
2.8008 sec 425 0 0 0.5
2.8508 sec 500 0 0 0.5
2.901 sec 575 0 0 0.5
2.9506 sec 575 0 0 0.5
3.0006 sec 650 0 0 0.5
3.0506 sec 725 0 0 0.5
⋮
signalTimetable2 = canSignalTimetable(ascData, "EngineData")signalTimetable2=1136×6 timetable
Time PetrolLevel EngPower EngForce IdleRunning EngTemp EngSpeed
__________ ___________ ________ ________ ___________ _______ ________
2.3011 sec 1 7.5 0 0 0 750
2.3512 sec 2 7.5 375 0 0 4
2.4011 sec 3 7.5 375 0 0 10
2.4508 sec 4 7.5 375 0 0 17
2.5008 sec 5 7.5 375 0 0 23
2.5507 sec 6 7.5 375 0 0 30
2.6008 sec 7 7.5 375 0 0 36
2.6508 sec 8 7.5 375 0 0 43
2.7008 sec 9 9 450 0 0 50
2.7506 sec 10 10.5 525 0 0 59
2.8006 sec 10 10.5 525 0 0 69
2.8506 sec 11 12 600 0 0 80
2.9006 sec 11 13.5 675 0 0 92
2.9504 sec 12 13.5 675 0 0 106
3.0004 sec 13 15 750 0 0 121
3.0503 sec 13 16.5 825 0 0 136
⋮
signalTimetable3 = canSignalTimetable(ascData, "GearBoxInfo")signalTimetable3=1136×3 timetable
Time EcoMode ShiftRequest Gear
__________ _______ ____________ ____
2.3016 sec 0 0 1
2.3516 sec 0 0 1
2.4015 sec 0 0 1
2.451 sec 0 0 1
2.501 sec 0 0 1
2.5512 sec 0 0 1
2.6012 sec 0 0 1
2.651 sec 0 0 1
2.7014 sec 0 0 1
2.7509 sec 0 0 1
2.8009 sec 0 0 1
2.8508 sec 0 0 1
2.9011 sec 0 0 1
2.9507 sec 0 0 1
3.0007 sec 0 0 1
3.0507 sec 0 0 1
⋮
为了可视化感兴趣的信号,可以绘制信号时间表中的列随时间变化的图,以便进一步分析。
subplot(3, 1, 1) plot(signalTimetable1.Time, signalTimetable1.CarSpeed, "r") title("{\itCarSpeed} Signal from {\itABSdata} Message", FontWeight="bold") xlabel("Timestamp") ylabel("Car Speed") subplot(3, 1, 2) plot(signalTimetable2.Time, signalTimetable2.EngSpeed, "b") title("{\itEngSpeed} Signal from {\itEngData} Message", FontWeight="bold") xlabel("Timestamp") ylabel("Engine Speed") subplot(3, 1, 3) plot(signalTimetable3.Time, signalTimetable3.Gear, "y") title("{\itGear} Signal from {\itGearBoxInfo} Message", FontWeight="bold") xlabel("Timestamp") ylabel("Gear")
