Здравствуйте. Нужен фильтр скользящее средним окном Экспоненциальное (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