yoncho`s blog

DBC, 자동차를 위한 CAN 관련 정보 파일 본문

기술, 나의 공부를 공유합니다./[Vehicle] CAN, CANFD

DBC, 자동차를 위한 CAN 관련 정보 파일

욘초 2023. 2. 21. 23:01

간략한 설명 : 
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

3) https://github.com/commaai/opendbc

Comments