Mittelwertbildung S5-95U

demo

Level-1
Beiträge
15
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo!
Ich messe mit einer S5 einen Wasserstand. Mein Problem ist, dass teilweise ziemliche Turbulenzen im Wasser vorhanden sind und der Messwert dadurch springt.
Ich möchte daher meinen Messwert tiefpassfiltern. Dazu habe ich mir überlegt, die letzten 8 Messwerte aufsummieren und dann das Ergebnis 3 Bit nach links zu schieben um durch 8 zu dividieren.
Weiss vielleicht irgendwer, wie ich mit der S5 die letzten Werte möglichst einfach abspeichere und den ältersten Wert duch den aktuellen ersetze? Gibt es vielleicht so was ähnliches wie ein Array, auf das ich mit einem Zähler direkt zugreifen kann?

Vielen Dank für eure Hilfe!
 
Bei 8 Meßwerten kannst du das zu Fuß machen oder aber mit indirekter Adressierung. Bei der S5 war das der sogeannte "Bearbeite-Befehl" B.
Ich würde bei jedem neuen Messwert (Flanke) wie folgt vorgehen:

Nimm z.Bsp. einen DB, DW 1-8 für deine Messwerte.

1. Variante
-Schieben der Messwerte
DW7 nach DW8
DW6 nach DW7
...
DW1 nach DW2
-neuen Messwert eintragen
Neuer Meßwert in DW1

-Alles addieren und dann durch 8 teilen.

2.Variante um etwas Rechenzeit zu sparen
-Schieben der Messwerte
DW8 nach DW9
DW7 nach DW8
DW6 nach DW7
...
DW1 nach DW2
-Neuen Messwert eintragen
Neuer Meßwert in DW1

-letzen Messwert raus aus der Summe, neuen Messwert rein (spart ein paar Rechenoperationen)
Neue Summe = Alte Summe - DW9 + DW1;
Alte Summe = Neue Summe

PS: Achtung, reicht dir ein DW für das Aufsummieren von 8 Messwerten aus?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

zum Dividieren auf alle Fälle nach rechts verschieben!

Ansonsten Flankengesteuert die Messwerte verschieben.

z.B.
L MW 20 alter 7.Wert
T MW 22 neuer 8. Wert
L MW 24 alter 6. Wert
T MW 22 neuer 7. Wert
....

L neusten Wert
T alter 1. Wert

Gruß
raika

Edit: War ich wohl zu langsam.
 
noch ne Variante

Ich hab das letzten's mal so realisiert. Die Anzahl der Mittelwert kannst du an über n einstellen.
Die statischen Var's musst du halt per IN-OUT in den Baustein bringen.
Den Code kannst du ja übersetzen lassen und als awl nach S5 verschieben, oder?


hth

Code:
FUNCTION_BLOCK FB215
TITLE = 'Mittelwert'
//
// Beschreibung:
// Mittelt einen Analogwert über die letzten n Werte.
VERSION : '1.0'
AUTHOR  : 'FA/ST'
NAME    : 'MITTEL'
FAMILY  : 'CONTR'
 
// Bausteinparameter
VAR_INPUT
  // Eingangsparameter
    IN : REAL; // Analogwert (in REAL - Format)
    n : INT; // Anzahl der Werte        
    Reset : BOOL ;// Reset des internen Zählers
END_VAR
VAR_OUTPUT
 // Ausgangsparameter
    MittelWert : REAL; // Gemittelter Wert
END_VAR
VAR
  // statische Variablen
    z : INT; // Aktueller Zähler
    Sum_in : REAL; // Zwischenwert
END_VAR
 
BEGIN
 
  // Anweisungsteil
  IF Reset OR z > n THEN
      z := 0;
      sum_in := 0;
  END_IF;
  IF z < n THEN
       sum_in := sum_in + IN;
       z := z+1;
  ELSE
      sum_in := sum_in + IN - Mittelwert;
  END_IF;
  Mittelwert := sum_in / z;
END_FUNCTION_BLOCK
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Vielen Dank für die zahlreichen Lösungen!

Ich werde einen Datenbaustein benutzen und den Lösungsvorschlag von Ralle nehmen.

Ich habe mir auch schon Gedanken darüber gemancht, ob ein Wort, also 16 Bit ausreichen.
Welche einfachen Möglichkeiten gibt es mit einem größeren Wert als 16 Bit zu arbeiten ohne Genauigkeit zu verlieren?
 
Na es gibt bei S5 doch die gute, alte Gleitpunktzahl (32Bit). Dann müsstest Du natürlich nicht MW und DW sondern MD und DD benutzen...
Umwandeln Festpunktzahlen (DW) nach Gleitpunktzahlen (DD) geht bei S5 mit dem Befehl FDG bzw GFD umgekehrt. Die Befehle gehören zum sog. "erweiterten Befehlssatz", man kann sie also nur in einem FB und nciht innerhalb eines PB benutzen..

Ui, ich sehe gerade, dass Du ne 95U hast... Dann wird das wohl nix mit Gleitpunktzahlen...

Gruß Aprox
 
Kann die S5 kein Gleitpunkt?
Du kannst auch die Division für jeden Summanden einzel ausführen und hinterher zusammenzählen.
 
Wenn Du Gleitpunktzahlen addierst und dann durch 8 teilst, müsstest Du eigentlich an Genauigkeit hinzugewinnen, da sich ja auch Kommazahlen realisieren lassen (z.B. 17 mal addieren und durch 17 teilen).
Aber mit 3 Bit schieben geht die Division durch 8 bei Gleitpunktzahlen nicht mehr.
Da musst Du dann wirklich schreiben:
A DB x
L DD (Summe Addition)
L KG 8.000000+01
/G
T DD (Ergebnis Mittelwert)

Aber meines Wissens geht Gleitpunktarithmetik erst bei einem AG 115U los. Du musst wohl mit 16Bit auskommen. ;-)

Gruß Apro
 
Zurück
Oben