Ошибка декодирования pymodbus: [Input / Output] Нет ответа от удаленного устройства / Невозможно декодировать ответ - PullRequest
0 голосов
/ 14 декабря 2018

У меня были ошибки декодирования на моем Raspberry Pi 3B с использованием pymodbus.Разработана плата с использованием MAX14854G в качестве приемопередатчика RS-485, которая подключена к контактам UART RPI3 (8 и 10).В настоящее время тестируем его с использованием кабеля RS-485 и симулятора Modbus (Modbus Simulator -> кабель RS485 -> плата HART RS-485 UART -> Raspberry Pi 3B).

Блок-схема:

enter image description here

Дополнительная информация: я использую полную функциональность UART (ttyAMA0), меняя местами ttyS0 и ttyAMA0 и отключая последовательные консоли и Bluetooth:

$ sudo systemctl disable serial-getty@ttyAMA0.service
$ sudo systemctl disable serial-getty@ttyS0.service
$ sudo systemctl disable serial-getty@serial0.service
$ sudo systemctl disable serial-getty@serial1.service

Вот мой код + ошибки + журнал:

In [1]: import pymodbus
   ...: import serial
   ...: import serial.rs485
   ...: from pymodbus.pdu import ModbusRequest
   ...: from pymodbus.client.sync import ModbusSerialClient as ModbusClient
   ...: from pymodbus.transaction import ModbusRtuFramer
   ...: from pymodbus.register_read_message import ReadInputRegistersResponse
   ...: 
   ...: import logging
   ...: logging.basicConfig()
   ...: log = logging.getLogger()
   ...: log.setLevel(logging.DEBUG)

In [2]: msys = ModbusClient(method='rtu',port='/dev/ttyAMA0',stopbits=1,bytesize=8,parity='O',baudrate=9600,timeout=2)

In [3]: msys.inter_char_timeout = 0.05

In [4]: HR2 = msys.read_holding_registers(0,1,unit=1)
DEBUG:pymodbus.transaction:Current transaction state - IDLE
DEBUG:pymodbus.transaction:Running transaction 1
DEBUG:pymodbus.transaction:SEND: 0x1 0x3 0x0 0x0 0x0 0x1 0x84 0xa
DEBUG:pymodbus.client.sync:New Transaction state 'SENDING'
DEBUG:pymodbus.transaction:Changing transaction state from 'SENDING' to 'WAITING FOR REPLY'
DEBUG:pymodbus.transaction:Changing transaction state from 'WAITING FOR REPLY' to 'PROCESSING REPLY'
DEBUG:pymodbus.transaction:RECV: 0x1 0x3 0x0 0x0 0x0 0x1 0x84
DEBUG:pymodbus.transaction:Changing transaction state from 'PROCESSING REPLY' to 'TRANSACTION_COMPLETE'

In [5]: HR2
Out[5]: 
pymodbus.exceptions.ModbusIOException('No Response received from the remote unit/Unable to decode response',
                                  3)

In [6]: print(HR2)
Modbus Error: [Input/Output] No Response received from the remote unit/Unable to decode response

In [7]: print(HR2.registers)
---------------------------------------------------------------------------
 AttributeError                            Traceback (most recent call last)
<ipython-input-7-02134bc1ab17> in <module>()
----> 1 print(HR2.registers)

AttributeError: 'ModbusIOException' object has no attribute 'registers'

Это проблема декодирования или UART Raspberry Pi 3B неправильно настроен?До отключения последовательных консолей я даже не мог подключиться к устройству.Основанный на симуляторе Modbus, трафик данных.

enter image description here

Ответы [ 2 ]

0 голосов
/ 13 мая 2019

Я не уверен, что понимаю ваши настройки, но мне кажется, что вы пытаетесь прочитать данные с шины RS485, когда сигнал разрешения привода со стороны Pi всегда высокий.

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

Вам необходимо реализовать аппаратный или программный способ его переключения.Посмотрите здесь: фон на RS485

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

Решение с libmodbus

0 голосов
/ 17 декабря 2018

Ответ неверный.Для функции 3 (то есть read out words) ответ должен выглядеть как [SlaveNb] [FnNb] [NbBytes] [Data] [CRC16].Ваш запрос верный, вы запрашиваете 1 word, начиная с адреса 0.

Ответ должен быть 01 03 02 XX XX YY YY, где 02 - количество байтов данных, XX XX - данные, YY YY - CRC16.Вы должны заметить, что ваше поле NbBytes в ответе равно 0, но количество слов должно быть удвоено.

Кстати, ваш ответ выглядит как эхо запроса.Не ошиблись ли вы в проводке?Вероятно, вы сделали петлю rx & tx?

...