Распаковка битовой маски
В качестве примера рассмотрим распаковку тега "Слово состояние" в области Holding Registers, с предварительно настроенным драйвером Modbus. Тег принимает число, а внутри системы раскладывается на отдельные биты. Для получения значения и передачи его из системы, помимо функции чтения в свойствах, cледует указать также и запись. В настройках тега для драйвера Modbus подойдет тип данных UInt16— это двухбайтовый регистр, из которого для выполнения примера понадобится только один байт.

После настройки источника тег необходимо добавить в список активных.

Далее перейдите в "Редактор мнемосхем", создайте новую мнемосхему и перетащите в область редактирования "Логический индикатор 2" из "Общей галереи". Затем нажмите правой кнопкой мыши на индикаторе, чтобы отредактировать его для работы с битовыми состояниями.

В первую очередь в режиме редактирования "Редактора фигур" вызовите "Редактор аргументов" в меню Фигура > Аргументы. В окне создайте новый аргумент "Номер бита".

Для аргумента "Номер бита" установите флаг "Видимость в свойствах", чтобы иметь возможность указывать номер бита для элемента на мнемосхеме. Затем отключите флаг "Видимость в привязках" и укажите тип значения Integer. Для аргумента "Переменная" укажите "Тип значения" Number. Далее закройте окно, нажав "Ок".

Далее настройте привязки в меню Фигура > Привязки. Отредактируйте выражения в двух привязках. Цели рекомендуется оставить без изменений. В выражении будем использовать функцию getBit, которая позволяет извлекать состояние конкретного бита из значения тега. Функция принимает два аргумента (значение, номер бита) типа number.
Примечание
В данном примере аргумент "Номер бита", который будет передан в функцию getBit, имеет тип Integer. Это сделано для того, чтобы при указании номера бита в свойствах значение не содержало запятую. Функция автоматически выполнит преобразование типов, и ошибки компиляции не возникнет.

Примечание
Для индикаторов, представленных в общей галерее, используются различные выражения. В частности, для "Логического индикатора 2" доработанное выражение при работе с битовыми состояниями можно трактовать следущим образом: если переменная не привязана, результатом будет значение 1. В противном случае из значения привязанной переменной извлекается состояние бита, указанное в свойствах фигуры.
Перед сохранением нажмите кнопку "Проверить" и убедитесь, что в выражении нет ошибок.

Для второй привязки выполните аналогичные действия. Результат редактирования выражений можно проверить в пояснительном тексте рядом с самой привязкой. После этого выйдите из режима редактирования фигуры, нажав "Ок" во всех редакторах.

После нажатия кнопки "Ок" в редакторе фигур в окне с предложением нажмите "Да."

Далее выполните привязку фигуры к активному тегу проекта и размножьте индикатор. Их должно быть 8, как в количтво бит в байте. Для каждого индикатора укажите "Номер бита" в свойствах. Справа налево для первого индикатора — 0 бит, для второго — 1 бит и т.д. После этого убедитесь, что к каждому выполнена привязка к тегу "Слово состояние" и указан номер бита в свойствах.


Разверните проект на сервере. В любой удобном клиенте, при помощи стороннего эмулятора, передайте в систему любое число в диапазоне 0-255. В зависимости от значения тега на мнемосхеме будет подсвечиваться соответствующий индикатор или несколько индикаторов. Для удобства на мнемосхеме можно расположить любой текстовый индикатор из общей галереи и привязать к нему тег проекта "Слово состояние" с актуальным значением.

Для проверки можно использовать калькулятор в режиме программиста. Укажите число и сравните комбинацию включенных и выключенных битов справа налево.

Для того чтобы появилась возможность передавать битовую маску с мнемосхемы, перетащите из галереи в область редактирования ползунковый переключатель и отредактируйте его в редакторе фигур.

В редакторе аргументов понадобится добавить новый аргумент "Номер бита". Установить флаг видимости в свойствах. Также, аналогично битовому индикатору для тега "Переменная", укажите тип Number, чтобы обеспечить соответствие типов передаваемых данных функции.
При необходимости перемещение аргументов в списке можно выполнитьс помощью кнопок ▲ и ▼ на панели инструментов.


Далее создайте новую привязку и отредактируйте для неё выражение и цель.

В выражении укажите:
Функция setBit установит значение бита. В данном выражении она принимает исходную переменную, номер бита и новое инвертированное значение, которое было получено функцией getBit.
Для цели укажите:
- Цель — Кнопка.
- Свойство — ActionProps.Value (значение записываемое в тег при нажатии).
Далее отредактируйте выражения первых двух привязок. Это необходимо, чтобы переключатель мог не только записывать состояние бита, но и считывать его. Цели рекомендуется оставить без изменений.


Далее выйдите из редактора привязок и редактора фигур, нажав кнопку "Ок" для сохранения изменений. Привяжите к каждому преключателю тег "Слово состояние", сделайте дубликаты и для каждого укажите номер бита начиная с 0. Разверните проект на сервере и откройте клиент. Теперь появилась возможность включать и отключать каждый бит активного тега. Если включить бит 4, бит 5 и бит 6, то тег примет значение 112.

Проверить соответствие можно в калькуляторе в режиме программиста, включая, либо выключая соответствующий бит.
