Как в шаблоне прописать побитовое чтение Input регистра?

Здравствуйте. Не пойму, как мне в шаблоне устройства прописать побитовое чтение input регистров?
Устройство передает в одном регистре сразу несколько булевых значения:

bit 0: 0 – нет аварии; 1 – авария (код в регистре аварии).
bit 1: 0 – реле канала1 отключено; 1 – реле канала1 включено.
bit 2: 0 – реле канала2 отключено; 1 – реле канала2 включено.
bit 3: 0 – реле канала3 отключено; 1 – реле канала3 включено.
bit 4: 0 – реле канала4 отключено; 1 – реле канала4 включено.
bit 5 – bit 15 зарезервированы
Таким образом, мне необходимо передать в разные каналы модифицированное значение из одного регистра. Как я могу прописать это в шаблоне?

Здравствуйте! Предполагаем, что нужно считать биты из 16-разрядного регистра типа input с адресом 100. Для обращения к части регистра нужно использовать следующий формат записи адреса в шаблоне: “регистр:смещение в битах:ширина в битах”

Для вашего случая в шаблон добавляем следующие каналы:

            {
                "name": "description of bit0",
                "reg_type": "input",
                "address": "100:0:1",
                "type": "value",
                "format": "u16"
            },
            {
                "name": "description of bit1",
                "reg_type": "input",
                "address": "100:1:1",
                "type": "value",
                "format": "u16"
            }

С другими битами по аналогии.
На всякий случай прилагаю ссылки на похожие темы:

Спасибо, работает.

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

1 лайк

Ого. Не знал.

Да, понимаете правильно. Драйвер читает из устройства всегда один регистр (16 бит), а затем сам уже вычисляет нужный бит. Чтение одного бита из регистра holding или input не предусмотрено протоколом Modbus.
Если битов нужно считывать много и часто, то, наверное, будет оптимальным читать 16-разрядный регистр один раз как обычно, а биты выделять уже в правилах:

    bit0 = dev["my_device_47/Uptime"] & 1;			// бит 0
    bit1 = (dev["my_device_47/Uptime"] & 2) >> 1;	// бит 1
    bit01 = dev["my_device_47/Uptime"] & 3;		// биты 1 и 0