본문 바로가기
자동차 임베디드 SW/CAN통신 & LIN통신

CAN 통신에 대하여(2). 메세지의 ID

by 존버매니아.임베디드 개발자 2022. 6. 15.
반응형

캔통신의 메세지에는 ID 가 있다.

캔 통신에서 송신되는 메세지는 ID가 있으며, 최대 8바이트의 데이터를 담을 수 있다.

그런데 이전 글에서 말했듯이 캔의 메세지에는 source address, destination address가 없다.
근데 메세지는 버스에 연결된 모든 제어기에게 전송된다.

메세지를 수신하는 입장에서 생각해보면, 이 메세지를 누가 쏜건지, 이 데이터에 무슨 정보가 담긴건지 알 수가 없다.
그래서 사용하는 것이 바로 메세지의 ID 이다.

메세지마다 ID를 붙이고, 해당 ID의 메세지는 누가 송신을 누가하는건지, Data는 몇 바이트가 담기는 건지, 그리고 그 Data 영역에 담긴 데이터가 실제로 어떤 정보를 갖는건지
이런 정보들을 사전에 약속해둔다.

해당 CAN Bus로 통신에 참여하는 제어기들은 이 정보를 사전에 공유받아서 알고 있어야 메세지를 수신 받았을 때, 그 메세지를 받을지 말지, 그리고 받아서 어떻게 해석할 건지 알 수 있다.

예를 들어 설명해보겠다.

IDName송신자메세지
데이터 길이
(Byte)
포함된 데이터
123BMS_MsgBMS8SW Version
BMS 충전량
배터리 온도
200Abg_MsgAirbag4Airbag 고장 유무
Airbag SW Stae
Msg Counter
check sum
312Brk_MsgBrake6페달 각도
Brake SW State
Brake 고장 유무


위와 같이 해당 버스에서 사용할 메세지들에 ID를 붙여놓고,
해당 ID의 메세지에 이름을 붙이고, 데이터의 길이가 몇바이트인지, 그리고 그 데이터에 포함된 정보가 실제로 어떤 정보인건지 등을 서로 미리 약속해 놓는다.
또한 해당 ID의 메세지를 어떤 제어기가 송신할건지도 약속해놓는다.

이렇게 약속된 내용이 각 제어기 개발자들에게 공유될 것이다.

이제 각각의 제어기 개발자는 캔 메세지를 수신 받으면 메세지의 ID를 확인해보고,
저 테이블의 내용을 참고해서 해석하면된다.

예를 들어 내가 Brake 제어기 개발자다.
위와 같이 메세지들에 대해 정의된 CAN BUS에 통신을 참여하고 있다.
누군가 캔 메세지를 송신했고 내 제어기가 그 메세지를 수신받았다.
메세지를 열어봤더니 메세지의 ID가 200이다.
그러면 나는 이 메세지가 Airbag이 송신한 메세지라는 사실을 알 수 있다.
( 위에 작성된 테이블을 사전에 공유 받았으니까)
또한 해당 메세지에 어떤 정보들이 담겨 있는지도 알 수 있다.

만약 내가 이 메세지가 필요하다면, 이 메세지를 받아서 안에 들어있는 데이터를 해석해서 내 필요에 맞게 쓰면 된다.
만약 나에게 필요 없는 메세지라면?
그냥 무시하면 된다.

이건 수신하는 입장에서 얘기한 것이고, 위 테이블에 의하면 Brake 제어기는 Brk_Msg라는 메세지를 송신해야하고 해당 메세지의 ID는 312이다. 또한 해당 메세지에는 페달의 각도, Brake SW State, Brake 고장 유무
정보를 담아서 보내야한다.
따라서 Brake 제어기 개발자인 나는
우리 제어기가 ID 312인 캔 메세지를 송신하도록 SW를 구현해야하며, 이 때 이 메세지의 데이터 영역에는
페달의 각도, Brake SW State, Brake 고장 유무 정보를 담아야한다.
(표에서 이렇게 담기로 약속했으니까)

만약 내가 ID가 312가 아니라 ID 를 500이라고 적어서 메세지를 송신하면 어떻게 될까?
무슨 일이 발생하는 것은 아니지만, ID 500의 메세지가 다른 제어기들에게 송신될 것이다.
다른 제어기들은 위 표를 봤을때 ID가 500인 메세지에 대한 정보가 없으므로, ID 500인 메세지는 누가 쏜건지, 무슨 데이터가 담겨있는지 알지 못한다.
따라서 ID 500인 메세지는 수신 받아도 안쓰고 무시할 것이다.

그러므로, 우리는 사전에 약속된 정보를 바탕으로 CAN 메세지의 송신,수신 SW를 구현해야 할 것이다.

이렇게 메세지에 ID 를 붙여서 각 메세지가 어떤 메세지 인지를 정의해놓고 사용하는 것이 캔 통신의 두번째 특징이다.


참고로, CAN 통신에서 ID Type은 2가지가 있다.
Standard ID Type 의 경우 ID의 길이가 11bit 이다.
Extended ID Type 메세지의 경우 ID의 길이가 29bit 이다.


캔 메세지는 ID 별로 우선순위가 구분된다.
캔 통신은 Broad Cast 방식 송신이라고 했다. 근데 여기서 문제점이 있다.
통신에 참여하는 모든 제어기들이 하나의 공통선(Bus)를 사용해서 통신을 한다면 다음 상황에서 어떻게 해야될까?
A,B,C 제어기가 있다.
근데 A B C가 동시에 메세지를 송신하려고 한다면?

물리적으로 하나의 전선을 통해서 메세지를 송신하기 때문에 여러개의 메세지를 동시에 송신하는 것은 불가능하다.
이를 해결하기 위해 우선순위 컨셉이 필요하다.
A B C가 동시에 메세지를 송신하려고 한다면,
그 들간에 우선순위를 메겨서
우선순위가 높은 녀석이 먼저 메세지를 보내고, 그러고나서 그 다음 차례의 제어기가 메세지를 보내고.. 이런식으로
하면 문제가 해결 된다.

캔 통신에서 우선순위는 제어기별로 갖는게 아니라, 메세지의 ID 로 구분한다.
우선순위 규칙은 ID의 값이 낮을 수록 우선순위가 높다. 이다

Ex)
A 제어기가 ID 123 인 메세지를 송신하려고 함 ( ID값이 낮으므로 ID123 의 메세지가 ID 124 메세지 보다 우선순위 높다.)
B 제어기가 ID 124 인 메세지를 송신하려고 함

이 때, B 제어기는 메세지를 송신하는 과정에서 자신이 보내려는 ID 124인 메세지보다 우선순위가 높은(ID숫자가 낮은) 메세지를 누군가 송신하고 있다는 사실을 알게 되고, 자신이 메세지 보내려던 것을 멈춘다.
(이 사실을 어떻게 알게되는지는.. 설명 생략한다.)

A제어기와 B 제어기가 동시에 메세지를 송신하려고 했지만 , B 제어기가 자신이 보내려는 메세지의 우선순위가 낮다는 사실을 알고 메세지 송신을 멈춤으로써. ID 123인 메세지가 먼저 송신이된다.
그러고나면 B는 이제 자신이 보내려고했던 ID 124 메세지를 송신하게 된다.

이런 방법을 사용해서 하나의 버스에 여러 제어기가 동시에 메세지 송신할 때 충돌을 막을 수 있게 된다.


신입사원이 알아야 할 CAN 통신의 모든 것
강의를 진행하고 있습니다.
https://inf.run/Fbv2

CAN 통신 - 자동차 신입이 알아야 할 모든 것 - 인프런 | 강의

CAN 통신에 대한 '학술적인' 강의가 아니라 '같이 일하게 될' 신입사원에게 알려준다는 생각으로 일을 하는 과정에서 필요한 모든 얘기들을 담았습니다., - 강의 소개 | 인프런...

www.inflearn.com
















반응형