added slew rate filter
This commit is contained in:
parent
eb42b61903
commit
c279383429
37
Rate Limiter Slew Rate Filter.txt
Normal file
37
Rate Limiter Slew Rate Filter.txt
Normal file
|
|
@ -0,0 +1,37 @@
|
|||
#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;
|
||||
Loading…
Reference in a new issue