
Сообщение от
seagull72
Добрый вечер!
Есть задача для Codesys - 4 электромагнитных клапана последовательно включаются/отключаются циклически каждые, допустим, 60 секунд. Если в это время прилетает сигнал от какого-то датчика (любого, ну например при нажатии кнопки, или приход 1 на дискретный вход ПЛК) то надо знать и вывести оповещение - какой по номеру клапан был открыт в это время.
Подскажите в каком направлении копать, готовое решение не обязательно, сам хочу дойти (мальчику пора взрослеть). Мысли крутятся вокруг таймеров в Codesys, но не совсем понимаю как ожидание события при работающем таймере и как сделать, чтобы при наступлении события цикл работы клапанов не прерывался.
Учиться лучше на примерах. Это пример на ST из OL. Попробуйте портировать в CDS.
Код:
function_block Fix
var_input
in : bool; // Вход события для фиксации
end_var
var_output
Q : udint; // Зафиксированный номер текущего клапана
V1, V2, V3, V4 : bool; // Выхода клапанов
end_var
var
tmr : SYS.TON; // Таймер
nV : udint := 1; // Номер текущего клапана
rtIN : SYS.RTRIG; // Фиксатор нажатия кнопки in
end_var
tmr(I:=true, T:=T#60s); // Таймер все время в работе
if tmr.Q then // Пришло время сменить клапан
tmr(I:=false); // Перезапуск таймера
nV := nV + 1; // Следующий клапан
if nV > 4 then nV := 1; end_if // Циклически
end_if
// Включаем клапан по номеру в nV
V1 := false; V2 := false; V3 := false; V4 := false;
case nV of
1: V1 := true;
2: V2 := true;
3: V3 := true;
4: V4 := true;
end_case
// Фиксируем при каждом нажатии номер текущего клапана
rtIN(I:=in);
if rtIN.Q then Q := nV; end_if
end_function_block