大约在同一时间,我遇到了同样的问题-为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]&