4.11 Modbus-Related Functions
Overview
The Modbus module encapsulates the robot’s capabilities when acting as a Modbus master: slave management, register read/write, and serial-port parameter configuration.
Through the modbus interface you can obtain a Slave object by channel and slave ID, then perform batch reads/writes on coils, holding/input registers, and set/query serial-port communication parameters—making it easy to integrate with PLCs, I/O expansion modules, and other Modbus devices.
Note: Modbus-related functions conflict with the bus configuration on the teaching pendant and cannot be used simultaneously.
4.11.1 Get a Modbus Slave Instance for a Specified Channel and Slave ID
| Method Name | modbus.get_slave( channel : ModbusChannel, slave_id : int, master_id : int = 0) -> 'Modbus.Slave' |
|---|---|
| Description | Get a Modbus slave instance for a specified channel and slave ID. |
| Request Parameters | channel : ModbusChannel Modbus channel slave_id : Slave ID master_id : Master ID |
| Return Value | Modbus.Slave: Modbus slave instance |
| Compatible robot software version | Collaborative (Copper): v7.6.0.0+ Industrial (Bronze): v7.6.0.0+ |
4.11.2 Read Modbus Coil Registers from a Slave
| Method Name | slave.read_coils( address : int, number : int ) -> tuple[list[int], StatusCodeEnum] |
|---|---|
| Description | Read Modbus coil registers from a slave. |
| Request Parameters | address : int Register address number : int Number of registers (max 120) |
| Return Value | list[int]: Register values StatusCodeEnum: Result of the function execution |
| Compatible robot software version | Collaborative (Copper): v7.6.0.0+ Industrial (Bronze): v7.6.0.0+ |
4.11.3 Write to Modbus Coil Registers of a Slave
| Method Name | slave.write_coils( address : int, value : list[int]) -> StatusCodeEnum |
|---|---|
| Description | Write to Modbus coil registers of a slave. |
| Request Parameters | address : int Register address value : list[int] Register values |
| Return Value | StatusCodeEnum: Result of the function execution |
| Compatible robot software version | Collaborative (Copper): v7.6.0.0+ Industrial (Bronze): v7.6.0.0+ |
4.11.4 Read Modbus Holding Registers from a Slave
| Method Name | slave.read_holding_regs( address : int, number : int ) -> tuple[list[int], StatusCodeEnum] |
|---|---|
| Description | Read Modbus holding registers from a slave. |
| Request Parameters | address : int Register address number : int Number of registers (max 120) |
| Return Value | list[int]: Register values StatusCodeEnum: Result of the function execution |
| Compatible robot software version | Collaborative (Copper): v7.6.0.0+ Industrial (Bronze): v7.6.0.0+ |
4.11.5 Write to Modbus Holding Registers of a Slave
| Method Name | slave.write_holding_regs( address : int, value : list[int]) -> StatusCodeEnum |
|---|---|
| Description | Write to Modbus holding registers of a slave. |
| Request Parameters | address : int Register address value : list[int] Register values |
| Return Value | StatusCodeEnum: Result of the function execution |
| Compatible robot software version | Collaborative (Copper): v7.6.0.0+ Industrial (Bronze): v7.6.0.0+ |
4.11.6 Read Modbus Discrete Input Registers from a Slave
| Method Name | slave.read_discrete_inputs( address : int, number : int ) -> tuple[list[int], StatusCodeEnum] |
|---|---|
| Description | Read Modbus discrete input registers from a slave. |
| Request Parameters | address : int Register address number : int Number of registers (max 120) |
| Return Value | list[int]: Register values StatusCodeEnum: Result of the function execution |
| Compatible robot software version | Collaborative (Copper): v7.6.0.0+ Industrial (Bronze): v7.6.0.0+ |
4.11.7 Read Modbus Input Registers from a Slave
| Method Name | slave.read_input_regs( address : int, number : int ) -> tuple[list[int], StatusCodeEnum] |
|---|---|
| Description | Read Modbus input registers from a slave. |
| Request Parameters | address : int Register address number : int Number of registers (max 120) |
| Return Value | list[int]: Register values StatusCodeEnum: Result of the function execution |
| Compatible robot software version | Collaborative (Copper): v7.6.0.0+ Industrial (Bronze): v7.6.0.0+ |
Example Code
py
#!python
"""
Copyright © 2016 Agilebot Robotics Ltd. All rights reserved.
Instruction: modbus使用示例 / Example of modbus usage
"""
from Agilebot import Arm, ModbusChannel, SerialParams, StatusCodeEnum
# [ZH] 初始化Arm类
# [EN] Initialize the robot
arm = Arm()
# [ZH] 连接控制器
# [EN] Connect to the robot
ret = arm.connect("10.27.1.254")
if ret == StatusCodeEnum.OK:
print("机器人连接成功 / Robot connected successfully")
else:
print(f"机器人连接失败,错误代码 / Robot connection failed, error code: {ret.errmsg}")
arm.disconnect()
exit(1)
# [ZH] 设置modbus参数
# [EN] Set Modbus parameters
params = SerialParams(channel=ModbusChannel.CONTROLLER_TCP_TO_485, ip="10.27.1.80", port=502)
id, ret_code = arm.modbus.set_parameter(params)
if ret_code == StatusCodeEnum.OK:
print("设置Modbus参数成功 / Set Modbus parameters successfully")
else:
print(f"设置Modbus参数失败,错误代码 / Set Modbus parameters failed, error code: {ret_code.errmsg}")
arm.disconnect()
exit(1)
# [ZH] 创建从站
# [EN] Create a slave
slave = arm.modbus.get_slave(ModbusChannel.CONTROLLER_TCP_TO_485, 1, 1)
# [ZH] 写入
# [EN] Write to registers
value = [1, 2, 3, 4]
ret = slave.write_coils(0, value)
if ret == StatusCodeEnum.OK:
print("写入线圈成功 / Write coils successfully")
else:
print(f"写入线圈失败,错误代码 / Write coils failed, error code: {ret.errmsg}")
arm.disconnect()
exit(1)
ret = slave.write_holding_regs(0, value)
if ret == StatusCodeEnum.OK:
print("写入保持寄存器成功 / Write holding registers successfully")
else:
print(f"写入保持寄存器失败,错误代码 / Write holding registers failed, error code: {ret.errmsg}")
arm.disconnect()
exit(1)
# [ZH] 读取
# [EN] Read registers
res, ret = slave.read_coils(0, 4)
if ret == StatusCodeEnum.OK:
print("读取线圈成功 / Read coils successfully")
print(f"读取的线圈值 / Read coil values:{res}")
else:
print(f"读取线圈失败,错误代码 / Read coils failed, error code: {ret.errmsg}")
arm.disconnect()
exit(1)
res, ret = slave.read_holding_regs(0, 4)
if ret == StatusCodeEnum.OK:
print("读取保持寄存器成功 / Read holding registers successfully")
print(f"读取的寄存器值 / Read register values:{res}")
else:
print(f"读取保持寄存器失败,错误代码 / Read holding registers failed, error code: {ret.errmsg}")
arm.disconnect()
exit(1)
res, ret = slave.read_input_regs(0, 4)
if ret == StatusCodeEnum.OK:
print("读取输入寄存器成功 / Read input registers successfully")
print(f"读取的输入寄存器值 / Read input register values:{res}")
else:
print(f"读取输入寄存器失败,错误代码 / Read input registers failed, error code: {ret.errmsg}")
arm.disconnect()
exit(1)
res, ret = slave.read_discrete_inputs(0, 4)
if ret == StatusCodeEnum.OK:
print("读取离散输入成功 / Read discrete inputs successfully")
print(f"读取的离散输入值 / Read discrete input values:{res}")
else:
print(f"读取离散输入失败,错误代码 / Read discrete inputs failed, error code: {ret.errmsg}")
arm.disconnect()
exit(1)
# [ZH] 结束后断开机器人连接
# [EN] Disconnect from the robot
arm.disconnect()
print("机器人断开连接成功 / Robot disconnected successfully")4.11.8 Set Serial Communication Parameters
| Method Name | modbus.set_parameter( param : SerialParams) -> tuple[int, StatusCodeEnum] |
|---|---|
| Description | Set serial communication parameters. |
| Request Parameters | param : SerialParams Serial communication parameters |
| Return Value | int: Channel ID StatusCodeEnum: Result of the function execution |
| Compatible robot software version | Collaborative (Copper): v7.6.0.0+ Industrial (Bronze): v7.6.0.0+ |
4.11.9 Get Serial Communication Parameters
| Method Name | modbus.get_parameter( channel : ModbusChannel, master_id : int = 1) -> tuple[SerialParams, StatusCodeEnum] |
|---|---|
| Description | Get serial communication parameters. |
| Request Parameters | channel : ModbusChannel Modbus channel master_id : int Master ID |
| Return Value | SerialParams: Serial communication parameters StatusCodeEnum: Result of the function execution |
| Compatible robot software version | Collaborative (Copper): v7.6.0.0+ Industrial (Bronze): v7.6.0.0+ |