Siemens
Siemens

Digital Industries, Motion Control, Machine Tool Systems

Pick and Place, Nullpunkt Verschiebung und Zählen

Beitrag 06.05.2022, 11:47 Uhr
Daywalker2001
Daywalker2001
Level 1 = Community-Lehrling
*
Gruppe: Mitglied
Mitglied seit: 28.06.2021
Beiträge: 11
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)


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


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
   
Beitrag 06.05.2022, 20:00 Uhr
CNCFr
CNCFr
Level 7 = Community-Professor
*******
Gruppe: Mitglied
Mitglied seit: 15.09.2002
Beiträge: 1.926
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:
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


Der Beitrag wurde von CNCFr bearbeitet: 06.05.2022, 20:01 Uhr
   
Beitrag 09.05.2022, 09:51 Uhr
Daywalker2001
Daywalker2001
Level 1 = Community-Lehrling
*
Gruppe: Mitglied
Mitglied seit: 28.06.2021
Beiträge: 11
QUOTE (CNCFr @ 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:
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



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 wacko.gif
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)
Angehängte Datei  Test_GUD.mpf ( 3.63KB ) Anzahl der Downloads: 9
 
   
Beitrag 09.05.2022, 19:33 Uhr
CNCFr
CNCFr
Level 7 = Community-Professor
*******
Gruppe: Mitglied
Mitglied seit: 15.09.2002
Beiträge: 1.926
QUOTE (Daywalker2001 @ 09.05.2022, 10:51 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.
   
Beitrag 10.05.2022, 08:42 Uhr
Daywalker2001
Daywalker2001
Level 1 = Community-Lehrling
*
Gruppe: Mitglied
Mitglied seit: 28.06.2021
Beiträge: 11
QUOTE (CNCFr @ 09.05.2022, 19:33 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.


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: