Плохая производительность `ModbusSerialClient`, так же быстро, как и время ожидания

Для проекта у меня есть 4 устройства Modbus, подключенных к последовательной линии RS485. Устройства работают нормально, и теперь, когда я пишу контроллер, я весьма недоволен производительностью pymodbus,

Я нашел эту тему библиотеки Python Modbus, и мне кажется, что там могут быть лучшие библиотеки 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

Я протестировал его с различными USB-конвертерами RS845<->и всегда получаю схожие результаты.

Может ли кто-нибудь еще это подтвердить? Или я пропускаю какой-то недокументированный аргумент, который увеличит ModbusSerialClientпроизводительность?

1 ответ

Я могу подтвердить, что - pymodbus всегда ожидает тайм-аут (1-3 секунды), даже если он немедленно получает ответ от подчиненного устройства (в моем случае 14 мс). Поэтому я проверил с помощью minimalmodbus и сразу получил ответ. В моем случае до 35 раз в секунду, когда я тестировал его с помощью цикла.

Редактировать: Я нашел причину - pymodbus ожидает более 1000 байтов или тайм-аут при использовании протокола RTU. Им нужно вычислить ожидаемые байты, и у них есть исправление для этого, но это еще не в основной ветке (AFAIK). Проверьте этот пост https://github.com/bashwork/pymodbus/issues/76 Так что, если вам действительно нужно использовать pymodbus, вы можете попробовать патчи.

Другие вопросы по тегам