본문 바로가기

조금은 전문적인 이야기/자동차 통신

SID(Service Identifier)와 PID(Parameter Identifier)의 기초


 간만의 포스팅이다. 일단 파형을 읽는 방법을 통해 어떤 코드인지 읽는 기본기에 대해 설명을 했으니, 이제 각 프로토콜 별 설명을 들어가기 전에 SID(Service Identifier)와 PID(Parameter Identifier)에 대해 설명을 할 차례가 되었다. 사실 이 부분에 대해서는 각 프로토콜 별로 상이 하기 때문에 일단 가장 기본적인 KWP2000의 기준에 맞춰서 설명을 하도록 하겠다. 사실 UDS 이전의 CAN을 제외하면 대부분 같은 SID 체계를 가지고 있기 때문에 이정도만 알고 있어도 기본기는 충분하다고 할 수 있다. 


 먼저 SID(Service Identifier)에 대하여 이야기를 해보자. 이 부분은 많은 문서와 공부하는 학생들이 PID(Parameter Identifier) 또는 MID(Mode Identifier)로 오해를 하는 녀석이다. 정의하는 단어가 뭐가 중요하겠냐 만은, 단어가 통일이 되지 않으면, 이후에 있을 진짜 PID와 MID를 다루는 부분에서 무척이나 헷갈리기 때문이다. 


 잡설이 끼었는데, SID란 프로토콜상에서 Tester가 ECU에게 "XXX" 서비스에 대한 응답을 요구하기 위한 코드 이다. 서비스의 종류는 꽤나 많기 때문에, 나중에 다시 설명을 하겠지만, 간단하게 맛보기로 보자면 이런 서비스 들이 있다. 



 SID Hex value라고 적혀진 부분이 해당하는 서비스의 ID이고 어떤 서비스 인지는 Diagnostic service name에 명시가 되어 있다. 당장 이 표를 이해하기는 큰 무리가 있을 것이다. 왜냐하면 저기 적혀있는 Diagnostic sessions에 대한 이해가 전혀 이루어지지 않았기 때문이다. 세션에 대한 문제는 영어로 써있어서 어렵게 느껴지겠지만 알고보면 아주 단순하다. 


 일단 기본적으로 통신 오픈이 된 상태인 SS(Standard Session)과 일부 액츄에이션과 캘리브레이션을 위한 AS(Adjustment Session),그리고 코딩을 위한 PS(Programming Session)가 기본적이고 그다지 접할일은 없는 DS(Development Session), VMSS(Vehicle Manufacturer Specific Session), SSSS(System Supplier Specific Session)로 이루어져 있다. 사실 DS, VMSS, SSSS의 경우는 이쪽 계통에서 일을 하지 않는 이상 절대로 접할 일이 없는 세션이며, 용도는 매우 전문적이다. DS의 경우 일부 맵핑을 위해 사용 되는 경우가 있으나, 극히 드물다. 


 다시 SID로 넘어와서 적혀있는 ID에 대한설명을 하자면, 메세지 포멧에 있는 SID가 들어가는 자리에 해당 코드가 들어가면 해당 서비스를 수행하라는 명령어가 완성이 된다.



 이것이 기본적인 KWP2000의 메세지 형식인데, 떡하니 SID라는 부분이 자리잡고 있다. 그 부분에 해당 ID가 들어가면 된다는 것이다. 차후에 프로토콜에 대해 설명할 때 다시 설명을 하겠지만, 메세지 포맷에 대해 간단하게 설명을 하자면, FMT는 포맷 바이트로서 해당 프로토콜의 종류를 말해준다. KWP2000의 경우 8X 타입이 있고, 0X 타입이 있다. 해당 타입의 차이에 대해서는 나중에 KWP2000을 설명할 때 다루도록 하겠다. TGT의 경우는 메세지를 보내는 대상의 주소를 나타내는데, Tester로 보내는 것인지, ECU로 보내는 것 인지에 대해 판단하는 근거가 된다. SRC는 메세지를 보내는 장비의 주소를 나타낸다, 이후 SID로 요청하는 서비스의 종류가 붙으면 기본적인 메세지가 완성이 된다. 


 자 그럼 PID는 무엇이란 말인가? 사실 PID는 한개의 이름이 아니다. SID의 종류에 따라 파생이 되어지는 Mode나 Local Identifier를 모두 포함하는 것이다. 딱 SID만 두고 보게 되면 범위가 너무 넓다. 간단하게 예를 들어보면 0x10의 명령만 보더라도 그냥 달랑 Start diagnostic session이라고만 되어있다. 모두 보지 않았는가? 세션의 종류는 한개가 아니다. 따라서 여기에 붙는 것이 세션의 모드를 결정하는 PID가 된다. 



 이런식으로 0x10 이후에 어떤 값이 오는지에 따라서 어떤 세션을 열라는 명령이 된다. 0x81의 경우 SS를 여는 것이고 명시는 안되어 있지만 0x85의 경우는 PS를 열라는 명령이 된다. 



 해당 내용에 대해 나와있는 문서를 보면 명령의 패턴에 대해 이런식으로 나와 있다. 



 알아보기가 쉽지는 않으나, 위에 표시된 엑셀 화면과 매칭을 해보면 어떤식으로 명령어가 자리잡게 되는지 알 수 있다. Lenth의 경우 KWP2000의 타입에 따라 FMT에 포함이 될 수도 있고, 분리가 될 수도 있는데, 엑셀화면에 나오는 코드는 FMT에 렝스가 포함이 된 화면이다. 간단하게 말하면 FMT인 0x82가 의미 하는 것은 0x80 타입의 프로토콜이며, 0x02개의 데이타 수를 가진 메세지라는 의미이다. 데이타 수는 SID와 PID(Data)의 갯수를 말한다. 표에서는 0x10과 0x81 두개이기 때문에 0x02가 되는 것이다. 이를 Lenth를 포함하지 않는 메세지 형식으로 바꾸면 간단하게 80 10 F1 [02] 10 81 14 이렇게 바꿀 수 있다. 어떤가? 문서의 내용과 동일하지 않은가!!


 사실 문서에 나와있는 SID는 General 한 녀석이다. 일부 항목을 제외하고는 반드시 지켜야 할 필요는 없기 때문에, 제조사 별로 약간씩 상이한 코드와 리스트를 가지고 있는데, 기본적인 리스트는 다음과 같다. 



  살펴보면 각 SID이 범위별로 정의되는 문서가 다름을 알 수 있는데, 각 문서에서 해단 SID의 종류와 사용법에 대해 정의가 되어있다. 대부분 XXX 14230-3에서 정의가 되어 있는데 이것이 이번 포스팅에서 설명하고 있는 KWP2000에 대한 공식 문서이다. 


 SID(Service Identifier)와 PID(Parameter Identifier)에 대해서 다루려면 이정도 포스팅 가지고는 어림도 없다. 각 SID별로의 쓰임새와 사용 방법에 대해서 설명하려면 더 많은 포스팅이 필요한데, 이 기초가 되는 내용을 알고 있으면 이 후 프로토콜을 설명할 때 좀더 잘 이해할 수 있기에 먼저 설명을 했다. 이 내용에 대해서는 차후에 좀더 많은 설명을 하도록 하겠다. 


 마지막으로 실제 통신 데이터와 그 데이터에 대한 분석화면을 올린다. 위의 내용과 함꼐 보면 이해가 잘 될 것이다.