데이터 프레임 구조
IndyDCP의 서버와 클라이언트 간의 통신 시 송/수신되는 데이터는 52-byte 크기의 헤더, 4-byte 크기의 커맨드, 그리고 최대 200-byte 크기의 데이터로 이루어져 있습니다. 이를 데이터 프레임 이라고 정의하도록 하겠습니다. 클라이언트에서 서버로 요청하는 데이터프레임은 요청프레임, 서버에서 요청에 응답하여 보내주는 데이터프레임은 응답프레임 입니다. 응답프레임은 요청 성공시 수신하게되는 ACK (Acknowledgement) 응답프레임 과 실패 시 수신하게되는 NAK (Negative Acknowledgement) 응답프레임 두 가지로 나뉩니다.
Header | Command | Data |
---|---|---|
52 bytes | 4 bytes | 0 ~ 200 bytes |
헤더 형식 (Header Format)
아래 표는 데이터프레임 중 헤더영역에 대한 상세한 설명입니다.
크기 (byte) | ||
---|---|---|
Robot Name | 20 | 예시: "NRMK-Indy7" (ASCII Code: 0x4E 0x52 0x4D 0x4B 0x2D 0x49 0x6E 0x64 0x79 0x52 0x50 0x00 ...) |
Robot Version | 12 | |
STEP Info | 1 | |
Source of Frame (SoF) | 1 | |
Invoke ID | 4 | 프레임간의 순서를 구분하기 위한 ID (요청에 대한 응답 프레임이 요청과 같은 ID 값을 붙여 보내줌) |
Data Length | 4 | 데이터 영역의 데이터 길이 (unit: bytes, 0~200) |
Reserved | 10 | 예약 필드 |
예약필드와 로봇상태
Indy Framework 2.2.3 버전 이후부터는 응답프레임 헤더영역의 예약 필드 10바이트 중 앞의 4바이트에는 로봇의 상태정보가 담겨있습니다. 이를 통해 로봇 상태에 대하여 각각 명령어 요청을 하지 않아도 되며, 매 요청에 대한 응답 시 마다 로봇 상태를 받을 수 있습니다. 로봇 상태만을 받아오고 싶은 경우, 명령어 리스트의 0번 (check)을 통해 헤더만 주고받아 로봇 상태를 주기적으로 확인할 수 있습니다. 각 비트 (1부터 32까지)에 매핑된 로봇 상태는 아래 표와 같습니다.
Bit Num | 상태 | 설명 |
---|---|---|
1 | Is Robot Running | 로봇이 실행중인 상태 |
2 | Is Robot Ready | 로봇이 제어 가능한 상태(모든 Servo On 및 초기화 완료) |
3 | Is Emergency Stopped | 로봇 비상정지 상태 |
4 | Is Collided | 로봇 충돌 상태 |
5 | Is Error State | 로봇 에러 상태 |
6 | Is Busy | 로봇이 움직이고 있는 상태 (모션 중) |
7 | Is Move Finished | 로봇의 모션이 끝난 상태 |
8 | Is Home | 로봇이 홈 포지션인 상태 |
9 | Is Zero | 로봇이 제로 포지션인 상태 |
10 | Is In Resetting | 로봇이 리셋중인 상태 |
25 | Is Direct Teaching Mode | 직접교시 모드 상태 |
26 | Is Teaching Mode | 로봇 교시 모드 상태 (직접교시, Jogging 등) |
27 | Is Program Running | 로봇 프로그램이 실행 상태 (실행중, 일시정지중 포함) |
28 | Is Program Paused | 로봇 프로그램이 일시정지 상태 |
29 | Is Conty Connected | 콘티 연결 상태 |
커맨드와 데이터
요청프레임, ACK 응답프레임, NAK 응답프레임 모두 헤더의 형식은 아래와 같이 동일합니다.
Robot Name | Robot Version | Step Info | SoF | Invoke ID | Data Length | Reserved |
요청 프레임 (IndyDCP 클라이언트 → 서버)
Header (헤더) | Command (커맨드) | Data (데이터) |
---|---|---|
공통 52 byte |
명령어 ID 4 bytes |
명령어에 따라 포맷 및 길이가 다름 0 ~ 200 bytes |
ACK 응답 프레임 (IndyDCP 서버 → 클라이언트, 요청 수행 성공 시)
Header (헤더) | Command (커맨드) | Data (데이터) |
---|---|---|
공통 52 byte |
명령어 ID, 요청프레임과 동일 4 bytes |
명령어에 따라 포맷 및 길이가 다름 0 ~ 200 bytes |
참고
기본적으로 요청 프레임과 응답 프레임의 구조는 동일하다 (최대 256 Byte 프레임).
NAK 응답 프레임 (IndyDCP 서버 → 클라이언트, 요청 수행 실패 시)
Header (헤더) | Error (에러상태) | Error code (에러코드) |
---|---|---|
공통 52 byte |
커맨드 대신 에러상태를 나타내는 값 9999를 가짐 4 bytes 정수 |
데이터 대신 에러코드를 가짐 4 bytes 정수 |
참고
1) 프레임 내의 16진수 데이터는 0xA4, 0x23과 같이 접두사 '0x'를 통해 표현한다.
2) Robot Name이나 Robot Version과 같이 문자열 데이터는 ASCII String 으로 표현한다.
3) 일부를 제외한 모든 항목에 대한 값 (또는 데이터 값)은 Binary (바이너리 값)으로 표현되며, Boolean은 1 Byte Integer, 정수는 4 Byte Integer, 실수는 8 Byte Floating Point (Double)을 사용한다.