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.
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>
| 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. Las siguientes palabras clave no son válidas como nombres: |
| 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. |
| Por razones de compatibilidad, se utilizan llaves en lugar de paréntesis en la configuración predeterminada para El bloque de funciones |
| 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
| La longitud del nombre puede tener un máximo de 80 caracteres (sin incluir el prefijo |
| 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):
Los siguientes estados modales no se restauran:
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.
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.