Unterprogramme
Funktion: Aufruf eines Unterprogramms
Häufig wiederkehrende Aufgaben, wie zum Beispiel Taschenfräsen, Lochbohren oder Werkzeugwechsel, können in G-Code-Unterprogramme ausgelagert und dann aufgerufen werden. Beim Aufruf können dem Unterprogramm Parameter übergeben werden. Dabei sind nur die Datentypen BOOL
, LREAL
und STRING
zulässig.
Tipp
Wenn Sie Unterprogramme verwenden, müssen Sie statt der Funktionsbausteine SMC_ReadNCFile
und SMC_NCDecoder
die Funktionsbausteine SMC_ReadNCFile2
und SMC_NCInterpreter
verwenden.
Tipp
Unterprogramme funktionieren nur im Online-Decoder (nicht im CNC-Editor).
Jedes Unterprogramm wird in einer eigenen Datei gespeichert. Diese Dateien werden auf der Steuerung in einem oder mehreren Unterverzeichnissen abgelegt. Die Dateinamen müssen klein geschrieben sein, die Dateierweiterung .cnc
haben und dem Namen des Unterprogramms entsprechen. Beispiel: Unterprogrammname „Drill“ -> Dateiname drill.cnc
.
Wichtig
Bitte beachten Sie, dass der Dateiname des Unterprogramms klein geschrieben werden muss.
Der Baustein SMC_ReadNCFile2
hat einen Eingang aSubProgramDirs : ARRAY[0..4] OF STRING(174)
. Darüber können bis zu 5 Unterverzeichnisse angegeben werden. Sie werden in der gegebenen Reihenfolge durchsucht. Gibt es in mehreren Verzeichnissen Unterprogramme desselben Namens, dann wird das Unterprogramm gefunden, dessen Verzeichnis im Array den kleineren Index hat. Der Unterprogrammname wird in Kleinbuchstaben umgewandelt.
aSubProgramDirs = ['subprograms/user', 'subprograms/system', '']
Das Unterprogramm DrillA1
wird zuerst in der Datei subprograms/user/drilla1.cnc
gesucht. Existiert diese Datei nicht, wird noch in subprograms/system/drilla1.cnc
gesucht.
Es ist möglich, Unterprogramme indirekt über eine Variable (genauer gesagt über einen Ausdruck vom Typ STRING
) aufzurufen. Der Auswertung des Ausdrucks (und somit auch ein eventueller Lookup von Variablen) erfolgt, wie generell bei der Verwendung von Variablen im G-Code, zum Zeitpunkt des Vorlaufs, wenn der Interpreter die Zeile erreicht. Die Typprüfung der Argumente wird in diesem Fall erst gemacht, wenn der Interpreter die Zeile erreicht hat und nicht bereits beim Parsen, wie das bei statischen Aufrufen der Fall ist.
Tipp
Unterprogramme können nicht offline im CNC-Editor erstellt werden.
Maximale Schachtelungstiefe von Unterprogrammaufrufen
Vor Version 4.18.0.0: Die maximale Schachtelungstiefe von Unterprogrammaufrufen ist auf 14 begrenzt.
Ab Version 4.18.0.0: Die Schachtelungstiefe ist nur noch durch den Speicher begrenzt. Der Maximalwert kann über den Bibliotheksparameter SMC_CNC_LibParams.MAX_SUBPROGRAM_NESTING_DEPTH geändert werden.
Syntax für den Aufruf
Unterprogrammaufrufe sind spezielle Sätze im G-Code, die nur aus Satznummer und Aufruf bestehen. Es sind keine weiteren Wörter erlaubt. Weiter gibt es einen dynamischen Aufruf, bei dem der Name des Unterprogramms beim Parsen noch unbekannt ist und beispielsweise über eine IEC-Variable bereitgestellt wird.
N<SentenceNo> <Name> <BracketOpen> <ActualParamList> <BracketClosed> N<SentenceNo> DYNCALL <BracketOpen> <SubNameExp> [, <ActualParamListNotEmpty] <BracketClosed> <SubNameExp> : An expression with exactly one value of type STRING <ActualParamList> ::= Empty | <ActualParamListNotEmpty> <ActualParamListNotEmpty> ::= <ActualParamValue> | <ActualParamValue>, <ActualParamListNotEmpty>
| Gültiger IEC-Bezeichner mit mindestens 3 und maximal 80 Zeichen. Er muss dem Dateinamen (ohne Erweiterung) entsprechen, in dem das Unterprogramm definiert ist. Groß-/Kleinschreibung spielt bei den Unterprogrammnamen keine Rolle. Es sind die Zeichen Als Name sind folgende Schlüsselwörter ungültig: |
| Es müssen exakt so viele Parameterwerte angegeben werden, wie das Unterprogramm vorschreibt (siehe ‚Syntax für die Deklaration‘). Der Typ jedes Parameterwerts muss mit der Deklaration übereinstimmen. |
| Aus Kompatibilitätsgründen werden, bei Standardeinstellungen für Der Funktionsbaustein |
| Variable, Literal oder beliebige Ausdrücke |
Beispiel
N10 SUB1() N20 DRILL(10.0) N30 SUB2(5, "Text", 2.5) N40 G36 O#SUBNAME D'DRILL' % Indirect call via local variable N40 DYNCALL(#SUBNAME, 2) % equivalent to N40 DRILL(2) N50 DYNCALL($SUBNAME$, 2, 4) % Indirect call via IEC variable
Syntax für die Deklaration
Ein Unterprogramm muss in einer eigenen Datei abgelegt sein. Dabei muss in der ersten Zeile, die weder leer noch eine Kommentarzeile ist, die Deklaration des Unterprogramms stehen. Es gilt folgender Syntax:
SUBPROGRAM <Name> <BracketOpen> <FormalParamList> <BracketClosed> <RESTORE_OPT> <Inhalt Unterprogramm> END_SUBPROGRAM <FormalParamList> ::= Empty | <FormalParamListNotEmpty> <FormalParamListNoEmpty> ::= <FormalParam> | <FormalParam> , <FormalParamListNotEmpty> <FormalParam> ::= <ParamName> : <ParamType> <ParamName> ::= #[a-zA-Z0-9_]+ <ParamType> ::= LREAL | BOOL | STRING ; String with a maximum length of 255 bytes <RESTORE_OPT> ::= RESTORE_MODES
| Der Name darf (nach Abzug des Präfixes |
| Wenn dieses Schlüsselwort angegeben wird, dann werden bei der Rückkehr zum aufrufenden Programm folgende modalen Zustände wiederhergestellt, d.h. auf den Wert gesetzt, den sie beim Aufruf hatten:
Folgende modalen Zustände werden nicht wiederhergestellt:
Hinweis: Unabhängig von diesem Schlüsselwort werden bei der Rückkehr vom Unterprogramm zum aufrufenden Programm die impliziten Zählervariablen (G36, G37) wiederhergestellt. |
Beispiele
SUBPROGRAM SUB1() ; no formal parameters SUBPROGRAM DRILL(#depth : LREAL) SUBPROGRAM SUB2(#a : LREAL, #b : STRING, #c : LREAL) SUBPROGRAM SRM1() RESTORE_MODES
Syntax für den Rücksprung
Der Rücksprung erfolgt entweder am Ende des Unterprogrammtexts (vor dem END_SUBPROGRAM
) oder explizit mit folgende Syntax: N<Satznummer> RETURN
.
Verwendung der formalen Parameter im Unterprogramm
Auf die Werte der formalen Parameter kann im Unterprogramm durch #<ParamName>
zugegriffen werden.
Die Anzahl der formalen Parameter ist auf 21 begrenzt.
SUBPROGRAM SUB(#Param1 : LREAL) N10 G01 X#Param1
Anzeige der Aufrufliste
Der Interpreter (SMC_NCInterpreter
) besitzt einen Ausgang, der die 10 obersten aktiven Programme/Unterprogramme enthält: aActivePrograms : ARRAY[0..9] OF STRING
. Dabei ist der erste Eintrag (aActivePrograms[0]
) das derzeit interpretierte Programm/Unterprogramm. Der zweite Eintrag (aActivePrograms[1]
) ist das aufrufende Programm/Unterprogramm und so weiter. Gibt es kein aufrufendes Programm, dann ist der entsprechende String leer.
Die Aufrufliste kann auch zur Interpolationszeit angezeigt werden: Der Baustein SMC_DisplayNCCallstack
zeigt die aktiven Programme/Unterprogramme im gleichen Format wie der Interpreter, nur später (nämlich dann, wenn die Bewegung abgefahren wird). Dazu werden ihm als VAR_IN_OUT
-Variablen der Interpreter-Ausgang CallstackInfo (SMC_NCCallstackInfo)
und der Interpolator übergeben. SMC_NCCallstackInfo
speichert alle Aufruflistenänderungen inklusive der zugehörigen SMC_GeoInfo
-Objektnummer in einem Ringpuffer. Dadurch ist die Anzahl der speicherbaren Aufruflistenänderungen zwischen Interpretations- und Interpolationszeit beschränkt, momentan auf 128 Stück. Da der Ringpuffer nicht multitasksicher ist, muss SMC_DisplayNCCallstack
aus der Interpreter-Task aufgerufen werden.
Ein Beispiel für die Anzeige der Aufrufliste zur Interpolationszeit zeigt das Beispielprogramm CNC Beispiel 07: Ausdrücke und Unterprogramme verwenden.