Skip to content

4.11 Modbus 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, facilitating linkage with PLCs, I/O expansion modules, and other Modbus devices.

Core Features ​

  • Support for obtaining Modbus slave instances by channel and slave ID
  • Support for reading and writing Modbus coil registers from slaves
  • Support for reading and writing Modbus holding registers from slaves
  • Support for reading Modbus discrete input registers from slaves
  • Support for reading Modbus input registers from slaves
  • Support for setting and querying serial communication parameters

Use Cases ​

  • Data exchange with PLC devices
  • Control of I/O expansion modules
  • Implementation of linkage between robots and other Modbus devices
  • Configuration and management of Modbus serial communication parameters

Notes ​

Modbus functions conflict with the bus configuration on the robot software and cannot be used simultaneously.

4.11.1 Get Modbus Slave Instance ​

Method Namemodbus.get_slave( channel : ModbusChannel, slave_id : int, master_id : int = 0) -> 'Modbus.Slave'
DescriptionGet a Modbus slave instance for the specified channel and slave ID.
Request Parameterschannel : ModbusChannel Modbus channel
slave_id : int Slave ID
master_id : int Master ID (default 0)
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 Register count (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 Register count (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 Register count (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 Register count (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 (default 1)
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+