Compare commits

..

No commits in common. "c279383429a02b8b019eba476ae8bae3e4bc0bf4" and "88e893e4ad1d0fd01c2a0d9069c6e4d89eaca40c" have entirely different histories.

2 changed files with 0 additions and 87 deletions

View file

@ -1,50 +0,0 @@
#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

@ -1,37 +0,0 @@
#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;