Skip to content

7000 포트 프로토콜

개요

데이터 프레임 구조

항목길이 (Byte)설명
SyncByte20x4E66 고정 헤더
Length216진수 길이 00xffff; 데이터 헤더와 명령어를 포함하지 않으며, CRC 영역도 포함하지 않음
Command2명령어
dataLength데이터 영역 (주로 JSON 데이터 형식)
CRC4헤더 데이터를 제외한 데이터에 대한 CRC 검증 (CRC32)

통신 프로토콜 설정

7000 포트는 TCPUDP 두 가지 통신 프로토콜을 선택할 수 있으며, 컨트롤러 백엔드에 진입하여 설정 파일 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)

요청 필드 설명

필드타입설명
channelint채널; 최대 9개 채널, 기본값은 1
stopint전송 중지; 1일 때 이전의 지속 전송을 중지하며, 아래 데이터는 보내지 않아도 됨
robotint로봇 번호; 값 범위 [1, 4]
modeint응답 요청 모드; 0: 응답 (요청 1회당 응답 1회), 1: 지속 (요청 1회당 지속 응답)
intervalint지속 응답 간격 시간 (ms); mode=1일 때만 유효, 범위 [1, 60000]
queryTypestring[]조회할 운전 파라미터 목록, 조회할 필요가 없는 것은 작성하지 않음
typeCfgobject조회 내용 설정, 관련 타입 데이터를 조회할 필요가 있을 때만 유효

queryType 선택 가능 값

설명
realPosACS실시간 좌표 위치 (관절 좌표계)
realPosMCS실시간 좌표 위치 (직각 좌표계)
realPosPCS실시간 좌표 위치 (도구 좌표계)
realPosUCS실시간 좌표 위치 (사용자 좌표계)
axisVel축 속도
axisAcc축 가속도
torque토크
electric전류
numGVar수치 변수
IOIO 포트
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)

응답 필드 설명

필드타입설명
channelint채널; 최대 9개 채널
robotint로봇 번호; 값 범위 [1, 4]
replyDataobject조회 결과 응답; 조회하지 않은 항목은 응답하지 않음

좌표 데이터 설명

좌표 형식: 로봇 (앞 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}
IOIO 상태 키-값 쌍, 예: {"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)

요청 필드 설명

필드타입설명
robotint로봇 번호; 값 범위 [1, 4]
clearBufferint운동 궤적 캐시 큐 비우기; 1: 비움 (현재 전송 중인 데이터에는 영향 없음), 0일 때 보내지 않아도 됨
targetModeint운동 모드; 0: 단독 포인트, 1: 연속 궤적
sendModeint0: 한 번에 모든 궤적 포인트 전송, 1: 매번 일부 포인트 전송
runModeint매번 일부 포인트 전송 시 유효; 0: 궤적을 모두 수신한 후 운동, 1: 수신하면서 동시에 운동
endint1: 이전의 지속 전송을 중지하며, 아래 데이터는 보내지 않아도 됨; 0일 때 이 필드는 보내지 않아도 됨
sumint"궤적을 모두 수신한 후 운동"일 때만 유효; 전체 전송 프레임 수
countint"궤적을 모두 수신한 후 운동"일 때만 유효; 현재가 몇 번째 프레임인지
cfgobject운동 설정 (첫 프레임에서만 설정하며, 첫 프레임에서만 유효)
targetPosfloat[]단일 목표점 (이 노드를 사용하면 하나의 목표점만 운전)
targetVecobject[]복수 목표점 (순서대로 모든 포인트 운전; targetPos와 동시에 존재할 때, targetPos만 유효)

cfg 필드 상세

필드타입설명
coordstring좌표계, 예: "ACS"
extMoveint외부 축 운동 여부; 1: 있음, 0 또는 미작성: 없음
syncint외부 축 동기 여부; 0 또는 미작성: 비동기, 1: 동기
speedint속도 설정; 미작성 시 기본값 사용
accint가속도 설정; 미작성 시 기본값 사용
plint미작성 시 기본값은 5; "단독 포인트"이고 targetVec 사용 시에만 유효
moveModestring운동 모드; "TeachSet", "MOVJ", "MOVL", "MOVS" 선택 가능, 기본값은 "TeachSet"; "단독 포인트"이고 targetVec 사용 시에만 유효
timeoutint타임아웃 시간 (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)

응답 필드 설명

필드타입설명
robotint로봇 번호; 값 범위 [1, 4]
successbooltrue: 성공, false: 실패
sizeint운동 궤적 캐시 큐의 현재 궤적 수; success=true일 때만 해당 항목 존재
causestring실패 원인 (성공 시 비어 있음)

cause 실패 원인

설명
"busy"현재 아직 전송 완료되지 않은 데이터가 있음
"timeout"수신 타임아웃
"dataErr"데이터 오류
"termination"전송 측이 전송 중인 데이터를 종료함

응답 예시

json
{
  "robot": 1,
  "success": false,
  "size": 1,
  "cause": "timeout"
}

5. 변수, IO 제어 (0x1E04)

요청 필드 설명

필드타입설명
numGVarobject변수 설정; GA는 bool 타입, GI는 int 타입, GD는 double 타입
IOobjectIO 포트 설정; 1/0은 IO 포트 상태를 나타냄

요청 예시

json
{
  "numGVar": {
    "GA001": true,
    "GI033": 6,
    "GD666": -2.33
  },
  "IO": {
    "DO1": 1,
    "DO13": 0
  }
}

6. 서보 포인트 운동 제어 On/Off (0x1E10)

주의: 이 기능은 "운동 제어" 기능 (0x1E02)과 동시에 사용할 수 없습니다.

요청 필드 설명

필드타입설명
robotint로봇 번호; 값 범위 [1, 4]
switchbooltrue: On, false: Off

요청 예시

json
{
  "robot": 1,
  "switch": true
}

7. 서보 포인트 운동 제어 On/Off 응답 (0x1E11)

응답 필드 설명

필드타입설명
successbooltrue: 성공, false: 실패
causestring실패 원인 (성공 시 비어 있음)

cause 실패 원인

설명
"busy"현재 채널이 점유됨
"dataErr"데이터 오류
"startupErr"시작 실패

응답 예시

json
{
  "success": false,
  "cause": "busy"
}

8. 포인트 전송 (0x1E12)

요청 필드 설명

필드타입설명
robotint로봇 번호; 값 범위 [1, 4]
endint1: 이전의 지속 전송을 중지하며, 아래 데이터는 보내지 않아도 됨; 0일 때 이 필드는 보내지 않아도 됨. 포인트 전송이 완료되지 않았을 때, 이전에 수신된 데이터를 비우고 새로운 포인트 큐를 다시 대기함
sumint전체 전송 프레임 수
countint현재 프레임 번호
PosVecfloat[][]포인트 좌표 배열; 형식: 로봇 (앞 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)

응답 필드 설명

필드타입설명
robotint로봇 번호; 값 범위 [1, 4]
successbooltrue: 수신 성공, false: 수신 실패
causestring실패 원인 (성공 시 비어 있음)

cause 실패 원인

설명
"notStart"서보 포인트 운동 제어 모드가 시작되지 않음
"dataErr"데이터 오류
"termination"전송 측이 전송 중인 데이터를 종료함
"cacheFull"캐시 영역이 가득 참 (최대 캐시 6개 궤적)

응답 예시

json
{
  "robot": 1,
  "success": false,
  "cause": "dataErr"
}