주요 콘텐츠

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

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/Bdoc26a_3233028_2210314/tp94d33388/vnt-ex06202590/PowerTrain_BLF.dbc'
        UTF8_File: '/tmp/Bdoc26a_3233028_2210314/tp94d33388/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/Bdoc26a_3233028_2210314/tp94d33388/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 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.

BLF 파일의 일부 읽기

지금까지 BLF 파일에서 전체 CAN 데이터 세트를 가져와 시각화했으며, 이를 통해 기록된 차량 데이터에 대한 포괄적인 개요를 확인할 수 있습니다. 그러나 실제 상황에서는 신호 값의 갑작스러운 변화나 시험 주행 중 이상 감지 등, 특정 시간대나 관심 있는 사건에 분석을 집중하고 싶을 수 있습니다.

예를 들어, 위의 신호 그래프에서 20초와 30초 사이에 차량 속도가 급격히 변하는 것을 확인할 수 있습니다. 이 기간 동안의 CAN 트래픽과 신호 동작을 더 자세히 조사하려면, BLF 파일에서 관련 데이터 부분만 직접 추출할 수 있습니다. blfread 함수와 "TimeRange" 이름-값 쌍을 사용하여 이 기간 내에 채널 2에서 발생한 모든 메시지를 추출합니다.

blfDataChannel2 = blfread("Logging_BLF.blf", 2, TimeRange = seconds([20, 30]))
blfDataChannel2=1333×8 timetable
       Time        ID     Extended       Name                    Data                 Length      Signals       Error    Remote
    __________    ____    ________    __________    ______________________________    ______    ____________    _____    ______

    20 sec         100     false      {0×0 char}    {[   29 14 42 45 97 5 226 29]}      8       {0×0 struct}    false    false 
    20 sec         102     false      {0×0 char}    {[ 187 207 97 69 0 32 172 68]}      8       {0×0 struct}    false    false 
    20.001 sec     103     false      {0×0 char}    {[                       1 0]}      2       {0×0 struct}    false    false 
    20.001 sec     201     false      {0×0 char}    {[           77 0 0 0 153 42]}      6       {0×0 struct}    false    false 
    20.001 sec    1020     false      {0×0 char}    {[                         4]}      1       {0×0 struct}    false    false 
    20.02 sec      103     false      {0×0 char}    {[                       1 0]}      2       {0×0 struct}    false    false 
    20.04 sec      103     false      {0×0 char}    {[                       1 0]}      2       {0×0 struct}    false    false 
    20.05 sec      100     false      {0×0 char}    {[  38 14 42 45 124 5 120 30]}      8       {0×0 struct}    false    false 
    20.05 sec      102     false      {0×0 char}    {[  41 88 98 69 0 128 175 68]}      8       {0×0 struct}    false    false 
    20.051 sec     201     false      {0×0 char}    {[           77 0 0 0 178 42]}      6       {0×0 struct}    false    false 
    20.051 sec    1020     false      {0×0 char}    {[                         4]}      1       {0×0 struct}    false    false 
    20.06 sec      103     false      {0×0 char}    {[                       1 0]}      2       {0×0 struct}    false    false 
    20.08 sec      103     false      {0×0 char}    {[                       1 0]}      2       {0×0 struct}    false    false 
    20.1 sec       100     false      {0×0 char}    {[  46 14 42 45 124 5 120 30]}      8       {0×0 struct}    false    false 
    20.1 sec       102     false      {0×0 char}    {[147 227 98 69 0 128 175 68]}      8       {0×0 struct}    false    false 
    20.101 sec     103     false      {0×0 char}    {[                       1 0]}      2       {0×0 struct}    false    false 
      ⋮

마찬가지로, 다른 채널에서 특정 수의 메시지를 추출해야 할 수도 있습니다. 예를 들어, 채널 1의 첫 50개 메시지를 읽으려면 "IndexRange" 이름-값 쌍을 사용합니다.

blfDataChannel1 = blfread("Logging_BLF.blf", 1, IndexRange = [1 50])
blfDataChannel1=50×8 timetable
       Time       ID     Extended       Name                Data              Length      Signals       Error    Remote
    __________    ___    ________    __________    _______________________    ______    ____________    _____    ______

    2.2002 sec    272     false      {0×0 char}    {[              6 0 0]}      3       {0×0 struct}    false    false 
    2.2202 sec    416     false      {0×0 char}    {[           0 0 0 32]}      4       {0×0 struct}    false    false 
    2.2203 sec    496     false      {0×0 char}    {[                  0]}      1       {0×0 struct}    false    false 
    2.2204 sec    497     false      {0×0 char}    {[                  0]}      1       {0×0 struct}    false    false 
    2.2402 sec    416     false      {0×0 char}    {[           0 0 0 32]}      4       {0×0 struct}    false    false 
    2.2501 sec    496     false      {0×0 char}    {[                  0]}      1       {0×0 struct}    false    false 
    2.2502 sec    497     false      {0×0 char}    {[                  0]}      1       {0×0 struct}    false    false 
    2.2602 sec    416     false      {0×0 char}    {[           0 0 0 32]}      4       {0×0 struct}    false    false 
    2.2802 sec    416     false      {0×0 char}    {[           0 0 0 32]}      4       {0×0 struct}    false    false 
    2.2803 sec    496     false      {0×0 char}    {[                  0]}      1       {0×0 struct}    false    false 
    2.2804 sec    497     false      {0×0 char}    {[                  0]}      1       {0×0 struct}    false    false 
    2.3002 sec    272     false      {0×0 char}    {[            135 0 0]}      3       {0×0 struct}    false    false 
    2.3003 sec    416     false      {0×0 char}    {[           0 0 0 32]}      4       {0×0 struct}    false    false 
    2.3006 sec    273     false      {0×0 char}    {[0 0 0 238 2 1 120 0]}      8       {0×0 struct}    false    false 
    2.3101 sec    496     false      {0×0 char}    {[                  0]}      1       {0×0 struct}    false    false 
    2.3102 sec    497     false      {0×0 char}    {[                  0]}      1       {0×0 struct}    false    false 
      ⋮

BLF 파일에 데이터 쓰기

두 채널에서 관련 데이터 하위 집합을 추출한 후, 추후 분석이나 공유를 위해 이를 새로운 BLF 파일에 저장할 수 있습니다. blfwrite 함수는 기존 BLF 파일을 덮어쓸 수 없다는 점에 유의해야 합니다. 지정된 출력 파일이 이미 존재하는 경우, blfwrite는 오류를 반환합니다. 이러한 상황을 방지하려면, 먼저 파일이 있는지 확인하고, 필요한 경우 새 데이터를 쓰기 전에 해당 파일을 삭제해야 합니다.

outputFile = "SubsetLoggingBLF.blf";
if isfile(outputFile)
    delete(outputFile);
end

출력 파일이 존재하지 않는지 확인한 후, 추출한 CAN 데이터 서브셋을 BLF 파일에 기록할 수 있습니다. blfwrite 함수를 사용하려면 각 채널의 데이터를 셀형 배열로 제공해야 합니다. 또한 채널 번호와 해당 채널 유형도 지정해야 합니다. 이 경우, 두 채널 모두 "CAN" 유형입니다.

blfwrite(outputFile, {blfDataChannel1, blfDataChannel2}, [1 2], ["CAN", "CAN"])