Блог

Функциональные блоковые диаграммы (FBD)

Когда нужно быстро запрограммировать контроллер и сделать программу, которую другой инженер поймёт без долгих объяснений, инженеры выбирают FBD. Функциональные блоковые диаграммы – это графический язык программирования, который позволяет описать алгоритм управления как набор связанных между собой блоков.
На экране вы видите не текст, а диаграмму. На диаграмме блоки, на которых написано, что они делают. Между блоками линии, которые показывают, как данные передаются от одного блока к другому. Это очень наглядно.
FBD – один из пяти стандартных языков программирования МЭК 61131-3, и он один из самых популярных. Исследования показывают, что около 52% инженеров используют FBD в повседневной работе. Это больше, чем релейные диаграммы (LD), структурированный текст (ST) и другие языки.

Что такое функциональные блоки

Основной элемент FBD – функциональный блок. Это не просто коробочка на диаграмме. Это фрагмент программы, написанный, скорее всего, на каком-нибудь другом языке (ST, IL, или даже FBD), который выполняет конкретную функцию.
Функциональный блок имеет входы и выходы. На входы приходят данные (числа, логические значения, сигналы). Блок обрабатывает эти данные по своему алгоритму. На выходах получается результат.
Примеры функциональных блоков:
  • Логические операции: AND (И), OR (ИЛИ), NOT (НЕ), XOR (исключающее ИЛИ)
  • Сравнения: больше, меньше, равно
  • Арифметика: сложение, умножение, деление
  • Таймеры: задержка включения, задержка отключения
  • Счётчики: считают событияе, которые происходят
  • ПИД-регулятор: сложный блок для поддержания заданного значения
  • Триггеры: хранят состояние

Как устроена FBD диаграмма

FBD диаграмма – это набор функциональных блоков, соединённых линиями связи. Каждая линия связи представляет переменную. Через эту переменную один блок передаёт данные другому блоку.
Порядок выполнения блоков определяется вами явно. Обычно блоки выполняются слева направо и сверху вниз, но это можно изменить.
Пример: вы хотите вычислить (B × 4) ÷ A и записать результат в переменную result.
На диаграмме FBD это будет выглядеть так:
  • Константа 4 подается на один вход блока умножения
  • Переменная B подается на другой вход
  • Выход умножения подается на блок деления
  • Переменная A подается на делитель
  • Выход деления подается в переменную result
Визуально это понятно. На псевдокоде это было бы: result := B*4/A, но на диаграмме это явно видно.

Преимущества FBD

Наглядность. Графический формат делает программу легче понять. Даже специалист, который раньше не видел эту программу, может быстро разобраться, что она делает.
Простота обучения. Инженеры, которые не имеют специальной подготовки в программировании, могут быстро научиться создавать программы на FBD. Это графический язык, и логика хорошо видна.
Удобство отладки. Когда программа не работает, как надо, нужно найти ошибку. На FBD диаграмме легче отследить, как данные текут через блоки, где они преобразуются, где может возникнуть проблема.
Быстрая трансляция. Код выполняется последовательно, структура команд простая. Программа быстро компилируется, и задача выполняется надёжно.
Использование стандартных блоков. Можно использовать готовые блоки из библиотек. Не нужно писать всё с нуля. Берёшь блок для ПИД-регулирования, подключаешь входы и выходы, и регулятор работает.
Создание собственных блоков. Если готовых блоков недостаточно, можно создать свой блок. Написать его на FBD, ST или другом языке, и потом использовать как стандартный блок.

Недостатки FBD

Сложность сложных алгоритмов. Когда алгоритм управления очень сложный, FBD диаграмма может становиться запутанной. Много блоков, много линий связи. Диаграмма становится нечитаемой.
Ограничение по циклам и условиям. FBD лучше всего работает для прямолинейных потоков данных. Если нужны сложные циклы, вложенные условия, лучше использовать структурированный текст (ST).
Производительность. В некоторых случаях код, написанный на FBD, выполняется медленнее, чем код, написанный на ST или ассемблере. Хотя это редко бывает критичным.

Управляющие входы EN и выходы ENO

В FBD есть специальные входы и выходы для управления выполнением блоков.
EN (Enable) – вход разрешения. Если на этот вход подать логический ноль, блок не будет выполняться. Это полезно, когда нужно условно выполнять операцию.
ENO (Enable Output) – выход разрешения. Если при выполнении блока возникает ошибка (например, деление на ноль), ENO будет равен нулю. Это позволяет прервать выполнение цепи блоков и обработать ошибку.
Пример: если вы делите число на переменную A, и A неожиданно станет равна нулю, вместо того чтобы привести к аварии контроллера, выход ENO сообщит об ошибке, и последующие блоки не будут выполняться.

FBD в CODESYS

CODESYS – одна из самых популярных сред программирования для ПЛК. CODESYS поддерживает FBD, и в нём это очень удобно.
В CODESYS 3.5 вы можете создавать FBD диаграммы с помощью графического редактора. Перетаскиваете блоки из библиотеки на диаграмму, соединяете их линиями, задаёте параметры. Всё делается мышью.
CODESYS содержит большую библиотеку стандартных блоков:
  • Логические операции (AND, OR, NOT, XOR)
  • Арифметические операции (сложение, вычитание, умножение, деление)
  • Таймеры (TON, TOF, TP)
  • Счётчики (CTU, CTD, CTUD)
  • ПИД-регулятор (PID)
  • Функции работы со строками
  • Функции обработки аналоговых сигналов
Для ПЛК СТАБУР от компании Промсвязь CODESYS 3.5 является основной средой программирования. Вы можете запрограммировать СТАБУР на FBD, используя все возможности графического языка.

Разновидности FBD: CFC и FBC

Есть расширения базового стандарта FBD, которые добавляют новые возможности.
CFC (Continuous Function Chart) – расширенная версия FBD. В CFC вы не ограничены строго последовательным порядком выполнения. Вы можете установить порядок выполнения блоков, как вы считаете нужным. Это даёт больше свободы, но код становится более сложным.
FBC – функциональное программирование на основе FBD. В этой разновидности вы можете использовать только чистые функции с одним выходом, без промежуточных переменных. Это более строгий подход, который гарантирует отсутствие побочных эффектов.

FBD против других языков программирования МЭК 61131-3

FBD против LD (Ladder Diagram). LD – это релейно-контактные схемы, привычные электрикам. LD хорош для простых логических операций. Но при усложнении алгоритма LD становится нечитаемым. FBD работает лучше на сложных алгоритмах.
FBD против ST (Structured Text). ST – это текстовый язык, похожий на Паскаль. ST хорош для сложных алгоритмов, циклов, условных операторов. Но ST требует опыта программирования. FBD более наглядна.
FBD против IL (Instruction List). IL – это список инструкций, похожий на ассемблер. IL редко используется сегодня. FBD гораздо удобнее.
FBD против SFC (Sequential Function Chart). SFC – это язык для описания последовательных процессов. SFC хорош, когда нужно описать последовательность этапов. FBD лучше для обработки потоков данных.

Реальный пример: система управления насосом

Представьте, что вам нужно запрограммировать систему управления насосом. Требования:
  1. Насос включается, если нажата кнопка "Старт" И есть сигнал готовности от датчика
  2. Насос отключается, если нажата кнопка "Стоп" ИЛИ прошло 60 минут работы
  3. При отключении насоса срабатывает таймер задержки 5 секунд перед возможностью следующего включения
На FBD это будет выглядеть как:
  • Блок AND с входами "Кнопка Старт" и "Датчик готовности" – выход идёт на триггер
  • Блок NOT от "Кнопки Стоп" – выход идёт на другой вход триггера
  • Таймер на 60 минут – отслеживает время работы
  • Таймер задержки на 5 секунд – блокирует новое включение после отключения
  • Логические операции для объединения сигналов
На диаграмме это видно явно. Как работает система, какие блоки используются, как сигналы распространяются – всё ясно.

Практические советы по написанию FBD

Комментируйте сложные цепи. Если несколько блоков работают вместе в сложной логике, добавьте комментарий, объясняющий, что происходит.
Избегайте деления на ноль. Используйте входы EN и выходы ENO для проверки ошибок. Если делитель может быть нулём, проверьте это перед делением.
Используйте симулятор перед внедрением. CODESYS содержит встроенный симулятор ПЛК. Протестируйте программу на симуляторе прежде, чем загружать её на реальный контроллер.
Давайте понятные имена переменным. Вместо "var1", "var2", используйте "pump_status", "timer_delay". Программу будет легче читать.
Не усложняйте диаграмму. Если диаграмма становится слишком сложной, разделите её на несколько меньших диаграмм. Создавайте собственные блоки для повторяющихся операций.

Заключение

Функциональные блоковые диаграммы (FBD) – это мощный инструмент для программирования промышленных контроллеров. Они наглядны, просты в освоении, удобны в отладке. Для большинства задач управления FBD – это правильный выбор.
FBD особенно хорошо работает в CODESYS 3.5, среде, поддерживаемой ПЛК СТАБУР и многими другими контроллерами. Если вы только начинаете работать с ПЛК или ищете удобный способ описать алгоритм управления, начните с FBD. Вы поймёте, почему это один из самых популярных языков программирования в промышленной автоматизации.