From c279383429a02b8b019eba476ae8bae3e4bc0bf4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dejan=20Ro=C5=BEi=C4=8D?= Date: Fri, 20 Feb 2026 12:57:20 +0100 Subject: [PATCH] added slew rate filter --- Rate Limiter Slew Rate Filter.txt | 37 +++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 Rate Limiter Slew Rate Filter.txt diff --git a/Rate Limiter Slew Rate Filter.txt b/Rate Limiter Slew Rate Filter.txt new file mode 100644 index 0000000..045d79f --- /dev/null +++ b/Rate Limiter Slew Rate Filter.txt @@ -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; \ No newline at end of file