Main Content

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")

Figure contains 3 axes objects. Axes object 1 with title CarSpeed Signal from ABSdata Message, xlabel Timestamp, ylabel Car Speed contains an object of type line. Axes object 2 with title EngSpeed Signal from EngData Message, xlabel Timestamp, ylabel Engine Speed contains an object of type line. Axes object 3 with title Gear Signal from GearBoxInfo Message, xlabel Timestamp, ylabel Gear contains an object of type line.