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+ |
示例代码
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+ |