Клиент Pymodbus устанавливает значения, ограниченные 100 регистрами

Я использую pymodbus на Raspberry Pi в качестве клиента, чтобы хранить значения от сеньоров и сделать их доступными для мастера Modbus через TCP.

Все отлично работает. Я использую следующее для настройки хранилища данных. values ​​= context[slave_id].getValues ​​(register, address, count=350) Проблема заключается в том, что когда я пытаюсь установить значения, я не могу просмотреть список значений [98].

Если я установлю счет =5, я могу установить значения от [0] до [4], но он выдаст ошибку, когда я установлю [5], как и следовало ожидать.

С счетом = 350 я получаю ошибку, когда пытаюсь установить значение [99].

Это предполагает, что их ограничение составляет 100 регистров. Можно ли продлить этот лимит?

Глядя на store.py, я не вижу никаких ограничений, поэтому я немного смущен тем, где будет установлен предел.

Ваша помощь будет высоко ценится.

ура

2 ответа

В спецификации Modbus существует ограничение количества регистров, которые может обрабатывать протокол. Максимум, что я лично читаю / пишу за один звонок - это 120 регистров, но вот объяснение на control.com:

"Количество считываемых регистров вместе со всеми остальными полями в ожидаемом ответе не должно превышать допустимую длину сообщений Modbus: 256 байтов".

Ответ Modbus/RTU на запрос функции 3 включает

адрес узла: 1-байтовый код функции: 1-байтовый счетчик байтов: 1 байт

данные регистров: N регистров * 2 байта каждый

CRC: 2 байта

Следовательно, максимальное количество регистров, которые могут быть прочитаны в одном запросе Modbus/RTU, составляет 125.

Если вы используете Modbus/TCP, вы обмениваете адрес устройства и CRC (всего 3 байта) на 6-байтовый заголовок и 1-байтовый идентификатор блока; максимальное количество регистров в одном ответе падает до 123.

Максимальное количество регистров хранения за запрос

Я ответил на свой вопрос. Если вы настраиваете PyModbus для работы в качестве ведомого, и вам нужно более 100 доступных регистров, вам нужно отредактировать следующие строки кода в вашем скрипте python, чтобы отразить количество регистров, которые вы хотите обновить.

Здесь вы инициализируете свое хранилище данных в своем скрипте Python.

store = ModbusSlaveContext(
    di = ModbusSequentialDataBlock(0, [1]*100),
    co = ModbusSequentialDataBlock(0, [2]*100),
    hr = ModbusSequentialDataBlock(0, [3]*100),
    ir = ModbusSequentialDataBlock(0, [4]*100))
context = ModbusServerContext(slaves=store, single=True)

Измените значение 100 на количество регистров, которые вы хотите обновить.

Спасибо Stackru и вкладчикам. Вы - мой главный способ найти ответы на проблемы. Отличный сайт. ура

Другие вопросы по тегам