Skip to content

4.11 Modbus 相关功能

说明

Modbus 模块封装了机器人作为 Modbus 主站时的从站管理、寄存器读写以及串口参数配置等能力。通过 modbus 接口可以按通道、从站 ID 获取 Slave 对象,再对线圈、保持 / 输入寄存器执行批量读写,并设置 / 查询串口通信参数,方便与 PLC、IO 扩展模块等 Modbus 设备联动。

备注:Modbus 相关功能与示教器上的总线配置冲突,不能同时使用。

4.11.1 获取指定通道的指定从机 ID 的 Modbus 从机实例

方法名modbus.get_slave( channel : ModbusChannel, slave_id : int, master_id : int = 0) -> 'Modbus.Slave'
描述获取指定通道的指定从机 ID 的 Modbus 从机实例
请求参数channel : ModbusChannel Modbus 通道
slave_id : 从机 ID
master_id : 主机 ID
返回值Modbus.Slave: Modbus 从机实例
兼容的机器人软件版本协作 (Copper): v7.6.0.0+
工业 (Bronze): v7.6.0.0+

4.11.2 读取从机 Modbus 线圈寄存器

方法名slave.read_coils( address : int, number : int ) -> tuple[list[int], StatusCodeEnum]
描述读取从机 Modbus 线圈寄存器
请求参数address : int 寄存器地址
number : int 寄存器数量(最大 120)
返回值list [int]:寄存器值
StatusCodeEnum:函数执行结果
兼容的机器人软件版本协作 (Copper): v7.6.0.0+
工业 (Bronze): v7.6.0.0+

4.11.3 写入从机 Modbus 线圈寄存器

方法名slave.write_coils( address : int, value : list[int]) -> StatusCodeEnum
描述写入从机 Modbus 线圈寄存器
请求参数address : int 寄存器地址
value : list [int] 寄存器值
返回值StatusCodeEnum:函数执行结果
兼容的机器人软件版本协作 (Copper): v7.6.0.0+
工业 (Bronze): v7.6.0.0+

4.11.4 读取从机 Modbus 保持寄存器

方法名slave.read_holding_regs( address : int, number : int ) -> tuple[list[int], StatusCodeEnum]
描述读取从机 Modbus 保持寄存器
请求参数address : int 寄存器地址
number : int 寄存器数量(最大 120)
返回值list [int]:寄存器值
StatusCodeEnum:函数执行结果
兼容的机器人软件版本协作 (Copper): v7.6.0.0+
工业 (Bronze): v7.6.0.0+

4.11.5 写入从机 Modbus 保持寄存器

方法名slave.write_holding_regs( address : int, value : list[int]) -> StatusCodeEnum
描述写入从机 Modbus 保持寄存器
请求参数address : int 寄存器地址
value : list [int] 寄存器值
返回值StatusCodeEnum:函数执行结果
兼容的机器人软件版本协作 (Copper): v7.6.0.0+
工业 (Bronze): v7.6.0.0+

4.11.6 读取从机 Modbus 离散输入寄存器

方法名slave.read_discrete_inputs( address : int, number : int ) -> tuple[list[int], StatusCodeEnum]
描述读取从机 Modbus 离散输入寄存器
请求参数address : int 寄存器地址
number : int 寄存器数量(最大 120)
返回值list [int]:寄存器值
StatusCodeEnum:函数执行结果
兼容的机器人软件版本协作 (Copper): v7.6.0.0+
工业 (Bronze): v7.6.0.0+

4.11.7 读取从机 Modbus 输入寄存器

方法名slave.read_input_regs( address : int, number : int ) -> tuple[list[int], StatusCodeEnum]
描述读取从机 Modbus 输入寄存器
请求参数address : int 寄存器地址
number : int 寄存器数量(最大 120)
返回值list [int]:寄存器值
StatusCodeEnum:函数执行结果
兼容的机器人软件版本协作 (Copper): v7.6.0.0+
工业 (Bronze): v7.6.0.0+

示例代码

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 设置串口通讯参数

方法名modbus.set_parameter( param : SerialParams) -> tuple[int, StatusCodeEnum]
描述设置串口通讯参数
请求参数param : SerialParams 串口通讯参数
返回值int:通道 ID
StatusCodeEnum:函数执行结果
兼容的机器人软件版本协作 (Copper): v7.6.0.0+
工业 (Bronze): v7.6.0.0+

4.11.9 获取串口通讯参数

方法名modbus.get_parameter( channel : ModbusChannel, master_id : int = 1) -> tuple[SerialParams, StatusCodeEnum]
描述获取串口通讯参数
请求参数channel : ModbusChannel Modbus 通道
master_id : int 主机 ID
返回值SerialParams:串口通讯参数
StatusCodeEnum:函数执行结果
兼容的机器人软件版本协作 (Copper): v7.6.0.0+
工业 (Bronze): v7.6.0.0+