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

Ergebnis 1 bis 8 von 8

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

  1. #1
    Registriert seit
    07.07.2014
    Beiträge
    16
    Danke
    3
    Erhielt 0 Danke für 0 Beiträge

    Standard


    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
    Zitieren Zitieren Aus einem ARRAY ausgewählte Werte in ein anderes ARRAY kopieren  

  2. #2
    Registriert seit
    24.02.2009
    Beiträge
    1.242
    Danke
    23
    Erhielt 276 Danke für 235 Beiträge

    Standard

    Was wird nur überschrieben? Dein Quell-Array? Zeige mal deine Implementation von Sysmemcpy.

  3. #3
    Registriert seit
    13.06.2008
    Beiträge
    182
    Danke
    15
    Erhielt 25 Danke für 22 Beiträge

    Standard

    Hallo,

    du kannst dein Ziel mit Hilfe eines Index übergeben.
    Variante 1:
    Also Ziel_Array[i] := 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.

  4. #4
    lacosta19 ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    07.07.2014
    Beiträge
    16
    Danke
    3
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Zitat Zitat von MasterOhh Beitrag anzeigen
    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 ...
    Geändert von lacosta19 (06.08.2014 um 12:52 Uhr)

  5. #5
    lacosta19 ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    07.07.2014
    Beiträge
    16
    Danke
    3
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Zitat Zitat von L.T. Beitrag anzeigen
    Hallo,

    du kannst dein Ziel mit Hilfe eines Index übergeben.
    Variante 1:
    Also Ziel_Array[i] := 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[i] := 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...
    Geändert von lacosta19 (06.08.2014 um 13:07 Uhr)

  6. #6
    Registriert seit
    13.06.2008
    Beiträge
    182
    Danke
    15
    Erhielt 25 Danke für 22 Beiträge

    Standard

    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.

  7. #7
    lacosta19 ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    07.07.2014
    Beiträge
    16
    Danke
    3
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Zitat Zitat von L.T. Beitrag anzeigen
    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;
    Geändert von lacosta19 (06.08.2014 um 13:13 Uhr)

  8. #8
    Registriert seit
    13.06.2008
    Beiträge
    182
    Danke
    15
    Erhielt 25 Danke für 22 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    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[i] := 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

  9. Folgender Benutzer sagt Danke zu L.T. für den nützlichen Beitrag:

    lacosta19 (06.08.2014)

Ähnliche Themen

  1. Antworten: 18
    Letzter Beitrag: 21.12.2016, 17:03
  2. WinCC Flex Werte in ein Array schreiben
    Von Neuling74 im Forum HMI
    Antworten: 15
    Letzter Beitrag: 30.12.2015, 00:14
  3. Antworten: 6
    Letzter Beitrag: 30.09.2011, 13:35
  4. Antworten: 8
    Letzter Beitrag: 14.09.2010, 12:06
  5. Element aus Array kopieren
    Von guidokk im Forum Simatic
    Antworten: 9
    Letzter Beitrag: 18.06.2008, 16:14

Lesezeichen

Berechtigungen

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