Analogwert verzögert in mw speichern

Kaih

Level-1
Beiträge
17
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Erst mal hallo an alle!!!!

Nun zu meiner Frage
Ich suche nach einer Möglichkeit um Analogwerte verzögert einzulesen sodass ich aus ihnen einen Mittelwert bilden kann. Imoment wird der Wert permanent aktualisiert, ich suche aber nach einer lösung um diesen Wert z.b. alle 5s einmal einzulesen und ihn in einem mw zu speichern.
danke im vorraus
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
eine Mittelwert-Bildung läuft nur, wenn du mehrere Werte hast ...
Du könntest z.B. im OB35 mit entsprechendem Intervall (z.B. 100 ms) deinen Analog-Eingang in ein FIFO einlesen und aus dem FIFO immer die ersten 50 Werte addieren und durch 50 teilen. Damit hast du einen gedämpften Mittelwert, der sich aus der Werte der letzten 5 s ergibt ...

OHGN hat das Stichwort auch schon gegeben ...
 
Ich hätte da was in SCL:

Code:
FUNCTION_BLOCK FB109

VAR_INPUT
    Start: BOOL;
    Anzahl: INT;
    Messwert: INT;
END_VAR

VAR_OUTPUT
    Fertig: BOOL;
    Messwertmittel: INT;
END_VAR

VAR_TEMP
    // temporäre Variablen
    Messwertsumme: DINT;
END_VAR
VAR
    // statische Variablen
  Startflanke: BOOL;
  I, K: INT;
  Fertig_stat: BOOL;
  Messwertmittel_stat: INT;
  arMesswert: ARRAY[1..100] OF INT;
END_VAR

    IF Anzahl > 100 THEN
        Anzahl := 100;
    END_IF;    

    // Startflanke
    IF Start AND NOT Startflanke THEN
        Messwertsumme := 0;
        Fertig_stat := False;
        Startflanke := True;
        I := 0;
    END_IF;
    
    IF Start AND Startflanke AND NOT Fertig_stat THEN
        I := I + 1; 
        arMesswert[I] := Messwert;            
    END_IF;
    
    IF I = Anzahl THEN
        Messwertsumme := 0;
        FOR K := 1 TO Anzahl DO
            Messwertsumme := Messwertsumme + arMesswert[K];
        END_FOR;           
        Messwertmittel_stat := DINT_TO_INT(Messwertsumme DIV Anzahl);
        Fertig_stat := True;
    END_IF; 
   
    IF NOT Start THEN
        StartFlanke := FALSE;
        Fertig_stat := False;
    END_IF;
    
    Messwertmittel := Messwertmittel_Stat;
    Fertig := Fertig_stat;       
    ;
END_FUNCTION_BLOCK

Bei Start wird die eingestellte Anzahl der Messwerte (max. 100) aufgenommen, bei Fertig wird der Messmittelwert ausgegeben.

Aufruf des Bausteines wie folgt:

Code:
      UN    "MS03 HM Fertig1 oben"
      =     "MS03 HM Start1 oben"

      CALL  "MITTELWERT" , "IDB_Mittelwert_o1"
       Start         :="MS03 HM Start1 oben"
       Anzahl        :=100
       Messwert      :="DATA_STATION_03".Norm_Out_oben
       Fertig        :="MS03 HM Fertig1 oben"
       Messwertmittel:="DATA_STATION_03".Norm_Out_oben_mw_anzeig

Solltest du keine SCL haben, kann ich dir auch den übersetzten Baustein schicken.
 
Wenn man ohnehin nur den Mittelwert braucht, kann man die Meßwerte n-mal zu einer Speichervariablen addieren und dann durch n teilen. Dann braucht man nur 2 Variablen.

Etwa so


U Trigger
SPBN gnlh

L Meßwertespeicher
L Meßwerteingang
+D
T Meßwertespeicher

gnlh: L n
L Schleifenzähler
>=D
SPBN
L Meßwertespeicher
L n
/D
T Mittelwert

ende: SET
R Trigger
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
@Frank:
nur mal so am Rande ... aus welchen Werten bildest du denn den Mittelwert ? ... und worauf bezieht sich dieser ?

Also ich fand das Beispiel von Ralle da schon sehr treffend ...
 
Glättung

Hallo,

wenn nur ein Wert etwas geglättet werden soll: (gespeicherter Wert + gelesener Wert) / 2

Alle frischen Änderungen werden pro Aufruf nur zur Hälfte übernommen. Manchmal reicht das.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
schön wäre zu wissen was er machen will, dann kann man eher helfen.

mir wäre spontan keine anwendung bekannt wo es sinn macht einen wert nur alle 5s zu lesen, ausser der wert soll in einen speicher...

ich hätte noch einen filter zu bieten:

FilterWert := ((x - FilterWert ) * Konst ) + FilterWert
 
@Frank:
nur mal so am Rande ... aus welchen Werten bildest du denn den Mittelwert ? ... und worauf bezieht sich dieser ?

es bezieht sich auf die Variable "Messwert"; dabei wird der letzte berechnete Mittelwert immer wieder für die neue Berechnung verwendet und man benötigt nur 2 Variablen
 
Also Ich habs jetzt mit einem OB35 gelöst und mit mehren FBs die immer nach einer bestimmten Zeit einen Wert aufnehmen und ihn dann ausgeben und miteinander verrechnen so kommt es zu keinen großen schwankungen. War eine sehr große hilfe danke an euch alle:p
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Also Ich habs jetzt mit einem OB35 gelöst und mit mehren FBs die immer nach einer bestimmten Zeit einen Wert aufnehmen und ihn dann ausgeben und miteinander verrechnen so kommt es zu keinen großen schwankungen. War eine sehr große hilfe danke an euch alle:p


verstehe mich nicht falsch - aber so wie sich das anhört hast du viel zu kompliziert gedacht und es somit auch recht kompliziert gelöst...

warum brauchst du mehre fbs?
 
Zurück
Oben