7000 포트 통신(2207)
컨트롤러가 서버 측이며 기본 포트 번호는 7000입니다.
본 프로토콜에서 규정하는 모든 데이터 패킷은 본 형식 정의를 따르며, 표준 TLV(Type,Length,Value) 형식을 사용하고 고정된 시작 패킷 헤더 및 CRC 체크가 있습니다.
데이터 패킷 형식
| 항목 | 길이(Byte) | 설명 |
|---|---|---|
| SyncByte | 2 | 0x4E66 고정 패킷 헤더 |
| Length | 2 | 16진수 길이 0-0xffff; 데이터 헤더 및 명령어를 포함하지 않으며, CRC 영역도 포함하지 않음 |
| Command | 2 | 명령어 |
| data | Length | 데이터 영역(주로 JSON 데이터 형식) |
| CRC | 4 | 패킷 헤더를 제외한 데이터에 대해 CRC 검증 수행(CRC32) |
구성 파일 설정
구성 파일 controller.json의 hostComputerService 노드 아래:
socketType: socket 타입, "TCP"와 "UDP" 중 선택 가능, 기본값 "TCP"checkCRC: CRC 검사 수행 여부, false 선택 시 CRC를 검사하지 않지만 CRC가 차지하는 4 바이트 데이터는 여전히 전송해야 함에 유의; 기본값 true, CRC 검사
상태 조회
명령어: 0x9512
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"]
}
}
}파라미터 설명
| 파라미터 | 타입 | 필수 | 설명 |
|---|---|---|---|
| channel | int | 예 | 최대 9개 채널 |
| stop | int | 아니오 | 1일 때, 이전의 지속 전송 중지, 아래의 데이터는 전송하지 않아도 됨 |
| robot | int | 예 | 로봇 번호 |
| mode | int | 예 | 0: 응답(요청 1회당 응답 1회), 1: 지속(요청 1회당 지속 응답) |
| interval | int | 아니오 | ms, mode가 지속일 때만 유효, 범위 10-60000 |
| queryType | array | 아니오 | 조회 타입 배열, 선택 가능 값은 아래 표 참조 |
| typeCfg | object | 아니오 | 조회 내용 구성, 관련 타입 데이터를 조회할 때만 유효 |
queryType 선택 가능 값
| 값 | 설명 |
|---|---|
| realPosACS | 실시간 좌표 위치 - 관절 좌표 |
| realPosMCS | 실시간 좌표 위치 - 직교 좌표 |
| realPosPCS | 실시간 좌표 위치 - 도구 좌표 |
| realPosUCS | 실시간 좌표 위치 - 用户 좌표 |
| axisVel | 축 속도 |
| axisAcc | 축 가속도 |
| torque | 토크 |
| electric | 전류 |
| numGVar | 수치 변수 |
| IO | IO 포트 |
| serialNum | 시리얼 번호 |
| runControlPosRunNum | 모션 제어에서 현재 궤적의 실행된 포인트 수 |
| detailedMotionPos | 상세 모션 포인트, 이 항목은 각 로봇이 같은 시점에 하나의 채널만 조회 지원 |
typeCfg 상세 설명
| 파라미터 | 타입 | 설명 |
|---|---|---|
| numGVar | array | 조회 가능한 변수명 배열, 예: ["GD001", "GA001", "GI001", "GI333"] |
| IO | array | 조회 가능한 IO명 배열, 예: ["DI1", "DI16", "DO1", "DO3", "DO17"], 최대 개수는 IO 개수 이하여야 함 |
| detailedMotionPos | object | 상세 모션 포인트 구성 |
| detailedMotionPos.num | int | 매 프레임 데이터 응답 시 포인트 수 |
| detailedMotionPos.optional | array | 선택 가능 파라미터: ACS(관절 좌표), MCS(직교 좌표), time(타임스탬프), reset(포인트 기록 재설정) |
조회 반환
명령어: 0x9513
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]
}
]
}
}
}파라미터 설명
좌표 설명: 로봇(앞 7개) + 외부 축(뒤 5개). 외부 축이 없을 때, 좌표 개수는 축 수; 외부 축이 있을 때, 좌표 개수는 7 + 외부 축 개수
| 파라미터 | 타입 | 설명 |
|---|---|---|
| channel | int | 채널 번호 |
| robot | int | 로봇 번호 |
| replyData | object | 조회 반환 데이터 객체, 조회하지 않은 필드는 응답하지 않음 |
모션 제어
명령어: 0x9521
모드 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]}
]
}모드 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]},
{"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
}
]
}모드 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
}
]
}모션 제어 파라미터 설명
| 파라미터 | 타입 | 설명 |
|---|---|---|
| robot | int | 로봇 번호 |
| clearBuffer | int | 1일 때, 모션 궤적 캐시 큐를 비움; 0일 때, 이 필드를 보내지 않아도 됨 |
| end | int | 1일 때, 이전의 지속 전송 중지; 0일 때, 이 필드를 보내지 않아도 됨 |
| targetMode | int | 0: 독립 포인트, 1: 연속 궤적 |
| sendMode | int | 0: 한 번에 모든 궤적 포인트 전송, 1: 매회 일부 포인트 전송 |
| runMode | int | 매회 일부 포인트 전송 시에만 유효, 0: 궤적 수신 완료 후 모션, 1: 수신하면서 동시에 모션 |
| sum | int | "궤적 수신 완료 후 모션"일 때만 유효, 전송할 총 프레임 수 |
| count | int | "궤적 수신 완료 후 모션"일 때만 유효, 현재가 몇 번째 프레임인지 |
cfg 구성 파라미터 설명
| 파라미터 | 타입 | 설명 |
|---|---|---|
| coord | string | 좌표 타입, 예: "ACS" |
| extMove | int | 1은 외부 축 모션; 0이거나 쓰지 않으면 없음 의미 |
| sync | int | 0이거나 쓰지 않으면 외부 축 비동기, 1은 외부 축 동기 |
| speed | int | 속도, 쓰지 않으면 기본값 사용 |
| acc | int | 가속도, 쓰지 않으면 기본값 사용 |
| pl | int | 속도 등급, "독립 포인트" 및 "targetVec" 노드 사용 시에만 유효, 기본값 5 |
| moveMode | string | 모션 모드, "TeachSet", "MOVJ", "MOVL", "MOVS" 선택 가능, 기본값 "TeachSet" |
| timeout | int | ms, 타임아웃 시간, 쓰지 않으면 타임아웃 검사하지 않음, 범위 10-10000, "궤적 수신 완료 후 모션"일 때만 유효 |
targetVec 포인트 파라미터 설명
| 파라미터 | 타입 | 설명 |
|---|---|---|
| pos | array | 좌표 배열: 로봇(앞 7개) + 외부 축(뒤 5개) |
| axisVel | array | 축 속도, 연속 궤적 모드에서만 유효 |
| axisAcc | array | 축 가속도, 연속 궤적 모드에서만 유효 |
| timeStamp | int | ms, 해당 포인트에 도달했을 때의 시작점 기준 상대 시간, 연속 궤적 모드에서만 유효 |
주의:
targetPos와targetVec노드가 동시에 존재할 때,targetPos노드만 유효함
모션 제어 응답
명령어: 0x9523
json
{
"robot": 1,
"success": false,
"size": 1,
"cause": "timeout"
}파라미터 설명
| 파라미터 | 타입 | 설명 |
|---|---|---|
| robot | int | 로봇 번호 |
| success | bool | 수신 성공 여부 |
| size | int | 모션 궤적 캐시 큐의 현재 궤적 수, success가 true일 때만 존재 |
| cause | string | 실패 원인, 성공 시 비어 있음; 선택 가능 값: busy(현재 전송 완료되지 않은 데이터가 있음), timeout(수신 타임아웃), dataErr(데이터 오류), termination(송신 측이 전송 중인 데이터 종료) |
변수, IO 제어
명령어: 0x9531
json
{
"numGVar": {
"GA001": true,
"GI033": 6,
"GD666": -2.33
},
"IO": {
"DO1": 1,
"DO13": 0
}
}파라미터 설명
| 파라미터 | 타입 | 설명 |
|---|---|---|
| numGVar | object | 수치 변수, 키는 변수명, 값은 변수값 |
| IO | object | IO 포트, 키는 IO명, 값은 IO 상태(0 또는 1) |
서보 온/오프 포인트 모션 제어
명령어: 0x95A1
이 기능은 "모션 제어" 기능과 동시에 사용할 수 없음
json
{
"robot": 1,
"switch": true
}파라미터 설명
| 파라미터 | 타입 | 설명 |
|---|---|---|
| robot | int | 로봇 번호 |
| switch | bool | true: 켜기, false: 끄기 |
스위치 응답
명령어: 0x95A3
json
{
"robot": 1,
"success": false,
"cause": "busy"
}파라미터 설명
| 파라미터 | 타입 | 설명 |
|---|---|---|
| robot | int | 로봇 번호 |
| success | bool | 성공 여부 |
| cause | string | 실패 원인, 성공 시 비어 있음; 선택 가능 값: dataErr(수신 데이터 오류), startupErr(시작 실패), busy(현재 채널 점유됨) |
포인트 전송
명령어: 0x95A4
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]
]
}파라미터 설명
| 파라미터 | 타입 | 설명 |
|---|---|---|
| robot | int | 로봇 번호 |
| end | int | 1일 때, 이전의 지속 전송을 중지하고 아래 데이터를 보내지 않아도 됨; 0일 때, 이 필드를 보내지 않아도 됨; 포인트가 아직 전송 완료되지 않았을 때, 이전에 수신한 데이터를 비우고 새로운 포인트 큐를 다시 대기 |
| sum | int | 전송할 총 프레임 수 |
| count | int | 현재가 몇 번째 프레임인지 |
| PosVec | array | 좌표 배열, 좌표 형식: 로봇(앞 7개) + 외부 축(뒤 5개) |
포인트 전송 응답
명령어: 0x95A6
json
{
"robot": 1,
"success": false,
"cause": "dataErr"
}파라미터 설명
| 파라미터 | 타입 | 설명 |
|---|---|---|
| robot | int | 로봇 번호 |
| success | bool | 수신 성공 여부 |
| cause | string | 실패 원인, 성공 시 비어 있음; 선택 가능 값: notStart(서보 포인트 모션 제어 모드가 시작되지 않음), dataErr(데이터 오류), termination(송신 측이 전송 중인 데이터 종료), cacheFull(캐시 영역 가득 참, 최대 6개 궤적 캐시) |