Skip to main content

Funciones de código G específicas del usuario

El CNC11_CustomFunctions.project el proyecto de ejemplo se encuentra en el directorio de instalación de CODESYS debajo ..\CODESYS SoftMotion\Examples.

En este ejemplo se muestra cómo crear sus propias funciones para usarlas en expresiones en código G.

Para obtener más información acerca de las expresiones y funciones en el código G, consulte: Expresiones. Allí encontrará una lista de todos los operadores y funciones compatibles de forma predeterminada.

El ejemplo define la SEL operador de IEC 61131-3 para que también se pueda usar en código G.

Estructura de la solicitud

Como es habitual en las aplicaciones de CNC, la aplicación consiste en el procesamiento de rutas (CNC_PreparePath programa) e interpolación (CNC programa). Debido a que la interpolación no difiere de los otros ejemplos, el tema no se discutirá más aquí

El procesamiento de rutas se llama cíclicamente cada 20 ms en la prioridad baja PathTask. La interpolación se llama cíclicamente cada 4 MotionTask. La tarea en segundo plano VISU_TASK está definido para la visualización.

En la visualización, puede empezar a procesar el código G y establecer el valor de la variable $LONGLINE$. El código G y el movimiento de la máquina (pórtico 3D) se muestran en el lado derecho de la

El código 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

Línea 1: Declaración de la variable local #WIDTH de tipo LREAL.

Línea 2, bloque N10: Asignación del valor de SEL($LONGLINE$, 40, 110) a la variable #WIDTH. Si el valor de la variable PLC $LONGLINE$ es TRUE, entonces el valor de la expresión es 110; de lo contrario, es 40.

En las siguientes líneas, se recorre un rectángulo con movimiento adicional en la dirección Z; la longitud de un lado del rectángulo es 2*#WIDTH.

Implementación del SEL función

_sm_img_function_sel.png

Para crear una función definida por el usuario, debe escribir un bloque de funciones que implemente el SMC_NC_IFunction interfaz.

Para obtener más información, consulte: Función SMC_NC_I.

. La interfaz define dos métodos:
  1. GetSignature. Aquí se devuelven el tipo de retorno, el recuento y los tipos de argumentos de la función. En este ejemplo, el SEL la función devuelve un valor de tipo T_OTHER y tiene 3 argumentos de tipo T_BOOL, T_OTHER, y T_OTHER. T_OTHER representa cualquier tipo (ya sea T_BOOL, T_LREAL, o T_STRING]. Las 3 apariciones de T_OTHER debe ser del mismo tipo.

    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);
  2. Call: Este método se invoca cuando se procesa el código G. Los argumentos se transmiten a través del pa entrada. La expresión pa[0].argValue.bValue se usa para acceder al valor booleano del primer argumento. Según el tipo del segundo argumento pa[1].argType, el resultado es el valor devuelto result.argType y la bifurcación en una sentencia 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

Configuración de SMC_ReadNCFile2

Una instancia del CNC_Sel el bloque de función se crea en GVL_CNCFunctions lista global de variables.

Una matriz aCNCFunctions de longitud 1 se inicializa con el nombre y la instancia del bloque de funciones. A continuación, esta matriz se vincula a la tabla funTable de tipo 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)) ;

Por último, esta tabla se pasa al SMC_ReadNCFile2 bloque de funciones:

rncf2 : SMC_ReadNCFile2 := (bParenthesesAsComments:= FALSE);

[...]

rncf2(
    bExecute:= TRUE,
    sFileName:= sFileName,
    pCustomFunTable:= ADR(funTable),
    pvl:= ADR(varList));

Puesta en servicio

  1. Cree la aplicación y descárguela en un controlador.

  2. Inicie la aplicación, cambie a la visualización y pulse Start. Puedes usar el Longline botón de radio para establecer el valor de la variable $LONGLINE$ en el código G para TRUE o FALSE.