И что считает эта схема? Без каких-то личных претензий, но как применить ваш пример для "среднего расхода за последние сутки" как-то неясно.
Если я правильно прочитал вашу схему, то вы считаете "общее количество импульсов/общее время". Верно?
Такой подход
будет работать только при постоянной скорости. Если же расход меняется со временем, то ваш алгоритм будет показывать погоду.
Если что, то я выше
экспоненциальное сглаживание для ПЛК выложил. Оно адаптируется к изменяющимся скоростям.
И кода там 15 строк. Открываем статью в Wikipedia, сверяем алгоритм. На всякий пожарный проверяем в симуляции.
Код:
PROGRAM averages
(* https://en.wikipedia.org/wiki/Exponential_smoothing#Basic_exponential_smoothing *)
VAR CONSTANT
sampling_interval: REAL := 10; (* seconds, should be equal to interval in task configuration *)
END_VAR
VAR_OUTPUT
last1m: REAL;
last1h: REAL;
last1d: REAL;
END_VAR
VAR
a1m: REAL;
a1h: REAL;
a1d: REAL;
prevCnt: INT;
delta: REAL;
END_VAR
delta := (PLC_PRG.CV - prevCnt)/sampling_interval; (* current flow ITEMS PER SECOND *)
prevCnt := PLC_PRG.CV; (* <-- тут может возникнуть ошибка из-за того, что мы 2 раза читаем переменную PLC_PRG.CV? *)
a1m := 1-EXP(-sampling_interval/60); (* можно вычислить заранее и прямо константой забить *)
a1h := 1-EXP(-sampling_interval/3600);
a1d := 1-EXP(-sampling_interval/86400);
last1m := a1m*delta + (1-a1m)*last1m;
last1h := a1h*delta + (1-a1h)*last1h;
last1d := a1d*delta + (1-a1d)*last1d;
Код:
PROGRAM PLC_PRG
VAR_INPUT
inp: BOOL;
END_VAR
VAR_OUTPUT
CV: INT;
END_VAR
VAR
cntr: CTU;
END_VAR
cntr(CU := inp); (* тут просто считаем импульсы *)
CV := cntr.CV;