Die $GOTO-Anweisung
Diese Funktionalität bietet neben der Unterprogrammtechnik oder der Verwendung von Steuersatzanweisungen ($IF, $FOR...) eine weitere Möglichkeit der Verzweigung in andere Programmteile. Durch das Setzen von Sprungmarken (s.g. Labeln) im NC-Programm kann durch Aufruf des GOTO-Befehls an jede Stelle des NC-Programmes gesprungen werden.
Syntax: |
Es gibt zwei Möglichkeiten der Programmierung von Sprunganweisungen:
Expression – Label:
N<satz_nr> : | Definition Sprungziel, Satznummer mit Doppelpunkt |
$GOTO N<satz_nr> | Sprungaufruf |
String – Label:
[<name>] | Definition Sprungziel, Name in eckigen Klammern |
$GOTO [<name>] | Sprungaufruf |
Eigenschaften:
- Der Aufruf $GOTO kann im NC-Programm vor oder nach der Labeldefinition erfolgen. Die Suche nach einem Label wird vorwärts und rückwärts im Programm durchgeführt.
- Labelaufruf und Definition müssen immer in der gleichen Programmebene stattfinden (programmlokal). Programmsprünge zwischen Hauptprogramm und einem Unterprogramm sowie Sprünge zwischen Unterprogrammen sind nicht zulässig (siehe folgende Abb.).
- In Haupt-/ und Unterprogrammen können gleiche Label definiert werden.
- Es kann von mehreren Stellen im NC-Programm zum gleichen Label gesprungen werden.
- Eine $IF-Abfrage kann in der gleichen NC-Zeile mit einem $GOTO kombiniert werden. In diesem Fall darf kein zugehöriges $ELSE - $ENDIF programmiert werden.
- Vor und nach dem $GOTO-Befehl dürfen andere NC-Befehle in der gleichen Zeile programmiert werden. Der Sprung erfolgt jedoch erst als letzte Aktion im NC-Satz.
- Sprünge von außen in beliebige Ebenen eines $IF-$ELSE-$ENDIF- Steuersatzblockes sowie innerhalb und zwischen diesen Ebenen sind möglich. Dann jedoch gilt diese Einsprungebene als gültig (d.h. es wird angenommen, dass die Bedingung wahr ist; siehe Programmierbeispiel).
- Sprünge innerhalb von $WHILE, $FOR, $DO, $REPEAT sind nicht erlaubt.
- Das vollständige Verlassen eines beliebigen Steuersatzkonstruktes mit $GOTO aus jeder Ebene heraus ist immer erlaubt.
- Label in Kommentaren (#COMMENT BEGIN, #COMMENT END) werden nicht erkannt.
- Bei String-Label werden Groß- und Kleinbuchstaben nicht unterschieden.
- Die bei der Dekodierung überlesenen Sprungmarken werden gespeichert. Die maximale Anzahl speicherbarer Expressionlabel [6]-6.41 und Stringlabel [6]-6.42 sowie die Stringlabellänge [6]-6.43 sind vorgegeben.
- Bei jedem Sprungaufruf wird zuerst geprüft, ob die Sprungmarke bereits bekannt, also gespeichert ist. Bei positiver Prüfung wird der Sprung direkt ausgeführt. Wenn die Sprungmarke nicht bekannt ist, wird ab der aktuellen NC-Zeile in der Programmebene bis zum Programmende(M29/M30) gesucht. Wird die Sprungmarke nicht gefunden, so erfolgt die Ausgabe der Fehlermeldung P-ERR-20840.
- Wenn die maximale Anzahl speicherbarer Sprungmarken erreicht ist und die Dekodierung weitere neue Sprungmarken einliest, so werden diese Sprungmarken nicht mehr gespeichert. Dies wird durch die Warnings P-ERR-20829 bzw. P-ERR-20831 angezeigt. Bei jedem weiteren Sprungaufruf mit unbekannter Sprungmarke beginnt dann die Suche erneut am Anfang der aktuellen Programmebene. In diesem Fall kann der Sprungvorgang bei sehr großen NC-Programmen mehr Zeit in Anspruch nehmen.
Programmierbeispiel
Die $GOTO-Anweisung
%goto
N05 P1=1
N06 P2=1
N10 G74 X1 Y2 Z3
N11 X0 Y0 Z0
N15 $IF P1==1 $GOTO N40: ; Sprung von außen nach N40 in einen
; Steuerblock
N20 X10
N25 Y10
N30 $IF P1==2
N35 X20
N40: $IF P2==1
N45 X30
N50: Y30 $GOTO N65: ; Sprung nach N65 zwischen Steuersatzebenen
; IF-ELSE
N51 $ENDIF
N55 $ELSE
N60 Y40
N65: X40
N70 $ENDIF
N80 Z99
N999 M30
Programmierbeispiel
N10 G1 XY
N20: X100 ;Label Definition N20:
$IF V.L.dummy_1 <100 $GOTO N20 ;Sprung zu Label N20
$IF V.L.dummy_1 >200
$GOTO [LABEL_1] ;Sprung zu Label [LABEL_1]
Y20
$ENDIF
[LABEL_1] X0 ;Label Definition [LABEL_1]
N30 A0
$FOR V.P.my_var = 0, 4, 1
$IF V.L.dummy_2 <200 $GOTO [CONTINUE] ;Sprung zu Label [CONTINUE]
$SWITCH V.P.my_var
$CASE 0
V.P.AXE_X=V.P.GROUP[1].position[V.P.my_var]
$BREAK
$CASE 1
V.P.AXE_Y=V.P.GROUP[1].position[V.P.my_var]
$BREAK
$CASE 2
V.P.AXE_Z=V.P.GROUP[1].position[V.P.my_var]
$BREAK
$CASE 3
V.P.AXE_A=V.P.GROUP[1].position[V.P.my_var]
$DEFAULT
$ENDSWITCH
$ENDFOR
[CONTINUE] ;Label Definition [CONTINUE]
N1000 ...
...