Переменные ========== В любую схему можно добавить локальные переменные (или глобальные). Область видимости этих переменных ограничена текущей схемой. На рисунке показан внешний вид окна локальных переменных. В верхней части находится панель для управления и редактирования переменных: .. figure:: ../../zwb/lib/variable.png :align: center Для создания переменной нажать на кнопку :guilabel:`+`. Переменная будет добавлена в список и откроется Редактор свойств переменной: .. figure:: ../../zwb/lib/variable_property.png :align: center В данном пункте устанавливаются требуемые параметры переменной - название, тип данных, константность, значение по умолчанию, доступность по modbus (права доступа, адрес) сохранение в ПЗУ (адрес в ПЗУ). Название переменной – текстовый идентификатор переменной, который отображается на схеме в блоках чтения и записей переменных. Рекомендуется использовать в именах только латинские символы или цифры. **Тип данных** – тип данных переменной. Выбирается из следующего списка: * Логический; * Беззнаковый целый 1-байт; * Беззнаковый целый 2-байт; * Беззнаковый целый 4-байт; * Знаковый целый 1-байт; * Знаковый целый 2-байт; * Знаковый целый 4-байт; * Дробный 4-байт. **Начальное значение** – начальное значение переменной. **Константа** – этот флаг означает, что переменная является константой. **Запись в ПЗУ** – этот флаг указывает, что переменная должна сохранять свое значение в ПЗУ и восстанавливать его после включения контроллера. Адрес ячейки ПЗУ, по которому сохраняется переменная, устанавливаются в соответствующем списке. **Сетевой доступ** – настройка доступа к переменной по сети. Доступны три варианта этого параметра: * *Нет:* Переменная не доступна по сети; * *Чтение:* Переменная доступна только для чтения по сети; * *Чтение/Запись:* Переменная доступна для чтения и записи по сети. Параметры доступа по сети устанавливаются в соответствующем списке сетевых переменных, который можно открыть для редактирования и просмотра командой в верхней панели окна редактирования переменных. Для фильтрации переменных по параметру нужно выделить ячейку таблицы, и нажать на кнопку. На таблицу будет наложен фильтр с текущим значением, которое было в выделенной ячейки. Например, если выбрать ячейку таблицы Modbus, в которой стоит отмеченный флажок, то при фильтрации будут отображаться только те переменные, у которых стоит флаг доступа по Modbus. Фильтр может использоваться многократно (с наложением). Для удаления фильтров необходимо нажать кнопку "Удалить фильтр" Для удаления переменной используется кнопка :guilabel:`delete` на клавиатуре или команда ``Удалить``. Для использования переменной в проекте нужно на схеме поместить блок работы с переменной. Для этого нужно перетащить переменную левой кнопкой мыши в окно схемы. **Блок чтения переменной:** .. figure:: ../../zwb/lib/var_read.png :align: center **Блок записи переменной:** .. figure:: ../../zwb/lib/var_write.png :align: center **Блок условной записи переменной:** .. figure:: ../../zwb/lib/var_write1.png :align: center **Блок записи переменной по Modbus:** .. figure:: ../../zwb/lib/var_modbus.png :align: center По умолчанию создается блок :guilabel:`Чтения` переменной. В любой момент можно изменить привязку блока на другую переменную, выбрав нужную из списка. Существует четыре вида блоков переменной: * **Чтение** – значение переменной считывается; * **Запись** – значение, поданное на вход блока, записывается в переменную; * **Условная запись** - значение, поданное на вход блока, записывается в переменную, если на входе ``en`` установлена **1**; * **Запись по Modbus** - этот блок позволяет, в режиме подчиненного устройства Modbus, обработать команду записи, полученную от главного. На выходе ``val`` появляется (на время одного цикла) значение, полученное в команде записи, а на выходе ``rdy`` - признак получения команды записи. При отсутствии команды на этих выходах всегда присутствует **0**. Значения выходов блока зависят только от главного устройства! Для записи пришедшего значения необходимо осуществить преобразования как на рисунке внизу. Т.е. по сути, это та же условная запись переменной. **Блок записи по Modbus:** .. figure:: ../../zwb/lib/variable_modbus.png :align: center **Примечание:** блок :guilabel:`Запись Modbus` выполняет сначала обработку выходов, затем, в конце шага схемы – обработку входов, т. е. производит обработку своих входов с задержкой на один цикл. **По сути, это та же условная запись переменной. Но!** Данный блок объединяет в себе три операции: **блок чтения** (если выход VAL получает значение в режиме подчиненного устройства Modbus, то на выходе RDY устанавливается логическое значение 1, признак получения команды записи), **блок условной записи** (на вход VAL записывается обработанное значение, при условии, что вход EN получил логическое значение 1) и **блок вывода ошибки** ER. Обработка значения переменной выполняется согласно поставленной задаче. **Пример:** записать в переменную VAR4 значение X, если на выход VAL получено X < 20. Во-первых, сравниваем X с числом 20 (блок сравнения), во-вторых, чтобы запись значения произошла, нужно, чтобы на входе EN была установлена 1. Для этого выход блока сравнения и выход RDY объединим блоком AND, а выход блока AND соединим со входом EN, значение на выходе VAL соединим со входом VAL: .. figure:: ../../zwb/lib/modbus6.png :align: center Итак, если два условия истинны, то в переменную VAR4 будет записано значение, полученное на выходе VAL. Но есть еще блок вывода ошибки ER. Если значение, поданное на выход VAL не удовлетворяет условию блока сравнения, то на выходе блока AND установится 0, и вход EN получит 0, а вход ER должен выдать номер ошибки, почему не произведена запись в переменную. Ошибка 03 – неверные данные запроса: .. figure:: ../../zwb/lib/modbus7.png :align: center При получении на вход IF 1 блок Условие подаст на вход ER 0, в противном случае вход ER получит номер ошибки3. Внимание! Не следует путать значение, полученное в команде записи, со значением переменной! Выход «val» не выдает значение переменной. Изменить тип блока, если к нему подключена хоть одна связь невозможно. Если переменную перетащить на ножку блока или макроса, то связь образуется автоматически и блок принимает нужны тип, в зависимости от того, на вход или выход перетаскивали переменную. Еще одной важной особенностью блоков записи в переменную является приоритет записи, устанавливаемый в свойствах блока. Данное свойство позволяет писать значения в одну и ту же переменную при разных условиях и из разных мест в программе. Чем выше значение, тем выше приоритет, т.е. блок записи с приоритетом 100 имеет больший приоритет записи в переменную чем блок записи со значением 10. Это значит, что если одновременно придет сигнал записи новых значений в данные блоки, то в переменную запишется значение из блока записи с приоритетом 100.