Сообщение от
capzap
в 14:50:32.500 поступила команда TRUE на вход IN, с уставкой 5 секунд, время цикла плк ~3мс, отсчитываем приблизительно 1667 циклов, подходим к вызову таймера, он берет время с реальных часов, на них должно быть 14:50:37.501, вычитает время когда таймер запустился, у него получается больше уставки на 1мс, следовательно он меняет состояние Q, о каком накоплении идет речь у Вас?
ЗЫ а кто сказал что при поступлении сигнала на выключение двигателя он сразу останавливается, так что мы еще теряем наработку
3600 / 5 * (3ms*~0.5=1.5ms) / 1000 = ~1,08 в час в сторону уменьшения. данный метод имеет право на жизнь с срабатыванием "трещетки" как можно реже (5-10с). что при частых пусках -остановках дает свой "бонус" ).
Код:
вот покуроченный METER из оскат:
FUNCTION_BLOCK METERMOD
VAR_INPUT
Count : BOOL;
Reset : BOOL;
END_VAR
VAR_IN_OUT
Hours : REAL;
END_VAR
VAR
Count2 : BOOL;
Scale : REAL := 1;
Scale2 : REAL;
(* Period seconds *)
D : REAL := 3600;
MR : REAL2;
Hours1, Hours2 : REAL; (* current consumption value on Scale and Scale2 *)
HoursAct: DWORD;
last: DWORD;
tc: REAL;
init: BOOL;
END_VAR
(* see OSCAT Library METER *)
HoursAct := T_PLC_MS();
IF NOT init THEN
init := TRUE;
last := HoursAct;
mr.RX := Hours;
mr.R1 := 0.0;
ELSIF HoursAct = last THEN
RETURN;
ELSE
tc := DWORD_TO_REAL(HoursAct - last) * 0.001;
END_IF;
last := HoursAct;
(* reset *)
IF Reset THEN
mr.R1 := 0.0;
mr.RX := 0.0;
Hours := mr.RX;
ELSE
(* current consumption measurement *)
IF Count THEN Hours1 := Scale; ELSE Hours1 := 0.0; END_IF;
IF Count2 THEN Hours2 := Scale2; ELSE Hours2 := 0.0; END_IF;
(* add up the current values in a double real *)
MR := R2_ADD(MR,(SEL(Count,0.0,Hours1) + SEL(Count2, 0.0, Hours2)) / D * TC);
(* set the current output value *)
Hours := mr.RX;
END_IF;
sXbQwLk.png