Aus einem ARRAY ausgewählte Werte in ein anderes ARRAY kopieren

lacosta19

Level-1
Beiträge
16
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

ich habe ein Problem: Ich möchte aus einem ARRAY bestimmte REAL-Werte rauskopiert haben und in ein anderes ARRAY diese abzulegen. Von der Serielle Schnittstelle bekomme ich ein Packet von 26 Bytes, an der Stelle (ARRAY[6] -> MOVE -> Wert) lese ich meinen Wert aus, der sich ständig, durch die Messung, ändert. Nun möchte ich für die Ermittlung des Mittelwertes diese Werte in einem separatem ARRAY ablegen (es müssen 10 Werte abgeleget werden). Da ich leider in CodeSys ein Anfänger bin, kenne ich mich nicht so gut aus ... Ich habe mit dem Baustein "SysMemCpy" versucht dies zu realisieren und es wird, wie erwartet, nur überschrieben...

Kann mir bitte dabei jemand Hilfestellung geben, wie ich es am besten umsetzten kann

Vielen Dank im Vorraus
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

du kannst dein Ziel mit Hilfe eines Index übergeben.
Variante 1:
Also Ziel_Array := Quellwert
Wenn du nun "i" hochzählst, dann werden die Daten im Array an die jeweilige Stelle kopiert.

Variante 2:
Du willst den fortlaufenden Mittelwert aus 10 Werten.
Dafür musst du sobald ein neuer Wert ermittelt wird dein Ziel-Array weiterschieben (so ne Art Schieberegister)

Also z.b.
If New_Value then
Ziel_Array[10] := Ziel_Array[9];
Ziel_Array[9] := Ziel_Array[8];
.....
Ziel_Array[2] := Ziel_Array[1];
Ziel_Array[1] := Quellwert;
New_Value := False;
End_IF

Wobei man sowas dann lieber mit einer Schleife machen sollte, da du bei einem Mittelwert aus 100 Werten vom Tippen Blasen an den Fingern bekommen würdest.
 
Was wird nur überschrieben? Dein Quell-Array? Zeige mal deine Implementation von Sysmemcpy.
Hallo, vielen Dank für die Antwort. Es wird ("pReceiveStr2 [0..26] OF BYTE" -> Quelle) überschrieben, mit jeder (50ms Takt) Auslesung:
Unbenannt.JPG
wobei die "gemessene_Länge": REAL Typ entspricht und "Laenge_buffer[0]" von Typ BYTE ist. Ich weiß nicht warum aber wenn ich "Laenge_buffer[0..9] OF REAL" deklariere, dann wird es nichts in "Laenge_buffer" reingeschrieben ...
 
Zuletzt bearbeitet:
Hallo,

du kannst dein Ziel mit Hilfe eines Index übergeben.
Variante 1:
Also Ziel_Array := Quellwert
Wenn du nun "i" hochzählst, dann werden die Daten im Array an die jeweilige Stelle kopiert.

Variante 2:
Du willst den fortlaufenden Mittelwert aus 10 Werten.
Dafür musst du sobald ein neuer Wert ermittelt wird dein Ziel-Array weiterschieben (so ne Art Schieberegister)

Also z.b.
If New_Value then
Ziel_Array[10] := Ziel_Array[9];
Ziel_Array[9] := Ziel_Array[8];
.....
Ziel_Array[2] := Ziel_Array[1];
Ziel_Array[1] := Quellwert;
New_Value := False;
End_IF

Wobei man sowas dann lieber mit einer Schleife machen sollte, da du bei einem Mittelwert aus 100 Werten vom Tippen Blasen an den Fingern bekommen würdest.


Vielen Dank für die Antwort
Variante 1:
Meinst du so etwas?
FOR i := 0 TO 9 DO
arr1 := gemessene_Laenge;
END_FOR;

Würde in diesem Fall Index i automatisch hochzählen oder muss ich noch dazu i := i+1 schreiben? Diese Kenntnisse fehlen mir einfach...
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
i:= i+1 brauchst du nicht schreiben da das die FOR Schleife automatisch macht (wenn du keine andere Schrittweite für die Schleife angibst).

Allerdings würdest du mit dem Programmcode in alle Elemente von Arr1 den gleichen Wert schreiben.

Grund ist, bei der Abarbeitung des Programms wird die Schleife durchlaufen bis diese komplett abgearbeitet wurde.
In deinem Fall wird beim 1. Durchlauf i = 0 gesetzt der Schleifeninhalt abgearbeitet.
Anschließend wird i um 1 erhöht und die Schleife wiederholt sich.
Bis i = 9 dann wird der dein restliches Programm durchlaufen.
Somit würde in einem Prog. Zyklus alle Array-Elemente mit dem gleichen Wert beschrieben.
 
i:= i+1 brauchst du nicht schreiben da das die FOR Schleife automatisch macht (wenn du keine andere Schrittweite für die Schleife angibst).

Allerdings würdest du mit dem Programmcode in alle Elemente von Arr1 den gleichen Wert schreiben.

Grund ist, bei der Abarbeitung des Programms wird die Schleife durchlaufen bis diese komplett abgearbeitet wurde.
In deinem Fall wird beim 1. Durchlauf i = 0 gesetzt der Schleifeninhalt abgearbeitet.
Anschließend wird i um 1 erhöht und die Schleife wiederholt sich.
Bis i = 9 dann wird der dein restliches Programm durchlaufen.
Somit würde in einem Prog. Zyklus alle Array-Elemente mit dem gleichen Wert beschrieben.

Das habe ich mir schon gedacht ... wie kann ich es verhindern? So machen, dass es immer nur eine Stelle im Array beschrieben wird und mit dem nächsten Wert die nächste Stelle im Array beschrieben wird ...

FOR i := 0 TO 9 DO
arr1[0] := gemessene_Laenge;
arr1[1] := gemessene_Laenge;
arr1[2] := gemessene_Laenge;
.....
END_FOR;
 
Zuletzt bearbeitet:
Als erstes brauchst du einen Trigger der dir anzeigt ob neue Werte verfügbar sind.
Also entweder von deiner Schnittstelle ein Signal, dass neue Wert empfangen wurden oder du speicherst dir den letzten Wert und vergleichst den gespeicherten mit dem aktuellen Wert.

z.B.

IF Old_Value <> Akt_Value then (* Kontrolle ob sich Wert verändert hat *)
arr1 := gemessene_Laenge; (* neuen Wert im Array speichern *)
i := i +1; (* Array Element erhöhen das im nächsten Zyklus angesprochen werden soll *)
Old_Value := Akt_Value; (* akt. Wert speichern um Wertänderung zu erkennen *)
END_IF
 
Zurück
Oben