вот это годное и изящное решение.Цитата:
Как-то так, вероятно:
Вложение 89142
задержка на 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
спасибо.

