[7호]Multi-CAN Analyzer를 이용한 차량 ECU 모니터링
Multi-CAN Analyzer를
이용한 차량 ECU 모니터링
자료제공 : 마을소프트웨어
1. 들어가며
CAN (Controller Area Network)은 멀티마스터(Multi-Master) 브로드케스트 시리얼(Broadcast Serial) 버스 표준으로 실시간 제어 응용시스템 내에 있는 센서나 기동장치 등과 같은 주변장치들을 서로 연결해 주는 메시지 통신방식으로 마이크로 제어기용 네트웍을 가리킨다. CAN에서는 이더넷 등에서 사용되는 것과 같은 주소 지정 개념은 사용되지 않으며, 메시지는 해당 네트웍에서의 고유한 식별자를 사용하여 네트웍 내에 있는 모든 노드들에게 동시에 뿌려진다. 개개의 노드들은 이 식별자에 기반하여 해당 메시지를 처리할 것인지의 여부를 결정하며. 버스 접근 순서 역시 경쟁원리에 따라 메시지 우선순위가 배정되어 충돌이 없어 중단 없는 데이터 전송이 가능하다. 또한 differential twisted pair방식을 사용하여 노이즈에 매우 강한 특성이 있다. 보다 자세한 CAN에 대한 역사나 기술적인 내용은 본고에서는 생략하기로 하고 참고자료를 참고한다.
위와 같은 CAN 특성으로 최근 매우 안정성을 요구 하는 차량의 내부 네트워크로 CAN 통신을 사용하고 있는 추세다. 즉 주제어기인 ECU (Electronic Control Units) 끼리의 통신이나 각종 센서 및 작동기 등과 안정적인 통신을 위해 CAN이 사용되고 있는 것 이다. 따라서 CAN 통신을 이용하여 ECU가 이해할 수 있는 프로토콜로 통신을 하게 되면 차량 네트워크로부터 차량의 다양한 정보를 얻어 낼 수 있게 된다.
본고에서는 CAN 메시지를 송수신하고 메시지로부터 프로토콜을 해석할 수 있는 Analyzer를 소개하고, 그것을 통해 실제 차량 ECU로부터 다양한 정보를 모니터링 하는 방법에 대해 소개한다.
2. Multi-CAN Analyzer 소개
마을소프트웨어는 반도체 및 LED 생산설비 제조 전문업체로 그간 산업용 제어 분야의 경험을 기반으로 다양한 CAN 제품을 출시하였다. CAN 경험이 없는 일반 사용자들을 위해 보다 쉽게 접근할 수 있는 CAN2RS232 컨버터와, 인터넷을 통한 원격 제어를 위한 CAN2Ethernet 게이트웨이 등이 그것이다. 이 제품들은 주로 제어기 용도로 개발되었기 때문에 필터 설정을 통해 필요로 하는 메시지들만 CAN 버스로부터 수신하고 전송하는 제품으로 컨버터나 게이트웨이가 처리할 수 있는 용량 이상으로 CAN버스 메시지를 모두 처리 할 수는 없었다. 또한 절연되지 않아 현장 상황에 따라 컨버터가 파손되는 경우도 있었다. 이런 이유로 Analyzer 용도로는 적합하지 못해 High-End급 고성능 절연 CAN-USB Analyzer와 Multi-CAN Analyzer를 개발 출시 하게 되었다.
본고에서 소개될 Multi-CAN Analyzer는 이름에서 유추 할 수 있듯이 동시에 여러 인터페이스 방식을 사용할 수 있는데, 그것은 RS232C, USB 그리고 Ethernet이다. 따라서 어떠한 환경이나 조건에도 쉽게 Analyzer를 쓸 수 있는 장점이 있다. RS232C는 최대 460800bps의 속도 까지 사용할 수 있으며 인터페이스가 UART밖에 없는 소형 제어기와도 쉽게 연결된다. USB는 PC와 외부 전원 없이 연결할 수 있기 때문에 노트북으로 현장에서 디버깅하는데 매우 유용하다. Ethernet은 현장에 설치된 CAN버스의 문제점을 원격지 사무실에서 모니터링 하는데 매우 적합하다.
본 Analyzer는 제공되는 전용 프로토콜을 통해 직접 Analyzer를 제어기들과 연결하여 고성능 컨버터 처럼 사용할 수도 있지만, Windows 응용프로그램으로 제공되는 전용 분석기인 CANTALKER를 통해 추가적인 소프트웨어 개발 없이 고수준의 CAN 프로토콜을 분석할 수 있다. 기본적으로 표준 프로토콜로 OBD-II, CANopen 그리고 DeviceNet등이 일부 지원되며 향후 J1939도 지원될 예정이다.
그 밖에 CANTALKER가 지원하는 주요 기능은 다음과 같다.
· 10us 단위 Timestamp
· CAN 송신 메시지 프로그래밍
· CAN 송수신 메시지 읽기 및 저장
(텍스트 파일로 export지원)
· 특정 CAN 메시지 모니터링 및 산술 계산 / 그래픽 표시 / 로깅(실시간/비실시간 지원)
· CAN 수신 메시지 소프트웨어 필터링 / 트리거
· CAN 송수신 메시지에서 특정 메시지 찾기 / 복사
· CAN 버스 통계자료 제공
· CAN 컨트롤러 상태 확인 및 제어
· 터미널
· 펌웨어 업그레이드
본고에서 ECU 모니터링에 사용될 장비와 프로그램은 Multi-CAN Analyzer와 CANTALKER이다.
3. ECU 모니터링
CAN통신을 지원하는 차량의 대부분은 OBD-II PID 프로토콜을 지원한다. ECU와 통신하기 위해서는이 프로토콜을 반드시 숙지 해야 하는데 그다지 복잡하기 않기 때문에 쉽게 구현될 수 있다. 그럼 OBD-II PID가 무엇인지 다음절에서 알아 본다.
3.1 OBD-II PID란 ?
OBD-II PID는 On Board Diagnostics Parameter ID의 약자로 정확하게 말하면 프로토콜이 아니라 코드를 의미 하며 SAE J1979 표준의 한 부분으로 1996년부터 북미의 모든 차량에 구현되었다. 이 코드는 고장 진단장치가 차량으로부터 데이터를 얻는데 사용되는데 데이터를 요청할 때 OBD-II PID 코드를 정해진 프로토콜을 이용하여 차량으로 요청하여 응답을 얻는다. 중요 PID종류와 관련 응답 데이터 형식은 표 1과 같다. 모든 PID는 모든 차량에서 지원하는 것은 아닌데, 지원여부는 PID 00의 응답 값으로부터 알 수 있다.
표 1의 공식에서 사용되고 있는 알파벳 A, B, C, D 등은 수신된 데이터의 바이트 순서와 일치한다. 즉 첫번째 바이트는 A, 두번째는 B, 세번째는 C, 그리고 네번째는 D이다.
Mode | PID | 수신크기 | 설명 | Min | Max | 단위 | 공식 |
00 | 00 | 4 | PID Supported [01-20] | - | - | - | Bit encoded [A7..D0]== [PID 0×01..PID 0×20] |
01 | 04 | 1 | Calculated engine load value | 0 | 100 | % | A*100/255 |
01 | 05 | 1 | Engine Coolant Temperature | -40 | 215 | °C | A-40 |
01 | 0C | 2 | Engine RPM | 0 | 16383.75 | rpm | ((A*256)+B)/4 |
01 | 0D | 1 | Vehicle speed | 0 | 255 | km/h | A |
01 | 0E | 1 | Timing Advance | -64 | 63.5 | relative to #1 cylinder | A/2-64 |
01 | 0F | 1 | Intake air Temperature | -40 | 215 | °C | A-40 |
01 | 10 | 2 | MAF air flow rate | 0 | 655.35 | g/s | ((A*256)+B)/100 |
01 | 11 | 1 | Throttle Position | 0 | 100 | % | A*100/255 |
표1. PID 목록 및 설명 |
표 1의 Mode는 각 숫자별로 의미하는 내용은 표 2에서 알 수 있다. ECU의 각종 정보 데이터를 얻는 경우는 대부분 현재 데이터 표시용 Mode 0×01만 이용하면 되며, 차량의 고장진단 코드를 얻고자 하는 경우는 Mode 0×03를 사용한다.
Mode | 설명 |
0×01 | Show current data |
0×02 | Show freeze frame data |
0×03 | Show stored Diagnostic Trouble Codes |
0×04 | Clear Diagnostic Trouble Codes and stored values |
0×05 | Test results, oxygen sensor monitoring (non CAN only) |
0×06 | Test results, other component/system monitoring (Test results, oxygen sensor monitoring for CAN only) |
0x0A7 | Show pending Diagnostic Trouble Codes (detected during current or last driving cycle) |
0×08 | Control operation of on-board component/system |
0×09 | Request vehicle information |
0x0A | Permanent DTC’s (Cleared DTC’s) |
표 2. Mode별 설명 |
차량으로부터 데이터를 얻기 위해 ECU로 PID를 전달하기 위한 질의 CAN 메시지 형태는 각 메시지 데이터 바이트 별로 다음과 같은 형식을 갖는다. CAN ID는 11비트를 사용하는 경우 반드시 0x7DF로 해야 한다.
Byte 0 | Byte 1 | Byte 2 | Byte 3 | Byte 4 | Byte 5 | Byte 6 | Byte 7 |
추가데이터 바이트 수 0×02 |
Mode 0×01=show current data |
PID Code | 0×55 | 0×55 | 0×55 | 0×55 | 0×55 |
CAN메시지 전체 8바이트 중 첫번째 바이트(Byte0)는 몇 바이트의 정보가 오는지를 의미 하는 것으로 그 뒤로 Mode와 PID Code가 각각 1바이트씩 2바이트가 오기 때문에 2가 되며, 세번째 바이트(Byte2)는 PID코드가 위치하고 그 이상은 사용되지 않으므로 0×55로 채워진다.
이상과 같이 생성된 CAN 메시지를 ECU로 전송하면 ECU는 다음과 같은 형태의 CAN메시지로 응답한다. 이때 응답으로 오는 CAN ID는 주로 0x7E8이며, 0x7E9나 0x7EA가 될 수 도 있다.
Byte 0 | Byte 1 | Byte 2 | Byte 3 | Byte 4 | Byte 5 | Byte 6 | Byte 7 |
추가데이터 바이트 수 3~6 |
Custom Mode 0×40+Mode 0×41=show current data |
PID Code | Value0(A) | Value1(B) (Option) | Value2(C) (Option) | Value3 (D) (Option) | 0×55 |
여기서 첫번째 바이트는 질의 메시지와 동일하게 이후에 올 추가 데이터의 크기이다. 두번째는 질의 메시지에서 사용된 Mode값에 0×40을 더한값과 같다. 내번째 부터는 질의한 PID에 대한 응답데이터가 온다. 데이터 크기는 1바이트부터 4바이트까지만 갖을 수 있어 마지막 Byte7은 사용되지 않아 0×55로 채워진다. 응답데이터는 첫번째 바이트부터 A, B, C, D로 명명되고 PID 표의 공식 부분에서 참조된다.
3.2 ECU 모니터링을 위한 전송 메시지 설정
이제 ECU로 전달해야 할 CAN메시지 형식을 알게 되었기 때문에 Analyzer에서 질의 메시지를 작성하여 보내 보고자 한다. 보낼 PID는 표 1에 나와 있는 것으로 하고, 각 PID별로 보내는 시간 간격은 10ms로 한다. 모든 PID를 모두 보내면 10ms 만큼 대기하고 다시 처음부터 PID전송을 반복 한다. 이것을 Analyzer의 “CAN Send Message Tool”에서 설정하는 방법은 다음과 같다.
1. Engine RPM 질의를 위한 CAN메시지 예는 다음과 같다.
A. 전송하므로 Task Type은 “TX”
B. 11비트 질의이므로 CAN ID는 0×7DF, 2.0B와 RTR은 설정하지 않음
C. DATA는 “02 01 0C 55 55 55 55 55”로 함, 여기서 0×0C Engine RPM 질의 PID임.
D. 추가 반복하지 않으므로 Repeat는 “0”
E. 10ms이후에 다음 메시지 전송하므로 Interval은 “10”
2. 위와 같은 형식으로 나머지 PID에 대해서 모두 추가 한다.
3. 모든 PID가 전송된 후 10ms대기를 위해 Task Type이 “WAIT”, Wait Time을 10으로 설정한다.
4. 다시 처음부터 반복 전송을 위해 Task Type을 “GOTO”, Goto Index는 “0”으로 설정한다.
이렇게 모두 입력되면 “CAN Send Message Tool”창은 다음과 같이 보여지며 전송준비는 완료되며 (GO)버튼을 클릭하면 CAN메시지가 전송되기 시작한다. 이때 대부분 차량내에 사용되는 CAN통신 속도는 500kbps이므로 사전에 CAN통신 속도는 맞춰져 있어야 한다. 그렇지 않은 경우는 Analyzer의 Error LED가 켜질 것이다.
3.3 ECU 모니터링을 위한 수신 메시지 설정
3.1절에서 OBD-II PID가 포함된 질의 메시지에 대한 ECU 응답 메시지에 대한 형식을 알아 봤다. 이 정보를 토대로 CANTALKER에서 지원하는 “Monitor CAN ID & Data” 기능을 이용하여 응답 메시지로부터 실제 물리적인 값들을 추출하여 그래프로 표시하여 보자.
응답 메시지 형식과 표 1의 공식 부분을 참고 하여 “Monitor Condition”을 작성하여 보자. “Engine RPM”작성예를 보면 다음과 같다.
1. Item Title은 제목인 “Engine RPM”을 기록한다.
2. “CAN ID To Monitor”는 모니터링 하고자 하는 CAN ID를 의미 하므로 0x7E8이 된다.
3. “Engine RPM”의 경우 PID가 0x0C인데, CAN메시지 8바이트 중 세번째 바이트가 PID이므로 이 값이 0x0C인 메시지를 찾기 위해 Mask와 Compare는 다음과 같이 설정한다.
4. Mask는 세번째 바이트만 관심 대상이므로 0xFF로 설정하고, Compare값의 세번째 바이트를 0x0C로 설정한다. 이유는 “MSG & Mask == Compare”공식에 의해 각 바이트에 대해 모두 참이 되면 수신 메시지를 사용하게 된다.
5. 이렇게 수신 조건에 의해 걸러진 “Engine PRM” 메시지에서 Engine PRM에 관련된 데이터를 추출하기 위해 다음과 같이 설정한다.
6. Engine RPM값은 CAN 메시지 8바이트 중 4번째 바이트부터 2바이트 크기를 갖기 때문에 “Offset”은 3, “Length”는 2가 된다. 추출된 2바이트에서 첫번째가 상위 두번째가 하위 바이트가 되는 Big Endian형식이므로 “Big Endian”에 채크한다. 또한 공식에 의해 2바이트 값을 4로 나누거나 또는 0.25로 곱해야 하므로 “Multiply”에 0.25를 입력한다. 최종 생성되는 값은 산술 계산된 정수형이므로“Display Data Format”을“Scaled Integer”로 선택한다.
7. 결과적으로 생성된 물리값은 그래프로 표시하고 싶으므로 “Display Type”을 “Graph”로 선택하고 최대 최소값을 각각 0과 6000으로 한다.
그 밖의 다른 Item들도 위와 같은 형식에 의해 공식을 참고하여 비슷한 형식으로 아래 그림3과 같이 모두 입력한다.
3.4 실차량에서 모니터링 수행
3.2절에서 전송할 메시지들를 생성하고 3.3절에서 추출할 수신메시지 형식과 표시형식을 모두 설정하였으므로 실제차량에서 ECU에서 정보가 실제로 오는지 확인해 보자.
먼저 CAN 방식의 OBD-II가 지원되는 차량을 준비해야 한다. 대부분 최근에 생산된 차량은 거의 CAN 버스와 OBD-II를 지원하고 있다. 간혹 CAN은 지원하는데 OBD-II PID메시지에 대해 무응답하는 차량도 있으니 미리 확인해야 한다. Analyzer를 차량의 OBD-II단자에 연결하기 위해서는 OBD-II단자의 핀배열을 확인한 후 CAN 컨넥터와 맞게 케이블을 다음과 같이 제작해야 한다. OBD-II컨넥터는 디바이스마트에서 쉽게 구매할 수 있다.
그림4에서 OBD-II Male Connector의 PIN6은 CAN_H, PIN14는 CAN_L 이므로 Analyzer DB9 Connector의 PIN7번과 PIN2번에 각각 연결한다. CAN_H와 CAN_L은 잘못 연결되어서는 절대 안되므로 주의 깊게 작업해야 한다.
커넥터 작업이 완료되면, Analyzer를 차량의 OBD-II단자에 연결한다. 차량에 전원이 들어가거나 시동이 걸려있어야 CAN 통신이 되므로 사전에 전원을 넣거나 시동을 걸어 놓는다. 만약 컨넥터를 연결하자 마자 Analyzer의 Error LED가 점등 된다면, (1) 500kbps 속도 설정이 제대로 안되었거나, (2) CAN_H, CAN_L라인 결선에 문제가 있거나 (3) 종단저항 연결이 ON되어 있는 경우일 수 있으므로 다시 한번 확인해 본다.
모든 준비가 완료되면, “CAN Send Message Tool”에서 (Go)버튼을 클릭하여 ECU에 질의 메시지를 전송시킨다. 그러면 아래와 같이 질의에 해당하는 응답이 수신되면서 그 값과 그래프가 표시된다.
3.5 기타 차량 네트웍의 데이터 분석
차량에 Analyzer를 연결하여 보면 OBD-II PID질의 메시지를 보내지 않아도 수많은 메시지들이 수신되는 것 관찰 할 수 있다. 이 메시지들은 차량에 붙어있는 다양한 센서와 작동기 등과 ECU간에 정보 교류일 것인데 차량회사의 전용 프로토콜을 사용했을 것이다. 이에 알 수 없는 다양한 메시지들이 어떤 의미로 사용되는 것인지 분석하기 위한 방법을 본 절에서 제시하겠다.
그림6은 뉴카렌스 차량에서 수신한 메시지들에 대해 “CAN Bus Statistics” 기능을 이용하여 어떤 메시지들이 있는지 통계를 보여주고 있다.
OBD-II PID와 관련된 CAN ID를 제외하고 총8개의 CAN ID가 사용되고 있다. 각 ID에 대해 실시간으로 값을 모니터링 하려면 CANTALKER의 “Monitor ID & Data” 기능에서 통계창에서 보여지는 각각의 CAN ID에 대해 “CAN ID to Monitor”에 ID를 입력하고,“Display Data Format”을 “All Data”로 설정하며 [Logging]을 체크하는 식으로 보든 CAN ID를 다음과 같이 입력한다.
현재 차량에 연결되어 있는 상태라면 [RealTime]을 채크한 후 [Go]버튼을 클릭하면 실시간으로 수신되는 Data 내용을 볼 수 있으며 변화되는 내용이 쉽게 관찰될 수 있다. 만약에 이미 차량에서 데이터를 모두 수집한 상태에서 후처리로 확인하고 싶다면 [RealTime]을 끄고 [Go]버튼을 클릭한다. 처리가 완료되면 CANTALKER 프로그램에 있는 디렉토리에 “Item Title”을 파일이름으로 하고 확장명이 “log”인 파일들이 각각 생성된다. 예를들어 “test_271”에 대해서는 “test_271.log”로 생성된다.
그럼 관찰된 데이터로부터 좀더 깊이 분석을 하기 위해 329 CAN ID의 데이터를 확인해 보자. 다음은 수신된 메시지 로그의 일부이다.
20087.55 40 5D 7D 04 04 20 FF 14
20097.49 40 5D 7D 04 04 20 FF 14
20107.47 40 5D 7D 04 04 20 FF 14
20117.45 86 5D 7D 04 04 20 FF 14
20127.48 86 5D 7D 04 04 20 FF 14
20137.48 86 5D 7D 04 04 20 FF 14
20147.43 86 5D 7D 04 04 20 FF 14
20157.42 86 5D 7D 04 04 20 FF 14
20167.46 86 5D 7D 04 04 20 FF 14
20177.49 86 5D 7D 04 04 20 FF 14
20187.40 86 5D 7D 04 04 20 FF 14
20197.40 DE 5D 7D 04 04 20 FF 14
20207.63 DE 5D 7D 04 04 20 FF 14
20217.41 DE 5D 7D 04 04 20 FF 14
20227.37 DE 5D 7D 04 04 20 FF 14
20237.36 DE 5D 7D 04 04 20 FF 14
첫번째 컬럼은 timestamp이고 두번째가 메시지 내용이다. 메시지 내용을 보면 8바이트 중 첫번째 바이트만 변화되는 것을 볼 수 있다. 그럼 첫번째 컬럼에 대해 그래프로 확인하기 위해 “Monitor CAN ID & Data”기능에서 “test_329” item에 대해 “Calculation Information”과 “Display”를 다음과 같이 수정한다.
1. Offset : 0
2. Length : 1
3. Multiply : 1
4. Add : 0
5. Display Data Format : Scaled Integer
6. Display Type : Graph
7. Min : 0
8. Max : 256
이상과 같이 설정을 완료한 후 다시 [Go] 버튼을 클릭하면 다음과 같이 그래프가 그려지는 모습을 볼 수 있다. 정확하게 무엇을 의미하는지는 자동차 업계에서 일하는 사람이라면 알 수 있을지도 모르겠다.
4. 맺음말
이상과 같이 차량의 ECU 정보값을 모니터링 하기 위해 OBD-II PID와 관련한 질의와 응답 프로토콜에 대해 확인하였고, 그 내용을 Analyzer에 적용하여 각각의 데이터를 수신하고 그래프까지 출력해 보았다.
필자도 그러했지만 많은 사람들은 정보가 없었을 때 차량의 ECU와 통신을 해서 각종 정보를 얻어내는 것은 자동차 회사에서 프로토콜을 공개하지 않는 이상 불가능 한 것으로 여겨 왔었다. 그러나 정말 단순한 OBD-II PID 프로토콜만 인터넷 검색으로 찾아본다면 차량의 각종 상태나 고장진단 등을 Analyzer로 매우 쉽게 해낼 수 있다는 것을 알게 되었다.
그 밖에 Analyzer에서 제공하는 CANopen이나 DeviceNet 프로토콜로 관련 프로토콜을 지원하는 다양한 장비들의 상태 체크나 고장진단 등에 활용할 수 있으며, 표준 프로토콜을 사용하지 않는 각종 장비나 차량 부품도 CAN버스 통계정보로 사용되는 모든 CAN ID를 찾아 낼 수 있고, 찾아낸 CAN ID에 대해 각각 실시간 모니터링 함으로써 그 메시지의 특성이나 프로토콜을 쉽게 알아 낼 수 있다.
5. 참고자료
http://terms.co.kr/CAN.htm
http://en.wikipedia.org/wiki/Controller_area_network
http://en.wikipedia.org/wiki/OBD-II#OBD-II
http://en.wikipedia.org/wiki/OBD-II_PIDs
Multi-CAN Analyzer & Converter User’s Manual (http://user.chollian.net/~ascbbs/can/MCA_100_Manual.pdf)