Статья объясняет работу стандартных блоков МЭК 61131-3 R_TRIG и F_TRIG, которые выдают импульс длительностью один цикл ПЛК при смене состояния входного сигнала. Из неё можно взять правила вызова блоков в ST и FBD и типовые ошибки применения.
- R_TRIG срабатывает при переходе входа из 0 в 1, F_TRIG — при переходе из 1 в 0.
- У обоих блоков есть вход CLK и выход Q, а между вызовами сохраняется предыдущее состояние CLK.
- В ST блок вызывается через объявленный экземпляр, в FBD — размещается на схеме с подключением CLK и Q.
- Применяются для пуска/стопа, счёта импульсов, однократного запуска операции и фиксации событий.
- Выход Q активен один цикл, поэтому для запоминания события после детектора ставят RS-триггер.
- Нельзя использовать один экземпляр на два сигнала и вызывать блок внутри условия IF.
- МЭК 61131-3
- R_TRIG
- F_TRIG
- CLK
- Q
- ST
- FBD
- RS-триггер
Кому полезно: Инженеры АСУ ТП, программирующие ПЛК на ST и FBD
- Обучение Видео 33. Детекторы фронтов R_Trig и F_Trig
- Статья #1 — Structured Text // Определение переднего (R_TRIG) и заднего (F_TRIG) фронта сигнала в Codesys
- Библиотека Петров И.В. Программируемые контроллеры. Практическое применение языков стандарта МЭК 61131-3.
Выжимка составлена редакцией сайта с помощью ИИ по тексту статьи.
R_TRIG и F_TRIG — стандартные функциональные блоки МЭК 61131-3, которые формируют одиночный импульс на один цикл ПЛК при переходе входного сигнала из 0 в 1 (передний фронт) или из 1 в 0 (задний фронт). Нужны, чтобы реагировать на событие, а не на уровень сигнала.
В цикле ПЛК программа выполняется многократно, и любое логическое условие остаётся истинным столько, сколько держится сигнал. Если подать это условие напрямую на счётчик, счёт будет расти каждый цикл. Детектор фронта решает эту проблему: он сравнивает текущее значение входа с сохранённым значением из предыдущего цикла и выдаёт Q = TRUE ровно один цикл — в момент изменения [8].
R_TRIG (rising trigger) срабатывает на переходе 0 → 1, F_TRIG (falling trigger) — на переходе 1 → 0. У обоих блоков вход CLK и выход Q. Внутри хранится переменная M — предыдущее состояние CLK. Логика R_TRIG: Q := CLK AND NOT M; затем M := CLK. Логика F_TRIG: Q := NOT CLK AND M; затем M := CLK. Именно сохранение M между вызовами и даёт привязку к фронту, а не к уровню.
На ST блоки вызываются как экземпляры: объявляете переменную типа R_TRIG, затем в теле программы пишете R_TRIG_1(CLK := Start); и используете R_TRIG_1.Q. Экземпляр обязателен — если вызвать блок без него, состояние M негде хранить. На FBD блок просто ставится на схему, вход CLK соединяется с сигналом, выход Q идёт дальше на счётчик, триггер или таймер [1][3][6].
Типовое применение: пуск/стоп, счёт импульсов от кнопки или датчика, однократный запуск операции по появлению сигнала, фиксация события для архива или аларма. В учебных примерах CODESYS детекторы фронта часто стоят в одной схеме с RS-триггером и таймерами [6].
Частая ошибка — использовать выход Q детектора как удержание. Q активен только один цикл, поэтому для запоминания события нужен RS-триггер после детектора. Вторая ошибка — один экземпляр блока на два разных сигнала: состояние M перезапишется, и фронт будет определяться неверно. На каждый сигнал — свой экземпляр. Третья — вызов блока внутри условия IF, из-за чего M обновляется не каждый цикл и фронт теряется.
Материалы сайта по теме
- Видео 33. Детекторы фронтов R_Trig и F_Trig
- Видео 33. Детекторы фронтов R_Trig и F_Trig
- #1 — Structured Text // Определение переднего (R_TRIG) и заднего (F_TRIG) фронта сигнала в Codesys
- Видео 32. RS и SR триггеры на ST в Owen Logic
- В языках FBD и LAD Simatic (Siemens) имеются готовые конструкции для определения
- Программируемые логические контроллеры
Частые вопросы
Чем R_TRIG отличается от обычного контакта в LAD?
Контакт пропускает сигнал, пока он истинен, то есть много циклов. R_TRIG даёт импульс только на один цикл — в момент появления сигнала.
Почему счётчик считает больше одного раза за нажатие кнопки?
Скорее всего, на вход счётчика подан уровень сигнала, а не выход детектора фронта. Поставьте R_TRIG перед счётчиком.
Нужно ли объявлять экземпляр блока вручную?
Да. R_TRIG и F_TRIG хранят предыдущее состояние, поэтому в ST объявляется переменная типа R_TRIG, и вызов идёт через неё.
Можно ли написать детектор фронта самому?
Да, это две строки на ST: Q := CLK AND NOT M; M := CLK; для переднего фронта. Свой блок удобен, если нужна нестандартная логика [3].
Где взять R_TRIG в CODESYS?
В библиотеке стандартных блоков, в разделе триггеров. На FBD перетаскивается на схему, на ST вызывается как экземпляр.