Skip to main content

Sous-programmes

Fonction: Appel d'un sous-programme

Les tâches fréquemment récurrentes, telles que le fraisage de poches, le perçage de trous et le changement d'outil, peuvent être transférées vers des sous-programmes de code G et appelées à partir de là. Lors d'un appel, des paramètres peuvent être passés au sous-programme. Les types de données BOOL, LREAL, et STRING sont autorisés à cet effet.

Astuce

Si vous utilisez des sous-programmes, vous devez utiliser les blocs fonctionnels SMC_ReadNCFile2 et SMC_NCInterpreter à la place de SMC_ReadNCFile et SMC_NCDecoder.

Astuce

Les sous-programmes fonctionnent uniquement dans le décodeur en ligne (pas dans l'éditeur CNC).

Chaque sous-programme est stocké dans un fichier séparé. Ces fichiers sont stockés dans un ou plusieurs sous-répertoires sur le contrôleur. Les noms de fichiers doivent être en minuscules, l'extension de fichier .cnc et correspondent au nom du sous-programme. Exemple : Nom du sous-programme "Drill" -> nom du fichier drill.cnc.

Important

Notez que le nom de fichier du sous-programme doit être écrit en minuscules.

Le POU SMC_ReadNCFile2 a une entrée aSubProgramDirs : ARRAY[0..4] OF STRING(174). Au-delà, jusqu'à cinq sous-répertoires peuvent être spécifiés. Ils sont scannés dans l'ordre indiqué. S'il y a des sous-programmes avec le même nom dans plusieurs répertoires, alors le sous-programme est trouvé qui a le répertoire avec l'index le plus bas dans le tableau. Le nom du sous-programme est converti en minuscule.

Exemple 47. Exemple
aSubProgramDirs = ['subprograms/user', 'subprograms/system', '']

Le sous-programme DrillA1 est analysé en premier dans le fichier subprograms/user/drilla1.cnc. Si ce fichier n'existe pas, la recherche se poursuit dans subprograms/system/drilla1.cnc.



Il est possible d'appeler des sous-programmes indirectement au moyen d'une variable (plus précisément, au moyen d'une expression de type STRING). L'expression (et donc aussi toute recherche de variables) est évaluée – généralement dans le cas de l'utilisation de variables dans le code G – au moment du prétraitement lorsque l'interpréteur atteint la ligne. Dans ce cas, la vérification du type des arguments n'est effectuée que lorsque l'interpréteur a atteint la ligne et non déjà lors de l'analyse, comme c'est le cas avec les appels statiques.

Astuce

Les sous-programmes ne peuvent pas être créés hors ligne dans l'éditeur CNC.

Profondeur d'imbrication maximale des appels de sous-programmes

  • Avant la version 4.18.0.0 : la profondeur d'imbrication maximale des appels de sous-programmes est limitée à 14.

  • Version 4.18.0.0 et supérieure : la profondeur d'imbrication est désormais limitée uniquement par la mémoire. La valeur maximale peut être modifiée à l'aide du paramètre de bibliothèque SMC_CNC_LibParams.MAX_SUBPROGRAM_NESTING_DEPTH.

Syntaxe de l'appel

Les appels de sous-programmes sont des blocs spéciaux dans le code G qui se composent uniquement d'un numéro de bloc et d'un appel. Aucun mot supplémentaire n'est autorisé. De plus, il existe un appel dynamique dans lequel le nom du sous-programme est encore inconnu lors de l'analyse et est préparé (par exemple, par une variable IEC).

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>

Identifiant IEC valide avec un minimum de 3 et un maximum de 80 caractères. Il doit correspondre au nom de fichier (sans extension) dans lequel le sous-programme est défini. Les majuscules ou les minuscules n'ont pas d'importance pour les noms de sous-programmes. Les personnages [a-zA-Z0-9_] sont autorisés.

Les mots clés suivants ne sont pas valides en tant que noms : 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>

Il doit y avoir exactement le même nombre de valeurs de paramètres spécifiés que le sous-programme définit (voir "Syntaxe pour la déclaration"). Le type de chaque valeur de paramètre doit être conforme à la déclaration.

<BracketOpen>/<BracketClosed>

Pour des raisons de compatibilité, les accolades sont utilisées à la place des parenthèses dans les paramètres par défaut pour SMC_ReadNCFile2 et les appels et déclarations de sous-programmes. Les parenthèses sont valides dans le code G pour les commentaires.

Le bloc fonction SMC_ReadNCFile2 a un mode (bParenthesesAsComments input) où les parenthèses ne sont pas des commentaires. Au lieu de cela, les commentaires multilignes sont ouverts avec (* et fermé avec *). Dans ce nouveau mode, les accolades et les parenthèses peuvent être utilisées pour les appels et les déclarations de sous-programmes.

<ActualParamValue>

Variable, littéral ou toute expression

Exemple

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

Syntaxe de la déclaration

Un sous-programme doit être enregistré dans un fichier séparé. La première ligne (ni vide ni ligne de commentaire) doit contenir la déclaration du sous-programme. La syntaxe suivante s'applique :

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>

La longueur du nom peut être au maximum de 80 caractères (sans compter le préfixe #).

RESTORE_MODES

Si ce mot-clé est spécifié, alors les états modaux suivants sont restaurés lors du retour au programme appelant (défini à la valeur qu'il avait lors de l'appel) :

  • Code G actif

  • Mode relatif/absolu (G90/G91, G98/G99)

  • Plan circulaire et mode 2D/3D

  • Système de coordonnées du décodeur (y compris la mise à l'échelle)

  • Avance (trajet et axes supplémentaires), vitesse d'avance rapide, accélérations et décélérations maximales (trajet et axes supplémentaires)

  • Indicateurs de fonction et paramètres généraux (G38)

  • Rayon de l'outil (mot D)

  • Corrections d'outils (G43)

  • Profil S (mot S)

Les états modaux suivants ne sont pas restaurés :

  • Position actuelle du décodeur/interpréteur ainsi que l'état actuel de la spline cardinale La position inclut l'ensemble de la structure SMC_POSINFO (c'est-à-dire X, Y, Z, l'orientation et tous les axes supplémentaires).

  • État (marche/arrêt) des POU de prétraitement de chemin (G40-G43, G50-G52, G60-G61, G70-G71)

  • Réglage modulo des axes supplémentaires (PA, PB, …)

Remarque : Quel que soit ce mot-clé, les variables implicites du compteur (G36, G37) sont restaurées lors du retour du sous-programme vers le programme appelant.

Exemples

SUBPROGRAM SUB1()                 ; no formal parameters
SUBPROGRAM DRILL(#depth : LREAL)
SUBPROGRAM SUB2(#a : LREAL, #b : STRING, #c : LREAL)
SUBPROGRAM SRM1() RESTORE_MODES

Syntaxe pour le retour

Le retour se fait soit à la fin du texte du sous-programme (avant le END_SUBPROGRAM) ou explicitement avec la syntaxe suivante : N<block number> RETURN.

Utilisation des paramètres formels dans le sous-programme

Les valeurs des paramètres formels sont accessibles dans le sous-programme par #<ParamName>.

Le nombre de paramètres formels est limité à 21.

Exemple 48. Exemple
SUBPROGRAM SUB(#Param1 : LREAL)
N10 G01 X#Param1


Affichage de la pile d'appels

L'interprète (SMC_NCInterpreter) a une sortie qui contient les 10 principaux programmes/sous-programmes actifs : aActivePrograms : ARRAY[0..9] OF STRING. La première entrée (aActivePrograms[0]) est le programme/sous-programme actuellement interprété. La deuxième entrée (aActivePrograms[1]) est le programme/sous-programme appelant et ainsi de suite. S'il n'y a pas de programme appelant, la chaîne correspondante est vide.

La pile d'appels peut également être affichée au moment de l'interpolation. Les SMC_DisplayNCCallstack POU montre les programmes/sous-programmes actifs dans le même format que l'interpréteur, seulement plus tard (c'est-à-dire lorsque le mouvement est exécuté). Ce faisant, la sortie de l'interpréteur CallstackInfo (SMC_NCCallstackInfo) et l'interpolateur lui sont transmis comme VAR_IN_OUT variables. SMC_NCCallstackInfo stocke tous les changements de pile d'appels, y compris les SMC_GeoInfo numéro d'objet, dans un tampon en anneau. À ce stade, cela limite le nombre de changements de pile d'appels stockables entre le temps d'interprétation et le temps d'interpolation à 128. Étant donné que la mémoire tampon en anneau ne répond pas aux critères de multitâche, SMC_DisplayNCCallstack doit être appelé à partir de la tâche d'interprétation.

L'exemple de programmeExemple CNC 07 : Utilisation d'expressions et de sous-programmesmontre un exemple d'affichage de la pile des appels au moment de l'interpolation.