37 lines
890 B
Plaintext
37 lines
890 B
Plaintext
|
|
#Limits how fast the signal can change per scan cycle — useful for preventing actuator shock.
|
||
|
|
|
||
|
|
FUNCTION_BLOCK FB_RateLimiter
|
||
|
|
VAR_INPUT
|
||
|
|
xEnable : BOOL;
|
||
|
|
rInput : REAL;
|
||
|
|
rMaxRiseRate : REAL := 10.0; // Max units per second rising
|
||
|
|
rMaxFallRate : REAL := 10.0; // Max units per second falling
|
||
|
|
rCycleTimeS : REAL := 0.1; // OB cycle time in seconds
|
||
|
|
END_VAR
|
||
|
|
VAR_OUTPUT
|
||
|
|
rOutput : REAL;
|
||
|
|
END_VAR
|
||
|
|
VAR
|
||
|
|
xFirst : BOOL := TRUE;
|
||
|
|
rMaxStep : REAL;
|
||
|
|
rMinStep : REAL;
|
||
|
|
rDelta : REAL;
|
||
|
|
END_VAR
|
||
|
|
|
||
|
|
IF NOT xEnable THEN
|
||
|
|
xFirst := TRUE;
|
||
|
|
rOutput := rInput;
|
||
|
|
RETURN;
|
||
|
|
END_IF;
|
||
|
|
|
||
|
|
IF xFirst THEN
|
||
|
|
rOutput := rInput;
|
||
|
|
xFirst := FALSE;
|
||
|
|
RETURN;
|
||
|
|
END_IF;
|
||
|
|
|
||
|
|
rMaxStep := rMaxRiseRate * rCycleTimeS;
|
||
|
|
rMinStep := -rMaxFallRate * rCycleTimeS;
|
||
|
|
rDelta := rInput - rOutput;
|
||
|
|
rDelta := MAX(MIN(rDelta, rMaxStep), rMinStep);
|
||
|
|
rOutput := rOutput + rDelta;
|