Leo's Garage

CAN DBC files 본문

자동차 및 자동차 SW/자동차 SW 개발 일반

CAN DBC files

LeoBehindK 2023. 6. 25. 23:22
728x90
반응형

CAN DBC file이란 무엇인가

 

CAN DBC file (CAN Database)는 raw CAN Bus data를 '물리적'인 값으로 디코딩하기 위한 정보가 포함된 Text file이다.

이 raw CAN Data는 아래와 같이 생겼다.

CAN ID    Data bytes
0CF00400  FF FF FF 68 13 FF FF FF

CAN ID에 대한  디코딩 규칙이 포함된 CAN DBC가 있는 경우에는 데이터 Byte에서 signal을 추출할 수 있고, 그 신호 중 하나가 EngineSpeed일 수도 있다. 

Message  Signal       Value  Unit
EEC1     EngineSpeed  621    rpm

DBC 디코딩 작동 방식을 이해하기 위해 DBC 구문을 설명하고 예제를 보도록 하자.

 

DBC message & Signal Syntax

실제 CAN DBC 예제를 가지고 살펴보도록 하자.

아래 텍스트 파일은 속도(km/h) 및 엔진 속도(rpm)에 대한 디코딩 규칙이 포함된 Demo J1939 DBC 파일이다. 이 파일을 복사하여 이름을 J1939.dbc로 변경한 후 트럭, 트랙터 또는 기차 상용차량에서 속도/RPM을 추출하는데 사용할 수 있습니다. 

VERSION ""


NS_ : 
    CM_
    BA_DEF_
    BA_
    BA_DEF_DEF_

BS_:

BU_:


BO_ 2364540158 EEC1: 8 Vector_XXX
 SG_ EngineSpeed : 24|16@1+ (0.125,0) [0|8031.875] "rpm" Vector_XXX

BO_ 2566844926 CCVS1: 8 Vector_XXX
 SG_ WheelBasedVehicleSpeed : 8|16@1+ (0.00390625,0) [0|250.996] "km/h" Vector_XXX


CM_ BO_ 2364540158 "Electronic Engine Controller 1";
CM_ SG_ 2364540158 EngineSpeed "Actual engine speed which is calculated over a minimum crankshaft angle of 720 degrees divided by the number of cylinders....";
CM_ BO_ 2566844926 "Cruise Control/Vehicle Speed 1";
CM_ SG_ 2566844926 WheelBasedVehicleSpeed "Wheel-Based Vehicle Speed: Speed of the vehicle as calculated from wheel or tailshaft speed.";
BA_DEF_ SG_  "SPN" INT 0 524287;
BA_DEF_ BO_  "VFrameFormat" ENUM  "StandardCAN","ExtendedCAN","reserved","J1939PG";
BA_DEF_  "BusType" STRING ;
BA_DEF_  "ProtocolType" STRING ;
BA_DEF_DEF_  "SPN" 0;
BA_DEF_DEF_  "VFrameFormat" "J1939PG";
BA_DEF_DEF_  "BusType" "";
BA_DEF_DEF_  "ProtocolType" "";
BA_ "ProtocolType" "J1939";
BA_ "BusType" "CAN";
BA_ "VFrameFormat" BO_ 2364540158 3;
BA_ "VFrameFormat" BO_ 2566844926 3;
BA_ "SPN" SG_ 2364540158 EngineSpeed 190;
BA_ "SPN" SG_ 2566844926 WheelBasedVehicleSpeed 84;

DBC file의 핵심에는 CAN message와 signal을 디코딩하는 방법을 설명하는 규칙에 있다. 

DBC message Syntax 

  • 메시지는 BO_로 시작하며 ID는 고유해야 하고 16진수가 아닌 10진수여야 한다.
  • DBC ID는 29bit CAN ID에 3bit 추가하여 Extened ID flag 역할을 한다. 
  • Name은 1~32자로 고유해야 하며, [A-z], 숫자 및 밑줄을 포함할 수 있다. 
  • DLC는 0 ~ 1785 사이의 정수여야 한다. 
  • 발신자는 전송 노드의 이름 또는 사용할 수 있는 이름이 없는 경우에는 Vector__XXX이다. 

DBC signal Syntax

  • 각 메시지에는 SG_로 시작하는 신호가 1개 이상 포함된다.
  • Name은 1~32자로 고유해야 하며, [A-z], 숫자 및 밑줄을 포함할 수 있다.
  • Bit 시작은 0부터 카운트하며 데이터 페이로드에서 Signal의 시작 부분을 표시한다. 
  • Bit의 길이는 Signal의 길이이다.
  • '@1'은 Byte순서가 LittleEndian/ Intel 임을 지정한다. (BigEndian/Motorola 의 경우에는 @0)
  • '+'는 signal이 unsigned임을 나타낸다. ('-'은 signed)
  • Scale과 offset은 Linear equation을 통해 물리적 값을 표현하는데 사용한다. 
  • 최소[최대] 및 단위는 선택적인 메타 정보이다. 
  • 수신자는 수신 노드의 이름이다. (없다면, Vector__XXX가 사용됨)

 

예제 : EngineSpeed Signal의 물리적 값 추출하기 

CAN ID    Data bytes
0CF00400  FF FF FF 68 13 FF FF FF

 

#1 CAN ID와 DBC ID를 매칭하기

 

대부분의 raw CAN Data Log file에는 20 ~ 80개의 고유한 CAN ID가 포함되어 있다. 따라서 첫번째 단계는 각 CAN ID를 DBC의 관련 변환 규칙에 매핑하는 것이다. 일반 11 bit CAN ID의 경우, CAN ID의 10진수 값을 DBC CAN ID에 매핑하면 된다. Extended CAN ID의 29bit의 경우, 32bit DBC ID에 Mask(0x1FFFFFFF) 를 적용하여, CAN ID를 얻은 다음에 Log file에 매핑해야 한다. 

J1939 PGN 변환에 대하여, 

이 예제에서는 29bit CAN ID를 마스킹된 DBC ID에 직접 매핑한다. 실제로 J1939 변환은 CAN ID와 DBC ID에서 18bit J1939 PGN을 추출한 다음에 PGN을 비교하는 방식으로 수행되는 경우가 많다. 

방법은 사용하는 SW 따라 다르다. ASAM MDF와 같은 CANedge 툴과 Python API 툴에서 J1939 DBC를 로드하면 툴이 자동으로 J1939 PGN 매칭을 사용한다.

ID로 쉽게 변환하는 무료 툴

https://www.csselectronics.com/pages/j1939-pgn-conversion-tool

 

J1939 PGN vs. 29-Bit CAN ID - Online Converter [+ PGN List]

Need to convert a 29-bit CAN ID to a J1939 PGN (Parameter Group Number)? Or view the full J1939 PGN list? Then check out our online J1939 PGN converter tool!

www.csselectronics.com

 

#2 Signal Bits를 추출하기 

 다음으로 DBC Bit의 시작, 길이 및 Endian을 사용하여 CAN Frame Data Payload에서 관련 Bit를 추출한다. 이 예제에서 시작 Bit는 24(0부터 계산할 때 Byte 3을 의미)이고 Bit의 길이는 16(2Byte)이다. 

FF FF FF 68 13 FF FF FF

* Big Endian과 Little Endian 비교

이 예제에서는 Little Endian(Intel)을 사용했는데, 이는 DBC file의 'Bit Start'가 최하위 비트(LSB)의 위치를 반영한다는 것을 의미한다. Vector(CANDB++) 또는 Kvaser의 DBC file viewer에서 DBC Signal을 추가하는 경우, DBC editor에서도 LSB가 bit 시작으로 사용된다. 

대신 DBC editor GUI에서 Big Endian Signal을 추가하면, 여전히 LSB가 Bit Start로 표시되지만, DBC를 저장할 때, Bit Start는 Signal에서 MSB로 설정된다. 

 

#3 추출된 비트를 Scale하기 

엔진 속도 Signal은 LittleEndian(@1)이므로 Byte Sequence를 6813에서 1368로 다시 정렬해야 한다. 

다음으로 Hex string을 10진수로 변환하고 Linear conversion을 적용한다.

physical_value = offset + scale * raw_value_decimal
	
       621 rpm = 0 + 0.125 * 4968

즉, EngineSpeed의 물리적인 값은 621rpm이다.

 

#4 전체 Dataset Decoding

1 ~ 3 단계는 하나의 CAN Frame에 대해서 변환해보았다. 하지만 실제로는 수백만 개의 CAN frame, Time Stamp, 여러 개의 CAN ID 등을 디코딩해야 한다. 이러한 복잡성을 처리하기 위해서 Data Log file과 DBC File을 이용하여 raw CAN Data를 사람이 읽을 수 있는 형태로 디코딩하는 것이다. 

728x90
반응형
Comments