Skip to content

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 Namemodbus.get_slave( channel : ModbusChannel, slave_id : int, master_id : int = 0) -> 'Modbus.Slave'
DescriptionGet a Modbus slave instance for a specified channel and slave ID.
Request Parameterschannel : ModbusChannel Modbus channel
slave_id : Slave ID
master_id : Master ID
Return ValueModbus.Slave: Modbus slave instance
Compatible robot software versionCollaborative (Copper): v7.6.0.0+
Industrial (Bronze): v7.6.0.0+

4.11.2 Read Modbus Coil Registers from a Slave

Method Nameslave.read_coils( address : int, number : int ) -> tuple[list[int], StatusCodeEnum]
DescriptionRead Modbus coil registers from a slave.
Request Parametersaddress : int Register address
number : int Number of registers (max 120)
Return Valuelist[int]: Register values
StatusCodeEnum: Result of the function execution
Compatible robot software versionCollaborative (Copper): v7.6.0.0+
Industrial (Bronze): v7.6.0.0+

4.11.3 Write to Modbus Coil Registers of a Slave

Method Nameslave.write_coils( address : int, value : list[int]) -> StatusCodeEnum
DescriptionWrite to Modbus coil registers of a slave.
Request Parametersaddress : int Register address
value : list[int] Register values
Return ValueStatusCodeEnum: Result of the function execution
Compatible robot software versionCollaborative (Copper): v7.6.0.0+
Industrial (Bronze): v7.6.0.0+

4.11.4 Read Modbus Holding Registers from a Slave

Method Nameslave.read_holding_regs( address : int, number : int ) -> tuple[list[int], StatusCodeEnum]
DescriptionRead Modbus holding registers from a slave.
Request Parametersaddress : int Register address
number : int Number of registers (max 120)
Return Valuelist[int]: Register values
StatusCodeEnum: Result of the function execution
Compatible robot software versionCollaborative (Copper): v7.6.0.0+
Industrial (Bronze): v7.6.0.0+

4.11.5 Write to Modbus Holding Registers of a Slave

Method Nameslave.write_holding_regs( address : int, value : list[int]) -> StatusCodeEnum
DescriptionWrite to Modbus holding registers of a slave.
Request Parametersaddress : int Register address
value : list[int] Register values
Return ValueStatusCodeEnum: Result of the function execution
Compatible robot software versionCollaborative (Copper): v7.6.0.0+
Industrial (Bronze): v7.6.0.0+

4.11.6 Read Modbus Discrete Input Registers from a Slave

Method Nameslave.read_discrete_inputs( address : int, number : int ) -> tuple[list[int], StatusCodeEnum]
DescriptionRead Modbus discrete input registers from a slave.
Request Parametersaddress : int Register address
number : int Number of registers (max 120)
Return Valuelist[int]: Register values
StatusCodeEnum: Result of the function execution
Compatible robot software versionCollaborative (Copper): v7.6.0.0+
Industrial (Bronze): v7.6.0.0+

4.11.7 Read Modbus Input Registers from a Slave

Method Nameslave.read_input_regs( address : int, number : int ) -> tuple[list[int], StatusCodeEnum]
DescriptionRead Modbus input registers from a slave.
Request Parametersaddress : int Register address
number : int Number of registers (max 120)
Return Valuelist[int]: Register values
StatusCodeEnum: Result of the function execution
Compatible robot software versionCollaborative (Copper): v7.6.0.0+
Industrial (Bronze): v7.6.0.0+

Example Code

modbus.py
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 Namemodbus.set_parameter( param : SerialParams) -> tuple[int, StatusCodeEnum]
DescriptionSet serial communication parameters.
Request Parametersparam : SerialParams Serial communication parameters
Return Valueint: Channel ID
StatusCodeEnum: Result of the function execution
Compatible robot software versionCollaborative (Copper): v7.6.0.0+
Industrial (Bronze): v7.6.0.0+

4.11.9 Get Serial Communication Parameters

Method Namemodbus.get_parameter( channel : ModbusChannel, master_id : int = 1) -> tuple[SerialParams, StatusCodeEnum]
DescriptionGet serial communication parameters.
Request Parameterschannel : ModbusChannel Modbus channel
master_id : int Master ID
Return ValueSerialParams: Serial communication parameters
StatusCodeEnum: Result of the function execution
Compatible robot software versionCollaborative (Copper): v7.6.0.0+
Industrial (Bronze): v7.6.0.0+