From be5720e84edbc8311f3360e1f7eebb9d70fcb9af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dejan=20Ro=C5=BEi=C4=8D?= Date: Fri, 20 Feb 2026 12:51:24 +0100 Subject: [PATCH] added first scripts --- main.scl | 46 ++++++++++++++++++++++++++++++++++++++++++++++ moving-average.txt | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 92 insertions(+) create mode 100644 main.scl create mode 100644 moving-average.txt diff --git a/main.scl b/main.scl new file mode 100644 index 0000000..d879f1d --- /dev/null +++ b/main.scl @@ -0,0 +1,46 @@ +FUNCTION_BLOCK FB_MovingAverage +VAR_INPUT + xEnable : BOOL; + rInput : REAL; // Raw analog value + iWindowSize : INT := 10; // Number of samples (1..100) +END_VAR +VAR_OUTPUT + rOutput : REAL; // Filtered output + xReady : BOOL; // TRUE when buffer is full +END_VAR +VAR + arBuffer : ARRAY[0..99] OF REAL; // Circular buffer + iIndex : INT := 0; + iCount : INT := 0; + rSum : REAL := 0.0; + iWin : INT; +END_VAR + +IF NOT xEnable THEN + rOutput := rInput; + iIndex := 0; + iCount := 0; + rSum := 0.0; + RETURN; +END_IF; + +// Clamp window size +iWin := MIN(MAX(iWindowSize, 1), 100); + +// Subtract the oldest value from sum before overwrite +rSum := rSum - arBuffer[iIndex]; + +// Store new value +arBuffer[iIndex] := rInput; +rSum := rSum + rInput; + +// Advance circular index +iIndex := (iIndex + 1) MOD iWin; + +// Track how many samples collected +IF iCount < iWin THEN + iCount := iCount + 1; +END_IF; + +xReady := (iCount >= iWin); +rOutput := rSum / INT_TO_REAL(iCount); // Valid even before buffer full \ No newline at end of file diff --git a/moving-average.txt b/moving-average.txt new file mode 100644 index 0000000..d879f1d --- /dev/null +++ b/moving-average.txt @@ -0,0 +1,46 @@ +FUNCTION_BLOCK FB_MovingAverage +VAR_INPUT + xEnable : BOOL; + rInput : REAL; // Raw analog value + iWindowSize : INT := 10; // Number of samples (1..100) +END_VAR +VAR_OUTPUT + rOutput : REAL; // Filtered output + xReady : BOOL; // TRUE when buffer is full +END_VAR +VAR + arBuffer : ARRAY[0..99] OF REAL; // Circular buffer + iIndex : INT := 0; + iCount : INT := 0; + rSum : REAL := 0.0; + iWin : INT; +END_VAR + +IF NOT xEnable THEN + rOutput := rInput; + iIndex := 0; + iCount := 0; + rSum := 0.0; + RETURN; +END_IF; + +// Clamp window size +iWin := MIN(MAX(iWindowSize, 1), 100); + +// Subtract the oldest value from sum before overwrite +rSum := rSum - arBuffer[iIndex]; + +// Store new value +arBuffer[iIndex] := rInput; +rSum := rSum + rInput; + +// Advance circular index +iIndex := (iIndex + 1) MOD iWin; + +// Track how many samples collected +IF iCount < iWin THEN + iCount := iCount + 1; +END_IF; + +xReady := (iCount >= iWin); +rOutput := rSum / INT_TO_REAL(iCount); // Valid even before buffer full \ No newline at end of file