Ваша проблема в номере регистра, который вы пытаетесь прочитать. На pymodbus вы должны указать регистры как абсолютные адресные числа; вам не нужно добавлять 40000 к карте Modbus, как вы это сделали.
Просто измените эту строку:
request = client.read_holding_registers(address=43010, count=2, unit=UNIT)
на:
request = client.read_holding_registers(address=3010, count=2, unit=UNIT)
Это должно дать текущее среднее значение согласно карте вашего счетчика.
У меня сейчас нет доступа к счетчику, но если мои записи верны, порядок байтов должен быть byteorder=Endian.Big, wordorder=Endian.Little
, так что вы Возможно, вы захотите поиграть с этим и в своем коде.
Чтение этого вопроса может стоить вашего времени, в нем есть код, который, я думаю, нацелен на то же семейство устройств Schneider Electri c .
Я бы сказал, что было бы лучше, если бы вместо явно правильного чтения вы получили бы неправильную адресную ошибку, которую вы должны получить в этом случае. Я предполагаю, что они хотели оставить открытой возможность добавления дополнительных регистров на карту, и они оставили ее неограниченной.
EDIT: Как обсуждалось в комментариях ниже, правильный регистр для чтения для текущего в среднем 3009, поэтому запрос должен быть:
request = client.read_holding_registers(address=3009, count=2, unit=UNIT)
Некоторые устройства дают вам номера регистров хранения, начиная с 40001. Для pymodbus и других первый регистр хранения имеет номер 0, поэтому, если карту Modbus устройства вы должны прочитать регистр номер 45125, например, вам нужно вычесть 40001, чтобы получить address
для pymodbus :
address=45125-40001=5124
Случай, с которым вы имеете дело Здесь еще больше раздражает: карта начинается с регистра 1, поэтому вам нужно вычесть 1.
Как вы можете видеть на следующем снимке экрана:
ModbusPoll следует тому же логу c: по умолчанию вам нужно ввести 0 для регистра 40001 (или 10 для регистра 40011. Если вы установите флажок PL C адреса, вам нужно будет ввести r 1 для чтения с адреса 40001.
Да, я знаю, сбивает с толку!
Обратите внимание, что в вопросе в приведенной выше ссылке не упоминается смещение -1. Некоторые устройства (например, ваше!) Не позволяют читать с "неправильного" регистра. Таким образом, если вы хотите прочитать текущее среднее значение (которое является FLOAT32 и, следовательно, занимает два регистра), вам нужно начать чтение из регистра 3009 и прочитать два регистра (да, на карте указано 3010, но имейте в виду смещение -1). Если вместо этого вы начинаете с регистра 3010, вы фактически пытаетесь прочитать верхнюю половину текущего среднего и нижнюю половину следующей переменной (текущий дисбаланс). Поскольку вы не сможете получить какие-либо полезные данные, потому что вы читаете две смешанные переменные, вы получите ошибку. Опять же, не лучшая ошибка; он должен хотя бы намекнуть на то, что вы делаете неправильно, но, увы!