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의 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 바이트에 들어있는 비트 중 데이터를 담고있지 않은 바이트 수. 다음 나오는 e와 s가 설정되어 있으면 유효하다.
◦
e: expedited transfer를 의미하고, 데이터가 하나의 CAN 프레임 안에 들어있다는 의미.
◦
s: 데이터 크기가 n에 들어있다는 표시.
◦
index 및 subindex: 접근하고자 하는 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 네트워크에서 어떻게 통신할 것인지 그 규칙과 파라미터를 미리 정해놓은 것이다.
•
특정 카테고리의 장치들이 어떤 식으로 통신해야하는지 미리 정해두어서 메이커가 달라져도 호환성을 유지할 수 있다.
•
서보 모터를 예로 들면 컨트롤 파라미터로 속도, 위치, 토크 등이 지정되어 있는 식이다.