Цитата Сообщение от EFrol Посмотреть сообщение
Как-то так, вероятно:
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
вот это годное и изящное решение.
спасибо.