Guía CNC
Subprogramas y macros en Fanuc y Haas: M98/M99, M97, G65, variables # y WHILE
Cuando un programa repite lo mismo seis veces (seis barrenos, cuatro pasadas, dos piezas) hay dos formas de escribirlo: copiar y pegar, o decirle al control que lo repita. La segunda es más corta, tiene menos errores y se corrige en un solo lugar. Esta guía muestra las tres herramientas para hacerlo en Fanuc y Haas, de la más simple a la más potente.
1. Subprogramas: M98 y M99
Un subprograma es un programa aparte con su propio número O. M98 P100 salta a O100, lo ejecuta hasta encontrar M99 y regresa a la línea siguiente de la llamada. Con L se repite: M98 P100 L4 lo corre cuatro veces (en Fanuc antiguo las repeticiones van dentro de P: P40100 = 4 veces el O0100).
G54 G00 X10. Y10.
M98 P100 (3 barrenos en esta fila)
G00 X10. Y70.
M98 P100 (los mismos 3, en la fila de arriba)
...
O100 (3 BARRENOS EN X10, X25 Y X40, EN LA Y ACTUAL)
G90 G99 G83 X10. Z-23. R2. Q6. F250.
X25.
X40.
G80
M99
Dos reglas que evitan sustos: el subprograma debe dejar las cosas como las encontró (si cambia a G91, que regrese a G90; si abre un ciclo, que lo cierre con G80), y no debe depender de a qué altura está Z al entrar, porque se llamará desde distintos lugares.
G91 X15. para avanzar de barreno en barreno? Porque con un ciclo fijo activo, G91 también vuelve incrementales R (medido desde el nivel inicial) y Z (medido desde R): el siguiente barreno se haría unos milímetros arriba de la pieza, en el aire. El simulador lo avisa con «El ciclo G83 no llega al material». Si quieres barrenos incrementales, escribe el ciclo completo en G91 con R y Z incrementales, o usa posiciones absolutas como aquí.En la máquina, O100 es un programa independiente guardado en la memoria del control. En el simulador lo pegas al final del mismo archivo, después del M30, y lo encuentra solo.
2. Haas: M97, el subprograma local
Haas agrega M97 P100, que en lugar de buscar otro programa salta al bloque N100 del mismo programa. Es lo más cómodo para prácticas, porque todo vive en un archivo. El bloque local va después del M30 y termina con M99, exactamente igual que arriba pero con N100 en lugar de O100. En Fanuc no existe: usa M98.
3. Variables: los números con #
Una variable es un número con nombre: #1, #2… hasta #33 son locales (se borran al terminar el programa o la macro); de #100 a #199 son comunes y sobreviven entre programas. Se asignan con = y se usan donde iría un número:
#1 = -6. (profundidad final)
#2 = 2. (pasada)
G01 Z#1 F150. (igual que G01 Z-6. F150.)
#3 = #1 / #2 (operaciones: + - * / y funciones SIN COS SQRT ABS ROUND FIX)
#4 = [#1 + 10.] * 2 (los corchetes agrupan, como los paréntesis en álgebra)
Con variables, cambiar la profundidad de una cajera es editar una línea, no diez.
4. Decisiones y bucles: IF, GOTO y WHILE
Las comparaciones se escriben con EQ NE GT GE LT LE (igual, distinto, mayor, mayor o igual, menor, menor o igual) dentro de corchetes:
IF [#1 LT #2] THEN #1 = #2 (si pasó la profundidad final, la recorta)
IF [#5 GT 3.] GOTO 200 (salta al bloque N200 cuando se cumple)
WHILE [#1 GT #2] DO1 (repite hasta que la condición sea falsa)
...
END1
El bucle más útil del taller es el de pasadas en Z: en lugar de escribir el contorno tres veces, se escribe una vez dentro de un WHILE que baja #1 en cada vuelta. DO1/END1 deben llevar el mismo número; puedes anidar hasta tres (DO1, DO2, DO3).
5. Macros con argumentos: G65
G65 P9010 A60. B20. C30. llama al programa O9010 pasándole valores: A llega como #1, B como #2, C como #3 (la tabla sigue el alfabeto, saltando G, L, N, O y P; por ejemplo D es #7, I es #4, R es #18). Es la forma de escribir tu propio ciclo: una ranura, un patrón, un chaflán, con medidas distintas en cada llamada.
G65 P9010 A60. B20. C30. (ranura que empieza en X60 Y20, de 30 mm)
G65 P9010 A60. B60. C30. (otra igual, 40 mm más arriba)
...
O9010 (MACRO: RANURA DESDE #1,#2 DE LARGO #3)
G00 X#1 Y#2
Z2.
G01 Z-3. F150.
G91 G01 X#3 F500.
G90 G00 Z5.
M99
En Haas G65 también funciona; los programas de macro suelen numerarse O9000–O9999 y la máquina los puede proteger contra edición.
El programa completo
Une las tres técnicas sobre una placa de 100 × 80 × 20 con el cero en la esquina frontal izquierda. Funciona igual en los controles Haas y Fanuc del simulador (para la versión con M97, cambia M98 P100 por M97 P100 y O100 por N100).
%
O00060 (SUBPROGRAMAS Y MACROS)
(MATERIAL 100 X 80 X 20 ALUMINIO)
(CERO: ESQUINA FRONTAL IZQUIERDA, Z0 ARRIBA)
(T1 FRESA PLANA D10)
(T4 BROCA D8.5)
G17 G21 G40 G49 G80 G90
(--- 1. CAJERA EN PASADAS CON WHILE ---)
T1 M06
G54 G00 X30. Y40. S3500 M03
G43 H01 Z25. M08
#1 = 0. (PROFUNDIDAD ACTUAL)
#2 = -6. (PROFUNDIDAD FINAL)
#3 = 2. (PASADA)
G00 Z2.
WHILE [#1 GT #2] DO1
#1 = #1 - #3
IF [#1 LT #2] THEN #1 = #2
G01 Z#1 F150.
G01 X45. F500.
Y50.
X30.
Y40.
END1
G00 Z25.
(--- 2. RANURAS CON MACRO G65: A=X B=Y C=LARGO ---)
G65 P9010 A60. B20. C30.
G65 P9010 A60. B60. C30.
G00 Z25. M09
G53 G49 Z0. M05
(--- 3. BARRENOS CON SUBPROGRAMA M98 EN DOS FILAS ---)
T4 M06
G54 G00 X10. Y10. S2000 M03
G43 H04 Z25. M08
M98 P100
G00 X10. Y70.
M98 P100
G00 Z25. M09
G53 G49 Z0. M05
M30
O9010 (MACRO: RANURA DESDE #1,#2 DE LARGO #3)
G00 X#1 Y#2
Z2.
G01 Z-3. F150.
G91 G01 X#3 F500.
G90 G00 Z5.
M99
O100 (SUBPROGRAMA: 3 BARRENOS EN X10, X25 Y X40)
G90 G99 G83 X10. Z-23. R2. Q6. F250.
X25.
X40.
G80
M99
%
Al simularlo, usa Bloque a bloque y observa cómo el editor salta al subprograma y regresa; la línea resaltada es la que se está ejecutando. En el panel Programa verás 127 movimientos generados por 54 líneas: eso es lo que te ahorraste de escribir.
Errores típicos
- Bucle infinito: la condición nunca se vuelve falsa (olvidaste restar la pasada). El simulador se detiene al llegar a su límite de bloques y lo marca como error con la pregunta «¿ciclo infinito?»; en la máquina, el programa no terminaría nunca.
- Subprograma que no existe:
M98 P100sinO100, o con el número mal. En la máquina es una alarma; aquí, un error con la línea de la llamada. - Olvidar M99: el control sigue de largo hacia el siguiente programa en memoria.
- G91 que se queda activo al salir del subprograma: la siguiente coordenada absoluta se interpreta como incremental y la herramienta se va lejos. Siempre regresa a G90 antes del M99.
- Variables sin inicializar: una variable local vacía vale «vacío», no cero, y en algunos controles da alarma al usarse. Asigna todas antes del bucle.
R con IF … GOTOB y subprogramas SPF en Sinumerik (guía de Siemens); parámetros Q, FN y CALL LBL en Heidenhain (guía de Heidenhain). LinuxCNC usa O-words: o100 sub, o101 while (guía de GRBL y LinuxCNC).Recuerda que cada control tiene su propio límite de anidación y sus propias variables de sistema: lo que simula bien aquí, pruébalo en la máquina en bloque a bloque antes de confiar en una macro nueva.
Prueba lo que aprendiste: pega tu programa y revisa el reporte.
Abrir el simulador CNC