Welcome to our new forum
All users of the legacy CODESYS Forums, please create a new account at account.codesys.com. But make sure to use the same E-Mail address as in the old Forum. Then your posts will be matched. Close

Messwerte glätten aus MCP3008

roccowille
2017-09-02
2017-09-06
  • roccowille - 2017-09-02

    Hallo Zusammen,

    ich wollte ein paar analoge Messwerte glätten.
    Zunächst habe ich eine Mittelwertbildung programmiert. Der Mittelwert war immer sehr ähnlich dem aktuellen Messwert.
    Dann habe ich ein Array genutzt und mit Breakpunkten gearbeitet und festgestell, dass alle Felder des Arrays immer mit dem gleichen Messwert gefüllt werden.
    Es wird also vermutlich irgendwo ein logischer Fehler in der Programmierung sein, dass nicht in jedem Feld des Arrays ein anderer Messwert steht. Kann mit jemand helfen?

    FOR iZaehler:=0 TO 19 DO
    aiWerte[iZaehler] := (MCP3008.auiValue[6]);
    END_FOR

    Vielen Dank!

     
  • Anonymous - 2017-09-04

    Originally created by: Codesys>>Twincat

    In deinem Code kopierst du an jede Stelle im Array den Wert von MCP3008.auivalue[6]. Ich verstehe nicht ganz das Ziel ist. Wenn das Array mit gleicher Größe einfach kopiert werden soll geht das bestimmt auch einfacher, ansonsten:

    FOR iZaehler:=0 TO 19 DO
    aiWerte[iZaehler] := (MCP3008.auiValue[iZaehler]);
    END_FOR
    
     
  • roccowille - 2017-09-04

    Die Messwerte vom MCP schwanken sehr. Ich wollte in jedesmal feld des Array einen neuen Wert eintragen. Und daraus einen Mittelwert machen.
    Dass in jedem Feld nun der gleiche Messwert steht, habe ich schon vermutet. Ich weiß aber nicht, wo der Fehler ist und warum in jedem Feld der gleiche Wert steht.
    Ich dachte, dass bei jedem Schleifendurchlauf der aktuelle Messwert in das aktuelle Feld geschrieben wird.
    Auf jeden Fall schon mal Danke für das Feedback!!!

    Codesys>>Twincat hat geschrieben:
    In deinem Code kopierst du an jede Stelle im Array den Wert von MCP3008.auivalue[6]. Ich verstehe nicht ganz das Ziel ist. Wenn das Array mit gleicher Größe einfach kopiert werden soll geht das bestimmt auch einfacher, ansonsten:

    FOR iZaehler:=0 TO 19 DO
    aiWerte[iZaehler] := (MCP3008.auiValue[iZaehler]);
    END_FOR
    
     
  • eschwellinger

    eschwellinger - 2017-09-04

    Hi,
    kann es sein das in MCP3008.auiValue[6] nur pro Zyklus ein Messwert liefert?
    Nehme an [6] bedeutet Kanal 6 des Bausteins d.h du müsstest dein Array über 20 Zyklen befüllen
    das eben nicht in einer For Schleife.... (weil die macht er ja innerhalb eines SPS Zykluses daher immer der gleiche Wert)

    Grüße
    Edwin

     
  • roccowille - 2017-09-04

    Hallo Edwin,

    wahrscheinlich ist dieses Zyklusthema der Punkt. Als Rookie was codesys betrifft bin ich mit meinem Programmierwissen an die Sache herangegangen.
    Im Forum habe ich einen Beitrag zum Thema Messwerte gefunden, der mit Timer arbeitet.
    Das hat bei mir aber nicht ganz funktioniert. Ja, Nr. 6 ist Kanal 6 am MCP.
    Kannst Du mir noch einen Tipp geben?
    Vielen Dank im voraus!

    Beste grüsse
    Rocco

    Edwin Schwellinger hat geschrieben:
    Hi,
    kann es sein das in MCP3008.auiValue[6] nur pro Zyklus ein Messwert liefert?
    Nehme an [6] bedeutet Kanal 6 des Bausteins d.h du müsstest dein Array über 20 Zyklen befüllen
    das eben nicht in einer For Schleife.... (weil die macht er ja innerhalb eines SPS Zykluses daher immer der gleiche Wert)
    Grüße
    Edwin

     
  • eschwellinger

    eschwellinger - 2017-09-05

    Hi,
    hm.. gibt viele Möglichkeiten, eine davon wäre ne Statemachine etwa so:

    CASE iState OF
       0:
          aiWerte[iZaehler] := (MCP3008.auiValue[6]);
          iState:=iState+1;
       1:
          aiWerte[iZaehler] := (MCP3008.auiValue[6]);
          iState:=iState+1;
       2:
          aiWerte[iZaehler] := (MCP3008.auiValue[6]);
          iState:=iState+1;
       3:
       .
       .   
       19:
          aiWerte[iZaehler] := (MCP3008.auiValue[6]);
          iState:=iState+1;
       
       20:
          iState:=0;
    END_CASE
    

    Grüße
    Edwin

     
  • Anonymous - 2017-09-05

    Originally created by: jl

    Hallo

    Ich habe mit CoDeSys V3 noch nicht gearbeitet, in V2.3 gibt es den FUB "STATISTICS_REAL" der LIB "Util" der den Minimum, Maximum und Mittelwert einer Variable ermittelt.

    LG

     
  • roccowille - 2017-09-05

    Hallo Edwin,

    Vielen Dank für den Tipp.
    Deinen Code kann ich nachvollziehen, weiß nur nicht genau, wie ich ihn in die Schleife einbinden soll.
    Ich sag vielleicht auch noch mal, was ich überhaupt vorhabe
    An meinem MCP hängt ein Drucksensor, mit dem ich den Füllstand anzeigen lassen will.
    Weil eben die Werte vom MCP doch sehr schwanken, wollte ich einen Mittelwert aus eine Reihe von 20 Werten bilden.
    Wenn ich Dein Beispiel nehme und dann vielleicht 50 Messwerte mitteln will, dann muss ich doch nicht etwa 50 Cases beschreiben?
    Vielleicht stehe ich ja auch noch immer etwas auf dem Schlauch.
    Im Forum habe ich ebenfalls diese Möglichkeit gefunden https://forum-de.codesys.com/viewtopic.php?t=4917#p15909

    Viele Grüße
    Rocco

    Edwin Schwellinger hat geschrieben:
    Hi,
    hm.. gibt viele Möglichkeiten, eine davon wäre ne Statemachine etwa so:

    CASE iState OF
       0:
          aiWerte[iZaehler] := (MCP3008.auiValue[6]);
          iState:=iState+1;
       1:
          aiWerte[iZaehler] := (MCP3008.auiValue[6]);
          iState:=iState+1;
       2:
          aiWerte[iZaehler] := (MCP3008.auiValue[6]);
          iState:=iState+1;
       3:
       .
       .   
       19:
          aiWerte[iZaehler] := (MCP3008.auiValue[6]);
          iState:=iState+1;
       
       20:
          iState:=0;
    END_CASE
    

    Grüße
    Edwin

     
  • Anonymous - 2017-09-06

    Originally created by: jl

    zaehler := zaehler + 1;
    aiWerteSumme := aiWerteSumme + (MCP3008.auiValue[6]);

    IF zaehler = 20 then
    aiWerte_Mittelwert := aiWerteSumme / 20;
    aiWerteSumme := 0;
    zaehler := 0;
    END_IF

     

Log in to post a comment.