# Unterprogrammende (M17/M29)

M17 und M29 bewirken das ordentliche Beenden und Schließen eines lokalen oder globalen Unterprogrammes. Danach erfolgt der Rücksprung in das aufrufende NC-Programm an den Anfang der NC-Zeile, die dem Unterprogrammaufruf folgt, um die Bearbeitung fortzusetzen. Siehe hierzu auch Kapitel Unterprogrammtechniken. Durch Konfigurierung ist es möglich, zusätzlich ein Signal an die SPS weiterzugeben.

## Parametrierbarer Rücksprung M17/M29 aus einem Unterprogramm

## Versionshinweis

Diese Funktionalität ist verfügbar ab V3.01.3081.02

Durch zusätzliche Angaben nach M17/M29 kann der Rücksprung parametriert werden, sodass der Anwender selbst vorgeben kann, in welcher höheren Programmebene und an welcher Programmstelle die Bearbeitung fortgesetzt werden soll. Ein Praxisfall wäre z.B. ein detektierter Werkzeugbruch in einem Unterprogramm, der nach sofortigem Verlassen des Unterprogramms unmittelbar im Hauptprogramm behandelt werden soll.

Die Parametrierung des Rücksprungs mit M17/M29 wird wie folgt programmiert:

Syntax parametrierbarer Unterprogrammrücksprung:
M17 | M29 [ [ MAIN | JUMPS=.. ] [ [<LABEL>] | N.. ] ]

MAIN | Rücksprung auf Hauptprogrammebene
JUMPS=.. | Anzahl der Programmebenen, die zurückgesprungen werden soll, um die Bearbeitung fortzusetzen. Ausgabe einer Warnung, falls Anzahl der Rücksprungebenen die aktuelle Aufruftiefe übersteigt und Rücksprung auf Hauptprogrammebene.
[ <LABEL> ] | Angabe eines String-Labels als Sprungziel in der Rücksprungebene. Das String-Label kann dort sowohl in Vorwärts- als auch in Rückwärtsrichtung liegen.
N.. | Angabe einer Satznummer als Sprungziel in der Rücksprungebene. Es wird zuerst geprüft, ob die Satznummer als Expression-Label N..: bereits existiert und dann evtl. dorthin verzweigt. Das Expression-Label kann dort sowohl in Vorwärts- als auch in Rückwärtsrichtung liegen. Ist dies nicht der Fall, wird in der Rücksprungebene diese Satznummer ausschließlich Vorwärts in Richtung Programmende gesucht.

MAIN und JUMPS sind explizit aber optional. Ohne Angabe wird in die nächste Unterprogrammebene zurückgesprungen (implizites JUMPS=1). Die Hauptprogrammebene ist die Ebene 1. Die aktuelle Programmebene kann im NC-Programm mit V.G.PROG_LEVEL gelesen werden.

[LBL] und N.. sind ebenfalls explizit und optional. Ohne Angabe wird die Programmbearbeitung nach Rücksprung mit dem nächsten NC-Satz fortgesetzt.

## Hinweis

Das Sprungziel muss in der Rücksprungebene liegen. In lokalen Unterprogrammen oder in weiteren Unterprogrammaufrufen erfolgt keine Suche.

## Programmierbeispiel

Syntaxbeispiele parametrierter Unterprogrammrücksprünge mit M17

M17 [MAIN] ;Rücksprung in Hauptprogramm an den Ursprung der

;Aufrufkette und nächsten NC-Satz ausführen.

M17 [JUMPS=3 N150] ;3 Programmebenen zurückspringen und dort N150

;als nächsten NC-Satz ausführen.

M17 [MAIN N500] ;Rücksprung in Hauptprogramm und dort N500 als

;nächsten NC-Satz ausführen.

M17 [N300] ;1 Programmebene zurückspringen und dort N300 als

;nächsten NC-Satz ausführen.

M17 [JUMPS=2 [LBL4]] ;2 Programmebenen zurückspringen und dort den

;NC-Satz mit der Sprungmarke [LBL4] ausführen.

M17 [MAIN [END] ] ;Rücksprung in Hauptprogramm und dort den

;NC-Satz mit der Sprungmarke [END] ausführen.

M17 [] ;1 Programmebene zurückspringen und nächsten

;NC-Satz ausführen (analog zu M17)