Как-то так, вероятно:
Owen.jpg
задержка на 10 сек.
Код:function_block Delay var_input in : bool; // Входной сигнал t : udint; // Сдвиг сигнала end_var var_output Q : bool; // Выходной сигнал end_var var dTS : array [0..100] of udint; // Время фиксации состояния сигнала dS : array [0..100] of bool; // Состояние сигнала nState, i : udint; // Номер последнего зафисированного состояния и итератор rtStart : SYS.RTRIG; // Триггер начала записи end_var rtStart(I:=true); // Фиксируем начальное состояние if rtStart.Q then nState := 0; dTS[0] := time_to_udint(get_time()); dS[0] := in; end_if if in <> dS[nState] then // При каждом изменении входного сигнала nState := nState + 1; // Фиксируем новое состояние // Ограничим число фиксируемых состояний на всякий случай // если частота смены будет больше запланированной if nState > 100 then nState := 100; end_if dTS[nState] := time_to_udint(get_time()); // Метка времени dS[nState] := in; // Состояние end_if // Через время t выдаем следующее состояние на выход и смещаем массив if time_to_udint(get_time()) - dTS[0] >= t then Q := dS[0]; if nState > 0 then // Подготовим следующий переход, если есть nState := nState - 1; for i := 0 to nState do dTS[i] := dTS[i+1]; dS[i] := dS[i+1]; end_for end_if end_if end_function_block




Ответить с цитированием