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

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.
GetSignature
. Aquí se devuelven el tipo de retorno, el recuento y los tipos de argumentos de la función. En este ejemplo, elSEL
la función devuelve un valor de tipoT_OTHER
y tiene 3 argumentos de tipoT_BOOL
,T_OTHER
, yT_OTHER
.T_OTHER
representa cualquier tipo (ya seaT_BOOL
,T_LREAL
, oT_STRING
]. Las 3 apariciones deT_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);
Call
: Este método se invoca cuando se procesa el código G. Los argumentos se transmiten a través delpa
entrada. La expresiónpa[0].argValue.bValue
se usa para acceder al valor booleano del primer argumento. Según el tipo del segundo argumentopa[1].argType
, el resultado es el valor devueltoresult.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
Cree la aplicación y descárguela en un controlador.
Inicie la aplicación, cambie a la visualización y pulse
Start
. Puedes usar elLongline
botón de radio para establecer el valor de la variable$LONGLINE$
en el código G paraTRUE
oFALSE
.