#Faster response than SMA, no large buffer needed. The alpha parameter (0.0–1.0) controls smoothing — lower = more smoothing.

FUNCTION_BLOCK FB_EMA
VAR_INPUT
    xEnable : BOOL;
    rInput  : REAL;
    rAlpha  : REAL := 0.1;   // Smoothing factor: 0 = max smooth, 1 = no filter
END_VAR
VAR_OUTPUT
    rOutput : REAL;
END_VAR
VAR
    xFirst  : BOOL := TRUE;
END_VAR

IF NOT xEnable THEN
    xFirst  := TRUE;
    rOutput := rInput;
    RETURN;
END_IF;

IF xFirst THEN
    rOutput := rInput;
    xFirst  := FALSE;
ELSE
    rOutput := rAlpha * rInput + (1.0 - rAlpha) * rOutput;
END_IF;