Subprogramas M98/M99: escribir una forma repetida una vez y llamarla muchas veces
Explica con un ejemplo la estructura para llamar a un subprograma con M98 y retornar con M99, el número P y el número de repeticiones L, cómo mecanizar la misma ranura en varias posiciones con un subprograma incremental y los tipos de errores de llamada.
¿Por qué usar subprogramas?
Es habitual cortar la misma ranura en cinco lugares o mecanizar el mismo contorno varias veces a distintas profundidades. Copiar y pegar los mismos bloques cada vez alarga el programa, y corregir una dimensión obliga a corregir los cinco lugares. Omitir uno solo produce una pieza defectuosa porque uno de los cinco queda con un tamaño diferente.
Un subprograma separa la parte repetida en un programa propio, que el programa principal llama cuando es necesario. La forma se mantiene en un único lugar y el programa principal solo tiene que indicar «dónde y cuántas veces».
Llamada y retorno
| Comando | Significado | Ejemplo |
|---|---|---|
M98 P_ | Llama al programa cuyo número P coincide con el número O | M98 P3100 |
L_ o dígitos iniciales de P | Número de repeticiones | L3 → 3 veces |
M99 | Retorna a la línea posterior al bloque de llamada | Última línea de O3100 |
M99 P_ | Retorna, pero salta al número de secuencia especificado | Se usa para estructuras de ramificación y bucle |
Ejemplo: tres ranuras con un subprograma incremental
El subprograma O3100 está escrito en modo incremental G91. Desde la posición actual baja 6 mm, corta una ranura de 30 mm en X, sube 6 mm y avanza 10 mm en Y mientras vuelve al X inicial. La posición final se convierte en el inicio de la siguiente repetición, por lo que repetir la misma llamada tres veces produce tres ranuras separadas 10 mm.
Llamada tres veces al subprograma O3100 con L3 para cortar tres ranuras separadas 10 mm
O3007
T1 M6
G21 G90 G17 G94
G54
S3000 M03
G00 X0. Y0. Z5.
M98 P3100 L3
G90 G00 Z50.
M30
O3100
G91 G01 Z-6. F100
X30. F300
G00 Z6.
X-30. Y10.
M99La figura anterior es el resultado de analizar este programa con CNC Path Analyzer (rápido 8 segmentos, corte lineal 6 segmentos).
Reglas del programa principal
- Restablecer el modo: el subprograma termina en G91, así que ordene de nuevo
G90en el programa principal justo después del retorno. ElG90 G00 Z50.del ejemplo lo hace. Escribir soloZ50.sin G90 se interpreta como «50 mm por encima de la posición actual», no como «altura 50». Aquí es un movimiento ascendente y causa poco daño, pero en el bloque de aproximación de la siguiente herramienta podría provocar una colisión. - Posición inicial: un subprograma incremental da resultados diferentes según la posición en el momento de la llamada. Ordene claramente la posición inicial en coordenadas absolutas justo antes de la llamada.
- Estado de compensación y ciclo: llamar con la compensación del radio de herramienta o un ciclo fijo activos puede hacer que los movimientos del subprograma se comporten de forma inesperada. Ordene deliberadamente el estado modal antes y después de la llamada.
- Posición de M30: si el subprograma está en el mismo archivo, colóquelo después del
M30del programa principal. El programa principal termina en M30, por lo que el subprograma no se ejecuta por error.
Número de repeticiones y cálculo del tiempo de ciclo
Una ejecución del subprograma corta Z 6 mm (F100) y X 30 mm (F300): 3.6 segundos y 6 segundos, es decir, 9.6 segundos por ejecución y unos 29 segundos de corte puro en tres ejecuciones. Cambiar el número de repeticiones a L5 modifica un solo carácter del programa principal y produce cinco ranuras y unos 48 segundos de corte. Así se ve cómo una estructura repetitiva simplifica tanto los cambios del programa como las estimaciones de tiempo. El método se explica con más detalle en Cálculo del tiempo de mecanizado.
Tipos de errores de llamada
En la herramienta, los programas llamados que están en archivos separados pueden cargarse junto con el programa principal, y el número P se vincula al número O dentro del archivo, no al nombre del archivo.
| Error | Causa | Qué muestra CNC Path Analyzer |
|---|---|---|
| No se encontró el programa llamado | No hay ningún programa con un número O que coincida con P | La línea de llamada y el número no encontrado |
| Número O duplicado | Dos o más programas tienen el mismo número | Una advertencia de que no puede decidir cuál usar |
| Falta M99 | El subprograma no termina y continúa en el programa siguiente | Una advertencia de retorno ausente |
| Llamadas infinitas | Los programas se llaman entre sí continuamente, o un programa se llama a sí mismo | El cálculo se detiene por el límite de recursión o ejecución |
Preguntas frecuentes
¿Puede un subprograma llamar a otro subprograma?
¿En qué se diferencia M98 de una llamada de macro G65?
G65 es una llamada de macro que pasa argumentos (A, B, C…) como variables. Se usa para llamar a la misma forma con dimensiones diferentes, mientras que M98 repite la misma operación sin argumentos.