Вход

Просмотр полной версии : пр 103 суммировать время между событиями



kapithan
10.09.2025, 10:25
Помогите пожалуйста реализовать два похожих сценария:

на вход AI1 приходит дискретный сигнал. Через некоторое время t1, выставляемое в программе, например 2 секунды происходит какое то событие, например активируется триггер1 для дальнейшей логики, или Q1. C этим все понятно, есть блок с задержкой. Через некоторое время t2, которое задается внешним реле времени, после AI1, приходит сигнал на AI2. Нужно активировать событие, например триггер2 или Q2 через время равное t1 + t2. Как посчитать разницу во времени между событиями и сделать такую задержку, фикс t1 + посчитанное t2?
похожая ситуация. на вход AI1 приходит дискретный сигнал. Одновременно с этим (ну почти одновременно, может быть не в этом цикле, т.к. сигнал от другого реле, время срабатывания контактов может быть разным) приходит сигнал на AI2 длительностью t2 и пропадает потом. Нужно после первого сигнала с фиксированной задержкой t1 активировать триггер, а c задержкой t3 = t1 + t2 активировать другое событие, триггер2 например.


разница в сценариях в том, что в первом случае длительность задержки определяется фикс + задержка от реле времени, а во втором фикс + длительность самого сигнала.
Все сигналы дискретные, AI только потому что DI и FDI уже заняты другой логикой, уточнил тип входа на всякий случай если это важно.

Dimensy
10.09.2025, 11:13
Вот здесь измеряли время между двумя событиями
https://owen.ru/forum/showthread.php?t=41573

EFrol
10.09.2025, 12:58
Так что-ли?


function_block Fun

var_input
ai1, ai2 : bool;
t1 : udint;
end_var

var_output
Q1, Q2 : bool;
end_var

var
event1, event2 : bool;
ts1, ts2 : udint;
rt1, rt2 : SYS.RTRIG;
tQ1, tQ2 : SYS.TON;
end_var

rt1(I:=ai1); // Ловим фронт ai1
if rt1.Q then
event1 := true; // Фиксируем событие ..
ts1 := time_to_udint(get_time()); // и время ai1
end_if
rt2(I:=ai2); // Ловим фронт ai2
if rt2.Q then
event2 := true; // Фиксируем событие ..
ts2 := time_to_udint(get_time()); // и время ai2
end_if

if tQ2.Q then // После выдачи сигнала Q2 все сбрасываем и начинаем сначала
event1 := false; event2 := false;
end_if

tQ1(I:=event1, T := udint_to_time(t1), Q=>Q1);
tQ2(I:=event2, T := udint_to_time(t1 + ts2 - ts1), Q=>Q2);

end_function_block




function_block Fun2

var_input
ai1, ai2 : bool;
t1 : udint;
end_var

var_output
Q1, Q2 : bool;
end_var

var
event1, event2 : bool;
ts1, ts2 : udint;
rt1, rt2 : SYS.RTRIG;
ft2 : SYS.FTRIG;
tQ1, tQ2 : SYS.TON;
end_var

rt1(I:=ai1); // Ловим фронт ai1
if rt1.Q then
event1 := true; // Фиксируем событие ..
end_if
rt2(I:=ai2); ft2(I:=ai2); // Ловим фронт и спад ai2
if rt2.Q then
ts1 := time_to_udint(get_time()); // Фиксируем время прихода фронта ai2
end_if
if ft2.Q then
event2 := true; // Фиксируем событие ..
ts2 := time_to_udint(get_time()); // и время прихода спада ai2
end_if

if tQ2.Q then // После выдачи сигнала Q2 все сбрасываем и начинаем сначала
event1 := false; event2 := false;
end_if

tQ1(I:=event1, T := udint_to_time(t1), Q=>Q1);
tQ2(I:=event2, T := udint_to_time(t1 + ts2 - ts1), Q=>Q2);

end_function_block