⚠️ Найдите подвох в программе!
В CODESYS объявлены переменные:
VAR
fbTrig : R_TRIG;
xA : BOOL := TRUE;
xB : BOOL := FALSE;
iCount : INT := 0;
END_VAR
В каждом цикле ПЛК выполняется:
fbTrig(CLK := xA);
IF fbTrig.Q THEN
iCount := iCount + 1;
END_IF;
fbTrig(CLK := xB);
Условия:
•
xA всегда TRUE.•
xB всегда FALSE.•
iCount изначально равен 0.• Внутренняя память R_TRIG изначально FALSE.
• Код выполняется 5 циклов подряд.
━━━━━━━━━━━━━━━━━━
❓ Чему будет равен iCount после 5 циклов?
А) 0
Б) 1
В) 5
Г) 10
Сначала выберите вариант, затем откройте ответ 👇
🔎 Нажмите, чтобы открыть разбор
✅ Правильный ответ — В) 5.
Разберём первый цикл.
1️⃣ Первый вызов:
fbTrig(CLK := xA);
Поскольку xA = TRUE, а предыдущее состояние FALSE, R_TRIG обнаруживает передний фронт.
fbTrig.Q = TRUE
Счётчик увеличивается:
iCount = 1
2️⃣ Второй вызов:
fbTrig(CLK := xB);
Поскольку xB = FALSE, блок обновляет внутреннюю память значением FALSE.
Теперь fbTrig.Q = FALSE.
На следующем цикле ситуация повторяется!
Первый вызов снова получает TRUE после FALSE и формирует импульс.
Счётчик увеличивается каждый цикл.
Результат:
Цикл 1 → iCount = 1
Цикл 2 → iCount = 2
Цикл 3 → iCount = 3
Цикл 4 → iCount = 4
Цикл 5 → iCount = 5
Итого: iCount = 5.
Хотя xA ни разу не изменялся!
Причина — повторные вызовы одного экземпляра R_TRIG с разными значениями CLK.
━━━━━━━━━━━━━━━━━━
💡 Главная мысль
R_TRIG запоминает предыдущее состояние входа.Если использовать один экземпляр для разных сигналов, они будут влиять на его внутреннюю память.
Для независимых сигналов используйте отдельные экземпляры R_TRIG.
━━━━━━━━━━━━━━━━━━
💬 Получилось ответить правильно?
Напишите свой вариант в комментариях!
📤 Отправьте эту задачу коллеге-программисту ПЛК!
Проверьте, заметит ли он подвох с первого раза. 😉
🔁 Репостните интерактив в профильный чат — пусть больше инженеров проверят свои знания.
📚 Больше разборов CODESYS:
https://t.me/codesys4
#CODESYS #ПЛК #АСУТП #StructuredText #R_TRIG