Здравствуйте. Нужен фильтр скользящее средним окном Экспоненциальное (EMA). Входные данные 1 раз в секунду. ИИ выдал код, может нужно что-то поправить??Код:function_block EMAsek VAR_INPUT In : REAL; // Входной сигнал датчика Per : REAL; // Период сглаживания в секундах (N >= 1) Res : BOOL; // Принудительный сброс/инициализация END_VAR VAR_OUTPUT Out : REAL; // Сглаженный выходной сигнал END_VAR VAR fbTimer : SYS.TON; // Встроенный таймер для отсчета 1 секунды rAlpha : REAL; // Коэффициент альфа xInitDone : BOOL; // Флаг первоначальной инициализации END_VAR // Ограничение периода сглаживания во избежание деления на 0 IF Per < 1.0 THEN Per := 1.0; END_IF; // Расчет коэффициента альфа rAlpha := 2.0 / (Per + 1.0); // Первичная инициализация при старте ПЛК/прибора или по сбросу IF NOT xInitDone OR Res THEN Out := In; xInitDone := TRUE; END_IF; // Работа циклического таймера на 1 секунду fbTimer(I := NOT fbTimer.Q, T := T#1000ms); // Расчет фильтра строго в момент срабатывания таймера (раз в секунду) IF fbTimer.Q AND NOT Res THEN Out := (In * rAlpha) + (Out * (1.0 - rAlpha)); END_IF; end_function_block




Ответить с цитированием
