CODESYS - das IEC 61131-3 Programmiersystem

Willkommen im offiziellen CODESYS - Forum von 3S-Smart Software Solutions
Deutsche Version English version russian version 
Aktuelle Zeit: Fr Dez 15, 2017 8:10 am

Alle Zeiten sind UTC




Ein neues Thema erstellen  Auf das Thema antworten  [ 9 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Messwerte glätten aus MCP3008
BeitragVerfasst: Sa Sep 02, 2017 1:05 pm 
Offline

Registriert: Do Jan 19, 2017 7:44 pm
Beiträge: 13
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!


Nach oben
   
 Betreff des Beitrags: Re: Messwerte glätten aus MCP3008
BeitragVerfasst: Mo Sep 04, 2017 1:32 pm 
Offline

Registriert: Do Aug 10, 2017 12:37 pm
Beiträge: 8
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:

Code:

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



Nach oben
   
 Betreff des Beitrags: Re: Messwerte glätten aus MCP3008
BeitragVerfasst: Mo Sep 04, 2017 5:18 pm 
Offline

Registriert: Do Jan 19, 2017 7:44 pm
Beiträge: 13
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:

Code:

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



Nach oben
   
 Betreff des Beitrags: Re: Messwerte glätten aus MCP3008
BeitragVerfasst: Mo Sep 04, 2017 8:09 pm 
Offline
Site Admin

Registriert: Mo Sep 05, 2005 8:42 am
Beiträge: 2330
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


Nach oben
   
 Betreff des Beitrags: Re: Messwerte glätten aus MCP3008
BeitragVerfasst: Mo Sep 04, 2017 8:43 pm 
Offline

Registriert: Do Jan 19, 2017 7:44 pm
Beiträge: 13
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


Nach oben
   
 Betreff des Beitrags: Re: Messwerte glätten aus MCP3008
BeitragVerfasst: Di Sep 05, 2017 5:39 am 
Offline
Site Admin

Registriert: Mo Sep 05, 2005 8:42 am
Beiträge: 2330
Hi,
hm.. gibt viele Möglichkeiten, eine davon wäre ne Statemachine etwa so:

Code:
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


Nach oben
   
 Betreff des Beitrags: Re: Messwerte glätten aus MCP3008
BeitragVerfasst: Di Sep 05, 2017 11:48 am 
Offline

Registriert: Mi Jun 03, 2009 5:41 am
Beiträge: 24
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


Nach oben
   
 Betreff des Beitrags: Re: Messwerte glätten aus MCP3008
BeitragVerfasst: Di Sep 05, 2017 6:51 pm 
Offline

Registriert: Do Jan 19, 2017 7:44 pm
Beiträge: 13
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 :D
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, funktioniert aber nicht richtig bei mir.

Viele Grüße
Rocco

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

Code:
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


Nach oben
   
 Betreff des Beitrags: Re: Messwerte glätten aus MCP3008
BeitragVerfasst: Mi Sep 06, 2017 11:33 am 
Offline

Registriert: Mi Jun 03, 2009 5:41 am
Beiträge: 24
zaehler := zaehler + 1;
aiWerteSumme := aiWerteSumme + (MCP3008.auiValue[6]);

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


Nach oben
   
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen  Auf das Thema antworten  [ 9 Beiträge ] 

Alle Zeiten sind UTC


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast


Sie dürfen keine neuen Themen in diesem Forum erstellen.
Sie dürfen keine Antworten zu Themen in diesem Forum erstellen.
Sie dürfen Ihre Beiträge in diesem Forum nicht ändern.
Sie dürfen Ihre Beiträge in diesem Forum nicht löschen.
Sie dürfen keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
Powered by phpBB® Forum Software © phpBB Limited
Deutsche Übersetzung durch phpBB.de