郑州企业网站建设公司,大数据推广公司,做设计图的软件,徐州丰县建设局网站文档#xff1a;
https://pymodbus.readthedocs.io/en/latest/
源码#xff1a;
https://github.com/riptideio/pymodbus/ 文章目录 Python PyModbus库使用教程#xff1a;以Modbus RTU为例介绍安装PyModbus配置串行连接导入必要的模块创建Modbus客户端实例 建立连接连接…文档
https://pymodbus.readthedocs.io/en/latest/
源码
https://github.com/riptideio/pymodbus/ 文章目录 Python PyModbus库使用教程以Modbus RTU为例介绍安装PyModbus配置串行连接导入必要的模块创建Modbus客户端实例 建立连接连接到Modbus设备 读取数据读取寄存器 写入数据写入单个寄存器写入多个寄存器 处理异常断开连接高级主题异步客户端使用Twisted或Asyncio框架自定义消息日志记录 实例1. 使用RS485 modbus协议读取温度湿度传感器数据 Python PyModbus库使用教程以Modbus RTU为例
介绍
Modbus是一种工业领域广泛使用的通信协议而PyModbus是一个在Python中实现Modbus通信的库。它支持多种Modbus模式包括RTU通过串行线路ASCII和TCP/IP。本教程将重点介绍如何使用PyModbus库进行Modbus RTU通信。
安装PyModbus
在开始编写代码之前需要确保已经安装了PyModbus库。可以使用pip命令轻松地安装
pip install pymodbus配置串行连接
导入必要的模块
首先需要从pymodbus库中导入必要的模块
from pymodbus.client.sync import ModbusSerialClient as ModbusClient不知道是不是改版了我用上面导入报错用下面的可以
from pymodbus.client import ModbusSerialClient as ModbusClient创建Modbus客户端实例
接下来创建一个ModbusClient实例用于建立与Modbus设备的RTU通信
client ModbusClient(methodrtu, port/dev/ttyUSB0, baudrate9600)在这里method参数设置为rtu以指定通信协议port参数根据实际连接的串行端口进行设置例如Linux系统中可能是/dev/ttyUSB0Windows中可能是COM3baudrate参数设置传输速率这些参数应与设备文档或配置相匹配。
建立连接
连接到Modbus设备
在配置好客户端实例后尝试连接到Modbus设备
if client.connect():print(Modbus RTU Client Connected)
else:print(Failed to connect to Modbus RTU Client)读取数据
读取寄存器
Modbus协议定义了几种类型的寄存器最常见的是保持寄存器和输入寄存器。以下示例展示了如何读取保持寄存器
response client.read_holding_registers(address1, count10, unit1)
if not response.isError():print(Register Values: , response.registers)
else:print(Failed to read registers)在这个例子中read_holding_registers方法用于读取地址为1的起始位置、数量为10的连续寄存器。unit参数表示从哪个单元即设备ID读取数据。
注意pymodbus某个版本已将unit字段改为slave。使用时即使写错也不会报错注意查看你的pymodbus文档。
写入数据
写入单个寄存器
要向设备的单个寄存器写入数据可以使用以下代码
write_response client.write_register(address1, value25, unit1)
if not write_response.isError():print(Written successfully)
else:print(Failed to write register)这里使用了write_register方法它接受地址、要写入的值以及目标设备的单元ID。
写入多个寄存器
如果要写入多个寄存器可以使用write_registers方法
values [20, 40, 60, 80, 100]
write_response client.write_registers(address1, valuesvalues, unit1)
if not write_response.isError():print(Multiple registers written successfully)
else:print(Failed to write multiple registers)这里values列表包含了要写入寄存器的值序列。
处理异常
处理Modbus通信过程中可能出现的异常非常重要可以使用try-except语句捕获这些异常
from pymodbus.exceptions import ModbusExceptiontry:# 尝试执行Modbus操作response client.read_holding_registers(address1, count10, unit1)
except ModbusException as ex:print(An error occurred:, str(ex))断开连接
在完成所有Modbus通信后应该关闭与设备的连接
client.close()
print(Modbus RTU Client Connection Closed)调用close()方法将关闭串行端口并释放相关资源。
高级主题
异步客户端使用Twisted或Asyncio框架
除了同步客户端PyModbus还提供了异步客户端选项可以使用Twisted或Asyncio框架。异步客户端允许程序在等待响应时执行其他任务对于需要同时处理多个Modbus请求的应用非常有用。
自定义消息
有时候标准的Modbus函数不足以满足特定的需求。PyModbus允许创建自定义消息和事务处理器使得可以扩展协议以适应特殊用例。
日志记录
调试和监控Modbus通信过程中日志记录功能至关重要。PyModbus提供了详细的日志记录机制可以帮助分析问题所在。
实例
1. 使用RS485 modbus协议读取温度湿度传感器数据
# 请先安装 pymodbus 和 pyserial
# pip install pymodbus
# pip install pyserial# from pymodbus.client.sync import ModbusSerialClient as ModbusClient # 报错说找不到 sync
from pymodbus.client import ModbusSerialClient as ModbusClient
from pymodbus.exceptions import ModbusException, ConnectionException
import logging# 配置日志记录
logging.basicConfig()
log logging.getLogger()
log.setLevel(logging.DEBUG)# 初始化Modbus串行客户端
# client ModbusClient(methodrtu, port/dev/ttyUSB0, baudrate9600, timeout3) # [Errno 2] could not open port /dev/ttyUSB0: [Errno 2] No such file or directory: /dev/ttyUSB0
# client ModbusClient(methodrtu, port/dev/ttyTHS1, baudrate9600, timeout3)
# ttyTHS4 ttyS0 ttyS1 ttyS2 ttyS4
# client ModbusClient(methodrtu, port/dev/ttyTHS1, baudrate9600, timeout3)
# client ModbusClient(methodrtu, port/dev/ttyTHS0, baudrate9600, timeout3, stopbits1, bytesize8, parityN)
client ModbusClient(port/dev/ttyTHS0, baudrate9600, timeout3,stopbits1, bytesize8, parityN) # 看文档methodrtu貌似没用def read_temperature_and_humidity(client):try:# 读取寄存器地址0和1上的4个字节两个寄存器# result client.read_input_registers(address0, count3, unit1) # 这个错了这是读取输入寄存器的0x04# result client.read_holding_registers(address0, count3, unit1) # 这个才是读取输入寄存器的0x03 # unit参数错了当前pymodbus版本没有这个参数搞乌龙了要不是用filelocator搜索函数用法还真不知道- -result client.read_holding_registers(address0, count2, slave1) # 读取输入寄存器的0x03 # 读两个寄存器就ok卖家说第三个寄存器是预留的不用读if result.isError():# 处理错误print(读取错误:, result)return None, None# 将读取到的结果转换为温度和湿度registers result.registerstemperature_reg registers[0]humidity_reg registers[1]# 检查是否有探头错误if temperature_reg 0x8000 or humidity_reg 0x8000:print(探头错误)return None, None# 计算实际的温度和湿度值temperature temperature_reg * 0.1humidity humidity_reg * 0.1# 格式化温度和湿度值保留一位小数temperature round(temperature, 1)humidity round(humidity, 1)return temperature, humidityexcept ModbusException as e:print(Modbus异常:, e)return None, Noneexcept Exception as e:# 捕获除ModbusException之外的所有异常print(fAn error occurred: {e})return None, Nonedef main():try:if client.connect(): # 尝试连接到Modbus服务器/设备temperature, humidity read_temperature_and_humidity(client)if temperature is not None and humidity is not None:print(f温度: {temperature}°C, 湿度: {humidity}%RH)client.close() # 关闭连接else:print(无法连接到Modbus设备)except ConnectionException as e:print(连接异常:, e)if __name__ __main__:main()
运行结果