yoncho`s blog
DBC, 자동차를 위한 CAN 관련 정보 파일 본문
간략한 설명 :
can 데이터베이스 파일이라고도 부르는 .dbc 확장자를 가진 DBC 파일은 Vector(자동차 업계에서 매우 유명함)사에서 만든 can 정보를 담은 파일 유형이다.
can id별 data에서 startBit정보와 length값을 가지고 유효한 값을 추출해 낼 수 있으며, dbc 파일로 can message에 대한 판정(PASS_ or FAIL_)이 가능하다.
DBC 파일 구조
Prefix에 대한 설명
VERSION : 버전 정보
NS_ : (NewSymbol) dbc파일에 사용되는 모든 Symbol을 표시
BS_ : (Bit Speed) can 통신 속도를 표시
BU_ : (*Node) dbc파일에 사용되는 ecu 표시
BO_ : (*Message) 메시지(id, name, node) 정보를 표시
SG_ : (*Signal) 메시지 하위로 속하며, 메시지에 대한 Signal들을 표시
CM_ : (Comment) 메시지 / 시그널 에 대한 주석
VAL_ : (Value Table) 시그널 값으로 최종 결과를 판정하는 테이블
DBC Example
VERSION ""
NS_ :
BA_
BA_DEF_
BA_DEF_DEF_
BA_DEF_DEF_REL_
BA_DEF_REL_
BA_DEF_SGTYPE_
BA_REL_
BA_SGTYPE_
BO_TX_BU_
BU_BO_REL_
BU_EV_REL_
BU_SG_REL_
CAT_
CAT_DEF_
CM_
ENVVAR_DATA_
EV_DATA_
FILTER
NS_DESC_
SGTYPE_
SGTYPE_VAL_
SG_MUL_VAL_
SIGTYPE_VALTYPE_
SIG_GROUP_
SIG_TYPE_REF_
SIG_VALTYPE_
VAL_
VAL_TABLE_
BS_:
BU_: DBG DRIVER IO MOTOR SENSOR
BO_ 100 DRIVER_HEARTBEAT: 1 DRIVER
SG_ DRIVER_HEARTBEAT_cmd : 0|8@1+ (1,0) [0|0] "" SENSOR,MOTOR
BO_ 500 IO_DEBUG: 4 IO
SG_ IO_DEBUG_test_unsigned : 0|8@1+ (1,0) [0|0] "" DBG
SG_ IO_DEBUG_test_enum : 8|8@1+ (1,0) [0|0] "" DBG
SG_ IO_DEBUG_test_signed : 16|8@1- (1,0) [0|0] "" DBG
SG_ IO_DEBUG_test_float : 24|8@1+ (0.5,0) [0|0] "" DBG
BO_ 101 MOTOR_CMD: 1 DRIVER
SG_ MOTOR_CMD_steer : 0|4@1- (1,-5) [-5|5] "" MOTOR
SG_ MOTOR_CMD_drive : 4|4@1+ (1,0) [0|9] "" MOTOR
BO_ 400 MOTOR_STATUS: 3 MOTOR
SG_ MOTOR_STATUS_wheel_error : 0|1@1+ (1,0) [0|0] "" DRIVER,IO
SG_ MOTOR_STATUS_speed_kph : 8|16@1+ (0.001,0) [0|0] "kph" DRIVER,IO
BO_ 200 SENSOR_SONARS: 8 SENSOR
SG_ SENSOR_SONARS_mux M : 0|4@1+ (1,0) [0|0] "" DRIVER,IO
SG_ SENSOR_SONARS_err_count : 4|12@1+ (1,0) [0|0] "" DRIVER,IO
SG_ SENSOR_SONARS_left m0 : 16|12@1+ (0.1,0) [0|0] "" DRIVER,IO
SG_ SENSOR_SONARS_middle m0 : 28|12@1+ (0.1,0) [0|0] "" DRIVER,IO
SG_ SENSOR_SONARS_right m0 : 40|12@1+ (0.1,0) [0|0] "" DRIVER,IO
SG_ SENSOR_SONARS_rear m0 : 52|12@1+ (0.1,0) [0|0] "" DRIVER,IO
SG_ SENSOR_SONARS_no_filt_left m1 : 16|12@1+ (0.1,0) [0|0] "" DBG
SG_ SENSOR_SONARS_no_filt_middle m1 : 28|12@1+ (0.1,0) [0|0] "" DBG
SG_ SENSOR_SONARS_no_filt_right m1 : 40|12@1+ (0.1,0) [0|0] "" DBG
SG_ SENSOR_SONARS_no_filt_rear m1 : 52|12@1+ (0.1,0) [0|0] "" DBG
CM_ BU_ DRIVER "The driver controller driving the car";
CM_ BU_ MOTOR "The motor controller of the car";
CM_ BU_ SENSOR "The sensor controller of the car";
CM_ BO_ 100 "Sync message used to synchronize the controllers";
BA_DEF_ "BusType" STRING ;
BA_DEF_ BO_ "GenMsgCycleTime" INT 0 0;
BA_DEF_ SG_ "FieldType" STRING ;
BA_DEF_DEF_ "BusType" "CAN";
BA_DEF_DEF_ "FieldType" "";
BA_DEF_DEF_ "GenMsgCycleTime" 0;
BA_ "GenMsgCycleTime" BO_ 100 1000;
BA_ "GenMsgCycleTime" BO_ 500 100;
BA_ "GenMsgCycleTime" BO_ 101 100;
BA_ "GenMsgCycleTime" BO_ 400 100;
BA_ "GenMsgCycleTime" BO_ 200 100;
BA_ "FieldType" SG_ 100 DRIVER_HEARTBEAT_cmd "DRIVER_HEARTBEAT_cmd";
BA_ "FieldType" SG_ 500 IO_DEBUG_test_enum "IO_DEBUG_test_enum";
VAL_ 100 DRIVER_HEARTBEAT_cmd 2 "DRIVER_HEARTBEAT_cmd_REBOOT" 1 "DRIVER_HEARTBEAT_cmd_SYNC" 0 "DRIVER_HEARTBEAT_cmd_NOOP" ;
VAL_ 500 IO_DEBUG_test_enum 2 "IO_DEBUG_test2_enum_two" 1 "IO_DEBUG_test2_enum_one" ;
BO_ : 메시지의 Prefix (BO_) ID와 NAME, NODE 정보를 명시
기본 구조
BO_ 'ID(message ID)' 'name(Message name)' : 'byte(message length)' 'sender(message sender)'
Id : receive된 can id를 의미, decimal로 표시된다.
Name : message의 이름
Byte : message의 can data length
Sender : message를 전송한 객체 정보
BO_ 2046 TP_EDT_AMP: 8 EDT
위 BO_ 를 해석하면,
EDT로 부터 2046(decimal)값의 can id로 receive된 8byte can data이며 메시지 이름은 "TP_EDT_AMP"이다.
*판정에 있어서 receive id와 byte로 data를 1차 유효 체크할 수 있다.
SG_ : 메시지에 속하는 Signal 정보를 표시
*signal의 구조에는 많은 data가 있어서 정확히 봐야한다.
기본 구조
SG_ 'signal name' : 'startBit'|'length'@'byte_order_type' ('scale, offset') ['minimum|maximum'] 'unit' 'receiver'
Signal Name : signal의 이름
StartBit : message data에서 읽을 bit의 시작점
Length : StartBit부터 몇 개의 bit를 읽을지를 표시
ByteOrderType :
order : big-endian 0 표시 / little-endian 1 표시 *motorola가 0 (big-endian)/ intel이 1 (little-endian) 사용
type : unsigned : +표시 / signed : - 표시
*ex) 1+ : unsigned littel-endian 방
*little-endian과 big-endian이란?
big-endian은 숫자를 쓰는 자연스러운 선형방식으로 0x12, 0x34를 0x1234 이렇게 저장하는 방식이고,
little-endian은 선형에 반대이며 0x12, 0x34를 0x3412 이렇게 저장한다.
나무위키 : https://ko.wikipedia.org/wiki/%EC%97%94%EB%94%94%EC%96%B8
Scale/Offset :
[ real value = raw value * Scale + Offset ]
startBit와 length로 읽은 data값과 scale값을 곱하고 offset을 더해야 실제 데이터 값이 추출된다.
*ex) (1|0) 의 경우 raw value * 1 + 0이므로 raw value가 그대로 real value인셈이다.
Minimum/Maximum :
real value가 minimum과 maximum 범위 안에 있어야 유효한 값이다.
Unit : 단위 (real value를 표현하는 단위)
Receiver : 수신 ECU 이름 표 (기본값은 Vector_xxx 이다.)
VAL_ : VALUE_TABLE 으로 Message에 해당하는 각 Signal의 real value값에 따라 최종 결과를 분류하는 테이블이다.
기본구조
VAL_ 'ID(message id)' 'signal name' n "VAL_ N" ... 1 "VAL_0" 0 "VAL_1"
ID : message id
Signal Name : 해당 value table을 사용하는 signal 이름이다. (id에 해당하는 BO_ 아래 정의된 SG_에서 찾을 수 있다.)
n "VAL_N" 구조 : (중요함 !!!) receive된 can data를 signal 정보 (startBit, Length, scale, offset)로 추출한 real value값으로 최종 결과를 도출해내는 테이블 이다.
n "VAL_N" 구조는 2^(length) 개 만큼 정의된다.
*ex) length가 3일때는 bit가 총 3개이므로 000 부터 111까지 모두 2^3 = 8개의 경우의 수가 발생한다. 그래서 판정 값
또한 000 (decimal: 0 )부터 111 (decimal: 7)까지 총 8개가 존재한다.
VAL_ 419 GEAR_SHIFTER 32 "D" 8 "R" 4 "P" ;
위 VAL_을 해석하면 419(decimal)값으로 정의된 message(BO_)의 signal(SG_)중에 "GEAR_SHIFTER"라는 SignalName을 가진 정보의 real 값이 32일때 "D"라 출력, 8일때 "R" 출력, 4일때 "P" 출력이다.
참조:
1) https://www.csselectronics.com/pages/can-dbc-file-database-intro
2) https://docs.openvehicles.com/en/latest/components/vehicle_dbc/docs/dbc-primer.html
'기술, 나의 공부를 공유합니다. > [Vehicle] CAN, CANFD' 카테고리의 다른 글
CAN, 자동차 통신 프로토콜 Controller Area Network (0) | 2024.09.28 |
---|---|
CAN, 주섬 주섬 (0) | 2023.03.07 |
CAN Frame, Frame(single, multi) & Flow (0) | 2023.02.03 |
CAN Bit Timing, CAN Bus Parameter 설정을 위한 계산 (0) | 2022.11.08 |