Всё верно. Проблема только в другом. Я в write_address описываю on_value: 1, off_value: 0
Согласно логам - всё работает корректно. Но если посмотреть в tcpdump, то при включении система посылает значение 1 для write, а в момент выключения система посылает значение 2, а должна посылать 0. Так как эот modbus TCP, то есть возможность снять tcpdump и посмотреть, что реально посылает система по IP сети, что я и сделал.
При этом, еслии в шаблоне использовать только write_address, без параметра address, то запись регистра происходит корректно и система корректно передаёт значения 1 и 0 соответственно. Но при этом не читается значение из другого регистра для подтверждения переключения.
Если требуется, могу в режиме ВКС показать все действия, которые я делаю, чтобы в режиме онлайн показать, в чём именно проблема.
Технически невозможно записать часть регистра, пишется и читается всегда весь регистр полностью. Поэтому для изменения конкретных битов надо знать заранее значение всего регистра. В этом значении меняются только указанные биты, и весь регистр пишется в устройство.
Судя по вашим логам, происходит следующее:
Если указан address и write_address, из регистра по адресу address читается значение 2. Потом для нулевого бита выставляется 0, остальные биты не трогаются. Получается всё ещё 2. Писать битами технически невозможно, пишется всегда полностью регистр, т.е. 2. Это корректное поведение.
Параметра read_address не существует. Если его указать, но не указать address, не будет чтения оригинального значения, и оно будет принято за 0. Потому вы и видите запись 0. Это ошибочное поведение. Мы его исправили в wb-mqtt-serial 2.247.1, добавили дополнительную проверку шаблона. Если в write_address указаны биты, будет требоваться задать address. Т.е. шаблон с выдуманным read_address не пройдёт проверку.
Этот пример отличается от всего того, что обсуждали ранее. Пожалуйста, проверьте работу именно с ним, т.е. с указанием адресов без битов. Если всё ещё не так, как вы ожидаете, пришлите лог обмена.