rtu Pymodbus не может читать ведомое устройство

Я пытался подключиться к устройству, используя последовательный порт и RTU Modbus. Устройство представляет собой частотно-регулируемый регулятор:

введите описание изображения здесь

Который подключен к моему ноутбуку через следующий преобразователь RS485 в USB:

https://www.amazon.co.uk/gp/product/B01E8JRL6O/ref=ppx_yo_dt_b_search_asin_title?ie=UTF8&psc=1

Инструкции к устройству, которое я подключил, чтобы предоставить пример использования для чтения данных с помощью Modbus, как показано ниже:  введите описание изображения здесь

С учетом вышеизложенного я попытался выполнить запрос на чтение с помощью следующего кода:

from pymodbus.client.sync import ModbusSerialClient as ModbusClient
modbus = ModbusClient(method='rtu', port='/dev/tty.usbserial-AQ00BYCR', baudrate=9600, timeout=1)
modbus.connect()
test = modbus.read_holding_registers(1, 1, unit=1)
print (test)

Выше я предполагаю, что строка:

test = modbus.read_holding_registers(1, 1, unit=1)

означает, что читается адрес регистра 1, для 1 кадра чтения и для идентификатора устройства 1. Насколько я понимаю, этот запрос соответствует примеру инструкции, показанному выше. Однако, к сожалению, я постоянно получаю сообщение об ошибке:

Ошибка Modbus: [Вход / Выход] Ошибка Modbus: [Недействительное сообщение] Получено неполное сообщение, ожидается как минимум 2 байта (получен 1)

Кто-нибудь знает, почему я получаю эту ошибку? И, во-вторых, вычисляется ли CRC на лету pymodbus? Или я должен как-то это вычислить и включить?

Любая помощь высоко ценится!


person Hayden Eastwood    schedule 03.12.2019    source источник
comment
Вам не нужно беспокоиться о CRC, это обрабатывается pymodbus. Можете ли вы разместить ссылку на информацию о вашем конвертере RS485? Некоторые из них не подходят для Modbus. Также будет полезно, если вы разместите ссылку на свое внешнее устройство, просто чтобы убедиться, что вы используете правильные настройки.   -  person Marcos G.    schedule 03.12.2019
comment
Спасибо, Маркос, в описание я добавил ссылку на USB, а также внешний совет.   -  person Hayden Eastwood    schedule 03.12.2019
comment
Отличное редактирование, спасибо. Я не смог найти мануал для вашего pid-контроллера. Я видел некоторые подобные устройства, но иногда они не являются Modbus, но имеют очень похожий, но упрощенный протокол. Вы абсолютно уверены, что этот поддерживает Modbus? Ваш USB-конвертер выглядит хорошо, и если вы получаете обратно только один байт, единственное оставшееся объяснение - проблема с протоколом.   -  person Marcos G.    schedule 03.12.2019
comment
Привет, Маркос, спасибо за отзыв. Устройство определенно поддерживает Modbus, и пример команды чтения, приведенный выше в таблице, является примером запроса Modbus, предоставленного производителем устройства.   -  person Hayden Eastwood    schedule 03.12.2019
comment
ОК, ясно. Тогда единственные другие идеи, которые я могу вам предложить: дважды проверьте скорость передачи и четность и попробуйте использовать debug / log, чтобы узнать, какой именно байт вы возвращаете, вы можете взглянуть на этот пример, чтобы добавить конфигурацию, необходимую для печати отладочных сообщений.   -  person Marcos G.    schedule 03.12.2019
comment
Спасибо, сделаю - еще один момент: я предполагаю, что одна из возможностей моей ошибки связана с тем, как я перевожу приведенную выше таблицу в формат Pymodbus. Я что-то упустил в том, как определяются адреса Modbus? Спасибо, я просмотрел ссылку, я видел ее раньше и работал безрезультатно.   -  person Hayden Eastwood    schedule 03.12.2019
comment
Я написал ответ, но это больше похоже на комментарий. Напишите ответ, если обнаружите что-то полезное из журналов   -  person Marcos G.    schedule 03.12.2019


Ответы (1)


Как обсуждалось в комментариях, вы столкнулись со странной проблемой.

Подводить итоги:

-Ваш ПИД-регулятор поддерживает Modbus RTU через RS485.

-Проводка правильная: T / R + на конвертере USB идет на T / R (A) на контроллере, а T / R- на T / R (B).

-Преобразователь USB вроде хороший и поддерживает Modbus (полудуплекс RS485).

-Ваш код должен работать.

-Скорость передачи и четность правильные. (РЕДАКТИРОВАТЬ: на самом деле это была проблема, согласно приведенному ниже комментарию, часто скорость передачи данных, указанная в руководстве как значение по умолчанию, была изменена в новой версии прошивки или кем-то другим, манипулирующим устройством для своих собственные потребности).

Чтобы получить более подробную информацию, вы можете добавить отладку / ведение журнала следующим образом:

from pymodbus.client.sync import ModbusSerialClient as ModbusClient

import logging
FORMAT = ('%(asctime)-15s %(threadName)-15s '
          '%(levelname)-8s %(module)-15s:%(lineno)-8s %(message)s')
logging.basicConfig(format=FORMAT)
log = logging.getLogger()
log.setLevel(logging.DEBUG)


modbus = ModbusClient(method='rtu', port='/dev/tty.usbserial-AQ00BYCR', baudrate=9600, timeout=1)
modbus.connect()
test = modbus.read_holding_registers(1, 1, unit=1)
print(test.registers)

Попробуйте это, и вы убедитесь, что pymodbus действительно записывает в порт следующие байты:

0x01 0x03 0x00 0x01 0x00 0x01 0xD5 0xCA

Глядя на журнал (он должен быть похож на мой, но в вашем вы тоже увидите ответ с устройства):

2019-12-03 18:24:45,262 MainThread      DEBUG    transaction    :111      Current transaction state - IDLE
2019-12-03 18:24:45,262 MainThread      DEBUG    transaction    :116      Running transaction 1
2019-12-03 18:24:45,262 MainThread      DEBUG    transaction    :215      SEND: 0x1 0x3 0x0 0x1 0x0 0x1 0xd5 0xca
2019-12-03 18:24:45,262 MainThread      DEBUG    sync           :73       New Transaction state 'SENDING'
2019-12-03 18:24:45,262 MainThread      DEBUG    transaction    :224      Changing transaction state from 'SENDING' to 'WAITING FOR REPLY'
2019-12-03 18:24:46,264 MainThread      DEBUG    transaction    :234      Transaction failed. (Modbus Error: [Invalid Message] Incomplete message received, expected at least 2 bytes (0 received)) 
2019-12-03 18:24:46,265 MainThread      DEBUG    rtu_framer     :235      Frame - [] not ready
2019-12-03 18:24:46,265 MainThread      DEBUG    transaction    :390      Getting transaction 1
2019-12-03 18:24:46,265 MainThread      DEBUG    transaction    :189      Changing transaction state from 'PROCESSING REPLY' to 'TRANSACTION_COMPLETE'

На данный момент все, что у меня получается, - это чрезвычайно надуманные теории (если вы работаете на очень-очень старой версии pymodbus, порядок байтов CRC был неправильным, и вместо этого вы бы увидели 0xca 0xd5).

person Marcos G.    schedule 03.12.2019
comment
Спасибо за это - я наконец нашел свою проблему. Фактически, инструкции устройства утверждали, что скорость передачи данных 9600 бод была по умолчанию, тогда как на самом деле она была установлена ​​на 38400. После опробования полного диапазона бод связь ожила, как только я выбрал правильный. Не всегда верьте инструкциям! - person Hayden Eastwood; 04.12.2019
comment
Отлично. Нестандартные скорости передачи данных часто становятся головной болью. Если вы хотите сохранить свой вопрос и думаете, что ответ может быть полезен другим, вы можете отметить его решенным. - person Marcos G.; 04.12.2019