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

Ergebnis 1 bis 6 von 6

Thema: Positionsvergabe aus Reihen und Spalten

  1. #1
    Registriert seit
    04.04.2009
    Beiträge
    31
    Danke
    21
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo,

    Programiersoftware:
    TwinCAT PLC Control - Strukturierter Text

    Ich habe für jedes Feld eine X- (Spalten) und Y- (Reihen) Position, die ich schon vorher abgelegt habe.
    Nun möchte ich diesen Feldern diese Spalten und Reihen Position in folgendem Algorythmus übergeben (siehe Bild)

    Ich habe für die Reihen die Positionen errechnet und abgelegt. Ich muss diese Positionen errechnen, da die Feldgröße verstellbar ist. Diese Felder werden dann in ein fixes definiertes Fenster gelegt (also je nach Feldgröße (immer quadrate) gibt eine bestimmte Anzahl an Reihen und Spalten).

    Mein Problem liegt jetzt darin, das ich z.B beim Feld 7 bereits die Position des Feldes 8 übergebe (siehe Bild). Ich mache einen Spaltenwechsel aber auch gleichzeitig eine Reihenverringerung/Reihenerhöhung. Ich dürfte aber nur einen Spaltenwechsel machen und KEINE Reihenerhöhung bzw. Reihenverringerung:

    Aktueller Programmcode:

    (* Initialisieren *)
    IF NOT InitOk THEN
    m:= 1;
    IdxReihe:= 1;
    IdxSpalte:= 1;
    Invers:= FALSE;
    InitOk:= TRUE;
    END_IF

    WHILE IdxSpalte <= MaxAnzSpalten DO

    Felder[m].PosX:= Spalten[IdxSpalte].PosX; (* X-Übergabe aus Spalte *)

    Felder[m].PosY:= Reihen[IdxReihe].PosY; (* Y-Übergabe aus Reihe *)

    m:= m+1; (* Feldererhöhung *)

    (* Überprüfung oben *)
    IF IdxReihe = MaxAnzReihen THEN (* danach Spaltenwechsel *)
    IdxSpalte:= IdxSpalte + 1; (* Spaltenerhöhung *)
    Invers:= TRUE; (* Reihenverlauf nach unten *)
    END_IF

    (* Überprüfung unten *)
    IF IdxReihe = 1 AND Invers THEN (* danach Spaltenwechsel *)
    IdxSpalte:= IdxSpalte + 1; (* Spaltenerhöhung *)
    Invers:= FALSE; (* Reihenverlauf nach oben *)
    END_IF

    (* Reihenerhöhung/Reihenverringerung *)
    IF Invers THEN
    IdxReihe:= IdxReihe - 1;
    ELSE
    IdxReihe:= IdxReihe + 1;
    END_IF

    END_WHILE


    Ich hoffe es kann mir jemand helfen. Den richtigen Gedanken habe ich schon, ich weiß nur leider nicht, wie ich das Softwaremäßig umsetzen kann und soll.

    Danke für euer Bemühen!
    Angehängte Dateien Angehängte Dateien
    Zitieren Zitieren Positionsvergabe aus Reihen und Spalten  

  2. #2
    Registriert seit
    12.02.2008
    Ort
    Westfalen (Dort wo's Schwarzbrot gibt)
    Beiträge
    417
    Danke
    8
    Erhielt 87 Danke für 72 Beiträge

    Standard

    Anstelle die While-Schleife zu verwenden, würde ich mal 2 For-Schleifen verschachteln, a la:

    FOR Reihe := 1 TO Anzahl_Reihen DO
    FOR Spalte := 1 TO Anzahl_Spalten DO
    Deine_Anweisungen
    END_FOR;
    END_FOR;
    Die interne For-Schleife kann auch umgekehrt durchlaufen werden:

    FOR Reihe := 1 TO Anzahl_Reihen DO
    FOR Spalte := Anzahl_Spalten TO 1 BY -1 DO
    Deine_Anweisungen
    END_FOR;
    END_FOR;
    Geändert von Grubba (12.02.2010 um 09:38 Uhr)

  3. #3
    Registriert seit
    04.04.2009
    Beiträge
    31
    Danke
    21
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Hallo,

    Das habe ich mir auch schon gedacht. Wenn ich das mit 2 for Schleifen mache bekomme ich den Upper Bound Error.
    Wie würdest du die Bedingungen/Anweisungen in meinem Fall in die Schleifen legen? Wie würde der Code aussehen?

    Vielen Dank.

  4. #4
    Registriert seit
    12.02.2008
    Ort
    Westfalen (Dort wo's Schwarzbrot gibt)
    Beiträge
    417
    Danke
    8
    Erhielt 87 Danke für 72 Beiträge

    Standard

    Wenn ich das mit 2 for Schleifen mache bekomme ich den Upper Bound Error
    Das passiert aber nur, wenn Du irgendwo das Array überschreitest.

    Aber egal, probieren wirs nochmal:

    Code:
    var Richtung: BOOL = TRUE;  // True steigend, false fallend
          Zaehler : INT = 1;
     
    FOR Reihe := 1 TO Anzahl_Reihen DO // reihen von 1 bis ende durchlaufen
     
     IF Richtung THEN 
      FOR Spalte := 1 TO Anzahl_Spalten DO
       Felder[Zaehler ].PosX:= Spalten[Spalte].PosX;
       Felder[Zaehler ].PosY:= Reihen[Reihe].PosY;
      END_FOR;
     
     ELSE
     
      FOR Spalte := Anzahl_Spalten TO 1 BY -1 DO
       Felder[Zaehler ].PosX:= Spalten[Spalte].PosX;
       Felder[Zaehler ].PosY:= Reihen[Reihe].PosY; 
      END_FOR;
     
    END_IF;
     
    Zaehler:= Zaehler+ 1;
    Richtung:= NOT Richtung;
     
    END_FOR;

    So ungefähr.
    Geändert von Grubba (12.02.2010 um 10:11 Uhr) Grund: Variablen doch in Deutsch...

  5. #5
    Registriert seit
    12.02.2008
    Ort
    Westfalen (Dort wo's Schwarzbrot gibt)
    Beiträge
    417
    Danke
    8
    Erhielt 87 Danke für 72 Beiträge

    Standard

    Code:
    var Richtung: BOOL = TRUE;  // True steigend, false fallend
          Zaehler : INT = 1;
     
    FOR Reihe := 1 TO Anzahl_Reihen DO // reihen von 1 bis ende durchlaufen
     
     IF Richtung THEN 
      FOR Spalte := 1 TO Anzahl_Spalten DO
       Felder[Zaehler ].PosX:= Spalten[Spalte].PosX;
       Felder[Zaehler ].PosY:= Reihen[Reihe].PosY;
       Zaehler:= Zaehler+ 1;    -> Besser
      END_FOR;
     
     ELSE
     
      FOR Spalte := Anzahl_Spalten TO 1 BY -1 DO
       Felder[Zaehler ].PosX:= Spalten[Spalte].PosX;
       Felder[Zaehler ].PosY:= Reihen[Reihe].PosY; 
       Zaehler:= Zaehler+ 1;   -> Besser
      END_FOR;
     
    END_IF;
     
    Zaehler:= Zaehler+ 1;  <-Falsch
    Richtung:= NOT Richtung;
     
    END_FOR;
    Der Zähler muss noch ein bischen verschoben werden....

  6. Folgender Benutzer sagt Danke zu Grubba für den nützlichen Beitrag:

    stb_abe (15.02.2010)

  7. #6
    Registriert seit
    04.04.2009
    Beiträge
    31
    Danke
    21
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo,

    Das ganze funktioniert jetzt einwandfrei. Ich habe das schon einmal so aufgebaut gehabt. Bin dort leider in den Bound Error geraten. Ich habe die Reihen und Spalten Arrays in der Untergrenze auf 1 gestellt. Dadurch habe ich den Bound Error beim Runterzählen (da for Schleife Index kurz auf 0 stellt) ausgelöst. Nun habe ich die Untergrenzen der Arrays auf 0 gestellt.

    Vielen Dank.

    schöne Grüße

Ähnliche Themen

  1. Antworten: 3
    Letzter Beitrag: 13.03.2011, 11:22
  2. Spalten und Zeilen und eplan einfügen?
    Von sonic_229 im Forum E-CAD
    Antworten: 7
    Letzter Beitrag: 27.02.2009, 18:02

Stichworte

Lesezeichen

Berechtigungen

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