Skip to main content

Subprogramas

Función: Llamada de un subprograma

Las tareas que se repiten con frecuencia, como el fresado de cajeras, la perforación de orificios y el cambio de herramientas, pueden cambiarse a subprogramas de código G y llamarse desde allí. Durante una llamada, los parámetros se pueden pasar al subprograma. Los tipos de datos BOOL, LREAL, y STRING están permitidos para este propósito.

Sugerencia

Si usa subprogramas, entonces debe usar los bloques de función SMC_ReadNCFile2 y SMC_NCInterpreter en lugar de SMC_ReadNCFile y SMC_NCDecoder.

Sugerencia

Los subprogramas solo funcionan en el decodificador en línea (no en el editor CNC).

Cada subprograma se almacena en un archivo separado. Estos archivos se guardan en uno o más subdirectorios del controlador. Deben tener la extensión de archivo .cnc. El nombre del archivo debe corresponder al nombre del subprograma y estar en minúsculas. Ejemplo: nombre de subprograma "Drill" -> nombre de archivo drill.cnc.

Importante

Tenga en cuenta que el nombre del archivo del subprograma debe escribirse en minúsculas.

El POU SMC_ReadNCFile2 tiene una entrada aSubProgramDirs : ARRAY[0..4] OF STRING(174). Se pueden especificar hasta cinco subdirectorios más allá de esto. Se escanean en el orden indicado. Si hay subprogramas con el mismo nombre en varios directorios, entonces se encuentra el subprograma que tiene el directorio con el índice más bajo en la matriz. El nombre del subprograma se convierte a minúsculas.

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

El subprograma DrillA1 se escanea primero en el archivo subprograms/user/drilla1.cnc. Si este archivo no existe, la búsqueda continúa en subprograms/system/drilla1.cnc.



Es posible llamar a subprogramas indirectamente por medio de una variable (más precisamente, por medio de una expresión de tipo STRING). La expresión (y, por lo tanto, también cualquier búsqueda de variables) se evalúa, generalmente en el caso de usar variables en el código G, en el momento del preprocesamiento cuando el intérprete llega a la línea. En este caso, la verificación de tipo de los argumentos se realiza solo cuando el intérprete ha llegado a la línea y no durante el análisis, como es el caso de las llamadas estáticas.

Sugerencia

Los subprogramas no se pueden crear fuera de línea en el editor CNC.

Profundidad máxima de anidamiento de las llamadas de subprogramas

  • Antes de la versión 4.18.0.0: la profundidad máxima de anidamiento de las llamadas a subprogramas está limitada a 14.

  • Versión 4.18.0.0 y superior: la profundidad de anidamiento ahora solo está limitada por la memoria. El valor máximo se puede cambiar mediante SMC_CNC_LIBPARAMS.MAX_SUBPROGRAM_NESTING_DEPTH.

Sintaxis de la llamada

Las llamadas a subprogramas son bloques especiales en el código G que constan de un número de bloque y solo una llamada. No se permiten palabras adicionales.

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>

Identificador IEC válido con un mínimo de 3 y un máximo de 80 caracteres. Debe corresponder al nombre del archivo (sin extensión) donde está definido el subprograma. Las mayúsculas o minúsculas no importan para los nombres de los subprogramas. [a-zA-Z0-9_] están permitidos.

Las siguientes palabras clave no son válidas como nombres: 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>

Tiene que haber exactamente el mismo número de valores de parámetro especificados como define el subprograma (ver "Sintaxis de la declaración"). El tipo de valor de cada parámetro debe coincidir con la declaración.

<BracketOpen>/<BracketClosed>

Por razones de compatibilidad, se utilizan llaves en lugar de paréntesis en la configuración predeterminada para SMC_ReadNCFile2 y convocatorias y declaraciones de subprogramas. Los paréntesis son válidos en código G para comentarios.

El bloque de funciones SMC_ReadNCFile2 tiene un modobParenthesesAsComments input) donde los paréntesis no son comentarios. En cambio, los comentarios de varias líneas se abren con (* y cerrado con *). En este nuevo modo, tanto las llaves como los paréntesis se pueden usar para las llamadas y declaraciones de subprogramas.

<ActualParamValue>

Variable, literal o cualquier expresión

Ejemplo

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

Sintaxis de la declaración

Un subprograma debe guardarse en un archivo separado. La primera línea (ni vacía ni de comentario) debe contener la declaración del subprograma. Se aplica la siguiente sintaxis:

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 longitud del nombre puede tener un máximo de 80 caracteres (sin incluir el prefijo #).

RESTORE_MODES

Si se especifica esta palabra clave, los siguientes estados modales se restauran al regresar al programa de llamada (establecido en el valor que tenía en la llamada):

  • Código G activo

  • Modo relativo / absoluto (G90 / G91, G98 / G99)

  • Plano circular y modo 2D / 3D

  • Sistema de coordenadas del decodificador (incluida la escala)

  • Velocidades de avance (trayectoria y ejes adicionales), velocidad de desplazamiento rápido, aceleraciones y desaceleraciones máximas (trayectoria y ejes adicionales)

  • Indicadores de funciones y parámetros generales (G38)

  • Radio de la herramienta (palabra D)

  • Correcciones de herramienta (G43)

  • Perfil S (palabra S)

Los siguientes estados modales no se restauran:

  • Posición actual del decodificador/intérprete, así como el estado cardinal actual de la ranura La posición incluye toda la estructura SMC_POSINFO (es decir, X, Y, Z, la orientación y todos los ejes adicionales).

  • Estado (encendido / apagado) de las POU de preprocesamiento de ruta (G40-G43, G50-G52, G60-G61, G70-G71)

  • Ajuste de módulo de los ejes adicionales (PA, PB,…)

Nota: Independientemente de esta palabra clave, las variables de contador implícitas (G36, G37) se restauran al regresar del subprograma al programa de llamada.

Ejemplos de

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

Sintaxis para la devolución

La devolución se realiza al final del texto del subprograma (antes del END_SUBPROGRAM) o explícitamente con la siguiente sintaxis: N<block number> RETURN.

Usando los parámetros formales en el subprograma

Se puede acceder a los valores de los parámetros formales en el subprograma mediante #<ParamName>.

El número de parámetros formales está limitado a 21.

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


Visualización de la pila de llamadas

El interprete (SMC_NCInterpreter) tiene una salida que contiene los 10 principales programas / subprogramas activos: aActivePrograms : ARRAY[0..9] OF STRING. La primera entrada (aActivePrograms[0]) es el programa / subprograma actualmente interpretado. La segunda entrada (aActivePrograms[1]) es el programa / subprograma que llama y así sucesivamente. Si no hay un programa de llamada, la cadena correspondiente está vacía.

La pila de llamadas también se puede mostrar en el momento de la interpolación. los SMC_DisplayNCCallstack POU muestra los programas / subprogramas activos en el mismo formato que el intérprete, solo más tarde (es decir, cuando se ejecuta el movimiento). Al hacerlo, la salida del intérprete CallstackInfo (SMC_NCCallstackInfo) y el interpolador se le pasa como VAR_IN_OUT variables. SMC_NCCallstackInfo almacena todos los cambios de la pila de llamadas, incluido el correspondiente SMC_GeoInfo número de objeto, en un búfer circular. En este momento, esto restringe el número de cambios de pila de llamadas almacenables entre el tiempo de interpretación y el tiempo de interpolación a 128. Debido a que el búfer de anillo no cumple con los criterios de multitarea, SMC_DisplayNCCallstack tiene que ser llamado desde la tarea de intérprete.

El programa de muestraEjemplo 07 de CNC: uso de expresiones y subprogramasmuestra un ejemplo de la visualización de la pila de llamadas en el momento de la interpolación.