TIA Palettenberechnung SCL Schleife

  • Ersteller Ersteller Flatpro
  • Erstellt am Erstellt am
F

Flatpro

Guest
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

ich häng gerade voll in der Luft, darum ergieße ich mal mein Geist in diesen Beitrag :confused:

Ich habe eine Kiste mit 10 Reihen, 5 Spalten und 4 Lagen, sagen wir mal alles im 20mm Raster.
Ich möchte die x,y,Z-Position zur Laufzeit berechnen, d.h. Immer wenn ich meinen Greifer öffne Incrementiere ich meinen Teilezeiger um + 1
Es sollen zuerst die Reihen befüllt werden und danach die Spalten und danach die Lagen.

In AWL wüsste ich wie ich das mache aber wie zum Geier macht man da "schön" in SCL?

Nun habe ich zwei Ansätze:
1. Ich schaffe mir einen Reihen, Spalten und Lagenzähler ==> z.B. Ich lege Teil 12 ab also Reihe 2, Spalte 2, und Lage 1

AnzahlPalettenNester := AnzahlReihen x AnzahlSpalten x AnzahlLagen;

// Berechnung initialisieren
L INT#1
T Reihenzähler
T Spaltenzähler
T Lagenzähler

// Reihe, Spalte und Lage bestimmen
FOR i=1 to Palettenzeiger do By 1
IF Reihenzähler < Max.AnzahlReihen THEN
Reihenzähler := Reihenzeiger + 1;
IF Reihenzähler >= Max.AnzahlReihen THEN
Spaltenzähler:= Spaltenzähler + 1;
Reihenzähler := 1 // Wieder bei Reihe 1 anfangen
IF Spaltenzähler >= Max.Anzahl Spalten THEN
Lagenzähler := Lagenzähler + 1;
IF Reihenzähler * Spaltenzähler * Lagenzähler >= Palettenzeiger THEN // Kontrolle ob Position gefunden
EXIT;
END_IF;
END_IF;
END_IF;
END_FOR;


Dann die Positionen berechnen:
X-Position := X-StartpunktReihenzähler * Reihenraster
Y-Position := Y-StartpunktSpaltenzähler * Spaltenraster
Z-Position := Z-Startpunkt - Lagenzähler * Lagenraster


Ich lauf gleich im viereck... kann mir mit dem komischen Konstruckt etwas auf die Sprünge helfen?

Gruß und Danke Fatti
 
Moin,

ich habe deinen Code nur wenig überflogen, da ich keine gezielte Frage erkenne was nicht funktioniert gehe ich davon aus, dass Du falsche Zielwerte erhälst.

Code:
X_Position := X_Referenz + (X_Offset * X_Zähler) - X_Offset

Platz1:
Code:
30:= 30+ (20* 1) - 20

Platz2:
Code:
60:= 30+ (20* 2) - 20

usw.

Grüße

Marcel
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich glaube, das Problem ist deine FOR-Schleife.

versuchs mal mit
Code:
//Reihenzähler inkrementieren
if Abgelegt then
Reihenzähler+=1;
end_if;

//Spaltenzähler inkrementieren
if Reihenzähler > Reihenzählermax then
Reihenzähler:=0;
Spaltenzähler+=1;
end_if;

//LAgenzähler Inkrementieren
If Spaltenzähler > Spaltenzählermax then
Spaltenzähler:=0;
Lagenzähler+=1;
end_if;

//Palette voll
if Lagenzähler > Lagenzählermax then
Lagenzähler:=0;
Ausgang_Palettevoll:=true;
end_if;
edit: += Anweisung soweit ich weiß nur bei V14 und höher
 
Hi,
ja mein Problem ist die For Schleife.
Ich habe TIA V14 und eine 1200 Steuerung, was ich in dem Code von mir bzw. auch in deinem Code nicht verstehe, ist angenommen mein Zeiger steht auf 25 woher weis das Programm das, dieses bis 25 durchlaufen soll und die drei IF-Anweisungen immer wieder durchlaufen soll?

Steh gerade auf dem Schlauch und der scheint ziemlich lang zu sein ;-)

Gruß Fatti
 
Naja, die Schleife wird solange durchlaufen bis der Wert von i = Plattenzeiger ist. Je höher dein Plattenzeiger ist, desto länger zählt dein i hoch.

Ist es ein Verständnisproblem oder ein Funktionsproblem?

(eine deiner If-Anweisungen ist nicht abgeschlossen)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Moin,
ich glaub du mischt da gedanklich zwei Ansätze zusammen.
Wenn du 3 Zähler für Lage, Reihe und Spalte führen willst, dann brauchst du keine FOR-Schleife, sondern ein Trigger um den Entsprechenden Zähler (für Lage, Reihe, Spalte) zu erhöhen. Also Flanke_Greifer_öffnet dann inkrementiere den Zähler für Lage, Reihe oder Spalte.

Code:
//nur zählen bei Flanke "Greifer hat abgelegt"
if Flanke_Abgelegt then
  Reihenzähler+=1;


  //Spaltenzähler inkrementieren
  if Reihenzähler > Reihenzählermax then
  Reihenzähler:=1;
  Spaltenzähler+=1;
  end_if;

  //Lagenzähler Inkrementieren
  If Spaltenzähler > Spaltenzählermax then
  Spaltenzähler:=1;
  Lagenzähler+=1;
  end_if;

  //Palette voll
  if Lagenzähler > Lagenzählermax then
  Lagenzähler:=1;
  Ausgang_Palettevoll:=true;
  end_if;
end_if;

oder aber du zählst nur einen einzigen Zähler für alle Werkstücke und errechnest dir dann anhand der Gesamtanzahl (das ginge dann bspw. mit einer FOR-Schleife <- macht aber keinen Sinn) rückwärts wo du stehst.
 
Moin Fatti!

Du hast also ein kartesisches KoordinatenSystem mit X=Reihe, Y=Spalte und Z=Lage.
Und eigentlich willst Du aus ReihenNr und SpaltenNr und LagenNr eine fortlaufende Numerierung der "Plätze" berechnen.
Und noch eigentlicher geht es Dir darum, umgekehrt aus der PlatzNr die Nummern der Lage, Spalte und Reihe zu berechnen (und daraus dann die Koordinaten in mm).

Anscheinend beginnst das Zählen bzw. Duchnumerieren immer bei 1.
Reihe 1 ... 10, Spalte 1 ... 5, Lage 1 ... 4, Platz 1 ... 200.
Beginne doch einfach mit 0. Zumindest bei der "internen" Zählung, mit der Du rechnest.
Also: Reihe 0 ... 9, Spalte 0 ... 4, Lage 0 ... 3 und Platz 0 ... 199.
Sonst versperrst Du Dir den Blick für das Einfache ;o)

Jetzt brauchst Du noch die Anzahl der Plätze pro Lage (5 Spalten à 10 Reihen = 50) und die Anzahl der Plätze pro Spalte (= 10).
1. 1 von PlatzNr P' subtrahieren, um auf die "interne" Zählung P zu kommen
2. P dividierst Du durch 50
Das ganzzahlige Ergebnis ist die LagenNr L
Den DivisionsRest (modulo) benötigst Du, um weiterzurechnen
3. Den Rest dividierst Du durch 10
Das ganzzahlige Ergebnis ist die SpaltenNr S
Der DivisionsRest ist die ReihenNr R
4. Daraus kannst Du nun
4a. Die "externen" Nummern durch Addition von 1 errechnen: L'=L+1, S'=S+1, R'=R+1 (Für Anzeige-/KontrollZwecke, wenn überhaupt)
4b. Die Koordinaten berechnen
H = L x h, T = S x t, B = R x b - sagen wir mal, für die linke untere vordere Ecke des Platzes alias Quaders (wobei h und t und b die RasterMasse für Höhe, Tiefe und Breite sind).

Nix mit For und If! Einfach "direkt" berechnen!!! Das lässt sich gleichermassen in AWL und SCL realisieren, ohne das Dividieren durch wiederholtes Subtrahieren oder das Multiplizieren durch wiederholtes Addieren "zu Fuss" nachempfinden zu müssen.

Gruss, Heinileini

Anhang anzeigen LageSpalteReihe.xlsm.pdf
PseudoPDF - ist XLSM !!!
Stoppen des Timers: irgendetwas in Zelle A2 eingeben
 
Zuletzt bearbeitet:
Ich verstehe Dein Problem genau wie Heinileini. Heutzutage müssen wir die Position nicht mehr mit den Fingern abzählen - wir können rechnen ;) :cool:

Ich möchte die x,y,Z-Position zur Laufzeit berechnen, d.h. Immer wenn ich meinen Greifer öffne Incrementiere ich meinen Teilezeiger um + 1
Es sollen zuerst die Reihen befüllt werden und danach die Spalten und danach die Lagen.
[...]
z.B. Ich lege Teil 12 ab also Reihe 2, Spalte 2, und Lage 1
etwa so:
Code:
IF Greifer_öffnen_Flanke THEN
  Palettenzähler := Palettenzähler + 1;
  Pos_to_XYZ(Pos_N := Palettenzähler,
             Pos_X => ZielPos_X,
             Pos_Y => ZielPos_Y,
             Pos_Z => ZielPos_Z );
END_IF;
Code:
FUNCTION "Pos_to_XYZ" : Void
VAR_INPUT
  Pos_N : Int; //Platz-Nummer 1..200
END_VAR
VAR_OUTPUT
  Pos_X : Int; //Reihe-Nummer 1..10
  Pos_Y : Int; //Spalte-Nummer 1..5
  Pos_Z : Int; //Lage-Nummer 1..4
END_VAR

VAR_TEMP
  Pos_N0 : Int; //Platz-Nummer 0-basiert: 0..199
END_VAR

//Nummer 1..200 zu X+Y+Z
  IF #Pos_N <= 0 OR #Pos_N > 200 THEN
    #Pos_X := 0;
    #Pos_Y := 0;
    #Pos_Z := 0;
  ELSE
    #Pos_N0 := #Pos_N - 1;
    #Pos_X := #Pos_N0 MOD 10 + 1;        //--> Reihe  1..10
    #Pos_Y := (#Pos_N0 MOD 50) / 10 + 1; //--> Spalte 1..5
    #Pos_Z := #Pos_N0 / 50 + 1;          //--> Lage   1..4
  END_IF;
END_FUNCTION
oder die FUNCTION "Pos_to_XYZ" allgemein formuliert:
Code:
VAR CONSTANT
  C_Reihen  : Int := 10; //Anzahl Reihen
  C_Spalten : Int := 5;  //Anzahl Spalten
  C_Lagen   : Int := 4;  //Anzahl Lagen
END_VAR

  IF #Pos_N <= 0 OR #Pos_N > (#C_Reihen * #C_Spalten * #C_Lagen) THEN
    #Pos_X := 0;
    #Pos_Y := 0;
    #Pos_Z := 0;
  ELSE
    #Pos_N0 := #Pos_N - 1;
    #Pos_X := #Pos_N0 MOD #C_Reihen + 1;                              //--> Reihe  1..C_Reihen
    #Pos_Y := (#Pos_N0 MOD (#C_Reihen * #C_Spalten)) / #C_Reihen + 1; //--> Spalte 1..C_Spalten
    #Pos_Z := #Pos_N0 / (#C_Reihen * #C_Spalten) + 1;                 //--> Lage   1..C_Lagen
  END_IF;

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Diese Art von Frage zu Palettierer gab's schon einmal von @Spirit.
Sie hat es auch in SCL glaube für eine 1200 dann gelöst (war ca. vor 2 Jahren ;)).

Habe jetzt selbst nur noch einen Teil vom damaligen Lösungsansatz auf die Schnelle gefunden
Wobei man hier noch das mit den Lagen rein bringen müsste ...

Code:
01          X_Start = Teach_Pos_X
01          Y_Start = Teach_Pos_Y 
;
;                Abfangen Überlauf Platz_Zähler
01             IF Platz_Zähler > ( Anzahl_in_X * Anzahl_in_Y ) Then
11                Platz_Zähler = 1
01             ENDIF
;
;                Berechnen der Position in Y 
01             Zeile_Y = INT ( (Platz_Zähler - 1) / Anzahl_in_X ) + 1
01             Y_Position = Y_Start + Zeile_Y * Y_Abstand - Y_Abstand
;
;                Teilezähler in X für Spalte aufbereiten 
01             IF ( Zeile_Y - 1 ) = 0 THEN 
11                [B]Spalte_X =[COLOR=#0000cd] Platz_Zähler[/COLOR][/B]            
11             ELSE 
11                Spalte_X = ( Platz_Zähler - ( ( Zeile_Y - 1 ) * Anzahl_in_X )) 
01             ENDIF
;
;                Berechnen der Position in X 
01             X_Position = X_Start + ( Spalte_X * X_Abstand - X_Abstand )
 
Zurück
Oben