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

Ergebnis 1 bis 5 von 5

Thema: Array-Felder in SCL von Links nach Rechts schieben.

  1. #1
    Registriert seit
    09.04.2008
    Beiträge
    21
    Danke
    5
    Erhielt 3 Danke für 1 Beitrag

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo liebe Sps´ler,

    hab hier leider ein Problem in SCL.

    Ich habe ein Array mit 10 Felder.
    Gerne würde ich das Array in einem FB bei einer Pos_Flanke mit Werten nacheinander füllen lassen.

    Also Flanke -> 1. Feld wird beschrieben.
    nächste Flanke -> 1. Feld in 2. Feld. 1. Feld bekommt neuen Wert!
    usw...Also einen Ringpuffer. Hierbei muss ich aber später alle Felder beobachten können.Aber das wollte ich dann noch später ausbauen.
    Hier erstmal die Grundfunktion zum schieben der Felder im FB. :



    FUNCTION_BLOCK FB1

    VAR_INPUT
    LS_Pos : BOOL;
    END_VAR

    VAR
    Restrecke : ARRAY[1..10] OF REAL;
    Packetlaenge : ARRAY[1..10] OF INT;
    ctu : INT;
    ctu_hm : INT;
    i : INT;
    input : REAL;
    END_VAR
    VAR_Output
    out : INT;
    END_VAR

    BEGIN

    IF (LS_POS) THEN //Bei Pos_Flanke wird Zähler bis zum Wert 10 erhöht
    ctu := ctu + 1;
    END_IF;

    IF (CTU > 10) THEN //Zähler wird resettet
    ctu := 1;
    END_IF;

    IF ctu <> (ctu_hm) THEN

    For i:= 1 to 9 BY 1 do
    Restrecke[i+1] := Restrecke[i];
    END_FOR;

    Restrecke[1] := input;
    ctu_hm := ctu;

    END_IF;
    END_FUNCTION_BLOCK

    Der Fehler liegt natürlich in der schleife da immer alle Felder gleichzeitig überschrieben werden. Denke muss noch irgendwie die Länge des Arrays mit in der Kopfzeile der Forschleife mitreinbekommen.
    For i:= (1+-n) to (9+-n) BY 1(x) do....
    Wäre über eure Hilfe sehr dankbar!!!!
    Zitieren Zitieren Array-Felder in SCL von Links nach Rechts schieben.  

  2. #2
    Registriert seit
    01.02.2008
    Ort
    Düsseldorf
    Beiträge
    31
    Danke
    4
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Hallo Bosga,

    Ich denke du hast schon richtig erkannt das du dir mit der Schleife das ganze überschreibst.


    Du musst das ganze von hinten aufziehen. Ich bin nicht sicher ober man solche spielerein wie zB

    "For i:= 9 to 1 BY -1 do"

    machen kann.

    Was aber in jedem fall gehen sollte ist.


    For i:= 1 to 9 BY 1 do
    Restrecke[9 - i] := Restrecke[10 - i];
    END_FOR;

    (Leider bin ich zur Zeit unterwegs und kann es daher nicht selber testen)

    Bestimmt gibt es noch elegantere Lösungen.. auf die musst du dann aber selber kommen

    Gruß
    Wiggi
    Geändert von Wiggi0606 (17.02.2011 um 16:30 Uhr)

  3. #3
    Bosga ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    09.04.2008
    Beiträge
    21
    Danke
    5
    Erhielt 3 Danke für 1 Beitrag

    Standard

    Danke für die schnelle Antwort.

    Leider stimmt deine Lösung auch nicht ganz.
    Bei jedem erneuten ctu soll ein Feld verschoben werden,
    erstmal egal ob von links<-->rechts
    Also:
    2 , 0 , 0 , 0 , 0
    3 , 2 , 0 , 0 , 0
    6 , 3 , 2 , 0 , 0 usw...

    ////////////////////////////////////////////////////////////////////
    ctu := ctu + 1;

    If ctu>10 then
    ctu :=1;
    END_IF


    IF ctu <> (ctu_hm) THEN

    For i:= 1 to 9 BY 1 do
    Restrecke[10-i] := Restrecke[11-i];
    END_FOR;

    Restrecke[10] := input; // neu eingelesener Wert von rechts nach links
    ctu_hm := ctu;

    END_IF;

    Bei deinem Beispiel wird der Wert jedesmal in alle folgende Felder mitgeschoben bzw kopiert.

    Hat noch jemand eine Idee?
    Dankeschön

  4. #4
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.716
    Danke
    398
    Erhielt 2.399 Danke für 1.999 Beiträge

    Standard

    Hallo,
    es geht nur so :
    Code:
    For i:= 9 to 1 BY -1 do
       Restrecke[i+1] := Restrecke[i]; 
    END_FOR;
    Gruß
    Larry

  5. Folgender Benutzer sagt Danke zu Larry Laffer für den nützlichen Beitrag:

    Bosga (18.02.2011)

  6. #5
    Bosga ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    09.04.2008
    Beiträge
    21
    Danke
    5
    Erhielt 3 Danke für 1 Beitrag

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von Larry Laffer Beitrag anzeigen
    Hallo,
    es geht nur so :
    Code:
    For i:= 9 to 1 BY -1 do
       Restrecke[i+1] := Restrecke[i]; 
    END_FOR;
    Gruß
    Larry



    Super, genau so klappts mit dem Nachbarn
    Dankeschön!

Ähnliche Themen

  1. Array in Datenbaustein schieben
    Von bayerguard im Forum Simatic
    Antworten: 5
    Letzter Beitrag: 27.11.2008, 22:20
  2. 32bit GANZZAHL links schieben
    Von Karli im Forum Simatic
    Antworten: 1
    Letzter Beitrag: 30.06.2008, 12:28
  3. Datenbaustein Wörter nach oben schieben
    Von TheBigMemph im Forum Simatic
    Antworten: 8
    Letzter Beitrag: 25.02.2007, 21:09
  4. Relais für Tipp Links/Aus/Rechts
    Von Farinin im Forum Schaltschrankbau
    Antworten: 0
    Letzter Beitrag: 03.11.2006, 10:42
  5. Schieberegister Doppelwort links schieben
    Von andreHST im Forum Simatic
    Antworten: 2
    Letzter Beitrag: 06.10.2005, 17:02

Lesezeichen

Berechtigungen

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