Как исправить ошибку 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:
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)