Не корректно посылает регистр

Добрый день!

Всё верно. Проблема только в другом. Я в write_address описываю on_value: 1, off_value: 0
Согласно логам - всё работает корректно. Но если посмотреть в tcpdump, то при включении система посылает значение 1 для write, а в момент выключения система посылает значение 2, а должна посылать 0. Так как эот modbus TCP, то есть возможность снять tcpdump и посмотреть, что реально посылает система по IP сети, что я и сделал.

При этом, еслии в шаблоне использовать только write_address, без параметра address, то запись регистра происходит корректно и система корректно передаёт значения 1 и 0 соответственно. Но при этом не читается значение из другого регистра для подтверждения переключения.

Если требуется, могу в режиме ВКС показать все действия, которые я делаю, чтобы в режиме онлайн показать, в чём именно проблема.

И да,

read_address не игнорируется. Так же пробовал. При read_address, система посылает вообще значение 4 в off_value.

Лучше способ воспроизвести. То есть шаблон (кусок шаблона, но лучше весь).

Добрый день!

Технически невозможно записать часть регистра, пишется и читается всегда весь регистр полностью. Поэтому для изменения конкретных битов надо знать заранее значение всего регистра. В этом значении меняются только указанные биты, и весь регистр пишется в устройство.

Судя по вашим логам, происходит следующее:

Если указан address и write_address, из регистра по адресу address читается значение 2. Потом для нулевого бита выставляется 0, остальные биты не трогаются. Получается всё ещё 2. Писать битами технически невозможно, пишется всегда полностью регистр, т.е. 2. Это корректное поведение.

Параметра read_address не существует. Если его указать, но не указать address, не будет чтения оригинального значения, и оно будет принято за 0. Потому вы и видите запись 0. Это ошибочное поведение. Мы его исправили в wb-mqtt-serial 2.247.1, добавили дополнительную проверку шаблона. Если в write_address указаны биты, будет требоваться задать address. Т.е. шаблон с выдуманным read_address не пройдёт проверку.

Проблема именно с write_address.
Есть два варианта
{ "id": "power_control_onoff_1", "name": "Power Control_onoff_1", "reg_type": "holding", "write_address": "40078", "group": "io_control", "type": "wo-switch", "on_value": 1, "off_value": 0 },

и

{ "id": "power_control_onoff_1", "name": "Power Control_onoff_1", "reg_type": "holding", "address": "40002", "write_address": "40078", "group": "io_control", "type": "wo-switch", "on_value": 1, "off_value": 0 },

При первом варианте всё работает корректно, и когда идёт переключение в отключение, система шлёт в регистр со значением 0

Как я только добавляю "address": "40002", система сразу шлёт значение 2 в регистри при перключении в отключение.

Опять же. И поведение соответственно. В первом случае кондиционер корректно отключается, во втором нет.

Тут явно указано значение которое пишется в регистр. Не биты регистра а прямо целиком.

А что в этом, 40002 регистре? Если там уже “0” - то зачем записывать?

Этот пример отличается от всего того, что обсуждали ранее. Пожалуйста, проверьте работу именно с ним, т.е. с указанием адресов без битов. Если всё ещё не так, как вы ожидаете, пришлите лог обмена.

В wb-mqtt-serial добавлен вывод в лог при использовании неподдерживаемых директив.