7000 포트 프로토콜
개요
데이터 프레임 구조
| 항목 | 길이 (Byte) | 설명 |
|---|---|---|
| SyncByte | 2 | 0x4E66 고정 헤더 |
| Length | 2 | 16진수 길이 0–0xffff; 데이터 헤더와 명령어를 포함하지 않으며, CRC 영역도 포함하지 않음 |
| Command | 2 | 명령어 |
| data | Length | 데이터 영역 (주로 JSON 데이터 형식) |
| CRC | 4 | 헤더 데이터를 제외한 데이터에 대한 CRC 검증 (CRC32) |
통신 프로토콜 설정
7000 포트는 TCP와 UDP 두 가지 통신 프로토콜을 선택할 수 있으며, 컨트롤러 백엔드에 진입하여 설정 파일 config/controller.json을 수정합니다. hostComputerService 노드 아래에서:
socketType: socket 타입,"TCP"또는"UDP"선택 가능, 기본값은"TCP"checkCRC: CRC 검출 여부;false일 때 CRC를 검출하지 않음 (단 CRC가 차지하는 4바이트는 여전히 전송해야 함), 기본값은true
조회 상태는 UDP 통신으로 설정하여 데이터를 획득할 수 있으며, 최소 주기는 1ms까지 가능합니다.
명령어 개요
| 명령어 | 방향 | 기능 |
|---|---|---|
0x1E00 | 상위 시스템 → 컨트롤러 | 조회 상태 |
0x1E01 | 컨트롤러 → 상위 시스템 | 조회 상태 응답 |
0x1E02 | 상위 시스템 → 컨트롤러 | 운동 제어 |
0x1E03 | 컨트롤러 → 상위 시스템 | 운동 제어 응답 |
0x1E04 | 상위 시스템 → 컨트롤러 | 변수, IO 제어 |
0x1E10 | 상위 시스템 → 컨트롤러 | 서보 포인트 운동 제어 On/Off |
0x1E11 | 컨트롤러 → 상위 시스템 | 서보 포인트 운동 제어 On/Off 응답 |
0x1E12 | 상위 시스템 → 컨트롤러 | 포인트 전송 |
0x1E13 | 컨트롤러 → 상위 시스템 | 포인트 전송 응답 |
1. 조회 상태 (0x1E00)
요청 필드 설명
| 필드 | 타입 | 설명 |
|---|---|---|
channel | int | 채널; 최대 9개 채널, 기본값은 1 |
stop | int | 전송 중지; 1일 때 이전의 지속 전송을 중지하며, 아래 데이터는 보내지 않아도 됨 |
robot | int | 로봇 번호; 값 범위 [1, 4] |
mode | int | 응답 요청 모드; 0: 응답 (요청 1회당 응답 1회), 1: 지속 (요청 1회당 지속 응답) |
interval | int | 지속 응답 간격 시간 (ms); mode=1일 때만 유효, 범위 [1, 60000] |
queryType | string[] | 조회할 운전 파라미터 목록, 조회할 필요가 없는 것은 작성하지 않음 |
typeCfg | object | 조회 내용 설정, 관련 타입 데이터를 조회할 필요가 있을 때만 유효 |
queryType 선택 가능 값
| 값 | 설명 |
|---|---|
realPosACS | 실시간 좌표 위치 (관절 좌표계) |
realPosMCS | 실시간 좌표 위치 (직각 좌표계) |
realPosPCS | 실시간 좌표 위치 (도구 좌표계) |
realPosUCS | 실시간 좌표 위치 (사용자 좌표계) |
axisVel | 축 속도 |
axisAcc | 축 가속도 |
torque | 토크 |
electric | 전류 |
numGVar | 수치 변수 |
IO | IO 포트 |
serialNum | 시리얼 번호 |
runControlPosRunNum | 운동 제어 현재 궤적 중 이미 운전된 포인트 수 |
detailedMotionPos | 상세 운동 포인트 (각 로봇은 동일 시각에 하나의 채널 조회만 지원) |
typeCfg 설정 설명
numGVar: 전역 변수 조회 (int 타입), 예:["GD001", "GA001", "GI001", "GI333"]IO: IO 포트 조회 (string 타입), 예:["DI1", "DI16", "DO1", "DO3", "DO17"]; 조회한 IO가 존재하지 않으면-1반환; 조회 가능한 최대 수는 IO 개수 이하여야 함detailedMotionPos:num: 각 프레임 데이터 응답 시 포인트 수 (int)optional: 선택 파라미터 (string[]),"ACS","MCS","time","reset"선택 가능
요청 예시
json
{
"channel": 1,
"stop": 1,
"robot": 1,
"mode": 0,
"interval": 10,
"queryType": [
"realPosACS", "realPosMCS", "realPosPCS", "realPosUCS",
"axisVel", "axisAcc",
"torque", "electric",
"numGVar",
"IO",
"serialNum",
"runControlPosRunNum",
"detailedMotionPos"
],
"typeCfg": {
"numGVar": ["GD001", "GA001", "GI001", "GI333"],
"IO": ["DI1", "DI16", "DO1", "DO3", "DO17"],
"detailedMotionPos": {
"num": 10,
"optional": ["ACS", "MCS", "time", "reset"]
}
}
}2. 조회 상태 응답 (0x1E01)
응답 필드 설명
| 필드 | 타입 | 설명 |
|---|---|---|
channel | int | 채널; 최대 9개 채널 |
robot | int | 로봇 번호; 값 범위 [1, 4] |
replyData | object | 조회 결과 응답; 조회하지 않은 항목은 응답하지 않음 |
좌표 데이터 설명
좌표 형식: 로봇 (앞 7개) + 외부 축 (뒤 5개)
- 외부 축이 없을 때, 좌표 개수는 축 수와 동일
- 외부 축이 있을 때, 좌표 개수는
7 + 외부 축 개수
replyData 필드 상세
| 필드 | 설명 |
|---|---|
realPosACS | 실시간 좌표 위치 (관절 좌표계), float 배열 |
realPosMCS | 실시간 좌표 위치 (직각 좌표계), float 배열 |
realPosPCS | 실시간 좌표 위치 (도구 좌표계), float 배열 |
realPosUCS | 실시간 좌표 위치 (사용자 좌표계), float 배열 |
axisVel | 축 속도, float 배열 |
axisAcc | 축 가속도, float 배열 |
torque | 토크, float 배열 |
electric | 전류, float 배열 |
numGVar | 전역 변수 키-값 쌍, 예: {"GD001": 0.1, "GA001": true, "GI001": 33} |
IO | IO 상태 키-값 쌍, 예: {"DI1": 1, "DO1": 0}; IO가 존재하지 않으면 -1 반환 |
runControlPosRunNum | 운동 제어 현재 궤적 중 이미 운전된 포인트 수 |
serialNum | 시리얼 번호; 응답마다 1씩 증가하며, 각 채널은 서로 독립적 |
detailedMotionPos | 상세 운동 포인트 |
detailedMotionPos 상세
num: 각 프레임 데이터 응답 시 포인트 수 (int)data: 포인트 배열, 각 포인트는 다음을 포함:ACS: 관절 좌표, float 배열MCS: 직각 좌표, float 배열time: 타임스탬프[초, 나노초], 예:[123456, 654321]
응답 예시
json
{
"channel": 1,
"robot": 1,
"replyData": {
"realPosACS": [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5],
"realPosMCS": [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5],
"realPosPCS": [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5],
"realPosUCS": [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5],
"axisVel": [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5],
"axisAcc": [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5],
"torque": [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5],
"electric": [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5],
"numGVar": {"GD001": 0.1, "GA001": true, "GI001": 33, "GI333": -55},
"IO": {"DI1": 1, "DI16": 0, "DO1": 0, "DO3": 1, "DO17": -1},
"runControlPosRunNum": 0,
"serialNum": 1,
"detailedMotionPos": {
"num": 10,
"data": [
{
"time": [123456, 654321],
"ACS": [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5],
"MCS": [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5]
}
]
}
}
}3. 운동 제어 (0x1E02)
요청 필드 설명
| 필드 | 타입 | 설명 |
|---|---|---|
robot | int | 로봇 번호; 값 범위 [1, 4] |
clearBuffer | int | 운동 궤적 캐시 큐 비우기; 1: 비움 (현재 전송 중인 데이터에는 영향 없음), 0일 때 보내지 않아도 됨 |
targetMode | int | 운동 모드; 0: 단독 포인트, 1: 연속 궤적 |
sendMode | int | 0: 한 번에 모든 궤적 포인트 전송, 1: 매번 일부 포인트 전송 |
runMode | int | 매번 일부 포인트 전송 시 유효; 0: 궤적을 모두 수신한 후 운동, 1: 수신하면서 동시에 운동 |
end | int | 1: 이전의 지속 전송을 중지하며, 아래 데이터는 보내지 않아도 됨; 0일 때 이 필드는 보내지 않아도 됨 |
sum | int | "궤적을 모두 수신한 후 운동"일 때만 유효; 전체 전송 프레임 수 |
count | int | "궤적을 모두 수신한 후 운동"일 때만 유효; 현재가 몇 번째 프레임인지 |
cfg | object | 운동 설정 (첫 프레임에서만 설정하며, 첫 프레임에서만 유효) |
targetPos | float[] | 단일 목표점 (이 노드를 사용하면 하나의 목표점만 운전) |
targetVec | object[] | 복수 목표점 (순서대로 모든 포인트 운전; targetPos와 동시에 존재할 때, targetPos만 유효) |
cfg 필드 상세
| 필드 | 타입 | 설명 |
|---|---|---|
coord | string | 좌표계, 예: "ACS" |
extMove | int | 외부 축 운동 여부; 1: 있음, 0 또는 미작성: 없음 |
sync | int | 외부 축 동기 여부; 0 또는 미작성: 비동기, 1: 동기 |
speed | int | 속도 설정; 미작성 시 기본값 사용 |
acc | int | 가속도 설정; 미작성 시 기본값 사용 |
pl | int | 미작성 시 기본값은 5; "단독 포인트"이고 targetVec 사용 시에만 유효 |
moveMode | string | 운동 모드; "TeachSet", "MOVJ", "MOVL", "MOVS" 선택 가능, 기본값은 "TeachSet"; "단독 포인트"이고 targetVec 사용 시에만 유효 |
timeout | int | 타임아웃 시간 (ms), 미작성 시 타임아웃 검사 안 함, 범위 10–10000; "궤적을 모두 수신한 후 운동"일 때만 유효 |
예시 1: 단독 포인트 · 한 번에 모든 포인트 전송
json
{
"robot": 1,
"clearBuffer": 1,
"targetMode": 0,
"cfg": {
"coord": "ACS",
"extMove": 0,
"sync": 0,
"speed": 100,
"acc": 100,
"pl": 5,
"moveMode": "TeachSet"
},
"targetPos": [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5],
"targetVec": [
{"pos": [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5]},
{"pos": [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5]},
{"pos": [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5]},
{"pos": [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5]}
]
// targetPos와 targetVec이 동시에 존재할 때, targetPos만 유효
}예시 2: 단독 포인트 · 매번 일부 포인트 전송 · 궤적 수신 후 운동
json
{
"robot": 1,
"clearBuffer": 1,
"end": 0,
"targetMode": 0,
"sendMode": 1,
"runMode": 0,
"sum": 10,
"count": 1,
"cfg": {
"coord": "ACS",
"extMove": 0,
"sync": 0,
"speed": 100,
"acc": 100,
"pl": 5,
"moveMode": "TeachSet",
"timeout": 100
},
"targetVec": [
{"pos": [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5]},
{"pos": [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5]}
]
}예시 3: 연속 궤적 · 한 번에 모든 포인트 전송
json
{
"robot": 1,
"clearBuffer": 1,
"targetMode": 1,
"sendMode": 0,
"cfg": {
"coord": "ACS",
"extMove": 0,
"sync": 0,
"speed": 100,
"acc": 100
},
"targetVec": [
{
"pos": [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5],
"axisVel": [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5],
"axisAcc": [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5],
"timeStamp": 10
},
{
"pos": [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5],
"axisVel": [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5],
"axisAcc": [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5],
"timeStamp": 10
}
]
}
timeStamp: 해당 포인트에 운전되었을 때의 시작점 대비 상대 시간 (ms)
예시 4: 연속 궤적 · 매번 일부 포인트 전송 · 궤적 수신 후 운동
json
{
"robot": 1,
"clearBuffer": 1,
"end": 0,
"targetMode": 1,
"sendMode": 1,
"runMode": 0,
"sum": 10,
"count": 1,
"cfg": {
"coord": "ACS",
"extMove": 0,
"sync": 0,
"speed": 100,
"acc": 100,
"timeout": 100
},
"targetVec": [
{
"pos": [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5],
"axisVel": [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5],
"axisAcc": [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5],
"timeStamp": 10
}
]
}4. 운동 제어 응답 (0x1E03)
응답 필드 설명
| 필드 | 타입 | 설명 |
|---|---|---|
robot | int | 로봇 번호; 값 범위 [1, 4] |
success | bool | true: 성공, false: 실패 |
size | int | 운동 궤적 캐시 큐의 현재 궤적 수; success=true일 때만 해당 항목 존재 |
cause | string | 실패 원인 (성공 시 비어 있음) |
cause 실패 원인
| 값 | 설명 |
|---|---|
"busy" | 현재 아직 전송 완료되지 않은 데이터가 있음 |
"timeout" | 수신 타임아웃 |
"dataErr" | 데이터 오류 |
"termination" | 전송 측이 전송 중인 데이터를 종료함 |
응답 예시
json
{
"robot": 1,
"success": false,
"size": 1,
"cause": "timeout"
}5. 변수, IO 제어 (0x1E04)
요청 필드 설명
| 필드 | 타입 | 설명 |
|---|---|---|
numGVar | object | 변수 설정; GA는 bool 타입, GI는 int 타입, GD는 double 타입 |
IO | object | IO 포트 설정; 1/0은 IO 포트 상태를 나타냄 |
요청 예시
json
{
"numGVar": {
"GA001": true,
"GI033": 6,
"GD666": -2.33
},
"IO": {
"DO1": 1,
"DO13": 0
}
}6. 서보 포인트 운동 제어 On/Off (0x1E10)
주의: 이 기능은 "운동 제어" 기능 (
0x1E02)과 동시에 사용할 수 없습니다.
요청 필드 설명
| 필드 | 타입 | 설명 |
|---|---|---|
robot | int | 로봇 번호; 값 범위 [1, 4] |
switch | bool | true: On, false: Off |
요청 예시
json
{
"robot": 1,
"switch": true
}7. 서보 포인트 운동 제어 On/Off 응답 (0x1E11)
응답 필드 설명
| 필드 | 타입 | 설명 |
|---|---|---|
success | bool | true: 성공, false: 실패 |
cause | string | 실패 원인 (성공 시 비어 있음) |
cause 실패 원인
| 값 | 설명 |
|---|---|
"busy" | 현재 채널이 점유됨 |
"dataErr" | 데이터 오류 |
"startupErr" | 시작 실패 |
응답 예시
json
{
"success": false,
"cause": "busy"
}8. 포인트 전송 (0x1E12)
요청 필드 설명
| 필드 | 타입 | 설명 |
|---|---|---|
robot | int | 로봇 번호; 값 범위 [1, 4] |
end | int | 1: 이전의 지속 전송을 중지하며, 아래 데이터는 보내지 않아도 됨; 0일 때 이 필드는 보내지 않아도 됨. 포인트 전송이 완료되지 않았을 때, 이전에 수신된 데이터를 비우고 새로운 포인트 큐를 다시 대기함 |
sum | int | 전체 전송 프레임 수 |
count | int | 현재 프레임 번호 |
PosVec | float[][] | 포인트 좌표 배열; 형식: 로봇 (앞 7개) + 외부 축 (뒤 5개) |
요청 예시
json
{
"robot": 1,
"end": 1,
"sum": 10,
"count": 1,
"PosVec": [
[1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5],
[1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5],
[1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.1, 2.2, 2.3, 2.4, 2.5]
]
}9. 포인트 전송 응답 (0x1E13)
응답 필드 설명
| 필드 | 타입 | 설명 |
|---|---|---|
robot | int | 로봇 번호; 값 범위 [1, 4] |
success | bool | true: 수신 성공, false: 수신 실패 |
cause | string | 실패 원인 (성공 시 비어 있음) |
cause 실패 원인
| 값 | 설명 |
|---|---|
"notStart" | 서보 포인트 운동 제어 모드가 시작되지 않음 |
"dataErr" | 데이터 오류 |
"termination" | 전송 측이 전송 중인 데이터를 종료함 |
"cacheFull" | 캐시 영역이 가득 참 (최대 캐시 6개 궤적) |
응답 예시
json
{
"robot": 1,
"success": false,
"cause": "dataErr"
}