Compare commits

...

2 commits

Author SHA1 Message Date
Dejan Rožič c279383429 added slew rate filter 2026-02-20 12:57:20 +01:00
Dejan Rožič eb42b61903 added median filter code 2026-02-20 12:55:59 +01:00
2 changed files with 87 additions and 0 deletions

50
Median Filter.txt Normal file
View file

@ -0,0 +1,50 @@
#Best for spike/impulse rejection (e.g. sensor glitches). Uses insertion sort on the buffer.
FUNCTION_BLOCK FB_MedianFilter
VAR_INPUT
xEnable : BOOL;
rInput : REAL;
iWindowSize : INT := 7; // Odd number recommended, max 15
END_VAR
VAR_OUTPUT
rOutput : REAL;
END_VAR
VAR
arBuffer : ARRAY[0..14] OF REAL;
arSorted : ARRAY[0..14] OF REAL;
iIndex : INT := 0;
iCount : INT := 0;
iWin : INT;
i, j : INT;
rTemp : REAL;
END_VAR
IF NOT xEnable THEN
iIndex := 0; iCount := 0; rOutput := rInput;
RETURN;
END_IF;
iWin := MIN(MAX(iWindowSize, 1), 15);
arBuffer[iIndex] := rInput;
iIndex := (iIndex + 1) MOD iWin;
IF iCount < iWin THEN iCount := iCount + 1; END_IF;
// Copy to sort buffer
FOR i := 0 TO iCount - 1 DO
arSorted[i] := arBuffer[i];
END_FOR;
// Insertion sort
FOR i := 1 TO iCount - 1 DO
rTemp := arSorted[i];
j := i - 1;
WHILE (j >= 0) AND (arSorted[j] > rTemp) DO
arSorted[j + 1] := arSorted[j];
j := j - 1;
END_WHILE;
arSorted[j + 1] := rTemp;
END_FOR;
// Pick middle element
rOutput := arSorted[iCount / 2];

View 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;