Блоки обработки переменных -------------------------- .. contents:: Содержание: Для хранения данных между "шагами" программы используются переменные величины, или просто переменные. Переменная постоянно занимает в памяти устройства требуемый объем памяти, который задается пользователем. Для обмена данными с переменными имеются соответствующие блоки. Этих блоков нет в окне :guilabel:`Блоки`, для их создания на сцене программы необходимо перетащить соответствующую переменную в Вашу схему. Созданный блок имеет те же параметры, что были заданы при создании переменной. При перетаскивании пользовательской переменной на сцену, тип блока зависит от точки, в которую перетаскивается переменная и где отпущена кнопка мыши. Если это место – вход блока: создается блок чтения, связанный с этим входом. Если эта точка – выход блока: создается блок записи, связанный с этим выходом. Иначе – создается несвязанный блок чтения. Переменные, создаваемые пользователем, могут быть считаны и записаны произвольным образом. Однако, каждое устройство имеет специальные переменные, например, переменные, связанные с физическими входами-выходами устройства. Специальные переменные могут иметь ограничения, например, может быть разрешено только чтение или только запись. Блоки чтения-записи специальных переменных устройства имеют несколько иной внешний вид, но логика работы таких блоков полностью совпадает с блоками чтения-записи пользовательских переменных. Свойства блока переменной ^^^^^^^^^^^^^^^^^^^^^^^^^ **Общие свойства:** Редактирование свойств блока. **Тип:** в этом пункте осуществляет выбор типа блока, работающего с переменной (чтение, запись, условная запись, запись MODBUS). **Чтение после записи:** значение выхода блока чтения, также как и любого другого выхода, фиксировано на каждом шаге выполнения программы в зависимости от свойства ``Чтение после записи``: если флаг не установлен (по умолчанию) - блок чтения выполняется гарантированно до блоков записи соответствующей переменной. В таком случае значение, записанное в переменную условно на первом шаге, будет прочитано блоком чтения на втором шаге выполнения схемы. Если флаг ``Чтение после записи`` установлен - блок чтения выполняется гарантированно после блоков записи соответствующей переменной. **Приоритет записи:** данный параметр задает приоритет записи при возникновении спорных ситуаций. **Переменная:** в данной графе осуществлена возможность выбора или изменения переменной, с которой будет работать созданный блок. Блок чтения переменной ^^^^^^^^^^^^^^^^^^^^^^ .. figure:: ../../zwb/lib/fbd_var_READ.png :align: center **Описание:** считывает значение переменной, выдает значение на выход. Количество блоков чтения одной переменной не ограничено, при этом значения всех блоков чтения с одинаковыми свойствами одинаковы. Блок записи переменной ^^^^^^^^^^^^^^^^^^^^^^ .. figure:: ../../zwb/lib/fbd_var_WRITE.png :align: center **Описание:** записывает значение в переменную, поданное на вход. Для каждой переменной в проекте может быть только один блок записи, в противном случае появляется неопределенность, какое значение требуется записать. Если необходимо записывать значение одного из нескольких выходов, следует использовать блок :guilabel:`Условие` или :guilabel:`Мультиплексор` для явного выбора требуемого значения. Блоки записи переменных выполняются гарантированно после блоков чтения соответствующей переменной и после блоков, которые могут прервать шаг программы. Блоки записи не выполняются при отладке схемы в устройстве, в режиме паузы. Блок записи может быть условным, при наличии дополнительно входа ``en``. Такой блок записи выполняется, если значение входа ``en`` равно 1. По умолчанию вход ``en`` равен 1: .. figure:: ../../zwb/lib/fbd_var_IFWRITE.png :align: center Блок "Запись Modbus" ^^^^^^^^^^^^^^^^^^^^ **Описание:** этот блок позволяет, в режиме подчиненного устройства Modbus, обработать команду записи, полученную от главного устройства. Выходы ``val`` и ``rdy`` выдают значение, полученное от master-устройства, и признак окончания передачи нового значения, соответственно. При отсутствии команды записи от "главного", эти выходы выдают 0. Значения выходов блока зависят только от главного устройства, выходы можно связывать с входами того же блока (циклическая связь разрывается внутри блока). Этот блок выполняет сначала обработку выходов, затем, в конце шага схемы – обработку входов. Внимание! Не следует путать значение, полученное в команде записи, со значением переменной! Выход ``val`` не выдает значение переменной. Входы ``val`` и ``en`` обрабатываются независимо от других входов-выходов блока, являясь фактически отдельным блоком условной записи. Как уже было сказано выше, блок записи выполняется в конце шага схемы, эти входы можно связать с выходами ``val`` и ``rdy`` соответственно. При таком связывании значение, поданное на вход ``val`` c одноименного выхода, будет записано как только такая команда будет получена с выхода ``rdy`` и передана на вход ``en``: .. figure:: ../../zwb/lib/block1.png :align: center По сути, это та же условная запись переменной. Но данный блок объединяет в себе три операции: блок :guilabel:`Чтения` (если выход ``val`` получает значение в режиме подчиненного устройства Modbus, то на выходе ``rdy`` устанавливается логическое значение 1, признак получения команды записи), блок :guilabel:`Условной записи` (на вход ``val`` записывается обработанное значение, при условии, что вход ``en`` получил логическое значение 1) и блок :guilabel:`Вывода ошибки` ``err``. Обработка значения переменной выполняется согласно поставленной задаче. **Пример:** записать в переменную :guilabel:`VAR4` значение X, если на выход ``val`` получено X < 20. Во-первых, сравниваем X с числом 20 (:guilabel:`Блок сравнения`), во-вторых, чтобы запись значения произошла, нужно, чтобы на входе ``en`` была установлена 1. Для этого выход :guilabel:`Блока сравнения` и выход ``rdy`` объединим блоком :guilabel:`AND`, а выход блока :guilabel:`AND` соединим со входом ``en``, значение на выходе ``val`` соединим со входом ``val``. Итак, если два условия истинны, то в переменную :guilabel:`VAR4` будет записано значение, полученное на выходе ``val``: .. figure:: ../../zwb/lib/zapispomodbus2.png :align: center Но есть еще блок :guilabel:`вывода ошибки` ``err``. Если значение, поданное на выход ``val`` не удовлетворяет условию блока :guilabel:`сравнения`, то на выходе блока :guilabel:`AND` установится 0, и вход ``en`` получит 0, а вход ``err`` должен выдать номер ошибки, почему не произведена запись в переменную. Ошибка 03 – неверные данные запроса. При получении на вход ``if`` 1 блок :guilabel:`Условие` подаст на вход ``er`` 0, в противном случае вход ``err`` получит номер ошибки 3. **Использовать различные способы записи переменных при разных условиях задачи.** #. Просто записать значение в переменную; #. Условная запись. Если на вход ``en`` подана 1, то запись произойдет. #. Запись по MODBUS. Если полученное значение предварительно требуется обработать (сравнить, изменить, проверить на соответствие каким-то условиям): .. figure:: ../../zwb/lib/zapispomodbus3.png :align: center Переменные, имеющие возможность **записи по сети**, всегда имеют на схеме блок :guilabel:`Запись Modbus`. Если пользователь его не создал, он создается неявно, как указано на рисунке. Блок с таким связыванием выполняет безусловную запись полученного значения от главного устройства в переменную. Если пользователь хочет проверить записываемое значение на корректность, заменить его или совсем не выполнять запись при каких-либо условиях, он должен вместо указанных связей создать цепь блоков, проверяющую и заменяющую значения требуемым образом. Вход ``err`` предназначен для возврата главному устройству кода ошибки в ответ на команду записи. Этот вход имеет уникальную особенность – если команда записи имеется (выход ``rdy`` равен 1) и на вход подано ненулевое значение, устройство прекращает выполнять шаг схемы. Обработка входа ``err`` всегда выполняется до всех блоков записи в переменные, и переменной этого блока, в том числе. Поэтому команда записи, в таком случае, не выполняется. Т.к. входы ``val`` и ``en`` записывают значение в переменную, этот блок записи может быть только один на сцене, и не может быть других, в том числе обычных, блоков записи той же переменной.