Positionsvergabe aus Reihen und Spalten

stb_abe

Level-1
Beiträge
34
Reaktionspunkte
0
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!
 

Anhänge

  • Algorythmus.pdf
    1 MB · Aufrufe: 15
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;
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
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.
 
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.
 
Zuletzt bearbeitet:
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;
  [COLOR=lime] Zaehler:= Zaehler+ 1;    -> Besser
[/COLOR]  END_FOR;
 
 ELSE
 
  FOR Spalte := Anzahl_Spalten TO 1 BY -1 DO
   Felder[Zaehler ].PosX:= Spalten[Spalte].PosX;
   Felder[Zaehler ].PosY:= Reihen[Reihe].PosY; 
  [COLOR=lime] Zaehler:= Zaehler+ 1;   -> Besser[/COLOR]
  END_FOR;
 
END_IF;
 
[COLOR=red]Zaehler:= Zaehler+ 1;  <-Falsch[/COLOR]
Richtung:= NOT Richtung;
 
END_FOR;

Der Zähler muss noch ein bischen verschoben werden....
 
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
 

Similar threads

Zurück
Oben