Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Seite 1 von 4 123 ... LetzteLetzte
Ergebnis 1 bis 10 von 34

Thema: Werte glätten

  1. #1
    Registriert seit
    27.09.2008
    Beiträge
    201
    Danke
    21
    Erhielt 11 Danke für 10 Beiträge

    Frage


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo allerseits.
    Habe schon einiges hier im Forum gelesen und leider gesehen, dass ich letztes Wochenende in Bielefeld wohl gefehlt habe.
    Hiermit melde ich mich mal mit einem ersten Thread und natürlich als Neuling in dem gesamten Programmierthema speziell in bezug auf ST mit einer dummen Frage.

    Die Suche habe ich schon zu Rate gezogen, konnte aber bisher aus den gegebenen Antworten nichts passendes für mich triangulieren.. (liegt wohl an Unerfahrenheit)

    Ich habe zwar Beispiele zum Glätten von Eingangswerten für AWL und SCL gesehen, konnte dies aber nicht in ST übertragen.

    Wie sähe ein Codeschnipsel aus, mit dem ich einen WORD-Wert (von Busklemmen eines WAGO Feldbusknoten 750-841) der stark pendelt um Ausreisser bereinige und mit dem ich ein relativ sauberes gemitteltes Ausgangssignal erhalte?

    Ich bin froh, dass es im Internet Foren dieser Art gibt.

    Gruss

    McNugget
    Zitieren Zitieren Werte glätten  

  2. #2
    Registriert seit
    14.08.2004
    Beiträge
    827
    Danke
    45
    Erhielt 73 Danke für 66 Beiträge

    Standard

    Bsp:

    Code:
    durchschnitt := 0
    FOR I:=1 TO 10 DO 
      durchschnitt := durchschnitt + messwert[i];
    END_FOR
    durchschnitt := durchschnitt/10;

  3. Folgender Benutzer sagt Danke zu drfunfrock für den nützlichen Beitrag:

    McNugget (29.09.2008)

  4. #3
    McNugget ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    27.09.2008
    Beiträge
    201
    Danke
    21
    Erhielt 11 Danke für 10 Beiträge

    Standard

    Wow.

    Das war mal schnell.

    Vielen Dank.

    McNugget

  5. #4
    McNugget ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    27.09.2008
    Beiträge
    201
    Danke
    21
    Erhielt 11 Danke für 10 Beiträge

    Standard

    OK.. Habe es mal versucht:
    Läuft nicht.

    Deklarationsteil:
    FUNCTION_BLOCK FIlter_AI
    VAR_INPUT
    IN: WORD ;
    END_VAR

    VAR_OUTPUT
    Durchschnitt: WORD;
    END_VAR

    VAR
    Messwert:ARRAY[1..10 ] OF WORD;
    I: INT;
    Out: BOOL;
    END_VAR

    Anweisungsteil:
    Durchschnitt:=0;

    FOR i:=1 TO 10 DO
    Durchschnitt := Durchschnitt + messwert[i];
    END_FOR
    Durchschnitt := Durchschnitt/10;


    Der Eingang "IN" müsste doch irgendwo explizit einfliessen, oder?
    Ausserdem setzt sich der Baustein doch immer wieder auf "0" zurück.

    Wie gesagt: blutigster Anfänger in puncto Schleifen.

    Gruss

    McNugget

  6. #5
    Registriert seit
    07.03.2004
    Beiträge
    4.369
    Danke
    946
    Erhielt 1.158 Danke für 831 Beiträge

    Standard

    Ohne zu testen:
    Code:
    IF j > 10 THEN
        j := 1;
    END_IF;
    
    messwerte[j] := ExtMesswert;
    
    durchschnitt := 0;
    FOR i:=1 TO 10 DO
      durchschnitt := durchschnitt + messwerte[i];
    END_FOR
    durchschnitt := durchschnitt/10;
    j := j + 1;
    Man hat ein Array in dem die letzten 10 Messwerte gespeichert werden. Dieses Array wird dann wie von drfunfrock beschrieben aufaddiert und durch die Anzahl der Elemente dividiert was den Durchschnitt ergibt.
    If you open your Mind too much, your Brain will fall out.

  7. Folgender Benutzer sagt Danke zu zotos für den nützlichen Beitrag:

    McNugget (29.09.2008)

  8. #6
    McNugget ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    27.09.2008
    Beiträge
    201
    Danke
    21
    Erhielt 11 Danke für 10 Beiträge

    Standard

    Vielen Dank Zotos,

    ok, hier im Forum geht es etwas fixer zu.. Sehr cool.

    Ich habe es so übernommen, aber nun passiert folgendes:

    Das Array füllt sich in allen 10 Zeilenmit Werten zwischen 17000 und 17200, aber der errechnete Durchschnitt pendelt immer so um die 4000.

    Da ist doch irgendwo noch der Wurm drin. oder habe ich irgendwas falsch übertragen?

    Kann man den Wert Durchschnitt mit etwas anderem als einer 0 initialisieren?
    Zum Beispiel einmalig der Aktualwert am Eingang?

    Gruss

    McNugget


    PS: Zotos: Kann es sein, dass Du den Anhalter gelesen hast?
    Geändert von McNugget (29.09.2008 um 15:21 Uhr)

  9. #7
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.840
    Danke
    400
    Erhielt 2.427 Danke für 2.023 Beiträge

    Standard

    Das Beispiel von Zotos sieht für mich gut aus ... was mir nicht so gefällt ist das du in deinem Beispiel mit dem Variablentyp WORD arbeitest. Das könnte ggf. schon das Problem sein. Ansonsten stell doch einfach mal den Code deines Bausteins hier ein ...

  10. #8
    Registriert seit
    27.04.2006
    Ort
    Sauerland
    Beiträge
    626
    Danke
    183
    Erhielt 88 Danke für 81 Beiträge

    Standard

    Also ich würde das so machen:

    Code:
    durchschnitt:=(durchschnitt*10+messwert)/11;
    ist etwas übersichtlicher und schneller.
    Die Kunst in der Personalführung ist es
    die Mitarbeiter so über den Tisch zu ziehen,
    dass sie die Reibungshitze als Nestwärme empfinden.

  11. #9
    McNugget ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    27.09.2008
    Beiträge
    201
    Danke
    21
    Erhielt 11 Danke für 10 Beiträge

    Standard

    Hallo Larry,

    die analoge Eingangsklemme liefert direkt ein Word. Ich möchte den Wert so früh wie möglich im System "beruhigen", bzw. glätten, und erst dann mit Typkonvertierungen beginnen, um eventuelle Rundungsfehler etc. möglichst zu minimieren.
    Ist der Ansatz falsch?

    Deklaration:
    FUNCTION_BLOCK FIlter_AI
    VAR_INPUT
    IN: WORD ;
    END_VAR

    VAR_OUTPUT
    Durchschnitt: WORD;
    END_VAR

    VAR
    Messwerte:ARRAY[1..1000 ] OF WORD;
    I: INT;
    j: INT;
    END_VAR


    Anweisungsteil:

    IF j > 10 THEN
    j := 1;
    END_IF;

    messwerte[j] := IN;

    durchschnitt := 0;
    FOR i:=1 TO 10 DO
    durchschnitt := durchschnitt + messwerte[i];
    END_FOR
    durchschnitt := durchschnitt/10;
    j := j + 1;


    Bin begeistert von der Anteilnahme.

    Gruss

    McNugget

  12. #10
    Registriert seit
    14.08.2004
    Beiträge
    827
    Danke
    45
    Erhielt 73 Danke für 66 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Ich hatte ebenfalls vergessen, dass man natürlich nicht in eine Word-Var aufaddiert, weil es dann zu Überläufen kommt. Meine Var durchschnitt muss dann grösser als WORD sein. Nimm einfach UDINT.

  13. Folgender Benutzer sagt Danke zu drfunfrock für den nützlichen Beitrag:

    repök (29.09.2008)

Ähnliche Themen

  1. analoge Messwerte glätten
    Von xinix im Forum CODESYS und IEC61131
    Antworten: 14
    Letzter Beitrag: 15.03.2011, 11:09
  2. Antworten: 5
    Letzter Beitrag: 14.09.2010, 17:56
  3. Werte in DB schreiben
    Von SolSna im Forum Simatic
    Antworten: 10
    Letzter Beitrag: 23.01.2008, 13:54
  4. CP 340 / 2 Werte vom PC in ein DB der SPS
    Von maxi im Forum Simatic
    Antworten: 12
    Letzter Beitrag: 16.08.2006, 12:18
  5. Anlogwert glätten
    Von fbeine im Forum Simatic
    Antworten: 9
    Letzter Beitrag: 31.03.2006, 12:00

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •