CAN 메세지와 시그널

강형우·2024년 8월 1일
0

CAN

목록 보기
2/6
post-thumbnail

메세지의 ID

  • CAN 메세지 내부에는 Transmitter, Receiver 정보가 따로 없다

    • 받는 제어기 입장에서의 문제점: 모든 메세지가 브로드캐스트 방식으로 전송이 되니 다른 제어기들이 어떤 메세지를 보낼 때마다 그 메세지들이 전부 수신이 됨

    • 하지만 메세지 안에 그 메세지를 누가 보낸건지, 메세지 내용 등을 파악할 방법이 없음

    • 이 문제를 해결하기 위해 메세지의 ID를 사용

    • Arbitration Field에 id를 적을 공간이 있음

    • Data에 우리가 실제로 보내려는 값들을 넣는 곳이 있음

    • ex) 내가 BMS개발하는 사람이면 BMS제어기는 ID영역에 16진수로 123을 적은 후 데이터를 채워서 보내야함

    • 메세지 ID라는것이 없었더라면 어떤 메세지를 수신했을 때 이 메세지가 누가 보낸 건지 어떤 내용이 담겨 있는 건지를 알 수 없는데 ID라는것이 있으니 메세지를 수신 받으면 메세지를 들여다 본 후 ID영역에 간 후 ID가 0x500이면 '엔진제어 상태 메세지이고 엔진 제어기가 보냄'을 알 수 있다

    • 실제로는 하나의 제어기가 다양한 아이디에 메세지를 보냄

    • 그렇지만 특정한 ID의 메세지를 보내는 제어기는 하나여야 됨

      • ex) 0x123이라는 아이디의 메세지를 보내는 제어기는 BMS만 있어야 함
      • 엔진 제어기도 0x123으로 보내고 에어백도 0x123으로 보내는 방식이면 안됨
      • 하지만 받아가는 제어기는 여러 개가 될 수 있음
  • 메세지 수신 받은 제어기들은 이 메세지가 무슨 메세지인지, 누가 보낸것인지 확인 필요

  • 그것을 구분하기 위해 사용되는게 메세지 ID

  • ID별로 메세지의 이름을 붙이고, 그 메세지를 누가 보낼건지를
    OEM에서 사전에 정의해둔다

  • 이런 정보가 담겨있는 자료를
    CAN Db, Can DataBase, Communiation Matrix , K-Matrix
    등으로 부른다

  • CAN 통신에서 메세지 형태를 ID의 길이에 따라 메세지를 2가지 포맷으로 구분

    • Standard Format : 11bit
    • Extended Format : 29bit
  • 이 두가지를 혼용해서 함께 사용할 수 있다

메세지의 우선순위 & Bus Load

메세지의 우선순위

  • CAN 통신에선 ID의 값을 이용하여 우선순위를 정함
    • ID의 값이 작을수록 우선순위가 높다
  • 제어기들은 CAN통신을 할 때 현재 네트워크에서 누군가 메세지를 보내고 있는지 아닌지를 계속 체크한다
    • 체크를 하다 아무도 메세지를 보내지 않을때 메세지를 보냄

  • 현재 메세지가 없는 상태라 순서대로 123, 134, 154 메세지를 3명이 동시에 쓰기 시작
    • 한 비트씩 읽어가는데 3개가 1,1,1을 출력해도 하나라도 0을 보내면 전선에는 무조건 0에 해당하는 전기적인 신호가 나가도록 설계되어있다
    • 앞자리에 0이 많을수록 결과적으로 작아짐 -> ID 값이 작을수록 우선순위가 높다

Bus Load (단위 : %)

  • Bus Load: 전체 네트워크에서 실제로 메세지가 왔다 갔다 한 기간을 %로 나타낸 것
    • ex) 전체 네트워크에서 메세지 하나를 보내는데 예를 들어 1초가 걸린다고 가정하면 전체 5초라는 시간 동안 1/5 = 20%가 된다.
    • 만약 5초동안 메세지가 2개가 왔다갔다 하면 2/5 = 40%
  • Bus Load가 가득차면 메세지를 추가로 보내고 싶어도 못보내는 현상이 생길 수 있다
    • 따라서 보통 Bus Load를 얼마 이하로 유지하는 요구사항이 주어짐
    • 메세지의 크기가 작으면(데이터를 최대한 작게) 점유율을 낮출 수 있음
    • 보내는 주기를 낮추는 방법도 있음

메세지 속 시그널

  • ex) 배터리 상태를 보내려 한다면

    • battery voltage, battery capacity, battery current 정보를 아이디가 0x123인 배터리 상태 라는 메세지 안에 넣어서 보냄
    • 메세지 안에 내가 보내려 하는 정보 하나하나의 단위를 시그널이라고 함
  • CAN 메세지 하나에 최대로 담을 수 있는 데이터는 최대 8Byte

  • 만약 내가 메세지 안에 총 8바이트의 데이터를 보낼 거다 하면 DL에 값을8이라고 적어서 보냄

  • CAN DB에는 각 메시지마다 데이터 영역의 길이가 얼마인지 나타내는 정보도 있다

  • 메세지 안에 어떤 시그널이 들어가 있는지 그 정보도 CAN DB에 담겨 있어야 된다

  • 수신된 데이터들은 어떠한 값임

    • 이 값들이 3가지 시그널을 나타내는 건 알겠는데 여기 쓰인 숫자 값들이 어디서부터 어디까지가 배터리 전압, 용량, 전류인지 정보를 알아야함
  • 시그널마다 속성값을 가짐
  • 배터리전압
    • Start bit: 0bit
    • Length: 7bit
    • Unit: V
    • Signal comment: 복잡하면 적음
  • 배터리 전류
    • Start bit: 7bit
    • Length: 7bit
    • Unit: A
    • Signal comment: 복잡하면 적음
  • 배터리 용량
    • Start bit: 14bit
    • Length: 18bit
    • Unit: W
    • Signal comment: 복잡하면 적음

Factor와 Offset

  • 실수형 데이터를 보내기 위해 무조건 4Byte씩 용량을 쓰는 것은 낭비
  • 줄이기 위해 나온 것이 Factor와 offset
  • 7bit로 12.4라는 데이터 표현 가능(원래는 4Byte = 32bit였음)
  • Factor의 값이 작을수록 정밀한 표현 가능
  • 장점: 줄여서 표현 가능
  • -값을 나타낼때 쓰는 방법

0개의 댓글