Programa GCode (configurable) para Mach3: desvasta volumen alisando sucesivamente plano XYAlgo tan simple como hacer un hueco de forma rectangular (o repetido/panelizado a lo largo de los ejes X e Y), o un corte lineal (de cierto espesor), o alisar una superficie con una máquina de CNC. Es simple, pero bueno, uno a veces tiene necesidades y escribe el programa una vez, dos veces, y luego se da cuenta que Mach3 es un excelente programa para controlar una máquina de CNC, pero lamentablemente no permite realizar ciertas cosas extremadamente útiles como asignación de nombres simbólicos a las variables ni construcciones condicionales. Por supuesto, estoy considerando que los programas son escritos a mano (tal como suelo hacer yo cuando necesito hacer mecanizaciones geométricamente simples). De mas está decir, también se pueden generar los programas utilizando modelado 3D mediante un software CAD, aunque como mencioné recién, si la geometría es simple, el código resultante de escribirlo manualmente queda bastante compacto y lindo. Frente a estas situaciones incómodas desde el punto de vista del programador (principalmente la de no poder asignar nombres simbólicos), para aliviar un poco la carga de tener que escribir un nuevo programa para cada situación o necesidad, aquí se permite generar el gcode (de la realización de un array de huecos rectangulares, es decir, panelizados) ajustando ciertos parámetros. Consideraciones para configurar correctamente las variables:
Reserva de Variables (para contar loops): desde #1000No requiero específicamente "declarar" las variables que voy a usar, pero sí preciso saber que debo reservar el espacio en memoria para dicha variable y no pisarlo con otra. Concretamente, voy a hacer uso de las siguientes variables (no voy a generar código para esta "reserva", sino que es para tenerlo en cuenta al momento de asignarle un número de parámetro a cada variable). Repito, la siguiente enumeración no es código de programa, sino que es dicho con el único fin de "acordarme yo" que estas zonas de memoria las voy a usar para una finalidad ya establecida.
Reserva de Subrutinas (que no son loops): desde O2000En gcode, la llamada a una subrutina tiene 2 formas:
A continuación se reservan zonas de memoria para las subrutinas que no son loops (ya que como dije anteriormente, para los loops se usa el mismo address que el "contador" que le corresponde). No se genera código en esta instancia, pero sí "me acuerdo" que las siguientes zonas de memoria van a ser ocupadas.
Seteo Constantes (hardcoded)Las constantes a continuación no pertenecen al código del programa ya que no es necesario memorizarlos dado que estos valores son tomados en el momento de la escritura del código fuente únicamente. Aquí son definidos valores constantes que a lo largo del programa será necesario escribir. Todas las coordenadas espaciales se encuentran en unidades de mm. Puede hacer click en parámetros coloreados en azul para modificarlos, y automáticamente la página va a refrescar y mostrar el resultado acorde con el valor ingresado.
Constantes Calculadas (hardcoded)Las variables a continuación tampoco pertenecen al código del programa ya que aquí simplemente son calculados valores constantes que a lo largo del programa será necesario usar, pero no se almacenan en memoria, sino que al momento de escribir el programa se utilizan. No son para que el usuario ajuste el valor, ya que se calculan automaticamente partiendo de los datos previamente ingresados.
El resultado de la variable "nPasadasEje_x" determina si es necesario que la herramienta pase por el medio del área del plano XY (nPasadasEje_x>0), o si con realizar solamente un recorrido por el perímetro alcanza (este caso se da solamente si [y-y0<=2*diamHerramienta-superposicion]) Funcion "main"G90 (absolute coords)G21 (mm mode) M3 (spindle on) F1000 ("feedRateSobrevuelo") G01 Z[10] (Move: "Zsobrevuelo") #1003=0 ("contador_panel_y": inicializacion variable) M98 P1003 L3 (Subrutina_panel_y) G01 X[0] Y[0] (Move: posicion inicial XY) G01 Z[0] (Move: posicion inicial Z) M5 (Spindle off) M30 (Program end and rewind) Subrutina "Panel Y"O1003 (Subrutina_panel_y)#1002=0 ("contador_panel_x": inicializacion variable) M98 P1002 L2 (Subrutina_panel_x) #1003=[#1003+1] (contador_panel_y++) M99 (Fin subrutina) Subrutina "Panel X"O1002 ("subrutina_panel_x")#1001=0 ("contador_plano_z": inicializacion variable) M98 P1001 L5 ("subrutina_plano_z") G01 Z[10] ("Zsobrevuelo": move) #1002=[#1002+1] (contador_panel_x++) M99 (Fin subrutina) Subrutina "Plano Z"O1001 ("subrutina_plano_z")M98 P2000 ("subrutina_perimetro") #1000=0 ("contador_linea_x": inicializacion variable) M98 P1000 L1 ("subrutina_linea_x") #1001=[#1001+1] (contador_plano_z++) M99 (Fin subrutina) Subrutina "Perimetro"O2000 ("subrutina_perimetro")G01 X[11.5+#1002*20] Y[21.5+#1003*20] ("p00": move XY) G01 Z[0+#1001*-1] (move: "Z") F100 ("feedRateMecanizacion") G01 X[18.5+#1002*20] Y[21.5+#1003*20] ("p10": move XY) G01 X[18.5+#1002*20] Y[28.5+#1003*20] ("p11": move XY) G01 X[11.5+#1002*20] Y[28.5+#1003*20] ("p01": move XY) G01 X[11.5+#1002*20] Y[21.5+#1003*20] ("p00": move XY) M99 (Fin subrutina) Subrutina "Linea X"O1000 ("subrutina_linea_x")F1000 ("feedRateSobrevuelo") G01 X[11.5+#1002*20] Y[23.8333333333+#1003*20+#1000*2.33333333333] ("linea_X_p00": move XY) F100 ("feedRateMecanizacion") G01 X[18.5+#1002*20] Y[23.8333333333+#1003*20+#1000*2.33333333333] ("linea_X_p10": move XY) F1000 ("feedRateSobrevuelo") G01 X[18.5+#1002*20] Y[26.1666666667+#1003*20+#1000*2.33333333333] ("linea_X_p11": move XY) F100 ("feedRateMecanizacion") G01 X[11.5+#1002*20] Y[26.1666666667+#1003*20+#1000*2.33333333333] ("linea_X_p01": move XY) F1000 ("feedRateSobrevuelo") #1000=[#1000+1] (contador_linea_x++) M99 (Fin subrutina) Resultado: código gcode completo(Parámetros ingresados para la generación del presente código) |