Как исправить ошибку PyModbus, не способную декодировать ошибку ответа с интерфейсом IF96015 по IME - PullRequest
0 голосов
/ 20 октября 2018

У меня есть PyModbus, работающий на Raspberry PI 3b .У меня есть IF96015 интерфейс Ethernet для цифрового мультиметра 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

Ответы [ 3 ]

0 голосов
/ 27 января 2019

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

0 голосов
/ 25 апреля 2019

Я нашел решение для этого.Проблема заключается в значении по умолчанию для идентификатора устройства.В руководстве, которое можно найти на веб-сайте поставщика , показан пример формата пакета 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)
0 голосов
/ 21 октября 2018

У каждого ведомого / сервера Modbus есть unit_ID , поэтому вам необходимо добавить это к методу .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)
...