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

Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 25

Thema: Werte im array verschieben

  1. #1
    Registriert seit
    31.07.2015
    Beiträge
    23
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo miteinander, ich habe einen array mit 10 Plätzen und möchte, das der aktuelle wert immer auf dem ersten Platz ist und die restlichen sich um einen verschieben.

    Beispiel:

    Programmstart, erster Wert ist 1
    2ter Durchlauf, aktueller Wert ist 2
    .
    .
    10ter Durchlauf, aktueller Wert ist 10

    Also beim Programmstart: 1,0,0,0,0,0,0,0,0,0,0

    2ter Durchlauf: 2,1,0,0,0,0,0,0,0,0,0

    10ter Durchlauf: 10,9,8,7,6,5,4,3,2,1

    Beim 11ten nehmen wir mal an, der aktuelle Wert sei 5 dann sollte es so aussehen: 5,10,9,8,7,6,5,4,3,2

    Ich habe es so geschrieben geht das?

    FOR i:=1 TO 9 BY 1 DO vMerker[i+1]:=vMerker[i]; END_FOR; (*verschiebt den ersten wert auf den zweiten usw*)
    vMerker[1]:=v; (*aktueller wert wird auf den ersten geschrieben*)

    Geht das so? Oder würde beim ersten Durchlauf der Schleife der 1te Wert auf den 2ten geschrieben werden und beim zweiten Durchlauf der 2te Wert auf den 3ten? Das würde ja bedeuten, das er alle plätze mit dem 1ten wert füllt oder?


    Dann möchte ich den Mittelwert des array Werte bilden.

    FOR i:=1 TO 10 BY 1 DO sumMerker:=sumMerker+vMerker[i]; END_FOR; (*zählt alle zsm*)
    vMittelwert:=sumMerker*0.1;(*summe wird durch 10 geteilt*)

    Ich bedanke mich schonmal für eure Hilfe.
    Zitieren Zitieren Werte im array verschieben  

  2. #2
    Registriert seit
    27.06.2009
    Ort
    am Nordharz
    Beiträge
    3.738
    Danke
    444
    Erhielt 924 Danke für 744 Beiträge

    Standard

    Zitat Zitat von fiftyone_88 Beitrag anzeigen
    Ich habe es so geschrieben geht das?

    FOR i:=1 TO 9 BY 1 DO vMerker[i+1]:=vMerker[i]; END_FOR; (*verschiebt den ersten wert auf den zweiten usw*)
    vMerker[1]:=v; (*aktueller wert wird auf den ersten geschrieben*)

    Geht das so? Oder würde beim ersten Durchlauf der Schleife der 1te Wert auf den 2ten geschrieben werden und beim zweiten Durchlauf der 2te Wert auf den 3ten? Das würde ja bedeuten, das er alle plätze mit dem 1ten wert füllt oder?
    Letzteres.

    Du musst demzufolge mit dem Verschieben im Array hinten anfangen:
    Code:
    FOR i:= 9 TO 1 BY -1 DO
        vMerker[i+1]:= vMerker[i];
    END_FOR;

  3. #3
    Registriert seit
    27.06.2009
    Ort
    am Nordharz
    Beiträge
    3.738
    Danke
    444
    Erhielt 924 Danke für 744 Beiträge

    Standard

    Zitat Zitat von fiftyone_88 Beitrag anzeigen
    Dann möchte ich den Mittelwert des array Werte bilden.

    FOR i:=1 TO 10 BY 1 DO sumMerker:=sumMerker+vMerker[i]; END_FOR; (*zählt alle zsm*)
    vMittelwert:=sumMerker*0.1;(*summe wird durch 10 geteilt*)
    Hier solltest Du vor der FOR-Schleife die Variable sumMerker noch sicherheitshalber auf 0 setzen, sonst könnte im 2. Programmdurchlauf noch die Summe des 1. Durchlaufs drin stehen und mit zu den 10 aktuellen Werten addiert werden.
    Hängt von der Deklarierung von sumMerker ab.

  4. #4
    fiftyone_88 ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    31.07.2015
    Beiträge
    23
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Zitat Zitat von hucki Beitrag anzeigen
    Hier solltest Du vor der FOR-Schleife die Variable sumMerker noch sicherheitshalber auf 0 setzen, sonst könnte im 2. Programmdurchlauf noch die Summe des 1. Durchlaufs drin stehen und mit zu den 10 aktuellen Werten addiert werden.
    Hängt von der Deklarierung von sumMerker ab.
    zu beiden antworten vielen dank, ja sumMerker setze ich nach dem der mittelwert berechnet wurde auf 0

  5. #5
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.314
    Danke
    932
    Erhielt 3.329 Danke für 2.688 Beiträge

    Standard

    Damit die Berechnung auch beim ersten Mal bzw. immer garantiert korrekt ist solltest Du sumMerker VOR der Berechnung auf 0 setzen.

    Harald
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  6. #6
    fiftyone_88 ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    31.07.2015
    Beiträge
    23
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    iat bei der variablen deklaration direkt auf null gesetzt

  7. #7
    fiftyone_88 ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    31.07.2015
    Beiträge
    23
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Zitat Zitat von PN/DP Beitrag anzeigen
    Damit die Berechnung auch beim ersten Mal bzw. immer garantiert korrekt ist solltest Du sumMerker VOR der Berechnung auf 0 setzen.

    Harald

    eine frage noch, und zwar wenn ich ein 10 min mittelwert bilden möchte, kann ich das dann so machen:

    zehnminTakt.PT:=T#600s;
    zehnminTakt.IN:=NOT zehnminTakt.Q;
    IF (zehnminTakt.Q=FALSE)
    THEN zehnminSumme:=zehnminSumme+v; z:=z+1;
    ELSE v10Mittelwert:=zehnminSumme/z; zehnminSumme:=0;
    END_IF;

  8. #8
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.314
    Danke
    932
    Erhielt 3.329 Danke für 2.688 Beiträge

    Standard

    Um ganz sicher zu gehen initialisiert man Variablen trotzdem VOR der Verwendung.
    Außerdem könntest Du die Variable durch eine temporäre Variable ersetzen und dann MUSST Du sie vor der Verwendung initialisieren.

    Harald
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

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

    Standard

    Zitat Zitat von fiftyone_88 Beitrag anzeigen
    eine frage noch, und zwar wenn ich ein 10 min mittelwert bilden möchte, kann ich das dann so machen:

    zehnminTakt.PT:=T#600s;
    zehnminTakt.IN:=NOT zehnminTakt.Q;
    IF (zehnminTakt.Q=FALSE)
    THEN zehnminSumme:=zehnminSumme+v; z:=z+1;
    ELSE v10Mittelwert:=zehnminSumme/z; zehnminSumme:=0;
    END_IF;
    Ja so kannst du einen Mittelwert über die letzten 10 Minuten bilden. Du erhälst aber nur alle 10 Minuten einen neuen Wert, wenn dir das reicht....
    Ansonsten befasse dich mal mit dem Thema "gleitender Mittelwert". Ich denke dazu findest du hier im Forum auch schon die ein oder andere Lösung.
    Sänd from mei Kombjudder mitse Dastadurr.

  10. #10
    Registriert seit
    04.09.2012
    Beiträge
    54
    Danke
    4
    Erhielt 7 Danke für 7 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Wenn Du einen 10min Mittelwert bilden willst, kannst Du die For.. Schleife 1mal je min für 1 Zyklus aufrufen.

Ähnliche Themen

  1. Aus einem ARRAY ausgewählte Werte in ein anderes ARRAY kopieren
    Von lacosta19 im Forum CODESYS und IEC61131
    Antworten: 7
    Letzter Beitrag: 06.08.2014, 15:42
  2. Array schreiben und Werte vermitteln
    Von arcomp im Forum PHOENIX CONTACT
    Antworten: 10
    Letzter Beitrag: 14.02.2014, 07:14
  3. Antworten: 8
    Letzter Beitrag: 04.12.2012, 17:29
  4. Array verschieben
    Von MrChiliCheese im Forum Simatic
    Antworten: 2
    Letzter Beitrag: 04.07.2012, 16:08
  5. INT Werte speichern bzw. verschieben
    Von steppenwolf im Forum Simatic
    Antworten: 15
    Letzter Beitrag: 09.03.2008, 18:35

Stichworte

Lesezeichen

Berechtigungen

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