-> Hier kostenlos registrieren
Das Porg. Speichert alle x sec. ein Wert ab. Das Array ist auf 0..10 gesetzt
Wenn die Abtastzeit abgelaufen ist dann Summiere auf und teile durch die AbtastWerte.
Das funktioniert mit dem Prog. (*A*) wunderbar.
Nehme ich stattdessen eine FOR Schleife, also ich nutze Prog. (*B*) dann wird mehr aufsummiert und der Mittelwert läuft langsam hoch.
Kann mir jemand sagen was das Problem ist.?
Hier noch das ganze Programm:
(*
Gleitende- Mittelwertbildung über x Zeiteinheiten zb. ms und über x (max 10) Werte.
Hinweise:
AbtastWerte min 1 - max 10 weil von Hand auf Array Werte[ 10 ]
Abtastzeit time#5s
*)
TON_1( i, Abtastzeit );
If TON_1.Q = TRUE THEN; (*wenn Zeit abgelaufen dann schreibe Wert auf die Zelle X*)
Werte[Zaehler] := IstWerte;
Zaehler := Zaehler + 1; (*erhöhe Laufindex*)
i := FALSE; (**)
END_IF;
If TON_1.Q = FALSE THEN; (*wenn Zeit abgelaufen dann i=1*)
i := TRUE;
END_IF;
IF AbtastWerte = Zaehler THEN (*wenn Inhalt von AbtastWerte = Zaehler neustart*)
Zaehler := 0;
END_IF;
(*A*)
(*Mittelwertbildung über die AbtastWerte 0...X *)
IF i = TRUE THEN (*wenn Abtastzeit abgelaufen dann rechne *)
AbtastWerteREAL := ANY_TO_REAL (AbtastWerte); (* konvertiere nach REAL*)
Summe := Werte[0]+Werte[1]+Werte[2]+Werte[3]+Werte[4]+Werte[5]+Werte[6]+Werte[7]+Werte[8]+Werte[9] ;
Mittelwert := Summe / AbtastWerteREAL;
END_IF;
(*B*)
(*-----------------------------------------------------------------------------------------------------*)
IF i = TRUE THEN (*wenn i dann rechne *)
FOR z := 0 TO AbtastWerte BY 1 DO
Summe := Summe + Werte[ z ];
END_FOR;
AbtastWerteREAL := ANY_TO_REAL (AbtastWerte); (* konvertiere nach REAL*)
Mittelwert := Summe / AbtastWerteREAL ;
END_IF;
Wenn die Abtastzeit abgelaufen ist dann Summiere auf und teile durch die AbtastWerte.
Das funktioniert mit dem Prog. (*A*) wunderbar.
Nehme ich stattdessen eine FOR Schleife, also ich nutze Prog. (*B*) dann wird mehr aufsummiert und der Mittelwert läuft langsam hoch.
Kann mir jemand sagen was das Problem ist.?
Hier noch das ganze Programm:
(*
Gleitende- Mittelwertbildung über x Zeiteinheiten zb. ms und über x (max 10) Werte.
Hinweise:
AbtastWerte min 1 - max 10 weil von Hand auf Array Werte[ 10 ]
Abtastzeit time#5s
*)
TON_1( i, Abtastzeit );
If TON_1.Q = TRUE THEN; (*wenn Zeit abgelaufen dann schreibe Wert auf die Zelle X*)
Werte[Zaehler] := IstWerte;
Zaehler := Zaehler + 1; (*erhöhe Laufindex*)
i := FALSE; (**)
END_IF;
If TON_1.Q = FALSE THEN; (*wenn Zeit abgelaufen dann i=1*)
i := TRUE;
END_IF;
IF AbtastWerte = Zaehler THEN (*wenn Inhalt von AbtastWerte = Zaehler neustart*)
Zaehler := 0;
END_IF;
(*A*)
(*Mittelwertbildung über die AbtastWerte 0...X *)
IF i = TRUE THEN (*wenn Abtastzeit abgelaufen dann rechne *)
AbtastWerteREAL := ANY_TO_REAL (AbtastWerte); (* konvertiere nach REAL*)
Summe := Werte[0]+Werte[1]+Werte[2]+Werte[3]+Werte[4]+Werte[5]+Werte[6]+Werte[7]+Werte[8]+Werte[9] ;
Mittelwert := Summe / AbtastWerteREAL;
END_IF;
(*B*)
(*-----------------------------------------------------------------------------------------------------*)
IF i = TRUE THEN (*wenn i dann rechne *)
FOR z := 0 TO AbtastWerte BY 1 DO
Summe := Summe + Werte[ z ];
END_FOR;
AbtastWerteREAL := ANY_TO_REAL (AbtastWerte); (* konvertiere nach REAL*)
Mittelwert := Summe / AbtastWerteREAL ;
END_IF;