наваял и себе и людям))
вроде работает.
секундомер Вам в руки)
Код:
FUNCTION_BLOCK P1P2MTRS
(*порядок датчиков не имеет значения*)
VAR_INPUT
iDi1 : BOOL; (*Вход датчик 1*)
iDi2 : BOOL; (*Вход датчик 2*)
iRes : BOOL; (*Сброс / запрет работы*)
iMtrsSP : REAL; (*Расстояние датчик1-датчик2, м*)
iErrSP : TIME; (*Время на ожидание второго датчика*)
END_VAR
VAR_OUTPUT
oDone : BOOL; (*Расчет выполнен, =TRUE только 1 цикл*)
oErr : BOOL; (*Ошибка: нет сигнала второго датчика*)
oSpd : REAL; (*Расчетная скорость, м/с*)
END_VAR
VAR
Trig1: BOOL;
Trig2 : BOOL;
Trig :BOOL;
TimeTrig : TIME;
TDelta : TIME;
Init: BOOL;
Di1Old :BOOL;
Di2Old : BOOL;
END_VAR
IF iRes THEN Init := oErr := FALSE; END_IF
IF oErr THEN RETURN; END_IF
(*INIT*)
IF NOT Init THEN
Init := TRUE;
Di1Old := iDi1;
Di2Old := iDi2;
iRes := oDone := Trig1:= Trig2 := Trig := FALSE;
TimeTrig := TDelta := t#0ms;
oSpd := 0;
END_IF
oDone := FALSE;
IF iDi1 > Di1Old THEN Trig1 := TRUE; END_IF
IF iDi2 > Di2Old THEN Trig2 := TRUE; END_IF
Di1Old := iDi1;
Di2Old := iDi2;
IF Trig1 OR Trig2 THEN
IF NOT Trig THEN TimeTrig := TIME(); Trig := TRUE; END_IF
TDelta := TIME() - TimeTrig;
IF TDelta > iErrSP THEN oSpd := 0; oErr := TRUE; RETURN; END_IF
IF Trig1 AND Trig2 THEN
IF TDelta < t#10ms THEN oSpd := 0; oErr := TRUE; RETURN; END_IF
oSpd := iMtrsSP * 1000 / TIME_TO_REAL(TDelta);
oDone := TRUE;
Trig1 := Trig2 := Trig := FALSE;
END_IF
END_IF