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
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!
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
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:
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:
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
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
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
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Hi,
hm.. gibt viele Möglichkeiten, eine davon wäre ne Statemachine etwa so:
CASEiStateOF  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
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
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
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
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:
CASEiStateOF  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
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
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!
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:
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!!!
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
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
Hi,
hm.. gibt viele Möglichkeiten, eine davon wäre ne Statemachine etwa so:
Grüße
Edwin
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
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
Grüße
Edwin
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