Skip to content

명령어 요청 실행

IndyDCP 클라이언트가 서버로 명령어 요청을 보낼 때, 데이터는 각 명령어의 목적에 따라 상이합니다. 본 절에서는 각 명령어 그룹 (비슷한 명령어끼리 묶음)에 대한 상세한 설명과 함께 요청/응답 프레임 예시를 보여줍니다.

로봇 모션 제어 명령

로봇 제어 명령은 로봇의 기본적인 동작과 관련된 명령입니다.

비상정지 명령 및 정지 명령

0001: Emergency Stop, 0005: Stop

비상정지 명령은 명령어 ID 1로써, 로봇이 어떠한 상태일지라도 명령 수신 즉시 로봇이 작업을 중지하고 비상정지 하도록 하는 명령입니다 (컨트롤 박스에 연결된 비상정지 버튼을 누르는 것과 동일). 비상정지 명령을 내릴때의 요청 프레임 포맷은 아래 표와 같습니다.

Header Command Data
Robot Name Robot Version STEP Info SoF InvokeID Data Length Reserved Command ID No Data
(0 byte)
"NRMK-Indy7" "" 0x00 0x34 1 0 - 1 -

위 예시는 Indy7에게 InvokeID 1로 비상정지 명령을 요청하는 예시입니다. 프레임 헤더의 각 항목에 대해 상세한 설명은 아래와 같습니다.

  • Robot Name: "NRMK-Indy7"로 ASCII String 으로 표현됨 (20-byte)
  • Robot Version: NULL String (요청 프레임에서는 사용하지 않음) (12-byte)
  • STEP Info: 0x00 (요청 프레임에서는 사용하지 않음) (1-byte)
  • SoF: 요청 프레임인 경우 0x34 (1-byte)
  • InvokeID: 본 예시에서는 1을 사용 (4-byte)
  • Data Length: 데이터 전달이 없으므로 0 (4-byte)
  • Reserved: 예약영역은 사용하지 않으므로 10byte를 비워둠 (10-byte)

이렇게 비상정지 명령에 대한 요청프레임 헤더는 총 56byte가 됩니다.

비상정지 명령의 명령어 ID는 1이므로 요청프레임의 커맨드영역에 4-byte 정수 값으로 1이 할당되었습니다. 그리고 비상정지 명령의 경우 데이터 전달이 필요 없으므로 데이터 영역은 비워져있습니다.

비상정지 명령 요청에 대한 IndyDCP 서버의 ACK 응답프레임은 아래와 같습니다.

Header Command Data
Robot Name Robot Version STEP Info SoF InvokeID Data Length Reserved Command ID No Data
(0 byte)
"NRMK-Indy7" "v2.2.3" 0x02 0x12 1 0 - 1 -

  • Robot Name: 요청 프레임에서 알맞게 하였으면 동일한 응답
  • Robot Version: IndyFramework의 버전
  • STEP Info: STEP의 버전 (0x02는 STEP2 를 나타냄)
  • SoF: 응답 프레임인 경우 0x12
  • InvokeID: 요청 프레임과 동일
  • Data Length: 반환되는 데이터가 없으므로 0
  • Reserved: Robot version 2.2.3 이후에는 10byte 중 앞의 4byte는 로봇의 상태를 나타냄 (예약필드 참고).
  • Command ID: 요청프레임과 동일

비상정지 명령은 요청프레임과 마찬가지로 ACK 응답프레임에서도 전달받는 데이터가 없으므로 데이터 크기는 0이며 데이터 영역은 비워져있습니다.

아래는 비상정지 명령어에 대한 IndyDCP 서버의 NAK 응답프레임 예시를 보여줍니다.

Header Command Data
Robot Name Robot Version STEP Info SoF InvokeID Data Length Reserved Command ID Error Code
(4 byte)
"NRMK-Indy7" "v2.2.3" 0x02 0x12 1 4 - 9999 20

NAK 응답프레임은 명령어 ID 필드가 9999값을 가지는 것으로 구분 할 수 있습니다. 이 때에 응답프레임의 데이터영역은 4-byte 정수의 에러코드를 가집니다. 이를 통해 어떠한 이유로 요청이 실패했는지 확인 할 수 있습니다 (NAK 응답프레임 에러코드 표 참고). 이에 맞춰 NAK 응답프레임 헤더영역의 데이터 크기 필드값은 4가 됩니다.

명령어 ID 5인 정지 명령은 로봇이 모션 중인 경우 로봇을 정지시킵니다. 비상정지 명령은 로봇의 모든 서보를 끄고 브레이크를 걸면서 즉시 정지시키지만, 정지 명령은 로봇이 모션 중일 때 자연스럽게 정지한다는 차이가 있습니다. 또한 비상정지 명령은 정지 이후에 비상정지 상태가 true가 되어 리셋 명령을 해주어야 다음 명령을 수행하거나 로봇 제어가 가능합니다. 정지 명령도 데이터영역을 사용하지 않으므로 명령어 ID만 다를 뿐 비상정지 명령과 데이터 프레임 구조는 동일합니다.

리셋 명령

0002: Reset Robot

명령어 ID 2 인 리셋 명령은 로봇이 충돌을 감지하거나, 비상정지 버튼을 눌렀거나, 또는 로봇 에러가 발생하여 로봇이 비상정지로 멈췄을 때 이 상태를 리셋하는 명령입니다. 리셋을 하게 되면 발생 원인에 따라서 자동으로 로봇이 리셋을 하게 됩니다. 리셋 명령의 데이터 프레임은 아래와 같습니다.

Header Command Data
Robot Name Robot Version STEP Info SoF InvokeID Data Length Reserved Command ID No Data
(0 byte)
"NRMK-Indy7" "" 0x00 0x34 2 0 - 2 -

리셋 명령어도 요청프레임에 데이터가 없기 때문에 데이터길이 필드는 0이며 데이터영역은 비워져있습니다. ACK 응답프레임과 NAK 응답프레임도 비상정지의 응답프레임과 동일합니다.

서보/브레이크 제어 명령

0003-0004: Servo & Brake On/Off

명령어 ID 3인 Servo On/Off와 4인 Brake On/Off는 로봇의 각 관절의 서보모터를 On/Off 하거나 브레이크를 On/Off하는 명령어입니다. 아래 표는 서보모터를 On/Off 하기 위한 요청프레임 예시를 보여줍니다.

Header Command
Robot Name Robot Version STEP Info SoF InvokeID Data Length Reserved Command ID
"NRMK-Indy7" "" 0x00 0x34 3 6 - 3

Data
Joint-0 Servo (1 byte) Joint-1 Servo (1 byte) Joint-2 Servo (1 byte) Joint-3 Servo (1 byte) Joint-4 Servo (1 byte) Joint-5 Servo (1 byte)
1 1 1 1 0 0

서보 On/Off 명령의 경우 데이터 크기는 DOF*1 이며, 이는 On (1), Off (0)를 나타내는 Boolean의 크기 (1-byte)와 로봇관절의 수를 곱한 값입니다. 따라서 위 예시의 경우 Indy7은 6축이기 때문에 데이터 크기는 6이며, 데이터 영역에는 1바이트 당 각 관절의 서보 On/Off 상태값을 가지고 있습니다. 위 예시의 명령어 요청이 정상적으로 실행되면 관절 0-3번의 서보모터는 켜지며, 4-5번은 꺼지게 됩니다. 응답프레임은 따로 반환할 값이 없으므로 데이터가 없으며, 일반적인 요청에 대한 ACK응답프레임을 받을 수 있습니다.

참고

6개 관절 관절을 표현할 때 인덱스는 0부터 시작

Move Command 실행 명령

0006: Execute Move Command

Move Command 실행 명령은 Conty에서 기본 프로그램 (Default Program)으로 설정해 놓은 로봇프로그램트리에 저장되어있는 Move Command (조인트무브 또는 태스크무브)를 실행하는 명령입니다. 아래 표는 요청프레임 예시를 보여줍니다.

Header Command
Robot Name Robot Version STEP Info SoF InvokeID Data Length Reserved Command ID
"NRMK-Indy7" "" 0x00 0x34 4 16 - 6

Data
Move Command Name (ASCII String)
"MySpecificMove01"

Move Command 명령 요청 시 데이터는 기본 프로그램의 프로그램 트리에 있는 Move Command의 이름이 됩니다. 따라서 ASCII string이 데이터 영역에 들어가며, 데이터 영역의 최대 길이는 200-byte 입니다. 위 예시에서는 기본 프로그램의 MySpecificMove01이라는 Move Command 를 실행합니다. 이 경우 이름의 ASCII string 길이가 16이므로 헤더의 데이터 길이는 16이 됩니다.

Move 관련 명령어의 경우 로봇이 이미 움직이고 있는 중이거나 비상정지 상태이면 실행되지 않습니다. 이미 움직이는 상태에서는 로봇을 정지한 후에 명령을 보내야 하며, 비상정지 상태이면 리셋을 한 이후에 명령을 보내야 합니다. 또한 해당 Move Command 이름이 기본프로그램에 저장되지 않은 경우에도 실행되지 않습니다. 각각의 실패 경우는 앞서 설명한 것과 같이 NAK 응답프레임 에러코드로 확인 할 수 있습니다.

특정 위치로 로봇 이동 명령

0007-0012: Move To & Move By

명령어 ID 0007-0008는 특정 위치로 로봇을 이동시키는 명령들 입니다. Move To Home (0007)은 Conty를 통해 사전에 지정된 (또는 기본값) 홈 위치로 이동하는 명령이며, Move To Zero (0008)는 영 위치 (모든 관절 각도가 0이 되는 위치)로 이동하는 명령입니다. 이 두가지는 사전에 지정된 위치로의 이동이기 때문에 데이터 영역에 전달할 값은 없습니다.

0009, 0010은 각각 절대위치, 상대위치로의 조인트무브 (JointMove)를 수행하는 명령입니다. Joint Move To (0009)는 데이터영역으로부터 요청받은 절대각도로 조인트무브를 수행하며, Joint Move By (0010)는 현재 위치에서 요청받은 위치만큼 상대적인 이동을 합니다.

0011과 0012는 작업공간의 좌표를 입력받아 절대/상대 위치로의 태스크무브를 (TaskMove) 수행하는 명령입니다. Task Move To (0011)는 요청받은 작업공간 절대좌표로의 태스크무브를 수행하며, Task Move By는 현재 위치를 기준으로 요청받은 작업공간 위치만큼 상대적인 이동을 수행합니다. 아래는 조인트무브와 태스크무브 명령요청에 대한 예시를 보여줍니다.

Header Command
Robot Name Robot Version STEP Info SoF InvokeID Data Length Reserved Command ID
"NRMK-Indy7" "" 0x00 0x34 5 48 - 9

Data
Joint-0 Angle (degree,8byte) Joint-1 Angle (degree,8byte) Joint-2 Angle (degree,8byte) Joint-3 Angle (degree,8byte) Joint-4 Angle (degree,8byte) Joint-5 Angle (degree,8byte)
35.123 -90.00 2.955 150.0 -120.0 45.0

위 예시는 데이터 영역에 있는 관절 각도로 로봇을 이동시키는 명령입니다. DOF는 6이고, 관절각도는 8-byte double로 표현되기 때문에 데이터 크기는 48 바이트가 됩니다.

Header Command
Robot Name Robot Version STEP Info SoF InvokeID Data Length Reserved Command ID
"NRMK-Indy7" "" 0x00 0x34 6 48 - 12

Data
Task X Position (meter, 8byte) Task Y Position (meter, 8byte) Task Z Position (meter, 8byte) Task U Position (degree, 8byte) Task V Position (degree, 8byte) Task W Position (degree, 8byte)
0.0 0.1 -0.25 30.00 0 0

위 예시는 현재의 로봇의 작업공간 위치로부터 데이터영역에 있는 작업공간 좌표값 만큼 상대이동 시키는 명령입니다. 작업공간 좌표는 XYZUVW로 표현되기 때문에 48-byte로 고정입니다.

주의

  • 로봇이 실제로 움직이는 명령이기 때문에 좌표를 잘못 입력할 경우 로봇이 주변과 충돌할 위험이 있다. 시뮬레이션 모드로 테스트 후 실제 로봇에 적용하는 것을 적극 권장한다.
  • 좌표계 등 명령어 데이터에서 길이/거리 단위는 항상 Meter이며, 각도 단위는 항상 Degree이다.
  • 데이터 영역에서 표현되는 관절의 인덱스는 0번 관절부터 시작한다.
  • 작업공간 좌표는 XYZUVW 순서로 표현한다.

로봇 프로그램 제어 명령

로봇 프로그램 제어 명령은 Conty 상에서 작성된 로봇프로그램을 제어 하는 명령입니다.

0014-0017번 명령은 차례대로 로봇 프로그램을 실행 (start), 중지 (stop), 일시중지 (pause), 재개 (resume)하는 명령입니다. 해당 명령들은 로봇의 상태나 프로그램 실행 상태에 따라 명령이 실패하는 경우가 있습니다. 예를들어 로봇이 움직이고 있을 때 프로그램 시작 명령을 요청하거나 Conty 상에서 불러온 프로그램이 없을때 일시중지나 재개 명령을 요청을 하면 실패응답을 보냅니다.

명령어 ID 0018은 기본 프로그램을 불러와 실행하는 명령입니다. 해당 명령을 실행하면 기본프로그램이 로드되므로 이후 0014-0017 명령어를 사용 할 수 있습니다. Conty상에서 작성한 로봇 프로그램은 Conty를 실행시킨 안드로이드 기기내에 저장을 할 수 있으며, 기본프로그램으로 지정할 경우 STEP에 저장됩니다.

Conty를 통해 기본프로그램을 1번부터 10번까지 저장할 수 있는데, 0019번 명령은 Conty로 로드된 프로그램을 특정 번호의 기본 프로그램으로 등록하는 명령어입니다. 데이터영역에 1부터 10 사이의 integer값을 전달하여 원하는 번호의 기본프로그램으로 등록 할 수 있으며 0을 전달하여 등록을 해제 할 수도 있습니다. 아래는 등록해제에 대한 요청프레임 예시를 나타냅니다.

Header Command Data
Robot Name Robot Version STEP Info SoF InvokeID Data Length Reserved Command ID Default Program # (4byte)
"NRMK-Indy7" "" 0x00 0x34 30 4 - 19 0

0020번 명령은 현재 등록된 기본 프로그램을 확인하는 명령입니다. 데이터 요청 명령이기 때문에 요청 프레임은 데이터가 없으며, 아래와 같이 응답 프레임에 4바이트 integer로 기본 프로그램 번호를 받을 수 있습니다. 이 때에 응답프레임의 데이터 값이 0인 경우 등록된 기본프로그램이 없는 상태이며, 있는 상태인 경우 1-10 사이의 값을 가집니다.

Header Command Data
Robot Name Robot Version STEP Info SoF InvokeID Data Length Reserved Command ID Default Program # (4byte)
"NRMK-Indy7" "v2.2.3" 0x02 0x12 31 4 - 20 7

로봇 상태 정보 읽기

0030-0039번과 0060-0064번은 로봇의 현재 상태에 대한 정보를 요청하여 읽어올 수 있는 명령들 입니다. 읽어 올 수 있는 로봇상태 정보들은 명령어 리스트 표에 정리되어 있습니다. 또한 ModbusTCP에서 로봇 상태 값 레지스터와 동일하기 때문에 이를 참조하셔도 됩니다.

아래 예시는 0031번 (Is Robot Ready)을 통해 현재 로봇이 Ready 상태인지를 요청했을 때의 ACK 응답프레임을 보여줍니다. 모든 로봇 상태값들은 Boolean 값으로 1 또는 0의 값을 가지므로 ACK 응답프레임의 데이터영역은 1-byte의 True/False 데이터를 가지고 있습니다.

Header Command Data
Robot Name Robot Version STEP Info SoF InvokeID Data Length Reserved Command ID Robot State (T/F, 1byte)
"NRMK-Indy7" "v2.2.3" 0x02 0x12 7 1 - 2 1

직접교시 상태 변경 명령

0080-0081: Change Direct Teaching Mode

직접교시 상태 변경 명령은 명령어 ID 0080번과 0081번 이며 각각 대기중인 로봇을 직접교시 모드로 진입시키거나, 직접교시모드인 로봇을 대기 모드로 나오게 하는 명령입니다. 직접교시 모드로 진입하기 위해서는 로봇이 멈춰있는 상태 (대기상태)여야 하며 로봇이 움직이고 있는 경우 요청에 실패하게 됩니다.

주의

직접교시 모드로 진입 시 로봇에 부착된 Tool의 무게가 제대로 입력되어 있지 않을 경우 로봇이 떨어지거나 상승하므로 주의해야 한다.

임의의 로봇 모션 실행

임의의 로봇 모션 실행 명령은 IndyDCP만을 통해서 웨이포인트를 추가하고, 이를 통해 만든 웨이포인트 집합에 대한 모션을 실행시키는 명령입니다.

0090-0094번은 조인트웨이포인트집합 (JointWaypointSet)에 조인트 웨이포인트를 등록, 제거, 리셋하고 조인트무브 모션을 실행하는 명령입니다.

0095-0099는 동일하게 태스크웨이포인트집합 (TaskWaypointSet)에 태스크 웨이포인트를 등록, 제거, 리셋하고 태스크무브를 실행 하는 명령어들입니다.

로봇 환경설정

로봇 환경설정 명령어를 통해 로봇에 대한 여러가지 설정을 수행할 수 있습니다. IndyDCP를 통해 로봇 프로그래밍을 수행할 때 로봇의 설정값이 자주 바뀌는 시나리오를 구현할 경우 이를 활용할 수 있습니다. 이러한 시나리오가 아닐 경우 모든 환경설정 명령어는 Conty에서도 지원하는 기능이므로, GUI 인터페이스가 지원되는 Conty를 통해 직접 보면서 로봇 환경을 설정하는 것을 권장드립니다.

TCP 설정

0100-0103: Set Default TCP & TCP Compensation

TCP (Tool Center Point) 설정은 태스크무브를 할 때, 설정된 TCP를 기준좌표계로 하여 툴 기준으로 로봇을 움직이고자 할 때 사용 할 수 있습니다. TCP의 초기값은 {0, 0, 0, 0, 0, 0}으로 툴이 달리지 않은 로봇의 마지막 바디의 끝점 정 가운데를 나타내며 이 값을 기준으로 TCP를 변경하여 태스크무브시에 반영시킬 수 있습니다. 이러한 TCP의 설정은 0100번 기본 TCP (Defualt TCP)값 변경 명령어를 통해 수행할 수 있으며, 0101번 명령어를 통해 기본 TCP를 초기값으로 리셋할 수 있습니다.

기본 TCP 외에도 TCP 보정값 (TCP compensation)이 있습니다. 0102번은 TCP 보정값을 설정할 수 있는 명령이며, 보정값으로 입력된 좌표만큼 기본 TCP 좌표에 더해집니다. 예를 들어 기본 TCP가 {0, 0, 0.1, 0, 0, 90} 인 상태에서 TCP 보정값이 {0, -0.2, 0, 0, 0, 30} 이라면 최종 TCP는 {0, -0.2, 0.1, 0, 0, 120}이 됩니다. 이 상태에서 TCP 보정값을 {0, 0.2, 0, 0, 0, -30}으로 다시 설정하면, 기본 TCP 기준으로 보정값만큼 변경되기 때문에 최종 TCP는 {0, 0.2, 0.1, 0, 0, 60}이 됩니다. 0103번은 TCP보정값을 리셋하는 명령이며 이 경우 기본 TCP가 최종 TCP가 되게 됩니다. 0101번과 0102번 명령어를 통해 기본 TCP를 변경할 때, TCP 보정값은 항상 자동으로 리셋이 됩니다. TCP 관련 좌표들은 태스크 좌표계와 동일하게 모두 XYZUVW값을 사용합니다. 따라서 48-byte 데이터 길이를 가지며 이에 대한 요청프레임 예시는 아래와 같습니다.

Header Command
Robot Name Robot Version STEP Info SoF InvokeID Data Length Reserved Command ID
"NRMK-Indy7" "" 0x00 0x34 10 48 - 100

Data
Default TCP X (meter, 8byte) Default TCP Y (meter, 8byte) Default TCP Z (meter, 8byte) Default TCP U (meter, 8byte) Default TCP V (meter, 8byte) Default TCP W (meter, 8byte)
0.0 0.0 0.1 90.00 0 0

레퍼런스 프레임 설정

0104-0105: Set Reference Frame

레퍼런스 프레임 (Reference Frame) 설정은 태스크무브 수행 시 베이스의 기준좌표계를 변경할 경우 사용할 수 있습니다. 래퍼런스 프레임의 기본값은 로봇의 0번 바디의 축으로 설정되어 있습니다 (Conty UI 참조). 0104번 명령을 통해 기본 래퍼런스 프레임으로 부터 입력받은 XYZ좌표 거리와 UVW회전 각도로 변환된 축을 새로운 래퍼런스 프레임으로 변경 할 수 있으며 이를 통해 태스크무브 시 새로운 래퍼런스 프레임을 반영시킬 수 있습니다. TCP 변경과 마찬가지로 요청프레임의 데이터 영역에 XYZUVW 데이터를 입력하여 요청할 수 있으며, 0105번 명령을 통해 기본값으로 초기화 할 수 있습니다.

충돌감지 레벨 설정

0106: Set Collision Detection Sensitivity Level

충돌감지 레벨은 충돌감지 민감도를 설정하는 값으로서 1-5 값으로 조절할 수 있습니다 (숫자가 낮을수록 민감도 상승). 요청 프레임의 데이터는 4-byte integer 값이며 요청프레임 예시는 아래와 같습니다.

Header Command Data
Robot Name Robot Version STEP Info SoF InvokeID Data Length Reserved Command ID Level (4byte)
"NRMK-Indy7" "" 0x00 0x34 11 4 - 106 3

속도 레벨 설정

0107-0108: Set Joint/Task Velocity Boundary

속도기반 무브 이용시 1-9단계의 속도 레벨 설정을 통해 로봇의 기본 속도를 설정할 수 있습니다. 기본적으로 Conty 프로그램이나 Move Command 실행은 해당 Move Command 프로그램 트리의 조인트무브/태스크무브 편집창에서 설정된 속도 레벨로 로봇 모션이 수행되지만, 그 외 Move Home, Move Zero, Joint Move To/By, Task Move To/By 등의 명령어는 본 명령어를 통해 설정된 속도레벨로 동작됩니다. 충돌감지레벨 설정과 동일하게 요청프레임 데이터는 4-byte integer 값 입니다.

웨이포인트 간격 시간 설정

0111-0112: Set Joint/TaskMove Waypoint Time

시간기반 무브 이용시 웨이포인트 간의 이동시간을 설정할 수 있습니다. 단위는 초 이며 최소값은 0.5 입니다. 시간값을 직접 요청해야 하므로 데이터는 8-byte double 값이 됩니다.

태스크무브의 기준좌표계 설정

0113: Set TaskMove Base Mode

태스크무브의 기준좌표계는 래퍼런스 프레임 기준과 TCP 기준 두 가지가 있습니다. 0113번 명령을 통해 이 기준을 바꿀 수 있으며, 요청프레임의 데이터가 0일 경우 래퍼런스 프레임을 기준으로, 1일 경우 TCP를 기준으로 설정됩니다.

기본 블렌딩 반경 설정

0116-0117: Set Joint/Task Blending Radius

0116과 0117번은 각각 조인트무브와 태스크무브를 실행할 때 각 웨이포인트에서의 블렌딩 반경을 설정하는 명령입니다.

로봇 환경설정값 읽기

0200번부터 0210번 까지의 명령은 위에서 언급하고 설정했던 모든 로봇 환경설정 값을 요청하여 읽을 수 있는 명령들입니다. 읽어오는 환경설정값의 데이터 형식은 해당 환경설정 명령에서의 설정값 데이터 형식과 동일합니다. 따라서 환경설정 명령에서는 요청프레임에서 데이터에 입력하지만, 읽기 명령에서는 요청프레임 데이터는 없으며 ACK 응답 프레임의 데이터에 설정값이 담겨있습니다. 이러한 환경설정값 읽기 명렁어에 대한 ACK 응답 프레임 예시는 아래와 같습니다.

Header Command
Robot Name Robot Version STEP Info SoF InvokeID Data Length Reserved Command ID
"NRMK-Indy7" "v2.2.3" 0x02 0x12 13 48 - 202

Data
RefFrame X (meter, 8byte) RefFrame Y (meter, 8byte) RefFrame Z (meter, 8byte) RefFrame U (meter, 8byte) RefFrame V (meter, 8byte) RefFrame W (meter, 8byte)
0 -0.25 1.2 0 0 90

로봇 데이터 읽기

로봇 데이터는 로봇의 현재 좌표, 속도, 모터 상태 등 로봇 제어와 관련된 데이터입니다. 로봇 데이터 읽기는 요청 명령어이므로 요청프레임에는 데이터가 포함되지 않습니다.

로봇 컨트롤 상태 읽기

0300-0302: Get Robot Control Status

로봇 컨트롤 상태는 현재 로봇 제어와 관련된 상태정보를 나타냅니다. 0300번은 현재 로봇이 실행된 시간으로써, ACK 응답프레임에서 8-byte double 데이터로 실행 시간 (단위: 초)을 반환합니다. 0301번은 로봇의 제어 모드를 4-byte Integer 데이터로 반환합니다. 0302번은 로봇의 각 조인트의 서보모터 및 브레이크의 On/Off 상태를 반환합니다. 0302번 요청 명령의 ACK 예시 프레임은 다음과 같습니다.

Header Command
Robot Name Robot Version STEP Info SoF InvokeID Data Length Reserved Command ID
"NRMK-Indy7" "v2.2.3" 0x02 0x12 14 12 - 302

Data
Joint-0 Servo (1byte) Joint-1 Servo (1byte) Joint-2 Servo (1byte) Joint-3 Servo (1byte) Joint-4 Servo (1byte) Joint-5 Servo (1byte) Joint-0 Brake (1byte) Joint-1 Brake (1byte) Joint-2 Brake (1byte) Joint-3 Brake (1byte) Joint-4 Brake (1byte) Joint-5 Brake (1byte)
1 1 1 1 1 1 0 0 0 0 0 0

로봇 컨트롤 데이터 읽기

0320-0324: Get Robot Control Data

로봇 컨트롤 데이터는 로봇의 제어 정보를 나타냅니다. 0320번은 조인트 각도, 0321번은 조인트 각속도, 0322번은 태스크 좌표, 0323번은 태스크 속도, 0324번은 조인트에 인가된 토크를 읽는 명령어입니다. 각 명령어 요청에 대한 ACK 응답 프레임에서 0320, 0321, 0324의 경우 조인트 관련 값이며 8-byte double 값으로 데이터 길이는 DOF*8이 됩니다. 0322, 0323은 태스크좌표 관련 값이므로 데이터길이는 6*8이 됩니다.

최근 비상정지 이벤트 정보 읽기

0380: Get Last Emergency Data

0380번은 가장 최근에 발생한 비상정지 이벤트의 정보를 읽는 명령입니다. 0032번 명령어로 비상정지 상태임을 인지하였을 때, 그 원인과 관련 데이터를 확인하고 싶은 경우 사용할 수 있습니다. 비상정지 이벤트의 ACK 응답 프레임은 아래와 같습니다.

Header Command
Robot Name Robot Version STEP Info SoF InvokeID Data Length Reserved Command ID
"NRMK-Indy7" "v2.2.3" 0x02 0x12 15 40 - 380

Data
Emg Code (4 byte integer) ArgsInt 0 (4 byte integer) ArgsInt 1 (4 byte integer) ArgsInt 2 (4 byte integer) ArgsDouble 0 (4 byte integer) ArgsDouble 1 (4 byte integer) ArgsDouble 2 (4 byte integer)
3 4 -160 0 0 0 0

비상정지 이벤트 정보의 데이터 길이는 총 40-byte 이며, 총 7개의 데이터를 포함하고 있습니다. 첫번째 데이터는 비상정지 이벤트 코드를 표현하는 4-byte integer 이며, 이 후 6개 데이터는 각각 3개의 Int Arguments와 3개의 Double Arguments 입니다. 비상정지 데이터에 대한 정보는 IndyFramework의 로봇에러 데이터 표에 기술되어 있으니 이를 참고하시기 바랍니다.

SmartIO 제어

IndyDCP를 통해서도 SmartIO를 이용하여 입출력 제어를 할 수 있습니다. IndyDCP에서는 각 IO별로 하나의 핀만을 제어하는 명령어와 전체를 제어하는 명령어를 제공합니다.

SmartDI를 읽는 명령어는 0400과 0401입니다. 0400번은 요청할 SmartDI번호를 통해 해당 DI의 값 하나만 읽는 명령어이며, 0401번은 SmartDI 전체를 읽는 명령어입니다. 따라서 0400의 경우 요청 프레임의 데이터는 4-byte integer로 SmartDI 번호이며, ACK 응답 프레임의 데이터는 1-byte로 HIGH(1) 또는 LOW(0)을 표현합니다. 0401명령어의 ACK 응답 프레임의 경우 각 DI번호에 따라 1-byte씩 32개의 SmartDI 전부를 표현합니다 (32-byte). 다음은 0401명령어의 ACK 응답 프레임의 예시를 나타내며 이 예시에서는 SmartDI 02, 03만 HIGH 값이고 나머지는 LOW 입니다.

Header Command
Robot Name Robot Version STEP Info SoF InvokeID Data Length Reserved Command ID
"NRMK-Indy7" "v2.2.3" 0x02 0x12 16 32 - 401

Data
SmartDI_00 (1 or 0, 1ybte) SmartDI_01 (1 or 0, 1ybte) SmartDI_02 (1 or 0, 1ybte) SmartDI_03 (1 or 0, 1ybte) SmartDI_04 (1 or 0, 1ybte) ... SmartDI_31 (1 or 0, 1ybte)
0 0 1 1 0 ... 0

SmartDO를 쓰는 명령어는 0402와 0403 입니다. 0402번은 SmartDO 번호를 통해 해당 DO값 하나만 쓰도록 요청하는 명령어이며, 0403번은 SmartDO 전체를 쓰는 명령어입니다. 따라서 0402의 경우 요청 프레임의 데이터는 SmartDO 번호 (4-byte Integer)와 SmartDO 값(1 또는 0, 1byte)로 총 5byte가 됩니다. 0403번 명령의 경우에는 0401과 마찬가지로 총 SmartDO가 32개이므로 각 DO번호에 따라 1byte 씩 전부 표현하여 요청 프레임의 데이터는 32byte가 됩니다. 아래는 0402번 명령의 요청프레임 예시로, SmartDO 04에 HIGH를 쓰는 경우를 나타냅니다.

Header Command Data
Robot Name Robot Version STEP Info SoF InvokeID Data Length Reserved Command ID SmartDO Num(4byte) SmartDO Value(1byte)
"NRMK-Indy7" "" 0x00 0x34 17 5 - 402 4 1

SmartAI와 SmartAO는 아날로그 I/O 성격상 모든 AI, AO를 한번에 읽거나 쓰는 명령어는 지원하지 않습니다. 0400번과 0402번처럼, SmartAIO의 경우에는 0404번과 0405번 명령어를 통해 하나의 AI, AO를 제어할 수 있습니다. 이 때 요청프레임의 데이터영역에서 SmartAI/AO 번호는 4-byte integer이고, 값은 4-byte integer로 0-10000범위로 나타냅니다.

기타 I/O 제어

SmartIO 외에도 Indy 로봇 및 CB에서는 다른 I/O도 지원을 합니다. 현재는 CAN 포트를 통해 FT 센서 입력에 대한 제어를 지원합니다.

CAN 포트를 이용한 FTSensor 값 읽기

0420-0423: Get CAN FTSensor

CAN 포트는 IndyCB (컨트롤박스)에도 있으며, 로봇의 마지막 바디에도 있습니다. 이 CAN 포트에 F/T 센서가 연결되어있을 경우 명령어를 통해 이 값을 읽을 수 있습니다.

F/T 센서를 읽을 때는 센서로부터 들어오는 Raw 데이터 값과, 이 값을 처리하여 실제 힘 값으로 환산된 데이터 두 가지를 읽을 수 있도록 지원합니다. 로봇 끝단의 CAN 포트에 장착된 F/T 센서 데이터는 0420번으로 Raw 데이터를, 0421번으로 처리된 데이터를 읽을 수 있습니다. IndyCB의 CAN 포트에 장착된 F/T 센서 데이터는 0422번으로 Raw 데이터를, 0423번으로 처리된 데이터를 읽을 수 있습니다.

F/T 센서 데이터는 태스크좌표와 같이 XYZUVW 6가지 데이터로 표현 됩니다. Raw 데이터는 4-byte integer로 표현되어 ACK 응답 프레임의 데이터 길이는 총 24-byte이고, 처리된 데이터는 8-byte double로 표현되어 48-byte 입니다. 처리된 데이터는 XYZ값의 경우 뉴턴(N) 단위이며, UVW는 뉴턴 미터(Nm) 단위입니다. 0423번의 응답프레임의 데이터 예시는 아래와 같습니다.

Header Command
Robot Name Robot Version STEP Info SoF InvokeID Data Length Reserved Command ID
"NRMK-Indy7" "v2.2.3" 0x02 0x12 18 32 - 423

Data
FTValue X(N, 8byte) FTValue Y(N, 8byte) FTValue Z(N, 8byte) FTValue U(Nm, 8byte) FTValue V(Nm, 8byte) FTValue W(Nm, 8byte)
32 12 -6.4 -1.2 1.5 -1.5

직접변수 (Direct Variable)

직접변수는 로봇의 프로그램 내에서 미리 선언된 변수들로서 각 타입별 메모리를 직접 지정하여 읽고 쓸 수 있는 변수입니다. 직접변수는 IndyDCP에서 뿐만 아니라 Conty, 공유메모리 등 여러 프로토콜을 통해 직접변수에 접근 가능하여, 같은 주소의 직접변수는 서로 공유되기 때문에 같은 값을 가지며 이를 통해 통신 등의 다양한 활용이 가능합니다.

직접변수의 타입 및 주소

직접변수에는 Byte, Word, DWord, LWord, Float, DFloat, Modbus 총 7가지의 타입이 있습니다. 여기서 Modbus Type은 ModbusTCP 통신에서 사용되는 Modbus Register에 대한 직접변수로 Modbus Master(Client)를 통해서도 접근할 수 있습니다.

각 타입별 직접변수는 1000개씩 제공되며, 주소값을 이용해 변수를 표현합니다. 주소는 000~999로, 세 자리 수로 표현됩니다. 아래 표는 각 직접변수 타입별 바이트와 데이터 타입, 변수표현법을 나타냅니다.

변수 타입 타입 번호 주소값 표현 Bytes & Data Type
BYTE (B) 0 B000 ~ B999 1 Byte, Unsigned Integer(부호 없는 정수)
WORD (W) 1 W000 ~ W999 2 Byte, Integer(정수)
DWORD (I) 2 I000 ~ I999 4 Byte, Integer(정수)
LWORD (L) 3 L000 ~ L999 8 Byte, Integer(정수)
FLOAT (F) 4 F000 ~ F999 4 Byte, Floating Point(실수)
DFLOAT (D) 5 D000 ~ D999 8 Byte, Floating Point(실수)
MODBUS (M) 10 M000 ~ M999 2 Byte, Integer(정수) / Modbus Register 0~999

직접변수읽기

직접변수를 읽는 명령은 직접변수 단일 읽기와 연속 읽기 두 가지가 있습니다. 단일 읽기는 주소값 하나에 대한 직접변수를 읽는 명령이며, 연속 읽기는 연속된 주소에 대한 여러 직접변수를 읽는 명령으로 한번에 최대 20개까지 읽을 수 있습니다.

직접변수 단일 읽기는 460번 명령을 통해 실행할 수 있습니다. 요청프레임의 데이터는 4-byte integer 두 개이며 각각 변수 타입 (타입 번호)과 주소값으로 사용합니다. W012 직접변수에 대한 읽기 요청에 대한 예시는 아래와 같습니다.

Header Command
Robot Name Robot Version STEP Info SoF InvokeID Data Length Reserved Command ID
"NRMK-Indy7" "" 0x00 0x34 20 8 - 460

Data
Direct Variable Type(4byte Integer) Direct Variable Address(4byte Integer)
1 12

이에대한 응답 프레임은 직접변수 타입에 따라서 데이터 크기가 정해지며, 해당 직접 변수의 값으로 응답 프레임이 수신됩니다. 위 예시의 요청에 대한 응답프레임의 데이터는 2-byte로, W012 변수의 값이 담겨있습니다.

직접변수 연속 읽기는 0461번 명령을 통해 실행할 수 있습니다. 필요 데이터는 4-byte 정수 3개 이며, 첫번째 및 두번째 데이터는 직접변수 단일 읽기와 동일하며 3번째 데이터로 연속 읽기에 대한 길이값을 넣을 수 있습니다. 길이는 1-20까지 가능하며, 21개 이상은 한번에 읽지 못합니다. 예를 들어 D100부터 D109까지 10개의 직접변수를 연속 읽기 할 경우 3번째 데이터는 10이며 요청 프레임 예시는 아래와 같습니다

Header Command
Robot Name Robot Version STEP Info SoF InvokeID Data Length Reserved Command ID
"NRMK-Indy7" "" 0x00 0x34 21 12 - 461

Data
Direct Variable Type
(4byte Integer)
Direct Variable Start
Address (4byte Integer)
Address Length
(4byte Integer)
5 100 10

연속 읽기에 대한 응답프레임의 데이터는 단일 읽기와 마찬가지로 해당 변수 타입의 주소값에 해당하는 데이터들이 수신됩니다. 다만 연속 읽기이므로 배열과 같이 연속된 값이 수신됩니다. 위 예시에 대한 응답 프레임은 데이터 사이즈는 8*10=80-byte 입니다.

직접변수 쓰기

직접변수를 쓰는 명령도 직접변수 단일 쓰기와 연속 쓰기로 두 가지가 있습니다. 단일 쓰기는 주소값 하나에 대한 직접변수를 쓰는 명령이며 연속 쓰기는 연속된 주소에 대한 여러 직접변수를 쓰는 명령으로 한번에 최대 20개까지 쓸 수 있습니다.

직접변수 단일 쓰기는 0463번 명령을 통해 실행할 수 있으며, 필요 데이터는 3개 입니다. 첫번째 데이터와 두번째 데이터는 직접변수 읽기 명령과 동일하게 각각 4-byte이며, 첫번째 데이터는 변수 타입, 두번째 데이터는 변수의 주소값, 세번째 데이터는 쓰고자 하는 직접변수값이 됩니다. 만약 첫번째 데이터가 1이면, 2-byte인 W직접변수 이므로 3번째 데이터는 2-byte이며, 총 데이터는 10-byte가 됩니다. 이와 같이 세번째 데이터의 크기는 직접변수 타입의 크기와 같으며 데이터 값은 해당하는 직접변수에 쓸 값이 됩니다. 예를 들어 W012 직접변수에 대해 값으로 35를 쓰려고 할 때 직접변수 쓰기 요청프레임은 아래와 같습니다.

Header Command
Robot Name Robot Version STEP Info SoF InvokeID Data Length Reserved Command ID
"NRMK-Indy7" "" 0x00 0x34 20 10 - 462

Data
Direct Variable Type
(4byte Integer)
Direct Variable Address
(4byte Integer)
Writing Value
(2byte; Depending on Type)
1 12 35

쓰기 명령에 대한 ACK 응답 프레임에는 별도의 데이터가 담겨 있지 않습니다.

직접변수 연속 쓰기는 0464번 명령을 통해 실행할 수 있습니다. 필요 데이터는 총 4개이며 단일 쓰기에서의 3개 데이터에 연속으로 쓸 개수가 추가된 것입니다. 앞의 3개 데이터는 변수 타입, 쓰기 시작 주소, 쓰기 개수이며, 이 뒤에 쓰기에 필요한 값이 붙습니다. 직접변수 연속 읽기의 응답 프레임 데이터와 마찬가지로, 직접변수 타입과 개수에 따라 연속적으로 붙습니다. 예를 들어 LWORD type 변수 L240~L245까지 6개에 값을 쓸 경우, 데이터 영역의 크기는 총 12-byte + 6 * 8-byte = 60-byte이며 이에 대한 요청프레임의 예시는 아래와 같습니다.

Header Command
Robot Name Robot Version STEP Info SoF InvokeID Data Length Reserved Command ID
"NRMK-Indy7" "" 0x00 0x34 20 60 - 463

Data
Direct Variable Type(4byte Integer) Direct Variable Address(4byte Integer) Address Length(4byte Integer)
3 240 6
Value 1
(L240;8byte)
Value 2
(L241;8byte)
Value 3
(L242;8byte)
Value 4
(L243;8byte)
Value 5
(L244;8byte)
Value 6
(L245;8byte)

NAK 응답 프레임

IndyDCP에서 명령어를 보내 요청을 할 때, 명령 수행에 실패하면 명령어 ID 9999와 함께 4-byte integer로 에러코드를 포함하는 NAK 응답이 수신됩니다. 이러한 NAK 응답 프레임의 에러코드는 아래 표에 요약되어 있습니다.

에러코드 내용 설명
0 ERR_NONE 에러 아님
1 ERR_NO_MATCHED_ROBOT 로봇 일치하지 않음
2 ERR_NO_MATCHED_STEP STEP 일치하지 않음
4 ERR_HEADER_FORMAT 헤더 포맷 오류
5 ERR_OVER_DATA_SIZE 명령어 데이터 사이즈 초과
6 ERR_NOT_SUPPORT_COMMAND 지원하지 않는 명령어
7 ERR_UNKNOWN_COMMAND 알 수 없는 명령어
8 ERR_UNKNOWN_DATA 알 수 없는 데이터
9 ERR_PROCESS_FAILED 명령 실행 실패
10 ERR_PARSE_FAILED 명령어 파싱 실패 (데이터 오류)
11 ERR_NO_MATCHED_PARAMETER 명령어에 따른 데이터 타입이 일치하지 않음
12 ERR_NO_MATCHED_DATA_SIZE 명령어에 따른 데이터 길이가 일치하지 않음
14 ERR_ROBOT_MOVING_STATE 로봇이 움직이고 있는 상태로 인한 명령어 실행 실패
15 ERR_ROBOT_PROGRAM_RUNNING 로봇 프로그램이 실행중인 상태로 인한 명령어 실행 실패
16 ERR_ROBOT_MOVE_FAILED 로봇 움직임/모션 명령어 실행 실패
17 ERR_NO_DEFAULT_PROGRAM 기본 프로그램 없음
18 ERR_NO_CURRENT_PROGRAM 현재 로드된 프로그램 없음
19 ERR_CURRENT_PROGRAM_STATE 현재 프로그램 상태에 따른 명령어 실행 실패
20 ERR_EMG_STATE 로봇이 비상정지 상태
21 ERR_ROBOT_STATE 로봇 상태에 따른 명령어 실행 실패
22 ERR_ROBOT_PROGRAM_LOAD_FAILED 로봇 프로그램 로드 실패
23 ERR_DIRECT_VARIABLE_INVALID_ADDRESS 무효한 직접변수 주소값
24 ERR_DIRECT_VARIABLE_INVALID_FORMAT 무효한 직접변수 참조 데이터 포맷
25 ERR_DIRECT_VARIABLE_REFNUM_LIMIT 직접변수 최대 접근 개수 초과