pymodbus считывает регистры счетчика

Я новичок в Modbus, но у меня есть небольшой проект, над которым нужно поработать. Мне нужно прочитать некоторые значения со счетчика энергии. Я написал это из нескольких примеров, найденных в Интернете:

import logging
from pymodbus.client.sync import ModbusTcpClient as ModbusClient

logging.basicConfig()
log = logging.getLogger()
log.setLevel(logging.DEBUG)

client = ModbusClient('192.168.80.210')
client.connect() 
rr = client.read_holding_registers(40012, 1)
print rr

client.close()

Кажется, он подключается к счетчику, потому что это мой результат:

DEBUG:pymodbus.transaction:Current transaction state - IDLE
DEBUG:pymodbus.transaction:Running transaction 1
DEBUG:pymodbus.transaction:SEND: 0x0 0x1 0x0 0x0 0x0 0x6 0x0 0x3 0x9c 0x4c 0x0 0x1
DEBUG:pymodbus.client.sync:New Transaction state 'SENDING'
DEBUG:pymodbus.transaction:Changing transaction state from 'SENDING' to 'WAITING FOR REPLY'
DEBUG:pymodbus.transaction:Transaction failed. (Modbus Error: [Invalid Message] Incomplete message received, expected at least 8 bytes (0 received)) 
DEBUG:pymodbus.framer.socket_framer:Processing: 
DEBUG:pymodbus.transaction:Getting transaction 1
DEBUG:pymodbus.transaction:Changing transaction state from 'PROCESSING REPLY' to 'TRANSACTION_COMPLETE'
Modbus Error: [Input/Output] Modbus Error: [Invalid Message] Incomplete message received, expected at least 8 bytes (0 received)

Я хочу читать из регистров 40012 в 40014, и это карта Modbusdbus, которая у меня есть: Карта Modbus

Я ценю вашу помощь. С уважением,


person Luis Javier Alvarez Rodriguez    schedule 21.11.2018    source источник


Ответы (1)


Я думаю, вам следует установить аргументы unit и port, а для получения значения использовать rr.registers, поэтому вам нужно знать значение unit_ID и порт устройства.

В большинстве случаев unit - это 1, а port - 502 по умолчанию для Modbus.

Если вы хотите читать с адреса 40012 по 40014, вы можете читать с 40012 как объемное чтение с count=3.


Я улучшил ваш код, попробуйте:

from pymodbus.client.sync import ModbusTcpClient

client = ModbusTcpClient('192.168.80.210', port=502)

if client.connect():
    res = client.read_holding_registers(40012, count=3, unit=1)

    if not res.isError():
    '''.isError() was implemented in pymodbus version 1.4.0 and above.'''
        print(res.registers)
    else:
        # handling error
        print(res)

client.close()
person Benyamin Jafari    schedule 21.11.2018
comment
Благодарить! Ты прав. Мне не хватало единицы, в данном случае единицы - 100, теперь у меня есть регистры, возвращаемые с устройства. - person Luis Javier Alvarez Rodriguez; 22.11.2018
comment
@LuisJavierAlvarezRodriguez удачи, с голосом поддержки мы могли бы улучшить вопрос / ответ Stack Overflow, а минимальная репутация для положительных голосов составляет 15. - person Benyamin Jafari; 22.11.2018