Что это за ошибка, выдаваемая устройством RS485 Modbus-RTU?

Я использую minimalmodbus для связи с ПИД-регулятор (Love 16C-3) через RS485 с использованием Кабель адаптера USB-RS485.

Однако при попытке чтения регистра отображается следующая ошибка. Что означает эта ошибка?

raise ValueError('The slave is indicating an error. The response is: {!r}'.format(response))
ValueError: The slave is indicating an error. The response is: '\x01\x83\x02\xc0\xf1'

Из руководства по оборудованию

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

Код Python

instrument = minimalmodbus.Instrument(port, 1, 'rtu')
instrument.serial.baudrate = 9600
instrument.serial.bytesize=8
instrument.serial.parity='E'
instrument.serial.stopbits=1
instrument.read_register(4096,1)

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


person Nyxynyx    schedule 05.12.2016    source источник
comment
Похоже на Illegal Data Address исключение. См. исключения Modbus.   -  person Andrej Debenjak    schedule 06.12.2016
comment
Попробуйте instrument.read_register(0x4700,1)   -  person Andrej Debenjak    schedule 06.12.2016
comment
@AndrejDebenjak Спасибо, исправил адрес и решил проблему. Как узнать, что сообщение об ошибке \x01\x83\x02\xc0\xf1 означало Illegal Data Address?   -  person Nyxynyx    schedule 06.12.2016
comment
Второе число в ответе: 83   -  person Andrej Debenjak    schedule 06.12.2016
comment
@AndrejDebenjak Извините, я не вижу кода ошибки 83 на странице исключений Modbus, на которую вы ссылаетесь ...   -  person Nyxynyx    schedule 06.12.2016
comment
Извините, плохой ответ. Вы получили '\x01\x83\x02\xc0\xf1'. Первое число - это адрес ведомого. Второй — код функции 0x83, представляющий исключение для команды чтения регистра. Третье число говорит вам, какое именно исключение произошло — 0x02 означает Illegal Data Address исключение. Последние две цифры - CRC.   -  person Andrej Debenjak    schedule 06.12.2016
comment
@AndrejDebenjak Спасибо! Решено.   -  person Nyxynyx    schedule 06.12.2016


Ответы (1)


Если вы обратитесь к спецификации Modbus, вы обнаружите, что исключение для функции делается путем установки MSB в байте функции... эффективно добавляя 0x80 к номеру функции в ответе.

В вашем примере вы попытались прочитать регистр удержания. В вашем запросе использовался номер функции 0x03. Исключением, которое вы получили, является функция 0x03 с установленным высоким старшим битом, что приводит к функции ответа 0x83. Код исключения — это число, которое следует за номером функции, в вашем случае это 0x02.

В спецификации Modbus код исключения 2 используется, когда адрес регистра не поддерживается.

Кстати, modbus — чрезвычайно простой протокол, а сама исходная спецификация довольно мала и легкодоступна. Если вы планируете работать с Modbus на любой глубине, я настоятельно рекомендую иметь его хотя бы под рукой: Протокол приложения Modbus v1.1

person Matt Andrews    schedule 01.03.2018