본문 바로가기
mobilgene/DCM

[DCM] IOCBI(0x2F)에서 5Byte Request에도 Positive Response가 발생하는 이유와 해결 방법

by Autosar 2026. 7. 23.
반응형

차량 ECU를 개발하다 보면 IOCBI(Input Output Control By Identifier, UDS Service 0x2F) 를 이용하여 모터, LED 등 다양한 출력 장치를 강제로 제어하는 기능을 구현하게 된다.

 

최근 프로젝트에서 IOCBI 기능을 검증하던 중 예상과 다른 동작을 확인하였다.

 

정상적으로는 4Byte Request만 허용될 것으로 예상했지만,

실제로는 5Byte Request까지 Positive Response를 반환하고 있었다.

 

처음에는 DCM의 메시지 길이 검사에 문제가 있다고 생각했지만, 원인을 분석해 보니 설정 방식과 Generator의 동작 때문이었다.

이번 글에서는 해당 이슈를 분석한 과정과 해결 방법을 정리해 보려고 한다.

 

문제 현상

 

예를 들어 강제구동 DID가 0xA123이라고 가정해 보자.

현재 DID는 Short Term Adjustment(Control Parameter = 0x03) 를 사용하도록 설정되어 있었다.

 

시험 결과는 다음과 같았다.

Request Response
2F A1 23 03 Positive Response
2F A1 23 03 01 Positive Response
2F A1 23 03 01 02 NRC13

 

추가 데이터가 포함된 Request는 NRC13 (Incorrect Message Length Or Invalid Format)을 반환할 것으로 예상했지만,

실제로는 5Byte Request까지 정상적으로 처리되고 있었다.

 

왜 이런 동작이 발생하는 것일까?

 

IOCBI의 Control Parameter란?

 

IOCBI(Service 0x2F)는 DID만 전송하는 서비스가 아니라,

해당 DID를 어떤 방식으로 제어할 것인지를 나타내는 Control Parameter를 함께 전송한다.

 

Request Format은 다음과 같다.

 

대표적인 Control Parameter는 다음과 같다.

값 기능
0x00 Return Control To ECU
0x01 Reset To Default
0x02 Freeze Current State
0x03 Short Term Adjustment

 

예를 들어 2F A1 23 03은 "DID 0xA123을 Short Term Adjustment 방식으로 제어하라."라는 의미가 된다.

반대로 2F A1 23 01은 "DID 0xA123을 Reset To Default 방식으로 제어하라."라는 의미이다.

 

즉, Control Parameter에 따라 동일한 DID라도 동작 방식이 달라진다.

 

Control Option Record란?

 

Control Parameter에 따라서는 Control Option Record라는 추가 데이터를 함께 전달할 수 있다.

Request Format에서 보면 마지막 필드가 바로 Control Option Record이다.

 

즉, Control Option Record는 강제구동에 필요한 제어값(Control Data) 이며, Control Parameter가 Short Term Adjustment인 경우 함께 전달될 수 있다. 반면 Reset To Default(Control Parameter = 0x01) 는 기본 상태로 복귀를 요청하는 기능이므로 일반적으로 별도의 Control Option Record를 일반적으로 사용하지 않는다.

 

이 때문에 프로젝트에서 Short Term Adjustment 대신 Reset To Default를 사용하도록 변경한 후에는 추가 데이터가 포함된 Request에 대해 NRC13을 반환하는 동작을 확인할 수 있었다.

 

원인 분석

 

먼저 Mobilgene에서 해당 DID의 설정을 확인하였다.

 

또한 Byte Size는 1Byte로 설정되어 있었다.


처음에는 Byte Size가 1Byte이기 때문에 5Byte Request가 허용되는 것으로 생각하였다.

그래서 Byte Size를 1 → 0으로 변경하면 해결될 것이라고 예상했다.

 

Byte Size를 0으로 변경하면 발생하는 문제

 

Byte Size를 0으로 변경한 후 Generate를 수행하자 다음과 같은 오류가 발생하였다.

SAFERTE_ERR_0046: Missing required configuration
ARRAY-SIZE should be configured for the IMPLEMENTATION-DATA-TYPE of category ARRAY

 

처음에는 Generator의 문제라고 생각했지만, 원인을 분석해 보니 Byte Size의 역할을 잘못 이해하고 있었다.

 

Byte Size는 Request의 허용 길이를 직접 결정하는 설정이 아니라,

Generator가 Implementation Data Type을 생성하기 위한 데이터 크기 정보이다.

 

따라서 Byte Size를 0으로 변경하면 Array Type을 생성하는 과정에서 ARRAY-SIZE를 생성할 수 없어 Generate가 실패하게 된다.

 

즉, Byte Size를 변경해서 Request 길이를 제한하는 것은 올바른 해결 방법이 아니었다.

 

실제 원인은 무엇이었을까?

 

이후 DcmDspDidControl 설정을 다시 확인하였다.

 

현재 프로젝트에서는 해당 DID가 Short Term Adjustment(Control Parameter = 0x03) 를 사용하도록 설정되어 있었고,

Generator가 생성한 DCM 코드를 확인한 결과, 현재 플랫폼에서는 Byte Size가 1Byte인 설정에 따라 1Byte의 추가 데이터를 허용하는 형태로 동작하고 있음을 확인하였다.

 

그 결과 다음과 같은 Request도 정상 요청으로 처리하였다.

2F A1 23 03 01

 

즉,

2F A1 23 03
2F A1 23 03 01

 

두 Request 모두 Positive Response를 반환하는 것은 현재 설정과 Generator가 생성한 코드 기준에서는 정상 동작이었다.

 

해결 방법

 

프로젝트 요구사항을 다시 확인한 결과, 해당 DID는 Short Term Adjustment 기능이 반드시 필요한 DID는 아니었다.

따라서 DcmDspDidControl 설정을 다음과 같이 변경하였다.

 

변경 전

 

변경 후

 

이번 프로젝트에서는 강제구동 시 별도의 제어값(Control Option Record)을 전달할 필요가 없었기 때문에

Short Term Adjustment 대신 Reset To Default를 사용하는 것이 요구사항에 적합하였다.

 

설정을 변경한 후 다시 시험한 결과는 다음과 같았다.

Request Response
2F A1 23 01 Positive Response
2F A1 23 01 01 NRC13
2F A1 23 01 01 02 NRC13
2F A1 23 01 01 02 05 NRC13

 

추가 데이터가 포함된 모든 Request에 대해 NRC13 (DCM_E_INCORRECTMESSAGELENGTHORINVALIDFORMAT) 을 반환하는 것을 확인하였다.

 

이를 통해 프로젝트에서 요구하는 동작을 만족할 수 있었다.

 

적용 시 고려해야 할 사항

 

이번 변경은 단순히 하나의 DID 설정만 수정하는 문제가 아니다.

 

DcmDspDidControl 설정은 IOCBI 서비스의 동작 방식에 영향을 줄 수 있으므로,

플랫폼에서 공통으로 사용하는 설정이라면 반드시 플랫폼 담당 부서와 충분한 협의를 진행한 후 적용하는 것이 좋다.

 

또한 동일 플랫폼을 사용하는 다른 프로젝트에서도 동일한 설정을 사용할 가능성이 있으므로,

변경 적용이 결정될 경우에는 전 차종에 대한 수평 전개 여부도 함께 검토하는 것을 권장한다.

 

정리

 

이번 이슈를 분석하면서 가장 크게 느낀 점은 Byte Size와 Request 길이는 서로 다른 개념이라는 것이다.

 

처음에는 Byte Size를 변경하면 Request 길이도 함께 제한될 것이라고 생각했지만,

실제로는 Generator가 사용하는 데이터 타입 생성 정보였으며 Request 허용 여부를 직접 제어하는 설정은 아니었다.

 

또한 이번 사례를 통해 IOCBI에서 예상과 다른 Request 처리 동작이 발생한다면 단순히 Byte Size만 확인하기보다

DcmDspDidControl 설정과 Generator가 생성한 DCM 코드의 동작을 함께 확인하는 것이 중요하다는 것을 알 수 있었다.

 

프로젝트마다 OEM 요구사항이나 플랫폼 구현 방식은 다를 수 있다. 따라서 무조건 Short Term Adjustment를 Reset To Default로 변경하는 것이 정답은 아니며, 해당 DID에서 어떤 Control Parameter를 사용해야 하는지 요구사항을 먼저 확인한 후 설정을 적용하는 것이 가장 중요하다.

 

※ 본 글은 특정 프로젝트에서 실제 분석한 사례를 기반으로 작성한 내용이다. 플랫폼 구현 방식이나 Generator 버전에 따라 동작이 달라질 수 있으므로, 동일한 현상이 발생하는 경우에는 프로젝트의 진단 요구사항과 DCM 설정을 함께 확인하는 것을 권장한다.

반응형