Skip to main content

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.

Beispiel 47. Beispiel
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>

<Name>

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 [a-zA-Z0-9_] erlaubt.

Als Name sind folgende Schlüsselwörter ungültig: SUBPROGRAM, RETURN, END_SUBPROGRAM, RESTORE_MODES, BOOL, LREAL, STRING, LET, DYNCALL, IF, ELSE, END_IF, CASE, END_CASE, FOR,END_FOR, WHILE, END_WHILE, REPEAT, UNTIL, END_REPEAT.

<ActualParamList>

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.

<BracketOpen>/<BracketClosed>

Aus Kompatibilitätsgründen werden, bei Standardeinstellungen für SMC_ReadNCFile2, für Unterprogrammaufrufe und Deklaration nicht runde Klammern, sondern geschweifte Klammern verwendet. Runde Klammern gelten im G-Code als Kommentarzeichen.

Der Funktionsbaustein SMC_ReadNCFile2 besitzt einen Modus (Eingang bParenthesesAsComments), bei dem runde Klammern keine Kommentare sind. Stattdessen werden mehrzeilige Kommentare dann mit (* eingeleitet und mit *) geschlossen. In diesem neuen Modus können sowohl geschweifte als auch runde Klammern für Unterprogrammaufruf und –deklaration verwendet werden.

<ActualParamValue>

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

<ParamName>

Der Name darf (nach Abzug des Präfixes #) maximal 80 Zeichen lang sein.

RESTORE_MODES

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:

  • Aktiver G-Code

  • Relativer/absoluter Modus (G90/G91, G98/G99)

  • Kreisebene und 2D/3D-Modus

  • Decoder-Koordinatensystem (inklusive Skalierung)

  • Vorschubgeschwindigkeiten (Bahn und Zusatzachsen), Eilganggeschwindigkeit, maximale Beschleunigungen und Verzögerungen (Bahn und Zusatzachsen)

  • Feature-Flags und allgemeine Parameter (G38)

  • Werkzeugradius (D-Wort)

  • Werkzeugoffsets (G43)

  • S-Profil (S-Wort)

Folgende modalen Zustände werden nicht wiederhergestellt:

  • Aktuelle Position des Decoders/Interpreters sowie der aktuelle Kardinal-Spline Zustand. Die Position umfasst die gesamte Struktur SMC_POSINFO, also X, Y, Z, die Orientierung und alle Zusatzachsen.

  • Zustand (Ein/Aus) der Bahnvorverarbeitungsbausteine (G40-G43, G50-G52, G60-G61, G70-G71)

  • Moduloeinstellung der Zusatzachsen (PA, PB, …)

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.

Beispiel 48. Beispiel
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.