Вариант 2:
Вложение 85482
Код:function_block TP
var_input
I : bool; // Входной импульс
T : udint; // Время в мс
end_var
var_output
Q : bool; // Выход
ET : udint; // Текущее значение таймера с обратным отсчетом
end_var
var
ts, d : udint; // Фиксация системного времени и дельты
rt : SYS.RTRIG; // Тригер фронта
end_var
rt(I := I and not Q); // Фиксируем начало нового импульса
if rt.Q then
ts := time_to_udint(get_time()); ET := T; Q := true; // Фиксируем продолжительность и начало импульса
end_if
if ET > 0 then
d := time_to_udint(get_time()) - ts; ts := ts + d; // Прошло времени в мc
if ET > d then
ET := ET - d; // Уменьшаем ET на это время
else
ET := 0; Q := false; // Иначе фиксируем завершение импульса
end_if
end_if
end_function_block

