使用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设备进行通信,读取保持寄存器和输入寄存器的值。这为工业自动化系统的开发和调试提供了有效的工具。

点赞(0) 打赏

微信小程序

微信扫一扫体验

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部