python pymodbus库使用教程(以Modbus RTU为例)

文档:

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(method='rtu', port='/dev/ttyUSB0', baudrate=9600)

在这里,method参数设置为'rtu'以指定通信协议,port参数根据实际连接的串行端口进行设置(例如Linux系统中可能是'/dev/ttyUSB0',Windows中可能是'COM3'),baudrate参数设置传输速率,这些参数应与设备文档或配置相匹配。

建立连接

连接到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(address=1, count=10, unit=1)
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(address=1, value=25, unit=1)
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(address=1, values=values, unit=1)
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(address=1, count=10, unit=1)
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(method='rtu', port='/dev/ttyUSB0', baudrate=9600, timeout=3)    # [Errno 2] could not open port /dev/ttyUSB0: [Errno 2] No such file or directory: '/dev/ttyUSB0'
# client = ModbusClient(method='rtu', port='/dev/ttyTHS1', baudrate=9600, timeout=3)
# ttyTHS4 ttyS0 ttyS1 ttyS2 ttyS4
# client = ModbusClient(method='rtu', port='/dev/ttyTHS1', baudrate=9600, timeout=3)
# client = ModbusClient(method='rtu', port='/dev/ttyTHS0', baudrate=9600, timeout=3, stopbits=1, bytesize=8, parity='N')
client = ModbusClient(port='/dev/ttyTHS0', baudrate=9600, timeout=3,stopbits=1, bytesize=8, parity='N')    # 看文档,method='rtu'貌似没用def read_temperature_and_humidity(client):try:# 读取寄存器地址0和1上的4个字节(两个寄存器)# result = client.read_input_registers(address=0, count=3, unit=1)  # 这个错了,这是读取输入寄存器的)0x04# result = client.read_holding_registers(address=0, count=3, unit=1)  # 这个才是读取输入寄存器的0x03  # unit参数错了,当前pymodbus版本没有这个参数,搞乌龙了,要不是用filelocator搜索函数用法,还真不知道- -result = client.read_holding_registers(address=0, count=2, slave=1)  # 读取输入寄存器的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(f"An 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()

运行结果:

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/210513.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

没有PDF密码,如何解密?

PDF文件有两种密码,一个打开密码、一个限制编辑密码,因为PDF文件设置了密码,那么打开、编辑PDF文件就会受到限制。忘记了PDF密码该如何解密? PDF和office一样,可以对文件进行加密,但是没有提供恢复密码的功…

pycharm 创建的django目录和命令行创建的django再使用pycharm打开的目录对比截图 及相关

pytcharm创建django的项目 命令行创建的django 命令行创建项目时 不带路径时 (.venv) D:\gbCode>django-admin startproject gbCode 命令行创建项目时 带路径时 -- 所以如果有目录就指定路径好 (.venv) D:\gbCode>django-admin startproject gbCode d:\gbCode\

Nginx结合cpolar实现内网穿透多个Windows Web站点端口

文章目录 1. 下载windows版Nginx2. 配置Nginx3. 测试局域网访问4. cpolar内网穿透5. 测试公网访问6. 配置固定二级子域名7. 测试访问公网固定二级子域名 1. 下载windows版Nginx 进入官方网站(http://nginx.org/en/download.html)下载windows版的nginx 下载好后解压进入nginx目…

咖啡馆管理系统点餐外卖小程序效果如何

咖啡一直是很多人喜欢的饮品,比如有些地区的人非常喜欢,熬夜加班醒脑等,咖啡领域市场规模逐年增加,相应的从业商家也在增加,近些年随着线上生态崛起,传统线下咖啡馆经营痛点显露出来。 通过【雨科】平台搭建…

【Linux系统编程二十】:(进程通信2)--命名管道/共享内存

【Linux系统编程二十】:命名管道/共享内存 一.命名管道1.创建管道2.打开管道3.进行通信(server/client) 二.共享内存1.实现原理2.申请内存3.挂接4.通信5.去关联6.释放共享内存7.特性: 一.命名管道 上一篇介绍的一个管道是没有名字的 因为你打开那个文件…

设备监控,liunx 脚本实时监控服务

这里写目录标题 一.命令说明二、编写要执行脚本三、手动测试执行脚本四、配置linux系统定时任务五、测试 服务器主机会出现断电,和其他jar包服务进程被杀死的情况,写个shell脚本 定时监控它们。 当然,断电重启的时候有些命令设置开机重启 再写…

5G智慧工地整体解决方案:文件全文115页,附下载

关键词:5G智慧工地,智慧工地建设方案,智慧工地管理平台系统,智慧工地建设调研报告,智慧工地云平台建设 一、5G智慧工地建设背景 5G智慧工地是利用5G技术、物联网、大数据、云计算、AI等信息技术,围绕“人…

如何在Linux系统上检测GPU显存和使用情况?

如何在Linux系统上检测GPU显存和使用情况? 在Linux系统上,你可以使用一些命令行工具来检测GPU显存和使用情况。以下是一些常用的方法: 1. 使用nvidia-smi(仅适用于NVIDIA GPU) 如果你使用的是NVIDIA的显卡&#xff0…

node与 pnpm、node-sass 等工具的版本兼容关系

1. node & pnpm 2. node & node-sass 3. node-sass & sass-loader sass-loader依赖于node-sass,以下是部分版本号对应

大宗商品贸易集团数据治理实践,夯实数字基座 | 数字化标杆

某大型央企是首批全国供应链创新与应用示范企业,在“十四五”规划期内以聚焦供应链管理核心主业作为主要战略发展方向。供应链运营管理以大宗商品贸易为主,其交易往往具有交易量巨大、交易环节复杂、风险交易难识别、风险客商难管控等痛点。 随着集团数…

mysql查询统计最近12个月的数据

项目场景: mysql查询统计最近12个月的数据,按每个月纵向展示,效果图 sql语句 注意:count( v.uuid ) 这里的是被统计那张表的id SELECT m.month,count( v.uuid ) AS total FROM (SELECT DATE_FORMAT(( CURDATE()), %Y-%m ) AS mon…

Pycharm 教育版下载

1 访问主站-->Developer Tools-->PyCharm JetBrains: Essential tools for software developers and teams 2 页面往下划找到 PyCharm for Education-->CHECK IT OUT! PyCharm: the Python IDE for Professional Developers by JetBrains 3 点击 Download free Lea…