-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 - elconfa

#1
 :-[
I have to thankyou! I did not seen that function and your help is very appreciated. I just made a little change because after changing the N variable, I need to send a reset signal for a Plc cycle or the result is wrong.


(* limit N to size of buffer *)
N := MIN(N, SIZEOF(buffer)/4);

A_TRIG_N(IN:= UINT_TO_REAL(N), RES:= 0.5, Q=> rst, D=> );

(* startup initialisation *)
IF NOT init OR rst OR N = 0 THEN
   init := TRUE;
   FOR i := 0 TO UINT_TO_INT(N)-1 DO
      buffer := X;
   END_FOR;
   sum := X * N;
   Y := X;
ELSE
   i := INC1(i, UINT_TO_INT(N));
   sum := sum + X - buffer;
   Y := sum / N;
   buffer := X;
END_IF;
#2
this is my code, may be someone need it, or you are able to make it better
Thanks
Massimo


FUNCTION_BLOCK FB_MovingAverage
VAR_INPUT
   IN : REAL;
   N_Cicli : INT;
   t_Pausa_1 : DINT;
   t_Pausa_2 : DINT;
END_VAR
VAR_OUTPUT
   Media : REAL;
END_VAR
VAR
   Valore : ARRAY [0..999] OF REAL;
   x, x1, x2: INT;
   SCHEDULER_1: OSCAT_BASIC.SCHEDULER;
   A, B, C, D: REAL;
   E: BOOL;
END_VAR


SCHEDULER_1(
   E0:= TRUE,
   E1:= TRUE,
   T0:= DINT_TO_TIME(t_Pausa_1),
   T1:= DINT_TO_TIME(t_Pausa_2));

IF SCHEDULER_1.Q0 THEN
   A := A + IN;
   B := B + 1;
END_IF

IF SCHEDULER_1.Q1 THEN      //MEDIA DELLE LETTURE BREVI
   C := A / B;
   A := 0;
   B := 0;
   D := 0;
   E := TRUE;
END_IF

IF E THEN
   FOR x := 1 TO (N_Cicli-1) DO
      x1 := N_Cicli - x;
      x2 := N_Cicli - x - 1;
      Valore[x1] := Valore[x2];
   END_FOR
   Valore[0] := C;
   FOR x := 0 TO (N_Cicli-1) DO
      D := D + Valore
  • ;
       END_FOR
       E := FALSE;
       Media := D / N_Cicli;   //MEDIA TRASCINATA
    END_IF


#3
I modified the library for Twincat 3.1 ;)
Massimo

[gelöscht durch Administrator]