对于一个项目,我在RS485串行线路上连接了4个modbus设备。设备工作正常,现在我正在编写一个控制器,我对pymodbus
的性能非常不满意。
我找到了这个帖子Python modbus library,在我看来可能有更好的python modbus库。 pymodbus
易于使用,我希望在可能的情况下继续使用它。
但是我发现任何读/写例程返回的时间都等于超时。这对我来说似乎不对,所以我写了一个快速测试:
from pymodbus.client.sync import ModbusSerialClient
import time
for t in xrange(1, 11):
client = ModbusSerialClient("rtu", port="/dev/ttyUSB0", baudrate=9600, timeout=t)
start = time.time()
data = client.read_holding_registers(0x9000, count=7, unit=2)
stop = time.time()
if data:
succ = "was successful"
else:
succ = "failed"
print "timeout: %ss, read %s, time spent reading: %fs" % (t, succ, stop-start)
这是我得到的输出
timeout: 1s, read was successful, time spent reading: 1.039731s
timeout: 2s, read was successful, time spent reading: 2.038965s
timeout: 3s, read was successful, time spent reading: 3.041441s
timeout: 4s, read was successful, time spent reading: 4.040762s
timeout: 5s, read was successful, time spent reading: 5.043523s
timeout: 6s, read was successful, time spent reading: 6.040139s
timeout: 7s, read was successful, time spent reading: 7.042159s
timeout: 8s, read was successful, time spent reading: 8.045216s
timeout: 9s, read was successful, time spent reading: 9.047682s
timeout: 10s, read was successful, time spent reading: 10.048799s
我已经使用不同的RS845 USB转换器对其进行了测试,我总能得到类似的结果。
任何其他人都能证实这一点吗?或者我错过了一些没有记录的论点会增加ModbusSerialClient
的表现?
答案 0 :(得分:0)
我可以确认 - 即使收到来自奴隶的响应(在我的情况下为14ms),pymodbus总是等待超时(1-3秒)。所以我用minimalmodbus测试并立即收到响应。在我的情况下,当我用循环测试时,每秒最多35次。
编辑:我找到了原因 - 使用RTU协议时,pymodbus等待超过1000个字节或超时。他们需要计算预期的字节,并且他们有一个修复,但这还没有在主分支(AFAIK)。查看这篇文章https://github.com/bashwork/pymodbus/issues/76所以,如果你真的需要使用pymodbus,你可以尝试补丁。