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.
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>
| 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 Les mots clés suivants ne sont pas valides en tant que noms : |
| 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. |
| Pour des raisons de compatibilité, les accolades sont utilisées à la place des parenthèses dans les paramètres par défaut pour Le bloc fonction |
| 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
| La longueur du nom peut être au maximum de 80 caractères (sans compter le préfixe |
| 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) :
Les états modaux suivants ne sont pas restaurés :
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.
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.