Siemens
Digital Industries, Motion Control, Machine Tool Systems
8837
Follower:innenPick and Place, Nullpunkt Verschiebung und Zählen
06.05.2022, 11:47 Uhr
Hallo Zusammen,
Ich Arbeite erst seit kurzem an der Siemens Steuerung und alles was ich bis Dato erlernt habe, passierte in Eigenregie.
Aktuell habe ich ein kl. Projekt mit "Pick and Place" am Laufen. Dabei soll ein Raster Abgearbeitet werde. Das Zählen der Reihen und Zeilen + die NP Verschiebung funktioniert bis auf die letzte Reihe.
Wie bekomme ich es hin, das mir ein Zähler nur bis 0 Rechnet ? Und nicht darüber hinaus. (Bsp. -1)
Das Ganze möchte ich als Unterprogramm laufen lassen und Später vom Hauptprogramm als Aufruf und Sprung laufen lassen. (Wenn dies möglich ist)
Vielen Dank für die Hilfe schon mal Vorab.
Gruß
Udo
Ich Arbeite erst seit kurzem an der Siemens Steuerung und alles was ich bis Dato erlernt habe, passierte in Eigenregie.
Aktuell habe ich ein kl. Projekt mit "Pick and Place" am Laufen. Dabei soll ein Raster Abgearbeitet werde. Das Zählen der Reihen und Zeilen + die NP Verschiebung funktioniert bis auf die letzte Reihe.
Wie bekomme ich es hin, das mir ein Zähler nur bis 0 Rechnet ? Und nicht darüber hinaus. (Bsp. -1)
QUOTE
N10 WERKSTUECK_ALLE = 10 ; Werkstücke Gesamt
N15 REIHEN_X = 2 ; Reihen in X
N20 OFFSET_X = 20. ; Offset in X)
N25 ZEILEN_Y = 3 ; Zeilen in Y)
N30 ZAEHLER_Y = ZEILEN_Y ;Zaehler fuer Y
N35 OFFSET_Y = 50. ; Offset in Y
;(R506 - Offset Versatz in Z - Rohteil [Wie tief unter Z-Oberkante Rohteil fahren soll])
N40 OFFSET_Z_ROHTEIL = 10.
;(R507 - Offset Versatz in Z - Bauteil [Wie tief unter Z-Oberkante Bauteil fahren soll])
N45 OFFSET_Z_BAUTEIL = 13.
;(R508 - Greifer Spindel Orientierung Rohteil [0 /90])
N50 ROHTEIL_ORIENT = 0.
;(R509 - Greifer Spindel Orientierung Bauteil [0 /90])
N55 BAUTEIL_ORIENT = 0.
N60 ZAEHLER_X = REIHEN_X ;Zaehler fuer X
N65 ZAEHLER_Y = ZEILEN_Y ;Zaehler fuer Y
..................
N95 BELADEN:
**WZ+VERFAHREN***
N150 ZAEHLER_Y=ZAEHLER_Y-1
N155 $P_UIFR[4, Y, TR] = $P_UIFR[4, Y, TR] + OFFSET_Y ; Fuer G57 + Offset Y
STOPRE
N160 IF ZAEHLER_Y==0
N165 $P_UIFR[4, X, TR] = $P_UIFR[4, X, TR] + OFFSET_X
N170 ZAEHLER_X=ZAEHLER_X-1
N175 ZAEHLER_Y=ZEILEN_Y
N180 $P_UIFR[4, Y, TR] = $P_UIFR[4, Y, TR] - (OFFSET_Y*ZEILEN_Y) ; Fuer G57 + Offset Y
ENDIF
STOPRE
N185 ENDIF
..................
ENTLADEN:
*WZ + VERFAHREN*
N150 ZAEHLER_Y=ZAEHLER_Y-1
N155 $P_UIFR[4, Y, TR] = $P_UIFR[4, Y, TR] + OFFSET_Y ; Fuer G57 + Offset Y
STOPRE
N160 IF ZAEHLER_Y==0
N165 $P_UIFR[4, X, TR] = $P_UIFR[4, X, TR] + OFFSET_X
N170 ZAEHLER_X=ZAEHLER_X-1
N175 ZAEHLER_Y=ZEILEN_Y
N180 $P_UIFR[4, Y, TR] = $P_UIFR[4, Y, TR] - (OFFSET_Y*ZEILEN_Y) ; Fuer G57 + Offset Y
ENDIF
STOPRE
N185 ENDIF
-----------
ABLEGEN:
************
N320 G0 SUPA Z0 D0
N325 IF (ZAEHLER_X==0) AND (ZAEHLER_Y==0)
$P_UIFR[4, Y, TR] = $P_UIFR[4, Y, TR] - (OFFSET_Y*ZEILEN_Y)
$P_UIFR[4, X, TR] = $P_UIFR[4, X, TR] - (OFFSET_X*REIHEN_X)
N330 GOTOF ENDE
N335 ENDIF
N340 GOTOB BELADEN
N345 ENDE:
$P_UIFR[4, Y, TR] = $P_UIFR[4, Y, TR] - (OFFSET_Y*ZEILEN_Y)
$P_UIFR[4, X, TR] = $P_UIFR[4, X, TR] - (OFFSET_X*REIHEN_X)
N350 M30
N15 REIHEN_X = 2 ; Reihen in X
N20 OFFSET_X = 20. ; Offset in X)
N25 ZEILEN_Y = 3 ; Zeilen in Y)
N30 ZAEHLER_Y = ZEILEN_Y ;Zaehler fuer Y
N35 OFFSET_Y = 50. ; Offset in Y
;(R506 - Offset Versatz in Z - Rohteil [Wie tief unter Z-Oberkante Rohteil fahren soll])
N40 OFFSET_Z_ROHTEIL = 10.
;(R507 - Offset Versatz in Z - Bauteil [Wie tief unter Z-Oberkante Bauteil fahren soll])
N45 OFFSET_Z_BAUTEIL = 13.
;(R508 - Greifer Spindel Orientierung Rohteil [0 /90])
N50 ROHTEIL_ORIENT = 0.
;(R509 - Greifer Spindel Orientierung Bauteil [0 /90])
N55 BAUTEIL_ORIENT = 0.
N60 ZAEHLER_X = REIHEN_X ;Zaehler fuer X
N65 ZAEHLER_Y = ZEILEN_Y ;Zaehler fuer Y
..................
N95 BELADEN:
**WZ+VERFAHREN***
N150 ZAEHLER_Y=ZAEHLER_Y-1
N155 $P_UIFR[4, Y, TR] = $P_UIFR[4, Y, TR] + OFFSET_Y ; Fuer G57 + Offset Y
STOPRE
N160 IF ZAEHLER_Y==0
N165 $P_UIFR[4, X, TR] = $P_UIFR[4, X, TR] + OFFSET_X
N170 ZAEHLER_X=ZAEHLER_X-1
N175 ZAEHLER_Y=ZEILEN_Y
N180 $P_UIFR[4, Y, TR] = $P_UIFR[4, Y, TR] - (OFFSET_Y*ZEILEN_Y) ; Fuer G57 + Offset Y
ENDIF
STOPRE
N185 ENDIF
..................
ENTLADEN:
*WZ + VERFAHREN*
N150 ZAEHLER_Y=ZAEHLER_Y-1
N155 $P_UIFR[4, Y, TR] = $P_UIFR[4, Y, TR] + OFFSET_Y ; Fuer G57 + Offset Y
STOPRE
N160 IF ZAEHLER_Y==0
N165 $P_UIFR[4, X, TR] = $P_UIFR[4, X, TR] + OFFSET_X
N170 ZAEHLER_X=ZAEHLER_X-1
N175 ZAEHLER_Y=ZEILEN_Y
N180 $P_UIFR[4, Y, TR] = $P_UIFR[4, Y, TR] - (OFFSET_Y*ZEILEN_Y) ; Fuer G57 + Offset Y
ENDIF
STOPRE
N185 ENDIF
-----------
ABLEGEN:
************
N320 G0 SUPA Z0 D0
N325 IF (ZAEHLER_X==0) AND (ZAEHLER_Y==0)
$P_UIFR[4, Y, TR] = $P_UIFR[4, Y, TR] - (OFFSET_Y*ZEILEN_Y)
$P_UIFR[4, X, TR] = $P_UIFR[4, X, TR] - (OFFSET_X*REIHEN_X)
N330 GOTOF ENDE
N335 ENDIF
N340 GOTOB BELADEN
N345 ENDE:
$P_UIFR[4, Y, TR] = $P_UIFR[4, Y, TR] - (OFFSET_Y*ZEILEN_Y)
$P_UIFR[4, X, TR] = $P_UIFR[4, X, TR] - (OFFSET_X*REIHEN_X)
N350 M30
Das Ganze möchte ich als Unterprogramm laufen lassen und Später vom Hauptprogramm als Aufruf und Sprung laufen lassen. (Wenn dies möglich ist)
Vielen Dank für die Hilfe schon mal Vorab.
Gruß
Udo
06.05.2022, 20:00 Uhr
Zunächst mal ein paar Kleinigkeiten:
Du setzt ganz vorne im Programm die Variable WERKSTUECK_ALLE auf 10. Verwendet wird sie nirgends und sie passt auch nicht zu deinen Zahlen für Reihen und Spalten. Wenn du vor hast, die Variable zu verwenden, solltest du sie aus der Zahl der Reihen und Zeilen ermitteln, also
WERKSTUECK_ALLE = REIHEN_X * ZEILEN_Y,
Eine deiner beiden Zeilen N30 und N65 ist überflüssig.
Das Hauptproblem sehe ich aber darin, dass du deine Nullpuntverschiebung (G57) immer inkrementell und nie absolut setzt. Auch das Rücksetzen (ab der Ziel N345) geschieht inkrementell. Wenn in der NPV einmal ein falscher Wert steht, bleibt das immer falsch. Das ist schnell passiert, wenn du eine Beladezyklus irgendwo in der Mitte unterbrechen musst. Du sollte deshalb meiner Meinung nach vor den Schleifen die NPV auf ihren Grundstellungswert (die erste Position in X und Y) setzen.
Die Schleife selber (ich habe mal den Teil ab N95 ("BELADEN") Herausgegriffen) würde ich folgendermaßen schreiben:
Der Beitrag wurde von CNCFr bearbeitet: 06.05.2022, 20:01 Uhr
Du setzt ganz vorne im Programm die Variable WERKSTUECK_ALLE auf 10. Verwendet wird sie nirgends und sie passt auch nicht zu deinen Zahlen für Reihen und Spalten. Wenn du vor hast, die Variable zu verwenden, solltest du sie aus der Zahl der Reihen und Zeilen ermitteln, also
WERKSTUECK_ALLE = REIHEN_X * ZEILEN_Y,
Eine deiner beiden Zeilen N30 und N65 ist überflüssig.
Das Hauptproblem sehe ich aber darin, dass du deine Nullpuntverschiebung (G57) immer inkrementell und nie absolut setzt. Auch das Rücksetzen (ab der Ziel N345) geschieht inkrementell. Wenn in der NPV einmal ein falscher Wert steht, bleibt das immer falsch. Das ist schnell passiert, wenn du eine Beladezyklus irgendwo in der Mitte unterbrechen musst. Du sollte deshalb meiner Meinung nach vor den Schleifen die NPV auf ihren Grundstellungswert (die erste Position in X und Y) setzen.
Die Schleife selber (ich habe mal den Teil ab N95 ("BELADEN") Herausgegriffen) würde ich folgendermaßen schreiben:
CODE
START_X_G57 = 123; bzw. was immer hier richtig ist
START_Y_G57 = 234.; bzw. was immer hier richtig ist
FOR ZAEHLER_X = 0 TO ZEILEN_X - 1
$P_UIFR[4, X, TR] = START_X_G57 + ZAEHLER_X * OFFSET_X
FOR ZAEHLER_Y = 0 TO ZEILEN_Y - 1
$P_UIFR[4, Y, TR] = START_Y_G57 + ZAEHLER_Y * OFFSET_Y
; Hier das Beladeunterprogramm (für ein Teil) aufrufen
ENDFOR
ENDFOR
START_Y_G57 = 234.; bzw. was immer hier richtig ist
FOR ZAEHLER_X = 0 TO ZEILEN_X - 1
$P_UIFR[4, X, TR] = START_X_G57 + ZAEHLER_X * OFFSET_X
FOR ZAEHLER_Y = 0 TO ZEILEN_Y - 1
$P_UIFR[4, Y, TR] = START_Y_G57 + ZAEHLER_Y * OFFSET_Y
; Hier das Beladeunterprogramm (für ein Teil) aufrufen
ENDFOR
ENDFOR
Der Beitrag wurde von CNCFr bearbeitet: 06.05.2022, 20:01 Uhr
09.05.2022, 09:51 Uhr
Zunächst mal ein paar Kleinigkeiten:
Du setzt ganz vorne im Programm die Variable WERKSTUECK_ALLE auf 10. Verwendet wird sie nirgends und sie passt auch nicht zu deinen Zahlen für Reihen und Spalten. Wenn du vor hast, die Variable zu verwenden, solltest du sie aus der Zahl der Reihen und Zeilen ermitteln, also
WERKSTUECK_ALLE = REIHEN_X * ZEILEN_Y,
Eine deiner beiden Zeilen N30 und N65 ist überflüssig.
Das Hauptproblem sehe ich aber darin, dass du deine Nullpuntverschiebung (G57) immer inkrementell und nie absolut setzt. Auch das Rücksetzen (ab der Ziel N345) geschieht inkrementell. Wenn in der NPV einmal ein falscher Wert steht, bleibt das immer falsch. Das ist schnell passiert, wenn du eine Beladezyklus irgendwo in der Mitte unterbrechen musst. Du sollte deshalb meiner Meinung nach vor den Schleifen die NPV auf ihren Grundstellungswert (die erste Position in X und Y) setzen.
Die Schleife selber (ich habe mal den Teil ab N95 ("BELADEN") Herausgegriffen) würde ich folgendermaßen schreiben:
Du setzt ganz vorne im Programm die Variable WERKSTUECK_ALLE auf 10. Verwendet wird sie nirgends und sie passt auch nicht zu deinen Zahlen für Reihen und Spalten. Wenn du vor hast, die Variable zu verwenden, solltest du sie aus der Zahl der Reihen und Zeilen ermitteln, also
WERKSTUECK_ALLE = REIHEN_X * ZEILEN_Y,
Eine deiner beiden Zeilen N30 und N65 ist überflüssig.
Das Hauptproblem sehe ich aber darin, dass du deine Nullpuntverschiebung (G57) immer inkrementell und nie absolut setzt. Auch das Rücksetzen (ab der Ziel N345) geschieht inkrementell. Wenn in der NPV einmal ein falscher Wert steht, bleibt das immer falsch. Das ist schnell passiert, wenn du eine Beladezyklus irgendwo in der Mitte unterbrechen musst. Du sollte deshalb meiner Meinung nach vor den Schleifen die NPV auf ihren Grundstellungswert (die erste Position in X und Y) setzen.
Die Schleife selber (ich habe mal den Teil ab N95 ("BELADEN") Herausgegriffen) würde ich folgendermaßen schreiben:
CODE
START_X_G57 = 123; bzw. was immer hier richtig ist
START_Y_G57 = 234.; bzw. was immer hier richtig ist
FOR ZAEHLER_X = 0 TO ZEILEN_X - 1
$P_UIFR[4, X, TR] = START_X_G57 + ZAEHLER_X * OFFSET_X
FOR ZAEHLER_Y = 0 TO ZEILEN_Y - 1
$P_UIFR[4, Y, TR] = START_Y_G57 + ZAEHLER_Y * OFFSET_Y
; Hier das Beladeunterprogramm (für ein Teil) aufrufen
ENDFOR
ENDFOR
START_Y_G57 = 234.; bzw. was immer hier richtig ist
FOR ZAEHLER_X = 0 TO ZEILEN_X - 1
$P_UIFR[4, X, TR] = START_X_G57 + ZAEHLER_X * OFFSET_X
FOR ZAEHLER_Y = 0 TO ZEILEN_Y - 1
$P_UIFR[4, Y, TR] = START_Y_G57 + ZAEHLER_Y * OFFSET_Y
; Hier das Beladeunterprogramm (für ein Teil) aufrufen
ENDFOR
ENDFOR
Hallo CNCFr,
Danke für den Hinweis mit der Doppelzeile.
Der Werkstück_Alle wert hatte ich schon mit rein genommen, angedacht war ein zweiten Zähler einzubauen der als Sicherheit dient, um zu Kontrollieren ob alle Bauteile "Verwendet wurden" und dann erst das Programm gestoppt wird oder einen Fehler ausgiebt.
Mit der NPV hast du nicht ganz Unrecht und verstehe ich gut. Jedoch verwirrt es mich gerade etwas mit dem FOR Zähler
Und ich glaube auch mit der Unterprogramm Aufruf habe ich mich falsch Ausgedrückt.
Meine Planung ist es das Hauptprogramm (Was die Bauteile Bearbeitet) laufen zu lassen und dann das Bestücken/Beladen als unter Programm laufen zu lassen ohne zusätzlichen Unterprogramme im Belade-Programm. (Wenn dies geht).
Ich hänge mal mein Bisherigen Aufbau an. (Ohne die Korrektur mit der NPV oder FOR Schleifen). Vieleicht erkennt man meine Logik dahinter
Gruß
Udo
Angehängte Datei(en)
09.05.2022, 19:33 Uhr
Meine Planung ist es das Hauptprogramm (Was die Bauteile Bearbeitet) laufen zu lassen und dann das Bestücken/Beladen als unter Programm laufen zu lassen ohne zusätzlichen Unterprogramme im Belade-Programm. (Wenn dies geht).
Ich denke, dass das der falsche Weg ist.
Das Hauptprogramm sollte die einzelnen Positionen anfahren und dann an jeder Position das gleiche Bearbeitungsprogramm als Unterprogramm ausführen. Im Idealfall weiß das Unterprogramm überhaupt nicht, mit welchem Teil auf der Palette es sich gerade beschäftigt.
Wenn du z.B. mit einem Standarbohrzyklus mehrere Löcher Bohren musst, fährst du in die Hauptprogramm ja auch die diversen Positionen an und rufst dann an jeder Position den Bohrzyklus auf.
Du versuchst dann ja auch nicht, den Bohrzyklus als Hauptprogramm zu betreiben und dann im Bohrzyklus selbst (z.B. durch Aufruf eines Unterprogramms) die jeweils nächste Position anzufahren. Das würde ja bedeuten, dass du keine Standardzyklen verwenden könntest.
Zur FOR-Schleife: Weshalb nicht die vorhandenen Möglichkeiten nutzen? Man kann sich die Schleife natürlich auch selber stricken, aber das heißt ja schließlich, das Rad jedes mal neu zu erfinden.
10.05.2022, 08:42 Uhr
Ich denke, dass das der falsche Weg ist.
Das Hauptprogramm sollte die einzelnen Positionen anfahren und dann an jeder Position das gleiche Bearbeitungsprogramm als Unterprogramm ausführen. Im Idealfall weiß das Unterprogramm überhaupt nicht, mit welchem Teil auf der Palette es sich gerade beschäftigt.
Wenn du z.B. mit einem Standarbohrzyklus mehrere Löcher Bohren musst, fährst du in die Hauptprogramm ja auch die diversen Positionen an und rufst dann an jeder Position den Bohrzyklus auf.
Du versuchst dann ja auch nicht, den Bohrzyklus als Hauptprogramm zu betreiben und dann im Bohrzyklus selbst (z.B. durch Aufruf eines Unterprogramms) die jeweils nächste Position anzufahren. Das würde ja bedeuten, dass du keine Standardzyklen verwenden könntest.
Zur FOR-Schleife: Weshalb nicht die vorhandenen Möglichkeiten nutzen? Man kann sich die Schleife natürlich auch selber stricken, aber das heißt ja schließlich, das Rad jedes mal neu zu erfinden.
Das Hauptprogramm sollte die einzelnen Positionen anfahren und dann an jeder Position das gleiche Bearbeitungsprogramm als Unterprogramm ausführen. Im Idealfall weiß das Unterprogramm überhaupt nicht, mit welchem Teil auf der Palette es sich gerade beschäftigt.
Wenn du z.B. mit einem Standarbohrzyklus mehrere Löcher Bohren musst, fährst du in die Hauptprogramm ja auch die diversen Positionen an und rufst dann an jeder Position den Bohrzyklus auf.
Du versuchst dann ja auch nicht, den Bohrzyklus als Hauptprogramm zu betreiben und dann im Bohrzyklus selbst (z.B. durch Aufruf eines Unterprogramms) die jeweils nächste Position anzufahren. Das würde ja bedeuten, dass du keine Standardzyklen verwenden könntest.
Zur FOR-Schleife: Weshalb nicht die vorhandenen Möglichkeiten nutzen? Man kann sich die Schleife natürlich auch selber stricken, aber das heißt ja schließlich, das Rad jedes mal neu zu erfinden.
Ich möchte Mittels eines Greifer die Bauteile in einen Pneumatik Schraubstock laden, dann Bearbeiten und danach das ganze in einen "Korb" ablegen.
Mit Hauptprogramm meine ich das Bearbeitungs Programm (nehmen wir mal als Bsp: Bohrungen einbringen). Dann soll dort ein Unterprogramm Aufgerufen werden für das Beladen/Entladen(mit Ablegen) vom Raster zum Schraubstock.
FOR-Schleife: Wenn ich richtig Verstehe, arbeitet die FOR Schleife solange bis diese Fertig ist ?
Wie schon Eingangs angesprochen, habe ich nicht viel Erfahrung mit Siemens Programmierung und dies scheint doch etwas Herausfordernder zu sein, ohne ein Bsp.
1 Besucher lesen dieses Thema (Gäste: 1)
0 Mitglieder: