
1) Qué es un subprograma (y por qué usarlo)
Un subprograma es un bloque de código reutilizable que se llama desde un programa principal para ejecutar una tarea repetitiva (por ejemplo, una cavidad, un patrón de taladros o un chaflán estándar). Su valor es enorme en producción porque:
- Reduce líneas de código y simplifica el mantenimiento.
- Mejora la consistencia: una sola fuente de verdad para la misma operación.
- Acelera la programación de familias de piezas con pequeñas variaciones.
- Facilita el “debug”: si el patrón tiene un error, lo arreglas una vez y se corrige en todos los usos.
En controles tipo Fanuc se llama con M98 y se vuelve con M99. En Heidenhain, se usan labels (LBL) y llamadas (CALL LBL), o bien archivos externos (CALL PGM), según configuración de la TNC.
2) Anatomía de un subprograma en Fanuc (M98/M99)
La forma más habitual en fresadora/torno Fanuc es:
; --- Programa principal ---
%
O1000 (PIEZA: PLACA CON PATRON 3x2 AGUJEROS)
G21 G90 G17 G40 G49 G80
G54
T2 M06 S3200 M03 M08
G00 X20 Y20 Z5
M98 P2000 ; Llamada al subprograma O2000 una vez
G00 Z50
X80 Y20 Z5
M98 P2000 ; Se repite en otra posicion
G00 Z50
M09 M05
M30
%
; --- Subprograma ---
O2000 (TALADRO Ø6 A Z-10 CON AVELLANADO)
G81 Z-10 R2 F250 ; Taladrado
G80
G82 Z-12 R2 P300 ; Avellanado con pausa 0,3 s (opcional)
M99 ; Retorno al punto siguiente del principal
Notas clave: M98 P#### busca el número de programa O####. M99 retorna. Puedes añadir L en el M98 para repetir varias veces seguidas (M98 P2000 L3).
3) Subprogramas relativos (G91) vs absolutos (G90)
Una técnica potente es escribir el subprograma en coordenadas incrementales (G91) para que funcione como “módulo” transportable. Ejemplo: patrón 3×2 a pasos fijos desde el punto de entrada.
; --- Principal (posiciona el punto de entrada con G90) ---
G21 G90 G17 G40 G49 G80
G54
T2 M06 S3500 M03 M08
G00 X20 Y20 Z5
M98 P3000 ; imprime matriz relativa desde aquí
G00 Z50
X100 Y30 Z5
M98 P3000
G00 Z50
M09 M05
M30
; --- Subprograma relativo ---
O3000 (MATRIZ 3x2 CON G91)
G91
G81 Z-10 R2 F250
X40
X40
G90 X0 ; vuelve a columna inicial con X absoluto (opcional)
G91 Y30 X-80
X40
X40
G80
G90
M99
Precaución: fija siempre el modo al entrar y al salir del subprograma (G91 al principio, G90 al final). Eso evita “heredar” estados peligrosos.
4) Anidar subprogramas y usar L (repeticiones)
Es habitual que un subprograma llame a otro (anidación). Controla la claridad con comentarios y, si tu CNC lo limita, no abuses de la profundidad de anidación.
; Principal
O1100
...
M98 P2100 L4 ; llama 4 veces (por ejemplo, 4 cavidades)
...
M30
; O2100 puede posicionar a la cavidad N y llamar a O2200
O2100
; calculo de offset local / posicionamiento
M98 P2200 ; operacion estandar de cavidad
M99
Si las posiciones cambian de forma aritmética, puedes combinar G91 + L o variables de macro (si tu control lo permite).
5) Equivalentes en Heidenhain: LBL y CALL
En TNC, los subprogramas se manejan con labels (LBL <número>) y llamadas (CALL LBL <número>), o cargando archivos/PGM externos. Ejemplo didáctico:
; --- Principal (Heidenhain estilo diálogo) ---
BEGIN PGM MATRIZ MM
CYCL DEF 7.0 DATUM ; Definir cero (ejemplo)
L X+20 Y+20 R0 FMAX
CALL LBL 10 ; Llamar patrón
L Z+50 FMAX
L X+100 Y+30 R0 FMAX
CALL LBL 10
L Z+50 FMAX
END PGM MATRIZ MM
; --- Subprograma / Label ---
LBL 10
CYCL DEF 200 DRILLING ~
Q200=+2 ; R
Q201=-10 ; Z final
Q206=+250 ; F
L X+0 Y+0 FMAX
CYCL CALL
L X+40 Y+0 FMAX
CYCL CALL
L X+80 Y+0 FMAX
L X+0 Y+30 FMAX
CYCL CALL
L X+40 Y+30 FMAX
CYCL CALL
L X+80 Y+30 FMAX
CYCL CALL
LBL 0
Ventaja de Heidenhain: los ciclos (CYCL DEF/CALL) y la gestión de labels hacen muy legible el patrón. Si te interesa trabajar esta sintaxis con simulador, lo hacemos paso a paso en Heidenhain.
6) Subprogramas vs macros con variables
Los subprogramas son plantillas fijas. Las macros permiten parametrizar (por ejemplo, pasos X/Y, profundidad Z, repeticiones) con variables del control. No todos los CNC tienen el mismo soporte de variables; revisa tu manual.
; Fanuc (si hay opciones de macro): paso X/Y parametrizable
O4000 (PATRON MATRIZ PARAMETRICO)
#100 = 40 (paso X)
#101 = 30 (paso Y)
#102 = 3 (col)
#103 = 2 (fil)
G91
G81 Z-10 R2 F250
#1 = 0
WHILE [#1 LT #102] DO1
X#100
#1 = #1 + 1
END1
G90 X0
G91 Y#101 X[-#100*#1]
#2 = 1
WHILE [#2 LT #103] DO2
X#100
X#100
G90 X0
G91 Y#101 X[-#100*#1]
#2 = #2 + 1
END2
G80
G90
M99
Si tu máquina no posee macros, puedes lograr gran parte del beneficio con subprogramas relativos y el contador L de M98.
7) Cuándo conviene usar subprogramas (y cuándo no)
- Sí: patrones repetitivos (matrices, cavidades, chaflanes estándar, taladros de brida), producción en serie, familias de piezas con variaciones mínimas, operaciones que migran entre máquinas.
- No: geometría única o muy pequeña donde el “salto” de llamada sería mayor que escribir dos líneas; operaciones con dependencias fuertes del contexto (compensaciones, G41/G42) si no garantizas entradas/salidas limpias dentro del sub.
En flujos CAM (por ejemplo, Mastercam), puedes postprocesar operaciones como subprogramas (una por feature) y llamarlas desde el principal por WCS/origen. Es una forma elegante de mantener archivos cortos y ordenados.
8) Buenas prácticas de seguridad y legibilidad
- Safe start en el principal y estado explícito dentro del sub (G90/G91, plano, cancelaciones).
- Entrada/salida seguras en el sub: no dependas de estados previos ocultos; activa/cancela ciclos (G80) y comp. de radio (G40) de forma limpia.
- Alturas Z razonables para evitar colisiones en repeticiones; define R del ciclo apropiado.
- Comentarios útiles (pieza, material, herramienta, correctores H/D, origen activo).
- Versionado del sub: número de revisión y fecha al inicio; controla distribución entre máquinas.
9) Errores comunes con subprogramas (y cómo evitarlos)
- Modo incremental “olvidado”: entrar al sub en G91 y salir sin volver a G90. Solución: fuerza modo al inicio y al final del sub.
- Llamar un O#### que no existe: error de número o archivo no cargado. Solución: estandariza la nomenclatura (O2xxx = cavidades; O3xxx = patrones).
- Herencia de compensaciones (G41/G42, G43): entradas o salidas sucias. Solución: activa/cancela dentro del sub y valida con simulación.
- Alturas R inadecuadas: choques en la segunda repetición. Solución: ajustar R y Z segura por operación.
- Demasiada anidación: difícil de depurar. Solución: máximo 2–3 niveles; comenta bien.
10) Plantilla de proyecto: cavidad estándar reusable
; --- O5000: Cavidad estándar 40x30x5 con planeado y contorno ---
O5000 (CAVIDAD ESTANDAR 40x30x5)
(TEZ: T4 Ø10 FRESA 2D - D02 - H04)
; Estado
G17 G40 G49 G80
; Aproximacion
G00 Z5
G43 H04 Z3
; Desbaste (ejemplo simple)
G01 Z-4 F250
; Contorno nominal (sin comp)
X40
Y30
X0
Y0
; Acabado a Z-5 con comp a izquierda
G00 Z2
G01 Z-5 F200
G01 G41 D02 X0 Y2 F600
X40
Y30
X0
Y0
G40 X-5 Y-5
G00 Z5
M99
En el principal posicionas sobre el “cero local” de la cavidad (esquina), llamas M98 P5000 tantas veces como necesites y mueves a la siguiente posición. Este patrón acelera la puesta a punto y deja el código muy legible. Lo trabajamos con piezas reales en Programación CNC en Fanuc.
11) Subprogramas y múltiples orígenes (G54…G59)
Si trabajas con dos mordazas o varias cavidades, combina orígenes de trabajo con llamadas a subprograma:
; Dos mordazas: izquierda G54, derecha G55
O1200
G21 G90 G17 G40 G49 G80
(--- IZQUIERDA ---)
G54
G00 X0 Y0 Z5
M98 P5000
G00 Z50
(--- DERECHA ---)
G55
G00 X0 Y0 Z5
M98 P5000
G00 Z50
M30
La relación clara entre origen y subprograma hace el programa robusto y fácil de revisar por cualquier operador del taller.
12) ¿Cómo integrar subprogramas en tu flujo CAM?
Con Mastercam (y otros CAM), puedes:
- Postprocesar una operación como subprograma y repetirla por WCS o transformaciones.
- Usar Transform → Translate/Rotate con Output → Subprogram para matrices y bridas.
- Asignar nombres O#### constantes a operaciones “plantilla” (por ejemplo, O5000 = cavidad estándar) y llamarlas desde el principal.
Ventaja: el G-code queda corto, ordenado y la simulación del CAM coincide con lo que pasa en máquina.
13) Estrategia de estudio 30/60/90
0–30 días: fundamentos.
- Practica llamadas
M98/M99con un subprograma simple (taladro). - Ensaya G90/G91 dentro del sub y el retorno limpio a G90.
- Haz matrices 2×3 con
Ly sin variables.
31–60 días: producción controlada.
- Implementa cavidad estándar reusable con entradas/salidas seguras.
- Combina subprogramas con G54…G59 (dos mordazas o múltiples cavidades).
- Integra el flujo en Mastercam con “Output as Subprogram”.
61–90 días: escalado y parametrización.
- Introduce macros (si tu control lo permite) para hacer subprogramas paramétricos.
- Crea una biblioteca de O#### corporativos (taladro, roscado, chaflán, cavidad, ranura).
- Documenta estándares de nombre, safe start y alturas.
14) FAQ rápidas
¿Puedo poner varios subprogramas en el mismo archivo? Sí, siempre que el control lo soporte; muchos talleres prefieren archivos separados para reutilizarlos en distintas piezas.
¿Se puede repetir un subprograma con desplazamiento automático? Con G91 dentro del sub y reposicionamientos entre llamadas, o con variables/macros, sí.
¿Qué pasa si paro a mitad de un subprograma? Retoma en un bloque seguro (Z alta, ciclos cancelados). Evita reanudar con compensaciones activas sin contexto.
[mailerlite_form form_id=1]15) Conclusión y siguiente paso
Los subprogramas son una palanca de productividad: estandarizan operaciones, reducen líneas y evitan errores. Empieza por patrones simples, fija estados seguros (G90/G91, planos y cancelaciones), añade entradas/salidas limpias y documenta tu biblioteca O####. En poco tiempo, tus programas serán más cortos, tus puestas a punto más rápidas y tus piezas más consistentes.
Si quieres acelerar el aprendizaje con ejercicios guiados y archivos listos para máquina:
- Curso de Programación CNC en Fanuc — M98/M99, G90/G91 seguros, librería de subprogramas.
- Curso de Heidenhain — LBL/CALL, ciclos TNC y estrategias de repetición.
- Curso de Mastercam — generar subprogramas desde el CAM y transformaciones por WCS.
Reto de esta semana: convierte una operación que repitas a diario en un subprograma reusable (O5xxx). Implántalo en una pieza real, mide el tiempo ahorrado y documenta la versión “v1.0”.



