使用Python的pymodbus库进行Modbus RTU通信
Modbus是一种广泛应用于工业自动化和控制系统的通信协议。pymodbus是一个Python库,用于实现Modbus协议的客户端和服务器功能。本文将重点介绍如何使用pymodbus库通过Modbus RTU协议读取保持寄存器和输入寄存器的值。
安装pymodbus库
首先,确保你的环境中安装了pymodbus库。在终端中运行以下命令进行安装:
pip install pymodbus
建立Modbus RTU通信
用于Modbus RTU通信,我们需要一个串口通信的库,通常可以使用pyserial
库。首先安装pyserial
:
pip install pyserial
下面是使用pymodbus库连接到Modbus RTU设备的基础代码示例。
from pymodbus.client.sync import ModbusSerialClient as ModbusClient
import logging
# 设置日志
logging.basicConfig()
log = logging.getLogger()
log.setLevel(logging.DEBUG)
# 创建Modbus RTU客户端
client = ModbusClient(method='rtu', port='/dev/ttyUSB0', baudrate=9600, timeout=3)
# 连接到Modbus设备
if not client.connect():
log.error("无法连接到Modbus设备")
exit()
请根据你的设备设置适当的串口(上面的示例为/dev/ttyUSB0
),波特率和超时。
读取保持寄存器
保持寄存器是用于存储设备运行状态的重要数据。使用read_holding_registers()
方法可以读取这些寄存器的值。下面是一个读取保持寄存器的示例:
# 读取保持寄存器
address = 0 # 寄存器起始地址
count = 10 # 读取寄存器的数量
result = client.read_holding_registers(address, count, unit=1) # unit为设备ID
if result.isError():
log.error(f"读取保持寄存器失败: {result}")
else:
log.info(f"保持寄存器值: {result.registers}")
读取输入寄存器
输入寄存器存储的通常是输入的传感器数据,例如温度和湿度等。使用read_input_registers()
方法可以读取这些值。以下是读取输入寄存器的示例:
# 读取输入寄存器
address = 0 # 输入寄存器起始地址
count = 10 # 读取寄存器的数量
result = client.read_input_registers(address, count, unit=1) # unit为设备ID
if result.isError():
log.error(f"读取输入寄存器失败: {result}")
else:
log.info(f"输入寄存器值: {result.registers}")
关闭连接
完成操作后,记得关闭与Modbus设备的连接:
client.close()
完整代码示例
将上述代码整合起来,形成一个完整的Modbus RTU通信程序:
from pymodbus.client.sync import ModbusSerialClient as ModbusClient
import logging
# 设置日志
logging.basicConfig()
log = logging.getLogger()
log.setLevel(logging.DEBUG)
# 创建Modbus RTU客户端
client = ModbusClient(method='rtu', port='/dev/ttyUSB0', baudrate=9600, timeout=3)
# 连接到Modbus设备
if not client.connect():
log.error("无法连接到Modbus设备")
exit()
# 读取保持寄存器
address_holding = 0
count_holding = 10
result_holding = client.read_holding_registers(address_holding, count_holding, unit=1)
if result_holding.isError():
log.error(f"读取保持寄存器失败: {result_holding}")
else:
log.info(f"保持寄存器值: {result_holding.registers}")
# 读取输入寄存器
address_input = 0
count_input = 10
result_input = client.read_input_registers(address_input, count_input, unit=1)
if result_input.isError():
log.error(f"读取输入寄存器失败: {result_input}")
else:
log.info(f"输入寄存器值: {result_input.registers}")
# 关闭连接
client.close()
通过以上示例,你可以轻松地使用pymodbus库与Modbus RTU设备进行通信,读取保持寄存器和输入寄存器的值。这为工业自动化系统的开发和调试提供了有效的工具。