Как исправить ошибку PyModbus, не способную декодировать ответную ошибку с интерфейсом IF96015 по IME

У меня есть PyModbus на Raspberry PI 3b. У меня есть интерфейс Ethernet IF96015 для цифрового мультиметра Nemo 96HD. Когда я пытаюсь подключиться к нему через ModbusTCP с помощью консоли PyModbus, я могу спросить, подключено ли оно и говорит ли оно "true", но я не могу прочитать какие-либо данные с него.

В соответствии с инструкциями первый используемый адрес 301 и когда я пытаюсь прочитать .Coil() Я получил:

"original_function_code": "1 (0x1)", 
"error": "[Input/Output] No Response received from the remote unit/Unable to decode response"

Откройте консоль:

pymodbus.console tcp --host 192.168.178.200 --port 502

Проверьте соединение:

client.connect

Попробуйте прочитать Катушку:

client.read_coils address 301 count 1

Выход:

"original_function_code": "1 (0x1)", 
"error": "[Input/Output] Modbus Error: [Invalid Message] Incomplete message received, expected at least 8 bytes (0 received)"

[ ПРИМЕЧАНИЕ ]:

Руководства IF96015:

Manual_1

Manual_2

1 ответ

В Руководстве 2 адрес 0x301 шестигранный. Пытаться client.read_coils address = 769 count = 1, Адреса должны указываться в десятичном формате (шестнадцатеричный 0x301 = декабрь 769).

Каждый ведомый / сервер Modbus имеет идентификатор_идентификатора, поэтому вам нужно добавить его на .read_coil() метод.

Во многих случаях unit аргумент равен 1 по умолчанию в ведомой стороне Modbus.


Вот пример (клиент Modbus):

pymodbus.console tcp --host 192.168.178.200 --port 502
client.connect
client.read_coils address=301 count=1 unit=1

Вот еще один пример с многократным чтением с .read_holding_registers() и его декодер:

client.read_holding_registers count=4 address=9 unit=1
{
    "registers": [
        60497,
        47134,
        34091,
        15424
    ]
}


result.raw
{
    "registers": [
        15626,
        55203,
        28733,
        18368
    ]
}

result.decode word_order=little byte_order=little formatters=float64
28.17

[ПРИМЕЧАНИЕ]:

  • read_coil() чтение / запись цифровых значений (1 бит)
  • read_holding_registers() чтение / запись аналоговых значений (16 бит)
  • Некоторые адреса являются шестнадцатеричными (возможно, 0x301 вместо 301)
  • Не забывай = после каждого аргумента вот так (count=1 вместо count 1)

Я нашел решение для этого. Проблема заключается в значении по умолчанию для идентификатора устройства. В руководстве, которое можно найти на веб-сайте поставщика, показан пример формата пакета Modbus TCP со значением идентификатора устройства, установленным на "1".

Но заводская настройка для идентификатора устройства - "255". Вы можете изменить адрес по умолчанию в меню, пароль 3002. Теперь я могу читать значения с помощью следующего кода Python:

message = tcp.read_holding_registers(slave_id=255, starting_address=0x1000, quantity=6)
response = tcp.send_message(message, sock)
Другие вопросы по тегам