Indy Framework supports Modbus TCP, one of the general-purpose industrial fieldbus communication protocols. ModbusTCP can be primaryly used to receive robot data and to send commands using external devices such as PC, PLC, and the other devices.
Robot setting, task teaching, and robot programming are commonly performed by Conty, which is Neuromeka's official teach pendant application. The commands such as executing and stopping the registered robot program can be performed by external devices that use IndyDCP or ModbusTCP as well as Conty.
Both IndyDCP and ModbusTCP use dedicated TCP communication and communicate through TCP/IP network protocol. To use TCP/IP protocol, control box (STEP) must be connected with external devices that will use the TCP/IP communication protocol through Ethernet. Here, IndyCB (control box) or STEP that executes Indy Framework will be a server, and up to 32 masters (client) can be connected. Below table is the connection information for the Modbus TCP slave (server)
|IP Address||Ethernet IP address of STEP|
|Port Number||502 (ModbusTCP default port)|
|Max. Number of Connections||32 (internally using 2 as default)|
|Max. Communication Cycle||100Hz (10ms)|
Memory Address Mapping
ModbusTCP supports both of Coil (bit) and Register (WORD; 16bit), but IndyFramework2.0 mainly uses Register.
Register 0 to 999 is a user area, which is able to read and write. Users freely assign variables to the required memory addresses. In Conty program, M variables can be created through direct variables as shown in below, allowing access to user area in memory.
Register 1000 to 3999 is a reserved area, which is used for controlling robots or reading data. Below table shows the memory address mapping of reserved areas of Register and Coil. Register is used by default, but in some cases with a Data Range of 0 to 1, it is also available with Coil. The availability of Coil is indicated with mark * in the Data Range.
Receiving Robot Status
The status of the robot uses 1000 to 1099 addresses. Most avariables for each address are represented by 1(true) and 0(false), and can be accessed by both Coil and Register to read status values. Some state variables have Word values accessible only by Register. For example, the 1040 address is default program Number registered in Conty.
|1011||R||isRobotReady||0~1 *||Robot is ready (all Servo On, etc.)|
|1013||R||isCollided||0~1 *||Robot detects collision|
|1015||R||isBusy||0~1 *||The robot is in motion|
|1016||R||isMoveFinished||0~1 *||The robot reached its target normally|
|1017||R||isHome||0~1 *||Robot is home position|
|1018||R||isZero||0~1 *||Robot is zero position|
|1040||R||Registered Default Program #Num||0, 1~10||The Number of registered default Conty program|
|1081||R||isTeachingMode||0~1 *||Teaching Mode through JOG buttons, etc.|
|1083||R||isProgramRunning||0~1 *||Program is running (including pause)|
Robot Control Command and Executing Program
To send commands to control the robot, you can write a value of 1 at 1100 to 1299 addresses. Both Coil and Register are accessible, as mentioned before. In the slave (server), Rising bit is used to recognize the command. It executes the command only after recognizing the change from 0 to 1.
If you want to send a command assigned to the same address again, you must change 1 to 0 and write it back to 1 for bit rising. Commands must be sent after 10 ms because the maximum communication cycle of the ModbusTCP is 100 Hz.
If the moving commands is sent when the robot is already moving or the program is running, it will be ignored. In addition, when multiple commands is sent at the same time, it runs only high-priority commands and other commands are ignored.
Program Execution Commands
1100-1104 are related to the execution of a program in Conty.
1110-1119 commands are related to the default program stored in Conty. Default programs can be stored in Conty from number 1 to 10, and one of these can be registered to the robot through ModbusTCP or Conty. It is possible to register a default program via 1110-1119 command and run it via 1100 command.
|Program Execution Commands|
|1100||W||Start Registered 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||Register Default Program 1~10||0~1 *||Register default program to the robot|
Basic Robot Control Commands
1160-1165 are the basic commands of robot control. Commands include reset, force reset, motion stop, emergency stop, move to home position, etc.
1160 reset command can be used to reset common errored situations. When robot is stopped due to overspeed or collision detection, reset is used to resolve the problem and make the robot ready again. When the reset is in progress, the state value of 1019 becomes 1 and user is able to know about robot status.
1161 reset command is a force reset command when the robot cannot be reset even with 1160 command. The robot will be rebooted and re-initialized.
1162 motion stop command stops the robot which is in motion (both motion and program).
1164 and 1165 commands move the robot to its home position or zero point. It only works when the robot is not moving or the program is not running.
|Basic Robot Control Commands|
|1160||W||Reset||0~1 *||Robot reset (Error reset, etc.)|
|1161||W||Force Reset||0~1 *||Hardware reset (Robot rebooting and initializing, etc.)|
|1162||W||Stop Motion||0~1 *||-|
|1163||W||Emergency Stop||0~1 *||-|
|1164||W||Move to Home||0~1 *||Move to home position|
|1165||W||Move to Zero||0~1 *||Move to zero position|
|1170||W||Switch To Direct Teaching Mode||0~1 *||-|
|1171||W||Finish Direct Teaching Mode||0~1 *||-|
Specific Move Command Execution Commands
1200-1299 are commands to execute certain Move commands in a program set as the default program. These names are mapped from move-00 to move-99 for each address. This command only works when the program is not running. Also, if the Move command is already in progress or if the robot is moving, command will be ignored
|Command & Program|
|1200-1299||W||Move to Specific Named Move Command(move-00~move-99)||0~1 *||-|
Methods for programming robots with ModbusTCP
User is able to create complicated conty program using SmartIO and ModbusTCP.
For example, if an external device is connected to a DIO port in CB, user can use if statement in Conty program to verify SmartDI inputs. In this case, the main agent of control is Conty program, and the program operates when the external device sends a SmartDI input.
Another option is to execute Move command directly from an external device. In this option, user directly sends command to 1200~1299, which is mapped with specified name as move-00~move-99. For example, if user create JointMove named move-00, move-01 and FrameMove named move-02, the robot can be controlled directly from an external device with commands to ModbusTCP 1200, 1201, and 1202 as shown in below.
Receiving Robot Data
There are two coordinates system for robot. One is joint coordinates and the other is task coordinates. Joint coordinates is the angles of each axis of the robot, and task coordinates is the TCP position on a three-dimensional space.
1300-1305 represent the joint coordinates and each corresponds to the angle of the joint 1 to 6. For the seven-axis robot, 1306 corresponds to the angle of joint 7. The unit is mrad (1/1000 times the radian) and it is represented by a signed 16-bit integer. Similarly, 1310-1315 are the current velocities of the axis 1 to 6, and 1380-1385 are the current forces (torque) of the axis 1 to 6 respectively.
1600-1605 represents Task coordinates (xyzuvw order) . xyz is the distance from the robot Base to TCP, and uvw indicates the rotation of the tool endpoints. These are represented by the Euler Angle and the rotation order is w->v->u (rZ->rY->rX). The unit is 1/10mm (1/10000 times the meter) for xyz and mrad for uvw. 1610-1615 likewise represent the current velocities on task coordinates.
The data described above cannot represent a more detailed unit because they represent a value in 16 bit integers. It also supports 32bit float data for users who want more detailed values. 1400-1411 and 1700-1711 use 2 addresses per data (e.g. 1400-1401) to represent 32bit float data.
|1300||R||Base joint angle (in mrad)||16bit||Angle of axis 1 (axis closest to the robot base)|
|1301||R||Shoulder joint angle (in mrad)||16bit||Angle of axis 2|
|1302||R||Elbow joint angle (in mrad)||16bit||Angle of axis 3|
|1303||R||Wrist1 joint angle (in mrad)||16bit||Angle of axis 4|
|1304||R||Wrist2 joint angle (in mrad)||16bit||Angle of axis 5|
|1305||R||Wrist3 joint angle (in mrad)||16bit||Angle of axis 6|
|1306||R||Wrist4 joint angle (in mrad)||16bit||Angle of axis 7 (when 7 or more axises exist)|
|1310||R||Base joint angle velocity (in mrad/s)||16bit||Velocity of axis 1|
|1311||R||Shoulder joint angle velocity (in mrad/s)||16bit||Velocity of axis 2|
|1312||R||Elbow joint angle velocity (in mrad/s)||16bit||Velocity of axis 3|
|1313||R||Wrist1 joint angle velocity (in mrad/s)||16bit||Velocity of axis 4|
|1314||R||Wrist2 joint angle velocity (in mrad/s)||16bit||Velocity of axis 5|
|1315||R||Wrist3 joint angle velocity (in mrad/s)||16bit||Velocity of axis 6|
|1316||R||Wrist4 joint angle velocity (in mrad/s)||16bit||Velocity of axis 7|
|1380||R||Base joint torque (in Nm)||16bit||Torque of axis 1|
|1381||R||Shoulder joint torque (in Nm)||16bit||Torque of axis 2|
|1382||R||Elbow joint torque (in Nm)||16bit||Torque of axis 3|
|1383||R||Wrist1 joint torque (in Nm)||16bit||Torque of axis 4|
|1384||R||Wrist2 joint torque (in Nm)||16bit||Torque of axis 5|
|1385||R||Wrist3 joint torque (in Nm)||16bit||Torque of axis 6|
|1386||R||Wrist4 joint torque (in Nm)||16bit||Torque of axis 7|
|1400-1401||R||Base joint angle (in rad)||32bit||Angle of axis 1|
|1402-1403||R||Shoulder joint angle (in rad)||32bit||Angle of axis 2|
|1404-1405||R||Elbow joint angle (in rad)||32bit||Angle of axis 3|
|1406-1407||R||Wrist1 joint angle (in rad)||32bit||Angle of axis 4|
|1408-1409||R||Wrist2 joint angle (in rad)||32bit||Angle of axis 5|
|1410-1411||R||Wrist3 joint angle (in rad)||32bit||Angle of axis 6|
|1412-1413||R||Wrist4 joint angle (in rad)||32bit||Angle of axis 7|
|1420-1421||R||Base joint angle velocity (in rad/s)||32bit||Velocity of axis 1|
|1422-1423||R||Shoulder joint angle velocity (in rad/s)||32bit||Velocity of axis 2|
|1424-1425||R||Elbow joint angle velocity (in rad/s)||32bit||Velocity of axis 3|
|1426-1427||R||Wrist1 joint angle velocity (in rad/s)||32bit||Velocity of axis 4|
|1428-1429||R||Wrist2 joint angle velocity (in rad/s)||32bit||Velocity of axis 5|
|1430-1421||R||Wrist3 joint angle velocity (in rad/s)||32bit||Velocity of axis 6|
|1432-1433||R||Wrist4 joint angle velocity (in rad/s)||32bit||Velocity of axis 7|
|1560-1561||R||Base joint torque (in Nm)||32bit||Torque of axis 1|
|1562-1563||R||Shoulder joint torque (in Nm)||32bit||Torque of axis 2|
|1564-1565||R||Elbow joint torque (in Nm)||32bit||Torque of axis 3|
|1566-1567||R||Wrist1 joint torque (in Nm)||32bit||Torque of axis 4|
|1568-1569||R||Wrist2 joint torque (in Nm)||32bit||Torque of axis 5|
|1570-1571||R||Wrist3 joint torque (in Nm)||32bit||Torque of axis 6|
|1572-1573||R||Wrist4 joint torque (in Nm)||32bit||Torque of axis 7|
|1600||R||TCP-x in 1/10 of mm (in base frame)||16bit||X coordinate of tool point (robot end point)|
|1601||R||TCP-y in 1/10 of mm (in base frame)||16bit||Y coordinate of tool point|
|1602||R||TCP-z in 1/10 of mm (in base frame)||16bit||Z coordinate of tool point|
|1603||R||TCP-rx in mrad (in base frame)||16bit||X-axis rotation angle of tool point (Euler UVW, rotation order rZ->rY->rX)|
|1604||R||TCP-ry in mrad (in base frame)||16bit||Y-axis rotation angle of tool point|
|1605||R||TCP-rz in mrad (in base frame)||16bit||Z-axis rotation angle of tool point|
|1610||R||TCP-x velocity in 1/10 of mm/s(in base frame)||16bit||X-axis velocity of tool point|
|1611||R||TCP-y velocity in 1/10 of mm/s(in base frame)||16bit||Y-axis velocity of tool point|
|1612||R||TCP-z velocity in 1/10 of mm/s(in base frame)||16bit||Z-axis velocity of tool point|
|1613||R||TCP-rx velocity in mrad/s (in base frame)||16bit||X-axis rotation velocity of tool point|
|1614||R||TCP-ry velocity in mrad/s (in base frame)||16bit||Y-axis rotation velocity of tool point|
|1615||R||TCP-rz velocity in mrad/s (in base frame)||16bit||Z-axis rotation velocity of tool point|
|Address||Read/Write||Description||Data Range||Comment||1700-1701||R||TCP-x in m (in base frame)||32bit||X coordinate of tool point|
|1702-1703||R||TCP-y in m (in base frame)||32bit||Y coordinate of tool point|
|1704-1705||R||TCP-z in m (in base frame)||32bit||Z coordinate of tool point|
|1706-1707||R||TCP-rx in rad (in base frame)||32bit||X-axis rotation velocity of tool point|
|1708-1709||R||TCP-ry in rad (in base frame)||32bit||Y-axis rotation velocity of tool point|
|1710-1711||R||TCP-rz in rad (in base frame)||32bit||Z-axis rotation velocity of tool point|
|1720-1721||R||TCP-x velocity in m/s (in base frame)||32bit||X-axis velocity of tool point|
|1722-1723||R||TCP-y velocity in m/s (in base frame)||32bit||Y-axis velocity of tool point|
|1724-1725||R||TCP-z velocity in m/s (in base frame)||32bit||Z-axis velocity of tool point|
|1726-1727||R||TCP-rx velocity in rad/s (in base frame)||32bit||X-axis rotation velocity of tool point|
|1728-1729||R||TCP-ry velocity in rad/s (in base frame)||32bit||Y-axis rotation velocity of tool point|
|1730-1731||R||TCP-rz velocity in rad/s (in base frame)||32bit||Z-axis rotation velocity of tool point|
Other Robot Data
Robot Error Data
When the robot is in an emergency or an error condition, the value of register 2900-2906 can be used to determine which emergency situation or error is present. These register contains the most recent information about an emergency or an error. 2900 register is the emergency event code and 2901-2906 register are the event data argument for each event code. For detail about error state, see IndyFramework.
|2900||R||Last Emergency Event Code(Integer)||16bit||Event code of last emergency|
|2901||R||Last Emergency Event Data Arg1(16bit Signed Integer)||16bit||Emergency event data 1|
|2902||R||Last Emergency Event Data Arg2(16bit Signed Integer)||16bit||Emergency event data 2|
|2903||R||Last Emergency Event Data Arg3(16bit Signed Integer)||16bit||Emergency event data 3|
|2904||R||Last Emergency Event Data Arg4(Floating Point (x1000))||16bit||Emergency event data 4|
|2905||R||Last Emergency Event Data Arg5(Floating Point (x1000))||16bit||Emergency event data 5|
|2906||R||Last Emergency Event Data Arg6(Floating Point (x1000))||16bit||Emergency event data 6|
Basic I/O Control
SmartIO(SmartDI, SmartAI, SmartDO, SmartDI) can be controlled through ModbusTCP. SmartDI 00-31 is allocated to the 3000-3031 register and SmartAI 00-03 is allocated to the 3200-3203, which can be read to determine the SmartDI and SmartAI value.
SmartDIO has 32 I/O each, and SmartAIO has 4 I/O each, but, there are unused numbers made for future scalability.
SmartDO and SmartAO can be controlled by not only ModbusTCP, but also by Conty or indyDCP, etc. When controlled at the same time, the output may not be the desired value. To avoid this situation, the control using Modbus is diactivated at default.
In the case of SmartDO, the default value is 2 (meaning "None"), which means that it doesn't write value to the SmartDO. If SmartDO should be controlled with ModbusTCP, user can change the the default value to HIGH(1) or LOW(0). Then, the ModbusTCP will write and control the SmartDO. In this case, SmartDO take priority over other controls.
Similarly, control through Modbus has a priority for SmartAO. The control value of SmartAO is 0(0[V]) to 10000(10[V]). All values exceed 10000 denotes None (default is 50000) which means SmartAO is not controlled with ModbusTCP.
|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)|
Other I/O Controls
Although there are some additional I/O ports, currently only CAN ports for FTTSensor are provided. Data is in XYZUVW order, and the unit are [N] for XYZ and [Nm] for UVW.
|3400-3405||R||FTSensor Data from Robot CAN (Raw)(16bit Signed Integer)||16bit||-|
|3406-3417||R||FTSensor Data from Robot CAN (Transformed)(32bit Signed Integer)||32bit||-|
|3420-3425||R||FTSensor Data from CB CAN (Raw)(16bit Signed Integer)||16bit||-|
|3426-3437||R||FTSensor Data from CB CAN (Transformed)(32bit Floating Integer)||32bit||-|