Search
🥫

CANopen 프로토콜이란?

Last update: @12/13/2023

CANopen이란?

CANopen은 산업용 자동화에 사용되는 CAN 프로토콜로, 1996년 발표되었다. CiA(CAN-in-Automation) 표준 중 하나이다.
Ethernet 프로토콜을 통해 TCP/IP 메시지가 운송되고, TCP/IP를 통해 HTTP 메시지가 운송되는 것처럼, CANopen은 CAN 프로토콜을 통해 운송되는 또다른 프로토콜이다.
다른 말로 하면, CANopen은 메시지만 운송될 수 있다면 EtherCAT, Modbus, Powerlin 등 어떤 데이터 링크 프로토콜을 통해서도 사용 가능하다.
CANopen 이후에 나온 차세대 프로토콜로 CAN FD가 있는데, 더 많아지는 데이터 송수신과 대역폭 한계를 극복하기 위한 규격이다.

CANopen의 7가지 핵심 개념

CANopen을 이해하기 위해서는 7가지 핵심 개념을 이해해야 한다.
Communication Models
Communication Protocols
Device states
Object Dictionary
Electronic Data Sheet
Device Profiles

Communication Models

장치/노드 간의 통신에 3가지 모델이 존재한다. 물론 모든 노드는 프로토콜 내에서 구분되지 않지만, 통신 시의 역할에 따라 나누는 것이다.

master-slave

노드 하나가 호스트 컨트롤러로 행동을 하면서 slave 노드들에 데이터를 보내거나 요청한다.
최대 127개의 slave 노드를 둘 수 있다.
예) NMT

client-server

클라이언트는 서버에 요청을 보내고 응답을 받는 모델.
서버가 데이터를 읽으면 업로드, 쓰면 다운로드
예) SDO

producer-consumer

Producer 노드는 데이터를 네트워크 전역에 뿌리고, consumer 노드는 이를 소비한다.
이런 broadcast는 요청에 의한 것일 수도 있고(pull model), 별도 요청 없이 이뤄지는 것일 수도 있다(push model)
예) Heartbeat

Communication Protocols

노드를 설정하기 위한 SDO 프로토콜, 실시간 데이터를 전송하기 위한 PDO 프로토콜 등이 존재한다. 먼저 CANopen 프로토콜의 데이터 프레임을 보자.

CANopen frame

Communication OBject IDentifier (COB-ID): 11bit로 이루어져 있고, 두 가지로 나누어 볼 수 있다.
function code: 4bit
node ID: 7 bit
COB-ID를 이해하기 위해 아래 COB-ID 할당 예제를 보면
15가지의 function이 정의되어 있고, 각 function을 어떤 node가 보낼 수 있는 지 정의되어 있다. 일부 function은 방송(broadcast) ID인 0으로만 보낼 수 있고, 나머지 function들은 127개의 노드에서 보낼 수 있도록 정의되어 있는 것을 볼 수 있다.
예를 들어 node ID가 5(0b101)인 장치가 Transmit SDO function(0b1011)을 송신하려면 1011 000101이 COB-ID가 된다.

7가지 서비스 타입

CANOpen에서는 위 데이터 프레임 중 8바이트의 데이터를 통해 7가지 서비스를 제공한다.

Network Management (NMT)

CANopen에 연결된 장치들을 관리한다.
start, stop, rest 등의 NMT 명령어를 활용한다.
작동 방식
장치의 상태를 바구기 위해 NMT 마스터 노드는 COB-ID를 0으로 해서 2바이트 크기의 메시지를 방송한다.
첫번째 바이트는 요청 상태 코드, 두번째 바이트는 목적지 노드가 들어간다.
노드 ID를 0으로 넣으면 broadcast 커맨드가 된다.
상태 코드는
01: operational
02: stopped
80: pre-operational
81: reset application
82: reset communication

Synchronization (SYNC)

여러가지 장치의 센싱값과 작동을 동기화하기 위해 사용된다.
보통 어플리케이션 마스터에 의해 작동된다.

Emergency (EMCY)

특정 장치가 오작동 등 긴급 상황임을 네트워크에 알리기 위해 사용된다.
높은 우선순위를 가지도록 전송된다.
데이터 바이트에 오류 정보가 들어간다.

Timestamp(TIME) [PDO]

글로벌 네트워크 시간을 공지할 수 있다.
데이터 바이트에 6바이트의 날짜&시간 정보가 들어간다(4바이트는 시간, 2바이트는 날짜).

Process Data Object [PDO]

장치 간의 실시간 데이터를 전송하기 위해 사용된다.
위치와 같은 측정 데이터나 회전 요청과 같은 명령 데이터 등

Service Data Object [SDO]

장치에 있는 Object Dictionary(OD)에 있는 값에 접근하거나 바꿀 때 사용된다.
예를 들어 어플리케이션 마스터가 특정 장치의 설정을 바꿀 때 사용한다.
PDO와 SDO가 CANopen 통신의 대부분을 차지하기 때문에 매우 중요하다.

Node monitoring (Heartbeat) [SDO]

장치의 상태를 확인하기 위한 목적과 NMT 명령을 확인하기 위해 사용된다.
NMT의 슬레이브 장치는 주기적으로 Heartbeat 메시지를 전송한다. 이 메시지의 첫번째 바이트에는 노드의 상태 코드가 들어간다.

CANopen Object Dictionary

OD는 어려운 말로 하자면 CANopen 노드의 행동을 기술하는 모든 파라미터를 가진 표준화된 구조이다.
모든 CANopen 노드는 이 Object Dictionary(OD)를 가지고 있다.
OD를 직역하면 여러가지 오브젝트를 모아놓은 사전(dictionary)이다. 여기서 Object는 프로그래밍 시 우리가 익히 알고 있는 그 오브젝트를 생각하면 된다. Object는 배열, 변수, 레코드 등을 말하기 때문이다.
각 엔트리(오브젝트)는 다음 속성들로 정의되어 있다.
Index: 16-bit로 이루어진 오브젝트의 주소
Object name: 제조사 장치 이름
Object code: Array, variable, or record
Data type: E.g. VISIBLE_STRING, or UNSIGNED32 or Record Name
Access: rw (read/write), ro (read-only), wo (write-only)
Category: 이 파라미터가 의무(mandatory)인지 옵션(optional)인지 나타낸다(M/O).
엔트리는 16 비트의 인덱스와 8비트의 서브 인덱스를 가지고 있다. 예를 들면 index 1008 (subindex 0)의 OD 엔트리는 노드 장치의 이름을 나타낸다.
OD에는 표준화된 섹션이 있어서 정해진 영역은 용도가 강제되고, 나머지는 자유롭게 사용하면 된다.
예를 들면 어플리케이션 마스터 노드가 특정 장치의 hearbeat 주기를 바꾼다거나, 특정 센서의 인풋값을 로깅하게 한다던가 하는 등의 설정 변경이 가능하다.

Electronic Data Sheet와 Device Configuration File

Electronic Data Sheet

새로운 장치를 살 때마다 OD를 직접 정의하면 괴로울 것이다. 이를 위해 제조사에서 사람이 읽을 수 있는(human-readable) OD 템플릿 같은 것을 제공해주면 좋을 것이다. 이를 위해 CiA 306 표준에 정의한 것이 EDS다.
INI을 파일 포맷으로 사용한다. INI는 아래처럼 키=값 형식을 갖는 설정 파일 포맷이다.
; last modified 1 April 2001 by John Doe [owner] name = John Doe organization = Acme Widgets Inc. ; use IP address in case network name resolution is not working [database] server = 192.0.2.62 port = 143 file = "payroll.dat"
Plain Text
복사

Device Configuration File

상가 EDS는 값(value)들이 비어 있는 상태인데, 구매자가 본인의 환경에 맞게 값을 넣어 장치를 설정한 EDS를 DCF라고 부른다.
이렇게 초기 설정을 하고 장치를 설치한 이후에 다시 설정값을 조회하거나 바꾸고 싶다면 이때 필요한 것이 SDO이다.

SDO

위의 설명처럼, CANopen 내의 장치의 OD를 조회하거나 수정할 때 사용하는 것이 SDO 서비스이다.
SDO는 client-server 모델을 사용한다. SDO 클라이언트가 SDO 서버에게 요청을 보내면, SDO 값을 돌려주거나 값을 바꾼 후 응답한다.
서버 입장에서는 SDO 값을 바꾸는 것이 다운로드(SDO download)이고, 읽어서 보내기만 하는것이 업로드(SDO download)이다.
아래는 node ID 5인 장치에 SDO download를 시작하도록 하는(5번 장치의 DO를 수정하는) CANopen 메시지 예시다.
COB-ID: SDO receive function code와 node id(5)를 조합
CCS: client command specifier는 transfer type (1: Download, 2: Upload)
n: 4~7 바이트에 들어있는 비트 중 데이터를 담고있지 않은 바이트 수. 다음 나오는 es가 설정되어 있으면 유효하다.
e: expedited transfer를 의미하고, 데이터가 하나의 CAN 프레임 안에 들어있다는 의미.
s: 데이터 크기가 n에 들어있다는 표시.
indexsubindex: 접근하고자 하는 OD 주소
4~7바이트: 5번 노드가 다운로드 받아야 하는 데이터
SDO 다운로드일 경우, 5번 노드는 빈 데이터를 가진 SDO transmit 메시지로 응답하고, 업로드일 경우 요청된 데이터를 가진 메시지를 응답한다.
SDO는 많은 오버헤드가 발생하기 때문에 실시간 작동 데이터를 전송하기에는 이상적이지 않다. 이때 필요한 것이 PDO다.

PDO

PDO는 실시간 작동 데이터를 전송할 때 사용한다.
SDO는 4바이트, PDO는 8바이트를 사용할 수 있기 때문이다.
POD는 consumer-producer 모델을 사용한다.
Producer가 PDO를 보내는 동작을 transfmit PDO(TPDO), receiver가 PDO를 받는 동작을 receive PDO(RPDO)라고 한다.

Device Profiles

CAN device profile은 장치들이 CANopen 네트워크에서 어떻게 통신할 것인지 그 규칙과 파라미터를 미리 정해놓은 것이다.
특정 카테고리의 장치들이 어떤 식으로 통신해야하는지 미리 정해두어서 메이커가 달라져도 호환성을 유지할 수 있다.
서보 모터를 예로 들면 컨트롤 파라미터로 속도, 위치, 토크 등이 지정되어 있는 식이다.

References

관련 문서