이 페이지는 기계 번역을 사용하여 번역되었습니다. 영어 원문을 보려면 여기를 클릭하십시오.
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")
