Разберём простую, но очень важную особенность работы ПЛК.
Нужно увеличивать счётчик на
1 при каждом нажатии кнопки.Пишем:
IF xButton THEN
iCounter := iCounter + 1;
END_IF
На первый взгляд всё логично:
🔘 нажали кнопку
➕ счётчик увеличился на
1Но после одного нажатия вдруг получаем:
iCounter = 73
😳 Почему не 1?
━━━━━━━━━━━━━━
🔄 Всё дело в цикле ПЛК
ПЛК выполняет программу не один раз.
Он повторяет её циклически — снова и снова.
Допустим, время цикла задачи:
10 мсА кнопку оператор удерживал примерно:
1 секундуЗа это время программа выполнится примерно:
1000 мс / 10 мс = 100 циклов
И всё это время:
xButton = TRUEЗначит, в каждом цикле снова выполняется:
iCounter := iCounter + 1;
📈 Поэтому одно физическое нажатие может привести к десяткам или даже сотням выполнений одной и той же команды.
━━━━━━━━━━━━━━
🎯 Нужно ловить не состояние, а событие
Нас интересует не то, сколько времени
xButton находится в состоянии TRUE.Нам нужен только момент перехода:
FALSE → TRUEЭто называется передним фронтом сигнала.
В CODESYS для его обнаружения есть стандартный функциональный блок:
R_TRIG━━━━━━━━━━━━━━
✅ Правильный вариант
VAR
xButton : BOOL;
fbTrig : R_TRIG;
iCounter : INT;
END_VAR
fbTrig(CLK := xButton);
IF fbTrig.Q THEN
iCounter := iCounter + 1;
END_IF
Теперь выход
fbTrig.Q становится TRUE только на один цикл ПЛК — в момент появления переднего фронта.Получаем:
🔘 нажали →
+1⏳ держим кнопку → ничего
🔘 отпустили → ничего
🔘 нажали снова →
+1━━━━━━━━━━━━━━
🧠 Главное различие
Когда мы пишем:
IF xButton THENмы спрашиваем:
«Сигнал сейчас активен?»
А
R_TRIG отвечает на другой вопрос:«Сигнал появился именно в этом цикле?»
Это две совершенно разные задачи.
━━━━━━━━━━━━━━
🏭 Где это используется на практике?
Обработка фронта постоянно встречается в программах ПЛК:
• команды с HMI
• квитирование аварий
• переключение режимов
• изменение уставок
• подсчёт событий
• запуск последовательностей
• обработка кнопок оператора
То есть везде, где действие должно выполниться один раз по событию, а не каждый цикл ПЛК.
━━━━━━━━━━━━━━
💡 Запомните
IF проверяет состояние.R_TRIG ловит момент появления сигнала.Небольшая разница в коде — огромная разница в поведении программы.
━━━━━━━━━━━━━━
💬 А как вы обрабатываете фронты в своих проектах?
Используете стандартные
R_TRIG / F_TRIG или пишете свою логику через запоминание предыдущего состояния?#CODESYS #ПЛК #АСУТП #StructuredText #ПрограммированиеПЛК