CAN 통신 표준 규격으로 J1939와 UDS에 대해서는 빠삭히 알고 있지만 CANopen은 그간 접해볼 기회가 없었는데요.
이번에 알아야 할 일이 생겨서 한번 간단한 서칭으로 알아봤습니다.
1. CANopen의 정의
CiA(CAN in Automation) 표준으로 산업용 자동화에 사용되는 CAN 통신 프로토콜 (유럽에서 많이 사용됨)
- 기계제어
- 공장자동화
- 운송수단
- 빌딩 자동화
- 의료 시스템
CAN통신을 시작/재시작할때 아래 단계를 거치며 이 단계를 제어하는 것은 최상위 제어기의 NMT (Network Management)
- Initialization(제어기가 켜지면 처음 진입하는 단계)
- Pre-operational(제어기가 동작할 준비가 되었음을 표시하는 단계, SDO 통신 가능)
- Operational(PDO 통신만 가능한 상태)
- Stopped (NMT 수신만 가능)
2. SDO, PDO, NMT, SYNC의 뜻
- Object Dictionary: 제어기들은 이런 "객체 사전"을 갖고 있고 여기에는 데이터, 파라미터가 저장되어 있음. 다른 제어기에서 index, subindex로 액세스할 수 있게 함.
1) SDO (Service Data Object): 클라이언트 -> 서버 통신 방식으로 index+subindex를 통해 서버의 Object에 addressing 할 수 있다. 8바이트 이상을 요청하고 수신받을 수 있다.
2) PDO (Process Data Object): 데이터 길이 8바이트로 제한. 주기전송하거나 SYNC 메시지 수신될 때마다 주기전송. Broadcast라고 봐야 한다.
3. 표준 CANopen 데이터 규격이 있는가?
- CANopen frame의 구성: 일반적인 CAN2.0A CAN Frame과 동일하다.
CAN ID: 상위 4bits(Function code), 하위 7bits(Node ID)
Function code 종류
- NMT가 가장 우선순위가 높고, SDO가 제일 낮다. (LSS는 뭔지 모르겠다)
- 공식적으로 정의된 11bit CAN ID
NMT에 대해 좀 더 자세히
장치 상태를 변경하거나 정상 동작여부 확인을 위해 사용
CAN Bus상 모든 노드는 이 메시지를 수신해서 처리해야 함.
COB-ID = 0x000, Data[0] = 변경할 상태, Data[1] = 수신대상 노드 (단, 0일 경우 모든 노드는 변경할 상태 일괄 적용)
SDO에 대해 좀 더 자세히
Data endianness: Little
SDO 서버 관점에서
Upload: 서버값을 클라이언트에게 보내는 동작 (Read)
Download: 서버에 클라이언트 값을 쓰는 동작 (Write)
SDO는 Pre-perational 상태에 있을때 사용 가능. 주로 노드의 고유값 읽을때, 설정 변경을 위해 사용.
클라이언트 -> 서버로 데이터 요청시 0x600 + 서버 노드 ID
서버 -> 클라이언트로 응답시 0x580 + 클라이언트 노드 ID
Object Dictionary (OBD) 예시.. Data 8바이트 영역만 표시
PDO에 대해 좀 더 자세히
각 노드들은 사전 정의된 PDO를 갖고 있을 수 있기도 하고,
Pre-perational 상태에서 SDO로 설정도 가능.
2 종류의 PDO가 있다.
- Transmit PDO: 예를 들어 0x180 + 전송하는 노드 ID로 보냄. 수신자를 지정하지 않음. 아무 노드나 받으면 됨.
- Receive PDO: 예를 들어 0x200 + 수신할 노드 ID로 보냄. 지정한 노드만 수신함.
PDO는 동기적 / 비동기적으로 송수신할 수 있는데
- 동기적 PDO라 함은 최상위 노드의 SYNC 메시지(COB-ID 0x080, Data는 없다.) 수신 후 보내는 방식
- 비동기적 PDO라 함은 각 노드가 내부 트리거에 의해 메시지를 전송하는 방식 (주로 ECU 내부 타이머), 외부에서는 다른 노드가 보낸 RTR = 1 메시지 수신시 응답하는 방식이다.
'전기차 개발자 > 임베디드시스템' 카테고리의 다른 글
dev c++ 설치 후 hello world 예제부터 컴파일 에러가 발생할때 해결 책 (0) | 2023.05.15 |
---|---|
bitnami redmine 서버가 망가졌을 때 백업, 복구 하는 방법 (0) | 2023.03.02 |
#include <헤더>와 #include "헤더"의 차이점 정리 (0) | 2023.03.02 |
tortoiseSVN에서 로그데이터 추출하는 법 (0) | 2023.02.21 |
SVN Branch에서 작업한 코드를 Trunk로 Merge 하는 법 (0) | 2023.02.10 |