Общий принцип работы

FBD-программа - это программа для контроллера, создаваемая в FBD-редакторе.Программа, написанная на языке FBD представляет собой выражение, составленное графически из отдельных элементов. К выходу блока подключается следующий блок, образуя цепь. Внутри цепи блоки выполняются строго в порядке их соединения. Результат вычисления цепи записывается во внутреннюю переменную, либо подается на выход ПЛК.

Программа, написанная на языке FBD представляет собой выражение, составленное графически из отдельных элементов. К выходу блока подключается следующий блок, образуя цепь. Внутри цепи блоки выполняются строго в порядке их соединения. Результат вычисления цепи записывается во внутреннюю переменную, либо подается на выход ПЛК.

Пример программы в Редакторе:

_images/zetFBD_1_1.png

Пример программы: значение переменной Var1 умножить на значение переменной Var2; к произведению прибавить значение переменной Var3; полученный результат записать в переменную result.

Основные функции редактора

Редактор в zWorkbench предоставляет разработчику FBD программ обширный набор библиотек, инструментов и интерактивных систем, которые в совокупности обеспечивают выполнение следующих функций:

  1. Визуальное проектирование программы для контроллеров Zentec:
    • выбор и установка на сцену функциональных блоков;

    • изменение свойств блоков и свойств входов-выходов;

    • трассировка связей между блоками;

    • ручное и автоматическое распределение переменных в памяти контроллера;

    • рисование на поле программы примитивов (эллипс, линия, прямоугольник);

    • вставка текстовых комментариев.

  2. Симуляция и отладка FBD программы:
    • проверка программы на содержание ошибок с выдачей результатов проверки в окно Сообщения;

    • симуляция на ПК без подключенного контроллера;

    • отладка сетей, виртуализация реальных сетей с неограниченным количеством узлов;

    • смешанная отладка - подключение к симулятору реальных приборов, реальных и виртуальных сетей в любых сочетаниях;

    • отладка в симуляторе и контроллере по шагам;

    • отладка в симуляторе и контроллере по точкам остановки и событиям;

    • установка констант на входы блоков «на лету».

  3. Поиск и диагностика:
    • поиск и подключение к сети контроллеров, даже при наличие мастера сети;

    • остановка мастера сети и подключение к нему;

    • идентификация контроллера: номер в сети, модель контроллера, версия программного обеспечения контроллера;

    • обновление и восстановление программного обеспечения контроллера.

  4. Сервисные функции:
    • копирование, вставка, отмена/повтор действий, масштабирование сцены;

    • навигатор проекта;

    • проектирование штампов и рамок, их вставка в печатные формы, автоматическая нумерация листов проекта;

    • печать всего проекта или его части;

    • создание цветовых схем;

    • отладка и проектирование в многооконном режиме;

    • экспорт переменных в XML формат.

Порядок выполнения блоков

Программа, создаваемая пользователем, представляет собой набор схем. В самом простом случае это одна схема. Схема указывает, каким образом выходы устройства зависят от внешних и внутренних данных. Каждая схема состоит из блоков и связей между блоками, а также имеет набор переменных величин, читаемых и записываемых схемой. Блоки выполняют функции взаимодействия между своими входами и выходами: от элементарных логических И, ИЛИ, НЕ до очень сложных. Некоторые виды блоков, кроме вычисления значений выходов, выполняют специальные задачи, например, блок Запись в переменную изменяет значение переменной, присваивая ей значение, полученное на входе. Выполнение блоков происходит последовательно, в порядке следования связей от выходов к входам, т.е. любой блок получает на входы обновленные значения, предварительно рассчитанные соответствующими блоками.

От визуального расположения блоков на схеме их выполнение не зависит, т.е. пользователь может располагать блоки так, как ему удобнее их видеть:

_images/zetFBD_2_1.png

Диаграмма 1 и Диаграмма 2 будут исполняться абсолютно одинаково:

  • сначала будет обработан Счетчик;

  • затем Детектор фронта;

  • и последним будет обработан RS триггер.

Циклические связи

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

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

На диаграмме 1 показана циклическая связь:

_images/zetFBD_4_1.png

Такие связи недопустимы.

Правило запрета циклических связей имеет исключение: есть блоки (например, Счетчики), внутри которых выходы не имеют прямой связи с входами. Такие блоки, если они включены в циклическую связь, разрывают ее внутри себя, поэтому такая связь разрешена:

_images/zetFBD_4_2.png

На Диаграмме 1 и 2 показаны блоки с псевдоциклическими связями.

Главный цикл, статическая и временная память

Шаги схемы выполняются в бесконечном цикле – главном цикле программы устройства.

Данные от последних (в последовательности выполнения) блоков могут быть прочитаны первыми блоками, если эти данные будут записаны в переменные схемы. Переменные, создаваемые пользователем, и специальные переменные устройства являются памятью, хранимой в течение всего времени работы устройства. Далее эту память будем называть «статической».

Для значений входов и выходов блоков, память устройства выделяется и освобождается по мере необходимости, - это «временная» память. Выполнение схемы в целом с точки зрения внешних систем является неделимым шагом, т.е. невозможно прочитать из устройства или увидеть на его выходах данные, обновленные частично. Если какие-либо блоки прерывают выполнение схемы, это прерывание гарантированно выполняется до записи в статическую память.

Операции обновления значений физических входов-выходов устройства и обмена данными по каналам связи выполняются между шагами выполнения схемы:

_images/zetFBD_5_1.png

На Диаграмме 1 показан полный цикл исполнения программы на примере кнопки-защелки: каждое нажатие кнопки DIN1 меняет состояние выхода DOUT1. Блоки пронумерованы в порядке их исполнения.

Рассмотрим полный цикл работы примера по шагам:

  • опрос состояния DIN1. Передача результата с выхода DIN1 на вход D блока Raise;

  • операция в блоке Raise. Передача результата с выхода F на вход C блока D-trigger. Так же чтение блока D (переменная). Передача результата с выхода блока D на вход D блока D-trigger;

  • операция в блоке D-trigger. Чтение выходов Q и ~Q;

  • запись результата в блок DOUT1 и переменную D.

Таким образом, переменная D «разрывает» циклическую связь.

Если рассмотреть пошаговую работу схемы в симуляторе, то при «включении питания» (начало симуляции) в первом шаге в переменной D записано значение 0:

_images/zetFBD_5_2.png

Во втором шаге значение переменной меняется:

_images/zetFBD_5_3.png

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

Цикл программы и Базовый таймер

Шаги схемы выполняются гарантированно, т.е. значения выходов гарантированно поступают на соответствующие входы; блоки гарантированно выполняют расчеты. В отличие от электронных схем, где каждый элемент имеет временные задержки в работе и может пропустить значения входов, схема FBD работает в общем дискретном времени, где каждый шаг полного расчета схемы соответствует одной единице дискретного времени. А каждая единица дискретного времени схемы соответствует какому-то интервалу физического времени.

Длительность этого интервала зависит только от скорости работы устройства, настройка такого соотношения в системе Редактора отсутствует. Устройство выполняет шаги с максимально возможной скоростью.

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

Гарантия срабатывания блоков в каждом шаге позволяет использовать следующую особенность: многие логические значения выходов, сигнализирующие о возникновении события, работают по принципу «одиночного срабатывания». Это значит, что такой выход выдает 0 в течение большинства шагов выполнения схемы. Только при возникновении события он выдает 1, в течение только одного шага выполнения схемы, а на следующих шагах снова выдается 0. Такая одиночная 1 только в течение одного шага (в течение одной единицы дискретного времени) обязательно будет обработана соответствующими блоками. Само собой разумеется, что если такой выход подключить к физическому дискретному выходу устройства – он будет включаться на время 1 шага схемы, который может длиться от 100 мксек до 1000 мсек, что неправильно, т.к. внешние системы не должны быть зависимы от времени выполнения шага устройства. Поведение таких выходов удобно тем, что для них передний фронт и уровень – одно и то же, при необходимости иметь передний фронт можно просто использовать этот выход, без анализа фронта.

Для синхронизации с реальным временем используется блок Таймер, работа которого определяется Базовым таймером системы. Любое количество блоков Таймер используют один аппаратный Базовый таймер устройства, настраиваемый на определенный постоянный интервал срабатывания. Базовый таймер - это интервал времени, за который гарантированно успевает выполниться вся программа контроллера без учета оптимизации.

Важно понимать:

  • цикл системы всегда динамический. Система внутренней оптимизации будет стремиться выполнить программу за минимальное время;

  • базовый таймер задает интервал времени, которому кратны все пользовательские таймеры;

  • если время динамического цикла выполнения программы будет больше времени базового таймера, то устройство выдаст ошибку.

Работа системы внутренней оптимизации

Работа системы внутренней оптимизации основана на динамическом предоставлении ресурсов для выполнения задачи.

Следующий пример поясняет работу этой системы.

Например, необходимо однократно считать данные из подчиненного устройства.

На Диаграмме 1 представлена реализация этой задачи:

_images/zetFBD_7_1.png

Блок чтения сетевой переменной 0h производит чтение, так как локальная переменная rdy имеет значение по умолчанию 1. После успешного чтения на выходе rdy блока чтения появляется уровень лог. 1, который записывает в локальную переменную rdy уровень лог. 0 (константу 0 на входе переменной). В следующем цикле переменная rdy запрещает работу блока чтения переменной 0h. Это состояние будет до следующего включения питания контроллера.

Очевидно, что данный пример работает несколько циклов после включения питания, а далее состояние блоков не меняется вплоть до сброса питания контроллера. Система внутренней оптимизации анализирует состояние входов и выходов этой программы и, после считывания переменной 0h исключает всю цепь из цикла программы. Остается только значение переменной SET, которое было получено при считывании переменной 0h.

Типы данных. Преобразование данных

Пользователю предоставляется возможность оперировать со следующими типами данных:

Тип данных

Размер, бит

min

значение

max

значение

Цветовая маркировка

по-умолчанию

1

Логический (bool)

1

0

1

красный

2

Без знака целый 1 байт (Uint8)

8

0

255

синий

3

Без знака целый 2 байт (Uint16)

16

0

65535

синий

4

Без знака целый 4 байт (Uint32)

32

0

4294967295

синий

5

Со знаком целый 1 байт (Sint8)

8

-128

+127

зеленый

6

Со знаком целый 2 байт (Sint16)

16

-32768

+32767

зеленый

7

Со знаком целый 4 байт (Sint32)

32

-2147483648

+2147483647

зеленый

8

Дробный 4 байт (float)

32

любое рациональное число

желтый

Типы данных выбираются в свойствах блоков, входов/выходов макросов и переменных:

_images/zetFBD_8_2.png

Редактор в zWorkbench преследует цель достижения однозначности поведения устройства при любых входных данных. Для определенности значений входов, связанных с выходами, имеющими отличный тип данных, имеется требование: тип данных выхода должен быть подмножеством типа данных входа. Если для какой-либо связи это требование является ненужным или недостижимым – пользователь должен вставить блок Преобразование данных в разрыв этой связи. Вход этого блока принимает данные любого типа. Опции этого блока позволяют определить его поведение при наличии значения, не попадающего во множество значений требуемого типа данных. Блоки, значения выходов у которых могут выходить за диапазон значений типа данных (переполнение при математических операциях), имеют опции, определяющие их поведение:

_images/zetFBD_8_3.png

Макросы

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

В таком случае в проекте имеется несколько схем, одна из которых является главной. Главная схема выполняется, выполняя другие (макросные) схемы при наличии в главной схеме соответствующих (макросных) блоков, ссылающихся на макросные схемы. Макросные схемы также могут содержать макросные блоки, т.е. макросы могут быть вложены. Однако вложение схемы в саму себя (рекурсия), прямая или косвенная, не допускается. Макросная схема также может содержать переменные, хранимые постоянно (постоянную память макроса). Если макросная схема использована в проекте неоднократно (имеется несколько блоков, использующих ее), каждый макросный блок имеет независимый от других блоков набор переменных. Логика работы устройства не изменится, если какие-либо блоки схемы перенести в макросную схему, и заменить их в главной схеме на макросный блок, или наоборот – заменить макросный блок на блоки, содержащиеся в макросной схеме. От такой замены может незначительно измениться только скорость работы схемы и количество использованной памяти устройства, из-за различно выполняемой оптимизации схемы.

Работа с постоянной памятью контроллера (ППЗУ)

Все переменные проекта располагаются в области оперативной памяти (ОЗУ) и имеют свойство Сохранение в ПЗУ. Физически, при активном свойстве, данные из ОЗУ копируется (записывается) в ПЗУ.

Запись переменных в энергонезависимую память выполняется устройством между шагами расчета схемы. Если переменная в ОЗУ изменяется с высокой частотой, а устройство будет производить запись безусловно, то из-за ограниченного количества циклов перезаписи, ППЗУ будет испорчено через некоторое время работы.

Такая проблема решается следующим образом – пользователь должен установить на схему блок Запись переменных и подать на его вход признак необходимости записи. Его можно формировать либо по таймеру, либо по событию изменения переменной (если переменная изменяется не часто), или по другому событию:

_images/zetFBD_10_1.png

На данной диаграмме показан способ записи значения из ОЗУ в ПЗУ. Когда в переменную Set_temp мастер сети произведет запись, на выходе rdy появится фронт, который будет подан на вход en блока EEPROM. Этот сигнал произведет инициализацию записи всей памяти устройства.

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

Перед записью переменной ее значение считывается из ППЗУ, запись выполняется только при неравенстве значений в ОЗУ и ППЗУ.