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基于paramunittest模块实现excl参数化

    Python基于paramunittest模块实现excl参数化

    这篇文章主要介绍了Python基于paramunittest模块实现excl参数化,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-04-04
  • Python方法的延迟加载的示例代码

    Python方法的延迟加载的示例代码

    本篇文章主要介绍了Python方法的延迟加载的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-12-12
  • python基础教程之实现石头剪刀布游戏示例

    python基础教程之实现石头剪刀布游戏示例

    使用PYTHON设计一个"石头,剪子,布"游戏,有时又叫"Rochambeau",下面是实现方法,需要的朋友可以参考下
    2014-02-02
  • django Serializer序列化使用方法详解

    django Serializer序列化使用方法详解

    这篇文章主要介绍了django Serializer序列化使用方法详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-10-10
  • Python参数传递机制传值和传引用原理详解

    Python参数传递机制传值和传引用原理详解

    这篇文章主要介绍了Python参数传递机制传值和传引用原理详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-05-05
  • python信号量,条件变量和事件详解

    python信号量,条件变量和事件详解

    这篇文章主要为大家介绍了python的信号量,条件变量和事件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-01-01
  • Django在Model保存前记录日志实例

    Django在Model保存前记录日志实例

    这篇文章主要介绍了Django在Model保存前记录日志实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-05-05
  • Python 切分数组实例解析

    Python 切分数组实例解析

    这篇文章主要介绍了Python 切分数组实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11
  • 通过python扫描二维码/条形码并打印数据

    通过python扫描二维码/条形码并打印数据

    这篇文章主要介绍了通过python扫描二维码/条形码并打印数据,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-11-11
  • PyCharm+Miniconda3安装配置教程详解

    PyCharm+Miniconda3安装配置教程详解

    这篇文章主要介绍了PyCharm+Miniconda3安装配置教程详解,需要的朋友可以参考下
    2021-02-02

最新评论