Decode CAN Data from Vector ASC Files
This example shows you how to import and decode CAN data from Vector ASC files in MATLAB® for analysis. The ASC log and CAN database files used in this example are similar to the files used in the Decode CAN Data from BLF Files example.
Open the DBC File
Open the database file describing the source CAN network using the canDatabase function.
canDB = canDatabase("PowerTrain_ASC.dbc")canDB =
Database with properties:
Name: 'PowerTrain_ASC'
Path: '/tmp/Bdoc26a_3146167_4178462/tp338fd2cf/vnt-ex25623565/PowerTrain_ASC.dbc'
UTF8_File: '/tmp/Bdoc26a_3146167_4178462/tp338fd2cf/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: []
Read Data from ASC File
The data of interest was logged from the powertrain bus which is stored in channel 2 of the ASC file. Read the CAN data using the canMessageImport function. You can also provide the DBC file to the function call which will enable message name lookup and signal value decoding.
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
⋮
View signals from an "EngineData" message.
ascData.Signals{3}ans = struct with fields:
PetrolLevel: 1
EngPower: 7.5000
EngForce: 0
IdleRunning: 0
EngTemp: 0
EngSpeed: 750
Repackage and Visualize Signal Values of Interest
Use the canSignalTimetable function to repackage signal data from each unique message on the bus into a signal timetable. This example creates three individual signal timetables for the three messages of interest, "ABSdata", "EngineData" and "GearBoxInfo", from the CAN message timetable.
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
⋮
To visualize the signals of interest, columns from the signal timetables can be plotted over time for further analysis.
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")
