주요 콘텐츠

이 페이지는 기계 번역을 사용하여 번역되었습니다. 영어 원문을 보려면 여기를 클릭하십시오.

BLF 파일에서 CAN 데이터 디코딩

이 예제는 분석을 위해 MATLAB®에서 BLF 파일로부터 CAN 데이터를 가져오고 디코딩하는 방법을 보여줍니다. 이 예제에서 사용된 BLF 파일은 Vector CANoe™의 "CAN - General System Configuration (CAN)" 샘플을 사용하여 생성되었습니다. 이 예제 또한 Vector 샘플 구성과 함께 제공되는 CAN 데이터베이스 파일인 PowerTrain_BLF.dbc를 사용합니다.

DBC 파일 열기

canDatabase 함수를 사용하여 소스 CAN 네트워크를 설명하는 데이터베이스 파일을 엽니다.

canDB = canDatabase("PowerTrain_BLF.dbc")
canDB = 
  Database with properties:

             Name: 'PowerTrain_BLF'
             Path: '/tmp/Bdoc25b_2988451_1428583/tpf364ba40/vnt-ex06202590/PowerTrain_BLF.dbc'
        UTF8_File: '/tmp/Bdoc25b_2988451_1428583/tpf364ba40/vnt-ex06202590/PowerTrain_BLF.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: []

BLF 파일 조사

BLF 파일에 대한 정보를 검색하고 확인합니다. blfinfo 함수는 Vector Binary Logging Format BLF 파일의 형식 및 내용에 관한 일반 정보를 구문 분석하여 구조체 형태로 해당 정보를 반환합니다.

binf = blfinfo("Logging_BLF.blf")
binf = struct with fields:
                  Name: "Logging_BLF.blf"
                  Path: "/tmp/Bdoc25b_2988451_1428583/tpf364ba40/vnt-ex06202590/Logging_BLF.blf"
           Application: "CANoe"
    ApplicationVersion: "11.0.55"
               Objects: 43344
             StartTime: 01-Jul-2020 14:47:34.427
               EndTime: 01-Jul-2020 14:48:33.487
           ChannelList: [2×3 table]

binf.ChannelList
ans=2×3 table
    ChannelID    Protocol    Objects
    _________    ________    _______

        1         "CAN"       8801  
        2         "CAN"       7575  

BLF 파일에서 데이터 읽기

관심 데이터는 파워트레인 버스에서 기록되었으며, 이는 BLF 파일의 채널 2에 저장됩니다. blfread 함수를 사용하여 CAN 데이터를 읽으십시오. 함수 호출 시 DBC 파일을 제공하면 메시지 이름 조회 및 신호 값 디코딩이 가능해집니다.

blfData = blfread("Logging_BLF.blf", 2, "Database", canDB)
blfData=7575×8 timetable
       Time        ID     Extended           Name                        Data                 Length      Signals       Error    Remote
    __________    ____    ________    __________________    ______________________________    ______    ____________    _____    ______

    2.2601 sec     103     false      {'Ignition_Info' }    {[                       1 0]}      2       {1×1 struct}    false    false 
    2.2801 sec     103     false      {'Ignition_Info' }    {[                       1 0]}      2       {1×1 struct}    false    false 
    2.3002 sec     100     false      {'EngineData'    }    {[      238 2 25 1 0 0 238 2]}      8       {1×1 struct}    false    false 
    2.3005 sec     102     false      {'EngineDataIEEE'}    {[       0 128 59 68 0 0 0 0]}      8       {1×1 struct}    false    false 
    2.3006 sec     103     false      {'Ignition_Info' }    {[                       1 0]}      2       {1×1 struct}    false    false 
    2.3008 sec     201     false      {'ABSdata'       }    {[            0 0 0 0 172 38]}      6       {1×1 struct}    false    false 
    2.3009 sec    1020     false      {'GearBoxInfo'   }    {[                         1]}      1       {1×1 struct}    false    false 
    2.3201 sec     103     false      {'Ignition_Info' }    {[                       1 0]}      2       {1×1 struct}    false    false 
    2.3401 sec     103     false      {'Ignition_Info' }    {[                       1 0]}      2       {1×1 struct}    false    false 
    2.3502 sec     100     false      {'EngineData'    }    {[      4 0 25 2 119 1 238 2]}      8       {1×1 struct}    false    false 
    2.3505 sec     102     false      {'EngineDataIEEE'}    {[53 127 119 64 0 128 187 67]}      8       {1×1 struct}    false    false 
    2.3507 sec     201     false      {'ABSdata'       }    {[             0 0 0 0 35 40]}      6       {1×1 struct}    false    false 
    2.3508 sec    1020     false      {'GearBoxInfo'   }    {[                         1]}      1       {1×1 struct}    false    false 
    2.3601 sec     103     false      {'Ignition_Info' }    {[                       1 0]}      2       {1×1 struct}    false    false 
    2.3801 sec     103     false      {'Ignition_Info' }    {[                       1 0]}      2       {1×1 struct}    false    false 
    2.4002 sec     100     false      {'EngineData'    }    {[     10 0 25 3 119 1 238 2]}      8       {1×1 struct}    false    false 
      ⋮

"EngineData" 메시지의 신호를 확인하십시오.

blfData.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(blfData, "ABSdata")
signalTimetable1=1136×4 timetable
       Time       AccelerationForce    Diagnostics    GearLock    CarSpeed
    __________    _________________    ___________    ________    ________

    2.3008 sec          -100                0            0            0   
    2.3507 sec           275                0            0            0   
    2.4008 sec           275                0            0            0   
    2.4507 sec           275                0            0            0   
    2.5008 sec           275                0            0            0   
    2.5507 sec           275                0            0            0   
    2.6008 sec           275                0            0            0   
    2.6507 sec           275                0            0            0   
    2.7008 sec           350                0            0            0   
    2.7507 sec           425                0            0          0.5   
    2.8008 sec           425                0            0          0.5   
    2.8507 sec           500                0            0          0.5   
    2.9008 sec           575                0            0          0.5   
    2.9507 sec           575                0            0          0.5   
    3.0008 sec           650                0            0          0.5   
    3.0507 sec           725                0            0          0.5   
      ⋮

signalTimetable2 = canSignalTimetable(blfData, "EngineData")
signalTimetable2=1136×6 timetable
       Time       PetrolLevel    EngPower    EngForce    IdleRunning    EngTemp    EngSpeed
    __________    ___________    ________    ________    ___________    _______    ________

    2.3002 sec         1            7.5          0            0            0         750   
    2.3502 sec         2            7.5        375            0            0           4   
    2.4002 sec         3            7.5        375            0            0          10   
    2.4502 sec         4            7.5        375            0            0          17   
    2.5002 sec         5            7.5        375            0            0          23   
    2.5502 sec         6            7.5        375            0            0          30   
    2.6002 sec         7            7.5        375            0            0          36   
    2.6502 sec         8            7.5        375            0            0          43   
    2.7002 sec         9              9        450            0            0          50   
    2.7502 sec        10           10.5        525            0            0          59   
    2.8002 sec        10           10.5        525            0            0          69   
    2.8502 sec        11             12        600            0            0          80   
    2.9002 sec        11           13.5        675            0            0          92   
    2.9502 sec        12           13.5        675            0            0         106   
    3.0002 sec        13             15        750            0            0         121   
    3.0502 sec        13           16.5        825            0            0         136   
      ⋮

signalTimetable3 = canSignalTimetable(blfData, "GearBoxInfo")
signalTimetable3=1136×3 timetable
       Time       EcoMode    ShiftRequest    Gear
    __________    _______    ____________    ____

    2.3009 sec       0            0           1  
    2.3508 sec       0            0           1  
    2.4009 sec       0            0           1  
    2.4508 sec       0            0           1  
    2.5009 sec       0            0           1  
    2.5508 sec       0            0           1  
    2.6009 sec       0            0           1  
    2.6508 sec       0            0           1  
    2.7009 sec       0            0           1  
    2.7508 sec       0            0           1  
    2.8009 sec       0            0           1  
    2.8508 sec       0            0           1  
    2.9009 sec       0            0           1  
    2.9508 sec       0            0           1  
    3.0009 sec       0            0           1  
    3.0508 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 blank Signal blank from blank ABSdata Message, xlabel Timestamp, ylabel Car Speed contains an object of type line. Axes object 2 with title EngSpeed blank Signal blank from blank EngData Message, xlabel Timestamp, ylabel Engine Speed contains an object of type line. Axes object 3 with title Gear blank Signal blank from blank GearBoxInfo Message, xlabel Timestamp, ylabel Gear contains an object of type line.