R_TRIG и F_TRIG должны помнить состояние входа на предыдущем вызове.Поэтому экземпляр функционального блока нужно вызывать циклически.
Например:
fbRise(CLK := xSignal);
на каждом выполнении задачи.
Не стоит вызывать блок только изредка в случайной ветке программы, если вы хотите надёжно отслеживать каждый переход сигнала.
━━━━━━━━━━━━━━━━━━
⚠️ Ещё одна частая ошибка
Не нужно использовать один экземпляр
R_TRIG для нескольких независимых сигналов.Плохо:
fbTrig(CLK := xStart);
...
fbTrig(CLK := xReset);
У блока есть внутреннее состояние.
Для разных сигналов лучше создавать разные экземпляры:
fbStart : R_TRIG;
fbReset : R_TRIG;
и вызывать их отдельно:
fbStart(CLK := xStart);
fbReset(CLK := xReset);
Так программа будет понятнее и предсказуемее.
━━━━━━━━━━━━━━━━━━
💡 Главное различие
Обычный:
IF xSignal THEN
отвечает на вопрос:
«Сигнал сейчас TRUE?»
R_TRIG отвечает:«Сигнал только что изменился с FALSE на TRUE?»
А
F_TRIG:«Сигнал только что изменился с TRUE на FALSE?»
━━━━━━━━━━━━━━━━━━
📌 Запомните
⬆️
R_TRIGFALSE → TRUE
Передний фронт — сигнал появился.
⬇️
F_TRIGTRUE → FALSE
Задний фронт — сигнал исчез.
Выход
Q активируется только на один цикл программы при обнаружении соответствующего перехода.━━━━━━━━━━━━━━━━━━
❓ Проверим себя
Сигнал изменяется так:
FALSE
FALSE
TRUE
TRUE
FALSE
FALSE
TRUE
Сколько раз за это время сработает
R_TRIG, а сколько — F_TRIG?💬 Напишите ответ в комментариях, не подглядывая в документацию 👇
#CODESYS #ПЛК #АСУТП #StructuredText #ST #R_TRIG #F_TRIG #ПрограммированиеПЛК