主要内容

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

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.