Показать сообщение отдельно
Старый 28.04.2021, 09:30   #3
младшой
Senior Member
 
Регистрация: May 2010
Адрес: Москва
Сообщения: 863
Благодарил(а): 4 раз(а)
Поблагодарили: 86 раз(а) в 67 сообщениях
По умолчанию Ответ: Предотвращение сброса переменных в ноль Modbus

Во-первых, вы используете блок записи с цикличным опросом.
В карте памяти слейва для этого блока указан период отличный от 0 (по умолчанию стоит 100 мсек).
Таким образом, периодически туда идет запрос на запись значения, которое у вас на выходе блока ADD.

Вам лучше бы использовать блок записи с нецикличным опросом (поставить период опроса = 0). Тогда на этом блоке появится дополнительный вход для отправки запроса.

Во-вторых, вы берете текущее значение параметра с выхода этого же блока. Однако, какое либо значение отличное от 0 там появляется только после записи по этому адресу нового значения (с последующим чтением, которое производится автоматически).
То есть, при запуске контроллера значение на этом выходе = 0.
Оно приходит на блок ADD, на котором ещё два входа = 0. Сумма на выходе = 0. А так как производится циклический запрос на запись, то через установленное в карте памяти время в регистр запишется 0.

Если вы хотите организовать такой функционал, то для этого Holding регистра в карте памяти заведите 2 переменных:
- с направлением R (out) и цикличным опросом (период >0) - так вы будете постоянно получать текущее значение регистра;
- с направлением R/W (out) и нецикличным опросом (период = 0) - для записи нового значения, но уже по необходимости.

Также рекомендую после кнопок ставить блоки Rise, чтобы изменения уставок происходило по событию "нажатие", но не срабатывало при дальнейшем удержании.
младшой сейчас на форуме   Ответить с цитированием
Благодарность от: