python pymodbus模块的具体使用

 更新时间:2025年09月24日 10:59:40   作者:小灰灰搞电子  
pymodbus是一个Python实现的Modbus协议库,支持TCP和RTU通信模式,支持读写线圈、离散输入、保持寄存器等数据类型,具有一定的参考价值,感兴趣的可以了解一下

一、详解

pymodbus是一个基于Python的开源库,用于实现Modbus通信协议。Modbus是一种广泛应用于工业自动化领域的串行通信协议,支持主从架构(客户端-服务器模型)。pymodbus库提供了完整的Modbus客户端(主站)和服务器(从站)功能,支持多种传输方式,包括Modbus RTU(串行通信)和Modbus TCP(以太网通信)。

1、 基础概念

Modbus协议定义了一套标准的数据模型和通信规则:

  • 数据模型:使用寄存器存储数据,分为:
    • 线圈(Coils):1位读写寄存器,用于布尔值(如开关状态)。
    • 离散输入(Discrete Inputs):1位只读寄存器。
    • 保持寄存器(Holding Registers):16位读写寄存器,用于整数值(如传感器读数)。
    • 输入寄存器(Input Registers):16位只读寄存器。
  • 地址范围:每个寄存器类型有独立地址空间,范围从0到65535(即 0 ≤ address ≤ 65535 0 \leq \text{address} \leq 65535 0address65535)。
  • 功能码:Modbus操作使用功能码(Function Code),例如:
    • 读线圈:功能码1。
    • 写单个寄存器:功能码6。
    • 完整列表可参考Modbus标准文档。

pymodmos库实现了这些概念,支持Python 3.6及以上版本,并兼容多种操作系统(Windows、Linux、macOS)。

2、核心功能

pymodbus提供模块化设计,主要组件包括:

  • 客户端(Client):作为主站发起请求,支持同步和异步模式。
    • 支持Modbus TCP和RTU传输。
    • 提供读写API,如read_coilswrite_register
  • 服务器(Server):作为从站响应请求,可模拟设备行为。
    • 支持数据存储上下文(如ModbusServerContext)。
    • 内置线程或异步事件处理。
  • 协议处理
    • 自动处理Modbus PDU(协议数据单元)格式。
    • 支持异常响应(如非法地址时返回错误码)。
  • 扩展性:允许自定义数据处理器和传输层(如通过串口或Socket)。

关键优势:

  • 轻量级:纯Python实现,无需外部依赖。
  • 灵活:支持同步(pymodbus.client)和异步(pymodbus.async)编程。
  • 兼容性:遵循Modbus标准,可与PLC、HMI等工业设备互操作。

3、安装与设置

安装pymodbus简单,通过pip命令即可:

pip install pymodbus

安装后,导入所需模块:

from pymodbus.client import ModbusTcpClient  # TCP客户端
from pymodbus.server import StartTcpServer    # TCP服务器
from pymodbus.datastore import ModbusSlaveContext, ModbusServerContext  # 数据存储

环境要求:

  • Python 3.6+。
  • 对于Modbus RTU,需物理串口或虚拟串口工具(如pyserial)。
  • 测试工具推荐:使用Modbus模拟软件(如Modbus Poll)验证通信。

4、使用示例

以下示例展示常见场景,代码基于同步模式(异步模式类似,使用asyncio)。

示例1: Modbus TCP客户端(读取保持寄存器)
作为客户端,连接到服务器并读取数据。

from pymodbus.client import ModbusTcpClient

# 连接到服务器(假设IP: 127.0.0.1, 端口: 502)
client = ModbusTcpClient('127.0.0.1', port=502)
client.connect()

# 读取保持寄存器(地址0,数量2个寄存器)
result = client.read_holding_registers(address=0, count=2, unit=1)  # unit为从站ID
if not result.isError():
    print("读取成功:", result.registers)  # 输出寄存器值列表,如[100, 200]
else:
    print("错误:", result)

client.close()  # 关闭连接

示例2: Modbus TCP服务器(模拟从站)
创建服务器并存储数据。

from pymodbus.server import StartTcpServer
from pymodbus.datastore import ModbusSlaveContext, ModbusServerContext
from pymodbus.datastore import ModbusSequentialDataBlock

# 初始化数据存储:设置保持寄存器(地址0-9,初始值0)
store = ModbusSlaveContext(
    hr=ModbusSequentialDataBlock(0, [0]*10)  # hr表示保持寄存器
)
context = ModbusServerContext(slaves=store, single=True)  # single模式为单从站

# 启动服务器(端口502)
StartTcpServer(context=context, address=("0.0.0.0", 502))

示例3: Modbus RTU通信(使用串口)
适用于串行设备。

from pymodbus.client import ModbusSerialClient

# 配置串口(端口COM1, 波特率9600)
client = ModbusSerialClient(method='rtu', port='COM1', baudrate=9600)
client.connect()

# 写单个线圈(地址0,值True)
client.write_coil(address=0, value=True, unit=1)

client.close()

5、 高级特性

pymodbus支持更复杂场景:

  • 异步模式:使用AsyncModbusTcpClient结合asyncio,提高并发性能。
    import asyncio
    from pymodbus.client import AsyncModbusTcpClient
    
    async def main():
        client = AsyncModbusTcpClient('127.0.0.1', port=502)
        await client.connect()
        result = await client.read_holding_registers(0, 2)
        print(result.registers)
        await client.close()
    
    asyncio.run(main())
    
  • 自定义数据处理器:重写ModbusRequestHandler处理特定逻辑。
  • 安全扩展:支持TLS加密(Modbus TCP)或自定义认证。
  • 诊断工具:内置日志记录(import logging),便于调试通信问题。

性能优化建议:

  • 使用连接池管理客户端实例。
  • 批量读写减少请求次数(如read_holding_registerscount参数)。
  • 在资源受限设备上,启用精简模式(禁用不必要功能)。

6、注意事项

  • 错误处理:pymodbus可能抛出异常(如ModbusIOException),需捕获处理:
    try:
        result = client.read_coils(0, 1)
    except Exception as e:
        print("通信错误:", e)
    
  • 协议限制
    • Modbus RTU要求严格时序(如3.5字符间隔)。
    • 地址溢出:确保地址在有效范围(如超出65535会报错)。
  • 常见问题
    • 连接超时:检查网络或串口配置。
    • 数据不一致:验证字节序(pymodbus默认大端序)。
    • 性能瓶颈:在高频通信中,优先使用异步模式。
  • 资源
    • 官方文档:pymodbus GitHub
    • 社区支持:通过GitHub Issues获取帮助。

二、代码示例

1、modbusTCP client

from time import sleep
from pymodbus.client import ModbusTcpClient



client = ModbusTcpClient('127.0.0.1')

client.connect()
while True:
    res = client.read_holding_registers(slave=1,address=0,count=10)

    print(res.registers)

    sleep(0.5)

2、modbusRTU client

from time import sleep
from pymodbus.client import ModbusSerialClient


client = ModbusSerialClient(method='rtu', port='COM1', baudrate=9600, timeout=1)
connection = client.connect()


while True:
    res = client.read_holding_registers(slave=1,address=0,count=10)

    print(res.registers)

    sleep(0.5)

到此这篇关于python pymodbus模块的具体使用的文章就介绍到这了,更多相关python pymodbus使用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 解决Python print 输出文本显示 gbk 编码错误问题

    解决Python print 输出文本显示 gbk 编码错误问题

    这篇文章主要介绍了解决Python print 输出文本显示 gbk 编码错误问题,本文给出了三种解决方法,需要的朋友可以参考下
    2018-07-07
  • 简单解析Django框架中的表单验证

    简单解析Django框架中的表单验证

    这篇文章主要介绍了简单解析Django框架中的表单验证,Django是Python重多人气框架中最为著名的一个,需要的朋友可以参考下
    2015-07-07
  • python线程池的四种好处总结

    python线程池的四种好处总结

    在本篇文章里小编给大家整理的是一篇关于python线程池的四种好处归纳内容,有兴趣的朋友们可以学习下。
    2021-04-04
  • Jupyter Notebook如何导入python文件时的问题

    Jupyter Notebook如何导入python文件时的问题

    这篇文章主要介绍了Jupyter Notebook如何导入python文件时的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • Python基于sklearn库的分类算法简单应用示例

    Python基于sklearn库的分类算法简单应用示例

    这篇文章主要介绍了Python基于sklearn库的分类算法,结合简单实例形式分析了Python使用sklearn库封装朴素贝叶斯、K近邻、逻辑回归、SVM向量机等常见机器学习算法的分类调用相关操作技巧,需要的朋友可以参考下
    2018-07-07
  • python实现图片压缩代码实例

    python实现图片压缩代码实例

    这篇文章主要介绍了python实现图片压缩代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-08-08
  • 一文带你深入了解Python中的多进程编程

    一文带你深入了解Python中的多进程编程

    在 Python 中,多进程编程是一种提高程序运行效率的有效手段,本文将详细讲解 Python 多进程编程的基本概念,使用方法及注意事项,希望对大家有所帮助
    2024-12-12
  • Pytorch中torch.cat()函数举例解析

    Pytorch中torch.cat()函数举例解析

    一般torch.cat()是为了把多个tensor进行拼接而存在的,下面这篇文章主要给大家介绍了关于Pytorch中torch.cat()函数举例解析的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2022-12-12
  • python Tornado事件循环示例源码解析

    python Tornado事件循环示例源码解析

    这篇文章主要为大家介绍了python Tornado事件循环示例源码解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-09-09
  • 使用python AI快速比对两张人脸图像及遇到的坑

    使用python AI快速比对两张人脸图像及遇到的坑

    这篇文章主要介绍了如何使用python AI快速比对两张人脸图像?实现过程比较简单,但是第三方python依赖的安装过程较为曲折,下面是通过实践对比总结出来的能够支持的几个版本,避免大家踩坑,需要的朋友可以参考下
    2023-02-02

最新评论