-Menü

Beiträge anzeigen

Dieser Abschnitt erlaubt es Ihnen, alle Beiträge anzusehen, die von diesem Mitglied geschrieben wurden. Beachten Sie, dass Sie nur Beiträge sehen können, die in Teilen des Forums geschrieben wurden, auf die Sie aktuell Zugriff haben.

Beiträge anzeigen-Menü

Beiträge - hejhopp1

#1
Hi,

I have a problem with the FT_AVG, is seems like it does not average correctly when going to 0.

It seems like in the last cycle, the calculation gets incorrect.
Have you experienced this?

I was not able to upload pictures but the calculation looks like this (bold is actual numbers)

130 input
avg130 := avg130 + (in130 - buff.out130 ) / INT_TO_REAL(N)10;

0 input until last cycle
avg13 := avg13 + (in0 - buff.out130 ) / INT_TO_REAL(N)10;

after last cycle
avg-9.54E-06 := avg-9.54E-06 + (in0 - buff.out130 ) / INT_TO_REAL(N)10;

afterwards
avg-9.54E-06 := avg-9.54E-06 + (in0 - buff.out0 ) / INT_TO_REAL(N)10;


------------------------------
Attaching code from lib to make discussion easier:

FUNCTION_BLOCK FT_AVG
VAR_INPUT
IN : REAL;
E : BOOL := TRUE;
N : INT := 32;
RST : BOOL;
END_VAR
VAR_OUTPUT
AVG : REAL;
END_VAR
VAR
buff : DELAY;
i: INT;
init : BOOL;
END_VAR


(* limit n to a max of 32 because delay can do max 32 cycles *)
buff.N := LIMIT(0, N, 32);

IF NOT init OR rst THEN
FOR i := 1 TO N DO
buff(in := in);
END_FOR;
avg := in;
init := TRUE;
ELSIF E THEN
buff(in := in);
avg := avg + (in - buff.out ) / INT_TO_REAL(N);
END_IF;




------------------------------------------------
FUNCTION_BLOCK DELAY
VAR_INPUT
IN : REAL;
N : INT;
RST : BOOL;
END_VAR
VAR_OUTPUT
OUT : REAL;
END_VAR
VAR
buf : ARRAY[0..31] OF REAL;
i : INT;
init: BOOL;
stop: INT;
END_VAR


stop := LIMIT(0,N,32) - 1;
IF rst OR NOT init THEN
init := TRUE;
FOR i := 0 TO stop DO buf := in; END_FOR;
out := in;
i := 0;
ELSIF stop < 0 THEN
out := in;
ELSE
out := buf;
buf := in;
i := INC1(i, N);
END_IF;