Skip to content

모드버스 TCP

Indy Framework에서는 범용 산업용 필드버스 통신 프로토콜 중 하나인 모드버스TCP 를 지원합니다. 모드버스TCP는 주로 외부 디바이스 (PC, PLC, 주변기기 등)에서 로봇 데이터를 수신하고, 로봇에 명령을 인가할 때 사용할 수 있습니다.

일반적으로 로봇 설정, 작업교시 (티칭), 로봇 프로그래밍 작업은 뉴로메카 티칭팬던트 앱 Conty를 통해 수행합니다. 이를 통해 등록된 로봇 프로그램을 실행/중지하는 등의 명령은 Conty 뿐만 아니라 IndyDCP와 모드버스TCP를 이용한 외부 디바이스에서도 수행할 수 있습니다.

모드버스TCP와 IndyDCP 모두 TCP 전용통신을 이용하며 TCP/IP 네트워크 프로토콜을 통해 통신합니다. TCP/IP 프로토콜을 사용하기 위해 컨트롤박스 또는 STEP은 Ethernet을 통해 모드버스TCP를 사용할 외부 디바이스와 연결되어 있어야 합니다. Indy로봇을 구동하는 STEP은 슬레이브(서버) 역할을 하며, 최대 32개의 마스터(클라이언트)가 연결될 수 있습니다.아래의 표는 Indy Framework에서 Indy 로봇을 제어하기 위한 모드버스 TCP 슬레이브(서버)의 연결 정보입니다.

항목 내용
IP 주소 STEP의 이더넷 IP 주소
포트 번호 502(모드버스TCP 기본 포트)
최대 연결 수 32(내부적으로 기본 2개 사용 중)
최대 통신 주기 100Hz(10ms)

메모리 주소 매핑

모드버스TCP에서는 코일 (bit 단위 주소)과 레지스터 (WORD; 16bit 단위 주소)를 지원하지만 Indy Framework에서는 주로 레지스터를 사용합니다.

메모리 주소 중 레지스터 0 ~ 999까지는 사용자 영역으로서, 사용자가 자유롭게 필요한 메모리 주소를 변수로 할당하여 Read와 Write 관계없이 사용가능합니다. Conty 프로그램에서는 아래의 그림과 같이 직접변수 (Direct Variable)을 통해서 M 변수를 만들어 사용자 영역 주소에 자유롭게 접근할 수 있습니다.


메모리 주소 중 레지스터 1000~3999는 예약 영역으로서, 로봇을 제어하거나 로봇의 데이터를 읽는 등의 용도로 사용합니다. 아래의 표는 레지스터 및 코일의 예약 영역 메모리 주소 매핑입니다. 각 주소에 따라 용도(Read/Write)가 다르며, 기본적으로 레지스터 를 사용하지만 Data Range가 0~1인 경우는 코일로도 접근 가능합니다. 코일 접근 가능 여부는 Data Range 에 * 로 표시가 되어있습니다.

로봇 상태 (Robot Status) 수신

로봇 상태는 1000~1099 주소를 사용합니다. 대부분의 경우 할당된 상태변수는 1(true)과 0(false)이며, 코일과 레지스터로 모두 접근하여 상태값을 읽을 수 있습니다. 일부 상태변수는 레지스터로만 접근 가능한 Word 값도 있습니다. 예를 들면, 1040주소는 현재 로봇에 등록된 기본 프로그램의 번호 (1~10) 값입니다.

Robot Status
Address Read/Write Description Data Range Comment
1010 R isRobotControllerRunning 0~1 * 로봇 제어기 실행중
1011 R isRobotReady 0~1 * 로봇이 준비되어 움직일 수 있는 상태 (모든 Servo On 등)
1012 R isEmergecyStopped 0~1 * 비상정지 상태
1013 R isCollided 0~1 * 로봇이 충돌을 감지한 상태
1014 R isErrorState 0~1 * 로봇이 에러 상태
1015 R isBusy 0~1 * 로봇이 현재 움직이고 있는 상태
1016 R isMoveFinished 0~1 * 로봇이 움직임 명령을 수행하고 정상적으로 목표에 도달한 상태
1017 R isHome 0~1 * 로봇이 홈 포지션
1018 R isZero 0~1 * 로봇이 제로 포지션
1019 R isInResetting 0~1 * 로봇이 리셋중인 상태
1040 R Resisterd Default Program #Num 0, 1~10 현재 등록된 기본 콘티 프로그램 번호
1080 R isDirectTeachingMode 0~1 * 직접교시 모드 상태
1081 R isTeachingMode 0~1 * JOG버튼 등을 통한 티칭중인 상태
1082 R isContyConnected 0~1 * 콘티 연결 상태
1083 R isProgramRunning 0~1 * 프로그램이 실행 중인 상태 (일시중지 포함)
1084 R isProgramPaused 0~1 * 프로그램이 일시중지 중인 상태

로봇 제어 명령 및 프로그램 실행

로봇을 제어하기 위한 명령을 보내기 위하여 1100~1299 주소에 1로 값을 써 명령을 내릴 수 있습니다. 앞서 기술했듯, 코일과 레지스터로 모두 접근 가능합니다. 슬레이브(서버)에서는 명령 인식을 위해 Rising bit를 사용합니다. 즉, 0 상태에서 1 상태로 바뀐 시점에만 이를 인식하고 명령을 수행합니다.

만약 같은 주소에 할당된 명령을 다시 내리고 싶으면 1를 0으로 바꾼 후, 1로 다시 값을 써 bit rising을 해줘야 합니다. 이 때, 모드버스TCP의 최대 통신 주기가 100Hz이므로 10ms 이후에 명령을 전달해야 합니다.

명령 결과가 로봇을 움직이게 하는 경우, 이미 로봇이 움직이거나 프로그램이 실행중일 때는 무시됩니다. 또한, 동시에 여러 명령을 내리면 우선순위가 높은 명령이 수행되고, 다른 명령은 무시될 수 있기 때문에 주의하여 명령을 내려야 합니다.

프로그램 실행 명령

1100~1104번은 Conty에서 작성한 프로그램실행과 관련된 명령입니다.

1110~1119 명령은 Conty에서 저장한 기본 프로그램과 관련된 명령입니다. Conty에 저장된 기본 프로그램 1~10번중 하나를 모드버스TCP나 Conty를 통해 로봇에 등록 할 수 있습니다. 1110~1119 명령을 통해 기본 프로그램을 등록한 뒤, 1100번 명령으로 등록한 기본프로그램을 실행할 수 있습니다.

Command & Program
Address Read/Write Description Data Range Comment
1100 W Start Resisterd Default Program 0~1 * 현재 등록된 기본 콘티 프로그램 실행
1101 W Start Program 0~1 * 현재 로드되어있는 프로그램 실행
1102 W Stop Program 0~1 * 현재 실행중인 프로그램 중지
1103 W Pause Program 0~1 * 현재 실행중인 프로그램 일시중지
1104 W Resume Program 0~1 * 현재 일지정지 되어있는 프로그램 재개
1110~1119 W Resister Default Program 1~10 0~1 * 저장된 기본 프로그램 1~10을 로봇에 등록

기본 로봇 제어 명령

1160~1165는 로봇 제어의 기본 명령입니다. 리셋, 강제리셋, 모션 중지, 긴급정지, 홈 포지션 이동, zero 포지션 이동 등의 명령이 있습니다.

1160리셋 명령은 일반적인 에러 상황을 리셋할 때 사용할 수 있습니다. 로봇의 속도 초과나 충돌 감지 등으로 비상정지 되었을 때, 리셋을 통해 이를 해결하고 로봇에게 다시 명령을 내릴 수 있게 합니다. 이러한 리셋중일 때는 1019상태값이 1이 되어 리셋중인 상태를 알 수 있습니다.

1161리셋 명령은 1160명령으로도 로봇이 리셋이 안될 때, 강제 리셋을 하는 명령입니다. 로봇이 재부팅 및 재 초기화 됩니다.

1162 모션 정지 명령은 현재 움직이고 있는 로봇과 프로그램을 정지시킵니다.

1164와 1165 명령은 로봇을 홈 포지션이나 zero 포지션으로 이동시키는 명령입니다. 로봇이 움직이고 있지 않거나 프로그램이 실행중이지 않는 경우에만 동작합니다.

Command & Program
Address Read/Write Description Data Range Comment
1160 W Reset 0~1 * 로봇 리셋 (에러 리셋 등)
1161 W Force Reset 0~1 * 하드 리셋 (로봇 재부팅 및 초기화)
1162 W Stop Motion 0~1 * 현재 모션 정지
1163 W Emergency Stop 0~1 * 비상정지
1164 W Move to Home 0~1 * 홈 포지션으로 이동
1165 W Move to Zero 0~1 * zero 포시션으로 이동
1170 W Switch To Direct Teaching Mode 0~1 * 직접교시 모드 상태로 변경
1171 W Finish Direct Teaching Mode 0~1 * 직접교시 모드 종료

특정 Move 커맨드 실행 명령

1200~1299번은 Conty에서 디폴트 프로그램으로 설정한 프로그램의 특정 Move 커맨드들을 실행하는 명령입니다. 1200~1299 각 주소 마다 move-00 ~ move-99로 고정으로 매핑되어 있으며 각각에 해당되는 이름의 Move 명령을 실행합니다.

본 명령은 프로그램이 실행중이지 않을 때만 동작합니다. 또한, 이미 Move 명령이 실행중이거나 로봇이 움직이고 있는 경우에는 명령이 실행되지 않습니다.

Command & Program
Address Read/Write Description Data Range Comment
1200-1299 W Move to Specific Named Move Command(move-00~move-99) 0~1 * 기본 콘티 프로그램의 사전에 정의된 Move 커맨드 실행

모드버스TCP를 통한 로봇 프로그래밍 방법

모드버스TCP의 직접변수(M변수)나 SmartIO와 콘티 프로그램의 if 등의 조건문을 이용하여 명령을 구체적으로 전달 할 수 있습니다. 예를 들어 외부 디바이스가 CB의 DIO포트와 연결되어 있는 경우, 콘티 프로그램에서 if문을 통해 SmartDI 입력을 확인하는 프로그램을 구성할 수 있습니다. 이러한 경우 제어의 주체는 Conty 프로그램이며, 외부 디바이스의 SmartDI 입력이 있을경우 로봇 프로그램이 동작합니다.

다른 방법으로 외부 디바이스에서 Move 커맨드 실행 명령을 내리는 방법이 있습니다. Conty 프로그램의 Move 커맨드를 지정된 이름인 move-00~move-99으로 만들고, 매핑되어있는 1200~1299번에 명령을 내리는 방법입니다. 예를 들어, 아래 그림과 같이 move-00, move-01이름의 JointMove 와 move-02 이름의 FrameMove를 만들면 모드버스TCP의 1200, 1201, 1202번으로 명령을 내려 (상태값 1) 로봇을 외부 디바이스에서 직접 제어할 수 있습니다.


로봇 데이터 수신

로봇의 좌표는 크게 Joint좌표와 Task좌표로 나뉩니다. Joint좌표는 로봇의 각 축의 각도를 통해 좌표를 나타내는 방식이며, Task좌표는 로봇의 툴 끝점(TCP; Tool Center Position)을 통해 로봇의 Base를 기준으로 3차원 공간 상의 TCP좌표를 나타내는 방식입니다.

1300-1305는 Joint좌표를 나타내며 각각 로봇의 1~6번축의 각도에 해당됩니다. 7축로봇의 경우 1300~1306의 1~7번축이며, 이하 Joint 관련 데이터에서 동일하게 적용됩니다. 단위는 mrad (radian의 1/1000배)이며 부호 있는 16bit 정수로 나타냅니다. 1310-1315는 각각 1~6번축의 현재 각속도이며, 1380-1385는 각각 1~6번축의 현재 힘(토크)입니다.

1600-1605는 Task좌표를 나타내며, 각각 xyzuvw값을 나타냅니다. xyz는 로봇 Base를 기준으로 xyz좌표축상에서 TCP까지의 거리이며, uvw는 툴 끝점의 회전 방향을 나타냅니다. 이는 Euler Angle로 표현되어 회전 순서는 w->v->u (rZ->rY->rX)입니다. 단위는 xyz의 경우 1/10mm (meter의 1/10000배)이며 uvw의 경우 mrad입니다. 1610-1615는 Task좌표상의 현재 이동/회전속도를 나타냅니다.

앞서 설명한 데이터들은 16bit정수로 값을 표현하기에 더 상세한 단위를 표현하지 못합니다. 상세한 단위의 값을 원하는 사용자를 위해 32bit Float 방식의 데이터도 지원합니다. 1400-1411, 1700-1711등은 각 데이터당 2개의 연속된 주소를 사용하여 (예. 1400-1401) 이를 통해 32bit Float 방식의 데이터를 표현합니다.

Joint(as WORD)
Address Read/Write Description Data Range Comment
1300 R Base joint angle (in mrad) 16bit 1번 축 (로봇 베이스와 가장 가까운 축, 이하동일) 각도
1301 R Shoulder joint angle (in mrad) 16bit 2번 축 각도
1302 R Elbow joint angle (in mrad) 16bit 3번 축 각도
1303 R Wrist1 joint angle (in mrad) 16bit 4번 축 각도
1304 R Wrist2 joint angle (in mrad) 16bit 5번 축 각도
1305 R Wrist3 joint angle (in mrad) 16bit 6번 축 각도
1306 R Wrist4 joint angle (in mrad) 16bit 7번 축 각도 (7축이상에서 사용, 이하 동일)
1310 R Base joint angle velocity (in mrad/s) 16bit 1번 축 속도
1311 R Shoulder joint angle velocity (in mrad/s) 16bit 2번 축 속도
1312 R Elbow joint angle velocity (in mrad/s) 16bit 3번 축 속도
1313 R Wrist1 joint angle velocity (in mrad/s) 16bit 4번 축 속도
1314 R Wrist2 joint angle velocity (in mrad/s) 16bit 5번 축 속도
1315 R Wrist3 joint angle velocity (in mrad/s) 16bit 6번 축 속도
1316 R Wrist4 joint angle velocity (in mrad/s) 16bit 7번 축 속도
1380 R Base joint torque (in Nm) 16bit 1번 축의 토크
1381 R Shoulder joint torque (in Nm) 16bit 2번 축의 토크
1382 R Elbow joint torque (in Nm) 16bit 3번 축의 토크
1383 R Wrist1 joint torque (in Nm) 16bit 4번 축의 토크
1384 R Wrist2 joint torque (in Nm) 16bit 5번 축의 토크
1385 R Wrist3 joint torque (in Nm) 16bit 6번 축의 토크
1386 R Wrist4 joint torque (in Nm) 16bit 7번 축의 토크

Joint(as Float)
Address Read/Write Description Data Range Comment
1400-1401 R Base joint angle (in rad) 32bit 1번 축 각도
1402-1403 R Shoulder joint angle (in rad) 32bit 2번 축 각도
1404-1405 R Elbow joint angle (in rad) 32bit 3번 축 각도
1406-1407 R Wrist1 joint angle (in rad) 32bit 4번 축 각도
1408-1409 R Wrist2 joint angle (in rad) 32bit 5번 축 각도
1410-1411 R Wrist3 joint angle (in rad) 32bit 6번 축 각도
1412-1413 R Wrist4 joint angle (in rad) 32bit 7번 축 각도
1420-1421 R Base joint angle velocity (in rad/s) 32bit 1번 축 속도
1422-1423 R Shoulder joint angle velocity (in rad/s) 32bit 2번 축 속도
1424-1425 R Elbow joint angle velocity (in rad/s) 32bit 3번 축 속도
1426-1427 R Wrist1 joint angle velocity (in rad/s) 32bit 4번 축 속도
1428-1429 R Wrist2 joint angle velocity (in rad/s) 32bit 5번 축 속도
1430-1421 R Wrist3 joint angle velocity (in rad/s) 32bit 6번 축 속도
1432-1433 R Wrist4 joint angle velocity (in rad/s) 32bit 7번 축 속도
1560-1561 R Base joint torque (in Nm) 32bit 1번 축의 토크
1562-1563 R Shoulder joint torque (in Nm) 32bit 2번 축의 토크
1564-1565 R Elbow joint torque (in Nm) 32bit 3번 축의 토크
1566-1567 R Wrist1 joint torque (in Nm) 32bit 4번 축의 토크
1568-1569 R Wrist2 joint torque (in Nm) 32bit 5번 축의 토크
1570-1571 R Wrist3 joint torque (in Nm) 32bit 6 번 축의 토크
1572-1573 R Wrist4 joint torque (in Nm) 32bit 7번 축의 토크
Task(as WORD)
Address Read/Write Description Data Range Comment
1600 R TCP-x in 1/10 of mm (in base frame) 16bit 툴 포인트(로봇 끝점, 이하동일)의 X좌표
1601 R TCP-y in 1/10 of mm (in base frame) 16bit 툴 포인트의 Y좌표
1602 R TCP-z in 1/10 of mm (in base frame) 16bit 툴 포인트의 Z좌표
1603 R TCP-rx in mrad (in base frame) 16bit 툴 포인트의 X축 회전각(오일러UVW, 회전 순서는 rZ->rY->rX 이하동일)
1604 R TCP-ry in mrad (in base frame) 16bit 툴 포인트의 Y축 회전각
1605 R TCP-rz in mrad (in base frame) 16bit 툴 포인트의 Z축 회전각
1610 R TCP-x velocity in 1/10 of mm/s(in base frame) 16bit 툴 포인트의 X축 속도
1611 R TCP-y velocity in 1/10 of mm/s(in base frame) 16bit 툴 포인트의 Y축 속도
1612 R TCP-z velocity in 1/10 of mm/s(in base frame) 16bit 툴 포인트의 Z축 속도
1613 R TCP-rx velocity in mrad/s (in base frame) 16bit 툴 포인트의 X축 회전속도
1614 R TCP-ry velocity in mrad/s (in base frame) 16bit 툴 포인트의 Y축 회전속도
1615 R TCP-rz velocity in mrad/s (in base frame) 16bit 툴 포인트의 Z축 회전속도
Task(as Float)
Address Read/Write Description Data Range Comment
1700-1701 R TCP-x in m (in base frame) 32bit 툴 포인트의 X좌표
1702-1703 R TCP-y in m (in base frame) 32bit 툴 포인트의 Y좌표
1704-1705 R TCP-z in m (in base frame) 32bit 툴 포인트의 Z좌표
1706-1707 R TCP-rx in rad (in base frame) 32bit 툴 포인트의 X축 회전각
1708-1709 R TCP-ry in rad (in base frame) 32bit 툴 포인트의 Y축 회전각
1710-1711 R TCP-rz in rad (in base frame) 32bit 툴 포인트의 Z축 회전각
1720-1721 R TCP-x velocity in m/s (in base frame) 32bit 툴 포인트의 X축 속도
1722-1723 R TCP-y velocity in m/s (in base frame) 32bit 툴 포인트의 Y축 속도
1724-1725 R TCP-z velocity in m/s (in base frame) 32bit 툴 포인트의 Z축 속도
1726-1727 R TCP-rx velocity in rad/s (in base frame) 32bit 툴 포인트의 X축 회전속도
1728-1729 R TCP-ry velocity in rad/s (in base frame) 32bit 툴 포인트의 Y축 회전속도
1730-1731 R TCP-rz velocity in rad/s (in base frame) 32bit 툴 포인트의 Z축 회전속도

기타 로봇 데이터

로봇 에러 데이터

로봇이 비상 혹은 에러상태 일 때, 2900~2906 레지스터 값을 통해서 원인을 파악할 수 있습니다. 2900 레지스터는 이벤트 코드를 나타내며, 2901~2906 레지스터는 이 이벤트 코드에 대한 Data로, 각 Event에 따라 의미하는 값이 각각 다릅니다. 에러상태의 이벤트코드에 대해서는 IndyFramework를 참조하시기 바랍니다.

etc_error
Address Read/Write Description Data Range Comment
2900 R Emergency Event Code (Integer) 16bit 비상상황 이벤트 코드
2901 R Emergency Event Data Arg1
(16bit Signed Integer)
16bit 비상상황 이벤트 데이터 1
2902 R Emergency Event Data Arg2
(16bit Signed Integer)
16bit 비상상황 이벤트 데이터 2
2903 R Emergency Event Data Arg3
(16bit Signed Integer)
16bit 비상상황 이벤트 데이터 3
2904 R Emergency Event Data Arg4
(Floating Point (x1000))
16bit 비상상황 이벤트 데이터 4
2905 R Emergency Event Data Arg5
(Floating Point (x1000))
16bit 비상상황 이벤트 데이터 5
2906 R Emergency Event Data Arg6
(Floating Point (x1000))
16bit 비상상황 이벤트 데이터 6

기본 입출력 제어

모드버스TCP를 통하여 SmartIO(SmartDI, SmartAI, SmartDO, SmartDI)를 제어할 수 있습니다. SmartDI 00~31번은 3000~3031 레지스터에, SmartAI 00~03번은 3200-3203 레지스터에 할당되며 각 레지스터의 값을 읽어 SmartDI, SmartAI값을 확인할 수 있습니다.

Note

SmartDIO는 I/O 각각 32개씩, SmartAIO는 각각 4개씩 존재하나 추후 확장성을 위해 만들어진 쓰지 않는 번호도 존재합니다.

SmartDO, SmartAO의 경우, 모드버스TCP외에도 Conty를 통한 로봇 프로그래밍, 전용통신 등으로도 제어될 수 있습니다. 동시에 제어될 때 충돌이 일어날 수 있으며, 이러한 상황을 회피하기 위해 모드버스를 이용한 SmartDO와 SmartAO제어는 디폴트로 비활성화 되어있습니다.

SmartDO의 경우에, 기본값은 2 (None)입니다. 기본값은 2 (None)는 해당 모드버스 레지스터에 매핑된 SmartDO에 값을 사용하지 않는다는 의미입니다. 모드버스TCP로 SmartDO를 제어하고 싶은 경우, 해당 레지스터에 HIGH(1) 또는 LOW(0) 값을 입력합니다. 레지스터에 값을 입력하여 SmartDO를 제어할 경우, 다른 제어방식(SharedMemory나 Conty 등)보다 우선시 되어 실행됩니다.

마찬가지로 SmartAO도 모드버스를 통한 제어가 우선시됩니다. SmartAO 의 제어값은 0~10000으로, 0은 0V, 10000은 10V를 의미합니다. 이 값을 제외한 모든 값은 None을 의미하며(기본 None값은 50000), 모드버스TCP를 통해 SmartAO를 제어하지 않습니다.

I/O
Address Read/Write Description Data Range Comment
3000-3031 R SmartDI_00~31 0~1 HIGH(1), LOW(0)
3100-3131 W SmartDO_00~31 0~1 HIGH(1), LOW(0), NONE(other)
3200-3203 R SmartAI_00~03 16bit 0~10V to 0~10000
3220-3223 W SmartAO_00-03 16bit 0~10V to 0~10000, NONE(other)

기타 입출력 제어

3400~3437 레지스터를 통해 FTSensor 데이터를 읽을 수 있습니다. CB와 로봇에 있는 CAN 포트를 모두 지원하며 (로봇 CAN 포트는 IndyRP, IndyRP2, Indy7 에만 존재), Raw 데이터와 Transformed 데이터가 있습니다. XYZUVW순서이며, 단위는 XYZ의경우 [N], UVW의 경우 [Nm]입니다.

Extra I/O
Address Read/Write Description Data Range Comment
3400-3405 R FTSensor Data from Robot CAN (Raw)(16bit Signed Integer) 16bit 로봇 Tool CAN포트 FTSensor Raw
3406-3417 R FTSensor Data from Robot CAN (Transformed)(32bit Signed Integer) 32bit 로봇 Tool CAN포트 FTSensor Transformed Data ([N], [Nm])
3420-3425 R FTSensor Data from CB CAN (Raw)(16bit Signed Integer) 16bit CB의 CAN포트를 통한 FTSensor Raw값
3426-3437 R FTSensor Data from CB CAN (Transformed)(32bit Floating Integer) 32bit CB의 CAN포트를 통한 FTSensor Transformed Data ([N], [Nm])