pymodbus数据_Python Modbus库

大约在同一时间,我遇到了同样的问题-为python modbus master实现选择哪个库,但对于串行通信(modbus RTU),我的观察仅对modbus RTU有效。

在我的考试中,我并没有过多地关注文档,但是最容易找到modbus-tk的串行RTU主站示例,但是仍然在wiki等上未找到源代码。

长话短说:

最小Modbus:

优点:轻量级模块

对于读取约10个寄存器的应用程序,性能可能是可以接受的

缺点:(对于我的应用程序而言)读取〜64个寄存器的速度太慢(对于我的应用程序而言)

相对较高的CPU负载

pymodbus:

独特功能:依赖串行流(由作者发布),并且必须动态设置串行超时,否则性能会很差(必须调整串行超时以获得尽可能长的响应)

优点:低CPU负载

可接受的表现

缺点:即使超时是动态设置的,其性能也比modbus-tk低2倍; 如果将超时保留为恒定值,性能会更差(但查询时间是恒定的)

对硬件敏感(由于我认为是依赖于串行缓冲区的处理流的结果)或事务可能存在内部问题:如果每秒执行20次或更多次不同的读取或读取/写入操作,则可能会混淆响应 。 较长的超时时间有助于但并非总是使串行线路上的pymodbus RTU实施不够坚固,无法用于生产环境。

添加对动态串行端口超时设置的支持需要其他编程:继承基本同步客户端类并实现套接字超时修改方法

响应验证不如modbus-tk中所述。 例如,在总线衰减的情况下,仅引发异常,而在相同情况下,modbus-tk返回错误的从站地址或CRC错误,这有助于识别问题的根本原因(可能是超时时间太短,错误的总线终止/缺少总线错误或 浮动地面等)

modbus-tk:

独特的功能:探测串行缓冲区中的数据,快速组装并返回响应。

优点最棒的表演; 动态超时比pymodbus快约2倍

缺点:大约 与pymodbus相比,CPU负载高出4倍//使这一点无效; 参见最后的“编辑”部分

大型请求的CPU负载增加//可以大大改善,从而使这一点无效; 参见最后的“编辑”部分

代码不如pymodbus优雅

超过6个月的时间,我一直在使用pymodbus,因为它具有最佳的性能/ CPU负载比,但是在更高的请求率下,不可靠的响应成为一个严重的问题,最终我转向了更快的嵌入式系统,并添加了对我最合适的modbus-tk的支持。

对于那些对细节感兴趣的人

我的目标是达到最短的响应时间。

建立:

波特率:153600与实现Modbus从站的微控制器的16MHz时钟同步)

我的rs-485总线只有50m

FTDI FT232R转换器以及TCP桥接上的串行(在RFC2217模式下使用com4com作为桥接)

如果是USB到串行转换器的最低超时和为串行端口配置的缓冲区大小(以降低延迟)

auto-tx rs-485适配器(总线处于显性状态)

用例场景:

每秒轮询5、8或10次,并支持之间的异步访问

读取/写入10到70个寄存器的请求

典型的长期(星期)表现:

MinimalModbus:在初始测试后删除

pymodbus:〜30ms读取64个寄存器; 有效地高达30个请求/秒但是响应不可靠(如果来自多个线程的同步访问)

github上可能有一个线程安全的fork,但是它在master后面,我还没有尝试过([https://github.com/xvart/pymodbus/network)]

modbus-tk:〜16ms读取64个寄存器; 对于较小的请求,有效地达到每秒70-80个请求

基准

码:

import time

import traceback

import serial

import modbus_tk.defines as tkCst

import modbus_tk.modbus_rtu as tkRtu

import minimalmodbus as mmRtu

from pymodbus.client.sync import ModbusSerialClient as pyRtu

slavesArr = [2]

iterSp = 100

regsSp = 10

portNbr = 21

portName = 'com22'

baudrate = 153600

timeoutSp=0.018 + regsSp*0

print "timeout: %s [s]&

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要利用Python读取Modbus数据,您可以使用第三方pymodbus。以下是一个示例代码: ```python from pymodbus.client.sync import ModbusTcpClient # 创建Modbus TCP客户端 client = ModbusTcpClient('<ip_address>', port=<port>) # 连接到Modbus设备 client.connect() # 读取保持寄存器的数据 result = client.read_holding_registers(address, count) # 处理读取到的数据 if result.isError(): print("读取数据失败") else: data = result.registers print("读取到的数据:", data) # 断开与Modbus设备的连接 client.close() ``` 在代码中,您需要将`<ip_address>`替换为目标设备的IP地址,`<port>`替换为Modbus TCP端口号。您还需要指定要读取的寄存器地址和数量。通过调用`client.read_holding_registers()`方法来读取数据。如果读取成功,您可以通过`result.registers`获取到读取到的数据。 请注意,这只是一个示例代码,您需要根据实际情况进行适当的修改和调整。 #### 引用[.reference_title] - *1* [利用python获取modbus tcp数据](https://blog.csdn.net/weixin_35749786/article/details/129564637)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [Python3通过串口服务器读取设备Modbus数据modbus_rtu_over_tcp】](https://blog.csdn.net/lzl640/article/details/129733725)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值