Fonctions G-Code spécifiques à l'utilisateur
Le CNC11_CustomFunctions.project un exemple de projet se trouve dans le répertoire d'installation de CODESYS sous ..\CODESYS SoftMotion\Examples.
Cet exemple montre comment créer vos propres fonctions à utiliser dans des expressions en G-code.
Pour plus d'informations sur les expressions et les fonctions du code G, consultez : Expressions. Vous y trouverez une liste de tous les opérateurs et fonctions pris en charge par défaut.
L'exemple définit SEL opérateur de la norme IEC 61131-3 afin qu'il puisse également être utilisé en code G.
Structure de la demande
Comme d'habitude pour les applications CNC, l'application consiste en un traitement de trajectoire (CNC_PreparePath programme) et interpolation (CNC programme). Comme l'interpolation ne diffère pas des autres exemples, le sujet ne sera pas abordé plus
Le traitement des chemins est appelé cycliquement toutes les 20 ms en basse priorité PathTask. L'interpolation est appelée cycliquement toutes les 4 ms MotionTask. La tâche d'arrière-plan VISU_TASK est défini pour la visualisation.
Dans la visualisation, vous pouvez commencer à traiter le code G et définir la valeur de la variable $LONGLINE$. Le code G et le mouvement de la machine (portique 3D) sont affichés sur le côté droit de la visualisation
Le code G
CNC
LET #WIDTH : LREAL N10 G36 O#WIDTH D SEL($LONGLINE$, 40, 110) N20 F50 E100 E-100 N30 G01 X#WIDTH Y#WIDTH Z#WIDTH/2 N40 Y-#WIDTH N50 X-#WIDTH Z-#WIDTH/2 N60 Y#WIDTH N70 X0 Y0 Z0
Ligne 1 : Déclaration de la variable locale #WIDTH de type LREAL.
Ligne 2, bloc N10 : Affectation de la valeur de SEL($LONGLINE$, 40, 110) à la variable #WIDTH. Si la valeur de la variable PLC $LONGLINE$ est TRUE, alors la valeur de l'expression est 110 ; sinon elle est 40.
Dans les lignes suivantes, un rectangle avec un mouvement supplémentaire dans la direction Z est parcouru ; la longueur d'un côté du rectangle est 2*#WIDTH.
Mise en œuvre de la SEL fonction

Pour créer une fonction définie par l'utilisateur, vous devez écrire un bloc de fonction qui implémente le SMC_NC_IFunction interface.
Pour plus d'informations, voir : Fonction SMC_NC_I.
- GetSignature. Le type de retour, le nombre et les types d'arguments de la fonction sont renvoyés ici. Dans cet exemple,- SELla fonction renvoie une valeur de type- T_OTHERet possède 3 arguments de type- T_BOOL,- T_OTHER, et- T_OTHER.- T_OTHERreprésente n'importe quel type (soit- T_BOOL,- T_LREAL, ou- T_STRING]. Les 3 occurrences de- T_OTHERdoit être du même type.- METHOD GetSignature VAR_OUTPUT resultType : SMC_GVar_Type; nNumArguments : UDINT; pType : POINTER TO SMC_GVar_Type; END_VAR VAR argTypes : ARRAY[0..2] OF SMC_GVar_Type := [SMC_GVar_Type.T_BOOL, SMC_GVar_Type.T_OTHER, SMC_GVar_Type.T_OTHER]; END_VAR resultType := SMC_GVAR_Type.T_OTHER; nNumArguments := 3; pType := ADR(argTypes); 
- Call: Cette méthode est appelée lorsque le code G est en cours de traitement. Les arguments sont transmis via- paentrée. L'expression- pa[0].argValue.bValueest utilisé pour accéder à la valeur booléenne du premier argument. En fonction du type du deuxième argument- pa[1].argType, le résultat est la valeur de retour- result.argTypeet le branchement vers une instruction CASE.- METHOD Call VAR_IN_OUT result : SMC_NC_GArgument; END_VAR VAR_INPUT pa : POINTER TO SMC_NC_GArgument; END_VA RVAR_OUTPUT eError : SMC_ERROR; END_VAR VAR g : BOOL; END_VAR g := pa[0].argValue.bValue; result.argType := pa[1].argType; CASE result.argType OF SMC_GVAR_Type.T_BOOL: result.argValue.bValue := SEL(g, pa[1].argValue.bValue, pa[2].argValue.bValue); SMC_GVAR_Type.T_STRING: result.argValue.sValue := SEL(g, pa[1].argValue.sValue, pa[2].argValue.sValue); SMC_GVAR_Type.T_LREAL: result.argValue.fValue := SEL(g, pa[1].argValue.fValue, pa[2].argValue.fValue); ELSE eError := SMC_INVALID_PARAMETER; END_CASE 
Configuration de SMC_ReadNCFile2
Une instance de CNC_Sel le bloc de fonction est créé dans le GVL_CNCFunctions liste globale de variables.
Un tableau aCNCFunctions de longueur 1 est initialisée avec le nom et l'instance du bloc fonctionnel. Ce tableau est ensuite lié dans le tableau funTable de type SMC_NC_GFunctionTable.
aCNCFunctions : ARRAY[0..0] OF SMC_NC_GFunction := [(stName:= 'SEL', iFunc:= GVL_CNCFunctions.g_Sel)]; funTable : SMC_NC_GFunctionTable := (numFunctions:= 1, pFunction:= ADR(aCNCFunctions)) ;
Enfin, ce tableau est transmis au SMC_ReadNCFile2 bloc fonctionnel :
rncf2 : SMC_ReadNCFile2 := (bParenthesesAsComments:= FALSE); [...] rncf2( bExecute:= TRUE, sFileName:= sFileName, pCustomFunTable:= ADR(funTable), pvl:= ADR(varList));
Mise en service
- Créez l'application et téléchargez-la sur une manette. 
- Démarrez l'application, passez à la visualisation et appuyez sur - Start. Vous pouvez utiliser- Longlinebouton radio pour définir la valeur de la variable- $LONGLINE$dans le code G pour- TRUEou- FALSE.