СТАБУР
Технология· 9 мин чтения

FBD: сигнал пропадает между блоками в одной сети - EN, ENO и порядок

Почему в FBD в одной сети пропадает сигнал между блоками: EN, ENO, порядок исполнения, первый scan и пошаговая отладка online в CODESYS.

В одной FBD-сети выход TON в online показывает ET = 5 s, а вход AND ниже по проводу - ноль, хотё визуально линия соединена. Или после cold start первые три цикла всё работает, потом MOVE перестаёт копировать, хотя EN на блоке вроде true. В ST тот же алгоритм живой - значит, дело не в физике, а в том, как FBD исполняет EN, ENO и порядок вычислений в сети.

FBD (Function Block Diagram) в CODESYS по IEC 61131-3 выглядит как «провода = железо», но runtime идёт по правилам блоков: нет EN - блок не считается; EN есть, ENO false - downstream может не получить «разрешение»; параллельные ветки и порядок top-to-left могут дать один цикл задержки. Статья разбирает, почему сигнал «пропадает между блоками» в одной сети. Не повторяем общий обзор FBD и не путаем с retain после cold start - отдельные темы.

Короткий ответ

В FBD сигнал между блоками пропадает, если upstream блок не исполняется (EN = FALSE или не подключён - по умолчанию TRUE только где так задано), если ENO = FALSE и downstream завязан на цепочку ENO, если тип/размер выхода не совпадает с входом (online показывает 0 или старое), или если порядок исполнения в сети такой, что downstream читается до пересчёта upstream в том же цикле. Проверьте: подключён ли EN на каждом блоке; не разорвана ли цепь ENO; нет ли параллельной ветки, обнуляющей вход; в online - force на EN/ENO и значения между блоками в одном scan. Отличие от retain: retain теряется после power off; EN/ENO - каждый цикл.

EN и ENO: что runtime реально делает

EN (Enable) - разрешение выполнения блока. EN = FALSE: блок не вызывается, выходы могут удерживать старое значение или обнуляться - зависит от блока и настройки (в CODESYS для многих FB при EN FALSE выходы freeze).

ENO (Enable Out) - «выполнение успешно, передай дальше». Для блоков с ENO downstream блоки, подключённые по цепочке ENO, могут не выполняться, если ENO FALSE (ошибка деления, переполнение в некоторых FB).

Если EN не подключён, в CODESYS часто трактуется как постоянный TRUE - но не для всех POU и не после миграции проекта. Явно подавайте EN от TRUE или от условия.

Типовая ошибка: TON с EN от Start, AND подключён только к Q, но второй вход AND сидел на ENO TON, а не на Q. Пока TON не активен, ENO false - AND молчит.

Одна сеть, «живой» провод, мёртвый сигнал

Симптом: линия на диаграмме есть, online значение на входе следующего блока 0.

Причины:

Upstream EN false в этом scan (кнопка, interlock, первый scan pulse).

Upstream не вызывался из-за разрыва ENO-цепи выше по сети.

Выход BOOL, вход INT - неявное преобразование даёт 0 без ошибки компиляции в некоторых случаях.

Подключение к инverted pin или к NOT без заметности на масштабе сети.

Несколько writer на один вход - последний по порядку побеждает, остальные «пропадают».

Откройте online, включите Show EN/ENO если доступно, поставьте watch на промежуточные выходы в том же POU.

Порядок исполнения в сети FBD

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

Feedback loop через RS или SR без задержки на один scan - осцилляция или «залипание» - путают с пропаданием сигнала.

Решение: вставить буфер (MOVE через промежуточную VAR), разнести на две сети с явным порядком, или перенести критичную логику в ST внутри того же POU.

Параллельные ветки: две цепочки AND сходятся в OR - одна ветка EN false не должна обнулять другую, но если OR вход подключён только к одной ветке по ошибке - второй сигнал «пропал».

Первый scan и EN

После перехода Stop → Run FirstScan один цикл TRUE - часто используют для инициализации. Если Init держит EN основной цепочки FALSE первый цикл, downstream видит ноль - норма, если не рассчитали на задержку.

Cold start vs warm: retain переменные восстанавливаются, EN-логика может стартовать иначе, чем в симуляторе без power cycle.

Не путать с retain и cold start для FBD-блоков - там память FB; здесь - разрешение на вычисление.

Блоки без ENO и с ENO

Стандартные AND, OR, ADD в CODESYS могут не иметь видимых EN/ENO на диаграмме - они всё равно вставлены в цепочку исполнения сети.

Функции с ENO (DIV, некоторые библиотечные FB): при делении на ноль ENO false - всё downstream «отваливается» на этот scan.

MUX, SEL: при неверном индексе выход может быть 0 или hold - похоже на «пропал сигнал».

Проверьте библиотечные FB из vendor pack - у них EN/ENO обязательны, в отличие от встроенных.

FBD vs LD latch: не смешивать симптомы

В LD «залипла» катушка после аварии - latch/set-reset, приоритет сетей. В FBD похожий эффект даёт RS/SR с неправильным приоритетом или TON с IN false, а Q ещё true один scan - оператор думает, что «сигнал пропал между блоками», а Q просто ещё не сброшен.

Если reset идёт в R вход RS, а S всё ещё true от interlock - сброс не виден downstream.

Отладка online за 10 минут

Остановите механизмы, безопасный режим. Online в тот же POU, одна проблемная сеть. Watch: EN каждого блока, ENO где есть, входы/выходы на «пропавшем» проводе. Сравните два scan подряд - меняется ли upstream выход. Временно подайте TRUE на EN подозрительного блока - если downstream ожил, проблема в условии EN, не в проводе. Проверьте типы на hover. Если помогло - ищите первопричину условия, не оставляйте force на объекте.

Документируйте: номер сети, блок, был ли ENO false из-за math error.

Связь со ST в одном POU

Mixed language: FBD-сеть и ST-body в одном FB. Переменные общие, но порядок - сначала сети FBD по номеру, потом ST (зависит от настроек POU). ST может перезаписать то, что FBD «положил» на VAR в конце цикла - симптом «между блоками OK, на выходе POU ноль».

Явно разделите: FBD только логика, ST только расчёт - или всё в одном языке для критичного участка. Обзор языков - в материале про LD и релейную логику; базовый обзор FBD - функциональные блоковые диаграммы.

TON, TOF, TP и «пропавший» Q

Таймеры - частый источник путаницы. TON: пока IN false, Q false, ET может сбрасываться - downstream, подключённый к Q, видит ноль, хотя IN «мигнул». TOF: Q держится после падения IN - кажется, что «сигнал пропал раньше времени» на следующем блоке, если его подключили к IN, а не к Q.

TP (pulse): один scan импульса легко пропустить в online без trace. Для цепочек interlock используйте явный Q таймера, не ENO, если ENO на вашей библиотеке не дублирует Q.

Библиотечные FB и скрытый EN

Пакеты Motion, Modbus, PID из vendor library часто требуют Enable на отдельном pin. После update library pin переименовали - compile OK, EN висит unconnected, runtime не вызывает FB. Симптом: «между моим AND и выходом пропало» - между AND и выходом стоит vendor FB с EN false.

После миграции CODESYS: Compare → migrated → Missing Connection report.

Несколько сетей в одном POU

Нумерация сетей: сеть 1 может передать VAR в сеть 3, но сеть 2 в середине перезаписывает ту же VAR. Online в сети 3 «пропало» - смотрите writer в сети 2.

Правило ревью: одна VAR - один writer на scan, или используйте FB с инкапсуляцией.

Симулятор vs ПЛК: EN от hardware input

В симуляции %IX0.0 force true; на ПЛК вход false из-за обрыва - EN цепочки false. «На ноутбуке между блоками OK, в цеху нет» - не EN/ENO баг, а физический вход.

Visualization и FBD: не путать слои

Кнопка HMI пишет BOOL в %MX, FBD читает через %MX - задержка один scan Modbus/internal bus. Между двумя FBD блоками в одном POU задержки нет, между HMI и FBD - есть. Оператор «нажал, не сработало» - не ENO, а scan rate visu.

При ревью FBD-сети на code review полезно пройти цепочку от входа %IX до %QX маркером: каждый блок - галочка EN подключён, ENO не используется как BOOL без понимания. Один пропущенный EN на vendor FB в середине цепочки стоит смене час простоя.

Где обнулилось, причина и online-признак

Где «обнулилось» Причина в FBD Что увидеть в online
После `TON` Подключили `AND` к ENO, не к Q ENO false пока идёт отсчёт
После `DIV` Деление на 0, ENO false ENO красный/false, downstream freeze
Между `MOVE` и выходом POU ST ниже перезаписывает VAR FBD online OK, OUT POU другой
Параллельные AND → OR Одна ветка не подключена к OR Один вход OR всегда false
Первый цикл после Run EN от `NOT FirstScan` Один scan задержки
`SEL` с Index=0 Неверный selector Все ветки 0, кроме выбранной
EN не подключён на FB По умолчанию не TRUE в библиотеке EN false в watch
Feedback loop Порядок в сети Осцилляция 0/1 каждый scan
BOOL → INT вход Неявное cast 0/1 вместо ожидаемого
После interlock false EN цепочки false Upstream блоки серые (не exec)

Вопросы с пуска

Провод соединён - значит сигнал идёт?
Нет. EN/ENO и порядок исполнения решают.

Почему в ST работает, в FBD нет?
ST последовательный текст; FBD - граф с EN и топологией. Перепишите проблемный фрагмент для сравнения.

ENO обязательно подключать?
Если downstream не зависит от ENO - можно не использовать цепочку ENO; но тогда не вешайте логику на ENO как на BOOL.

First scan ломает только FBD?
Нет, но на FBD виднее «провал» один scan между блоками.

Online change меняет порядок?
Редко; но после изменения топологии нужен rebuild. Странное поведение - full download.

Cold start меняет EN?
FirstScan и init логика - да, один-два scan. Постоянное отличие sim vs field - hardware EN.

На практике

В CODESYS на ПЛК СТАБУР FBD и ST соседствуют в одном проекте так же, как на любом IEC 61131-3 контроллере. Критичные interlock после ревью часто переносят в ST для прозрачности EN; FBD оставляют для PID и таймеров - при условии явной цепочки EN на каждом FB.

TOPICS • ТЕМЫ#FBD EN ENO#сигнал пропадает FBD#порядок исполнения FBD#CODESYS FBD отладка#Function Block Diagram#IEC 61131-3 FBD#блок не выполняется EN