Ir al contenido

Posprocesador QCAD/CAM

QCAD/CAM puede exportar dibujos CAD a diversos formatos usados en CAM (fabricación asistida por ordenador). Estos formatos pueden ser dialectos de código G u otros formatos completamente diferentes. Cada formato CAM admitido se define en un archivo de configuración (o “posprocesador”) que es un archivo ECMAScript (JavaScript) que implementa los detalles del formato. Todas las configuraciones disponibles se almacenan dentro del directorio postprocessors. Se pueden añadir nuevas implementaciones de formato en la misma ubicación.

Cada archivo de configuración contiene una clase ECMAScript con el mismo nombre que el archivo de script. Si el archivo de script se llama MyGCode.js, la clase definida dentro del script debe llamarse MyGCode.

La clase ECMAScript debe derivar directa o indirectamente de la clase CamExporterV2, que está definida por QCAD/CAM. CamExporterV2 define la estructura básica de las clases de configuración de exportador CAM. Diversos métodos de CamExporterV2 se llaman para exportar el encabezado del archivo, las diversas entidades del dibujo CAD y el pie de página. CamExporterV2 también se encarga de las diversas funciones de QCAD/CAM, por ejemplo la compensación del radio de la herramienta, la entrada / salida, el corte de los contornos internos antes de los externos, la optimización de trayectorias, etc.

CamExporterV2 no produce nada por sí mismo, sino que por sí solo generaría un archivo vacío. CamExporterV2 ofrece un flujo de texto (QTextStream) para escribir en el archivo exportado. Este flujo de texto se expone a través de la variable miembro this.stream.

Si la salida deseada es un dialecto de código G (p. ej. G1 X10 Y20 para un movimiento lineal), la configuración se puede derivar de la configuración existente para código G llamada GCodeBase, que está definida en el archivo GCodeBase.js. Este es el caso de la mayoría de los controladores de máquina. Una de esas configuraciones de ejemplo para la salida de código G en milímetros se define en el archivo GCodeMM.js y está disponible en la interfaz de usuario como la configuración llamada G-Code (G41/G42) [mm].

Cree un archivo con un nombre único de su elección. Para este ejemplo, llamamos a nuestra nueva configuración MyGCode y la almacenamos en un archivo del mismo nombre, es decir, MyGCode.js en el directorio postprocessors de su instalación de QCAD/CAM.

Puede usar su editor de texto plano preferido para crear y escribir el archivo, por ejemplo Notepad en Windows, TextEdit en macOS o vim, Emacs, etc. en sistemas Linux.

MyGCode.js debe definir una clase llamada MyGCode para ser una configuración válida para QCAD/CAM. Aunque en ECMAScript en sentido estricto no hay clases, podemos crear un concepto similar adjuntando funciones al objeto prototipo de una función constructora. Cómo funciona exactamente esto queda fuera del alcance de esta documentación. No obstante, hay una plantilla sencilla que puede usar para todos los archivos de configuración.

Para nuestro ejemplo, la definición de la clase MyGCode tiene este aspecto (tenga en cuenta que las líneas que empiezan por // son comentarios y no son necesarias):

// Incluir GCodeBase.js, que contiene la clase 'GCodeBase',
// usada como base para nuestra propia configuración:
include("GCodeBase.js");
// Constructor de nuestra clase:
function MyGCode(documentInterface, newDocumentInterface) {
// Llamar al constructor de la clase base:
GCodeBase.call(this, documentInterface, newDocumentInterface);
}
// Derivar nuestra clase de la clase GCodeBase:
MyGCode.prototype = new GCodeBase();
// Nombre para mostrar en la interfaz de usuario:
MyGCode.displayName = "My G-Code";

Ahora hemos creado una nueva configuración totalmente funcional llamada “My G-Code” que está lista para usarse en QCAD/CAM y produce código G básico.

El constructor que definimos arriba llama al constructor de nuestra clase base GCodeBase. En el constructor, podemos establecer algunos parámetros para nuestra configuración, como la unidad de salida deseada o si queremos usar G41/G42 para la compensación del radio de la herramienta o calcular el centro de la trayectoria de la herramienta.

Para configurar la unidad de salida (que es la unidad que espera su máquina o controlador), podemos establecer la variable miembro unit en Inch o Millimeter, por ejemplo:

this.unit = RS.Inch;

o

this.unit = RS.Millimeter;

Otros ajustes que se pueden configurar en el constructor son:

Variable Valores posibles Predeterminado Descripción
this.outputOffsetPath true o false false Establezca en true para calcular la compensación del radio de la herramienta en lugar de usar G41/G42.
this.lineNumber Número 10 Número inicial usado para la numeración de líneas (N…).
this.lineNumberIncrement Número 10 Incremento del número de línea de una línea a otra.
this.fileExtensions Array [ "nc", "cnc" ] Lista de extensiones de archivo entre las que el usuario puede elegir al exportar mediante este posprocesador.

Un constructor completo podría tener este aspecto:

function MyGCode(documentInterface, newDocumentInterface) {
GCodeBase.call(this, documentInterface, newDocumentInterface);
this.unit = RS.Inch;
this.outputOffsetPath = true;
this.lineNumber = 1;
this.lineNumberIncrement = 1;
}

La salida de código G está estructurada en bloques de código que se escriben en el archivo de salida al usar la función de exportación CAM en QCAD/CAM. Por ejemplo, el primer bloque de código que se escribe es el bloque de código “header”. Cada bloque de código se define en una variable miembro que lo identifica por su nombre, por ejemplo this.header contiene el bloque de código del encabezado del archivo.

Los bloques de código se pueden sobrescribir para que contengan cualquier código / texto. Los bloques de código suelen contener variables para dar salida a las coordenadas X/Y actuales, el número de línea, el avance, etc.

Supongamos que se exporta una sola línea a código G. La línea se exporta con compensación del radio de la herramienta a la izquierda de la línea (G41). Los bloques de código que se escriben en el archivo de salida son los siguientes:

Bloque de código Descripción Ejemplo de salida
header Encabezado de la salida (siempre el primer bloque de código). G21 G17 G90 G40 G49 G80
rapidMoveZ Movimiento rápido al nivel de seguridad. G0 Z100
rapidMove Movimiento rápido a la primera posición del primer contorno (aquí el inicio de la entrada de la línea). G0 X5 Y10
toolHeader Primer bloque cuando entra en acción una nueva herramienta (cambio de herramienta). T1
rapidMoveZ Movimiento rápido hacia abajo al nivel de aproximación (flotando sobre el material). G0 Z5
firstLinearMoveZ Penetración en el material a la velocidad de penetración. G1 Z-5 F50
toolpathHeader Primer bloque de una nueva trayectoria de herramienta.
contourHeader Primer bloque de un nuevo contorno dentro de una trayectoria de herramienta.
singleZPassHeader Encabezado para una única pasada Z. Estamos cortando toda la profundidad en una sola pasada.
zPassFirstHeader Primer encabezado de una o varias pasadas Z.
linearMoveCompensationLeft Movimiento lineal al punto inicial de la línea a lo largo de la entrada, activando la compensación del radio de la herramienta. G41 X10 Y10 F500
linearMove Movimiento lineal a lo largo de la línea hasta el punto final de la línea. X30 Y10
linearMoveCompensationOff Movimiento lineal alejándose del punto final a lo largo de la salida, desactivando la compensación del radio de la herramienta. G40 X35 Y10
zPassLastFooter Último pie de una o varias pasadas Z.
singleZPassFooter Pie para una única pasada Z.
contourFooter Fin del contorno.
toolpathFooter Fin de la trayectoria de herramienta.
linearMoveZ Movimiento fuera del material al nivel de aproximación. Z5
rapidMoveZ Movimiento rápido al nivel de seguridad. G0 Z100
toolFooter Fin para esta herramienta.
footer Fin del programa. M30

Muchos de estos bloques de código suelen estar sin usar y no producen ninguna salida (bloque de código vacío).

Variable miembro Nombre de variable Descripción
inputFileName INFILENAME Nombre del archivo de entrada (p. ej. archivo DXF).
inputFilePath INFILEPATH Nombre del archivo de entrada con la ruta completa.
fileName FILENAME Nombre del archivo de salida.
filePath FILEPATH Nombre del archivo de salida con la ruta completa.
dateTime DATETIME Fecha y hora de la exportación.
lineNumber N Número de línea actual.
spindleSpeed S Velocidad del husillo, típicamente en rpm.
feedRate F Avance.
plungeRate FP Velocidad de penetración.
xHomePosition XH Posición de referencia tal como se configura en la configuración CAM.
yHomePosition YH
zHomePosition ZH
zSafety ZS Nivel de seguridad Z para cambios de herramienta e inicio / fin.
zClearance ZU Nivel de aproximación Z para acercarse al material.
zClearancePass ZUP Nivel de aproximación Z entre varias pasadas.
zCuttingDepth ZD Nivel de corte Z (total).
xFirstPosition XF Primera posición del primer contorno en la primera trayectoria de herramienta.
yFirstPosition YF
xStartPosition X1 Inicio de la entidad (punto inicial de la línea / arco).
yStartPosition Y1
zStartPosition Z1
xPosition X Posición de destino actual. Punto final de la línea / arco actual.
yPosition Y
zPosition Z
xRelPosition XR Posición de destino actual como coordenada relativa, respecto al punto inicial.
yRelPosition YR
zRelPosition ZR
iArcCenterInc I Centro del arco, respecto al punto inicial.
jArcCenterInc J
iArcCenterAbs IA Centro del arco, absoluto.
jArcCenterAbs JA
arcRadius RADIUS Radio del arco.
arcDiameter DIAMETER Diámetro del arco.
arcSweep SWEEP Barrido del arco (ángulo cubierto por el arco en rad, negativo en sentido horario).
tool T Herramienta actual.
toolRadius TR Radio de la herramienta.
toolDiameter TD Diámetro de la herramienta.
toolpathOrder TOOLPATH_ORDER Orden de la trayectoria de herramienta en la lista de trayectorias, comenzando con 0 para la primera trayectoria.
toolCalls TOOL_CALLS Número de veces que se ha usado esta herramienta.
toolpathName TOOLPATH_NAME Nombre de la trayectoria de herramienta actual (definido por el usuario).
programName PROGRAM_NAME Nombre del programa tal como lo configura el usuario en la configuración CAM.
xMin X_MIN Extensión mínima del dibujo.
yMin Y_MIN
zMin Z_MIN
xMax X_MAX Extensión máxima del dibujo.
yMax Y_MAX
zMax Z_MAX

Para añadir o cambiar códigos G, códigos M u otra información en el encabezado o el pie de página, una configuración puede sobrescribir las variables miembro header y footer en el constructor, por ejemplo de la siguiente manera:

this.header = [ "[N] G0 Z100" ];
this.footer = [ "[N] G0 Z100", "[N] M30" ];

Para usar valores absolutos para los valores I/J del centro de los arcos, puede sobrescribir los bloques de código de arco de la siguiente manera:

this.firstArcCWMove = "[N] G2 [X] [Y] [IA] [JA] [F]";
this.arcCWMove = "[N] G2 [X] [Y] [IA] [JA] [F]";
this.firstArcCCWMove = "[N] G3 [X] [Y] [IA] [JA] [F]";
this.arcCCWMove = "[N] G3 [X] [Y] [IA] [JA] [F]";

QCAD/CAM combina automáticamente un archivo de plantilla DXF con el mismo nombre que el archivo del posprocesador (si está disponible) al establecer o cambiar el posprocesador. Supongamos que el posprocesador se llama “MyGCode”, implementado en postprocessors/MyGCode.js. Cree un archivo DXF con las definiciones de herramienta en postprocessors/MyGCode.dxf. Este archivo puede contener definiciones de herramienta, capas predeterminadas o el contorno de la superficie disponible. Nota: Cualquier contenido visible del archivo de plantilla se coloca automáticamente en una capa bloqueada al combinar, de modo que solo es visible pero no seleccionable.