Salta ai contenuti

Postprocessore QCAD/CAM

QCAD/CAM può esportare disegni CAD in vari formati usati nella CAM (produzione assistita dal computer). Questi formati possono essere dialetti di codice G o altri formati completamente diversi. Ogni formato CAM supportato è definito in un file di configurazione (o “postprocessore”) che è un file ECMAScript (JavaScript) che implementa i dettagli del formato. Tutte le configurazioni disponibili sono memorizzate nella cartella postprocessors. Nuove implementazioni di formato possono essere aggiunte nella stessa posizione.

Ogni file di configurazione contiene una classe ECMAScript con lo stesso nome del file di script. Se il file di script si chiama MyGCode.js, la classe definita all’interno dello script deve chiamarsi MyGCode.

La classe ECMAScript deve derivare direttamente o indirettamente dalla classe CamExporterV2, definita da QCAD/CAM. CamExporterV2 definisce la struttura di base delle classi di configurazione dell’esportatore CAM. Vari metodi di CamExporterV2 vengono chiamati per esportare l’intestazione del file, le varie entità del disegno CAD e il piè di pagina. CamExporterV2 si occupa inoltre delle varie funzioni di QCAD/CAM, ad esempio la compensazione del raggio utensile, l’entrata / l’uscita, il taglio dei contorni interni prima di quelli esterni, l’ottimizzazione dei percorsi, ecc.

CamExporterV2 non produce nulla da solo, ma di per sé genererebbe un file vuoto. CamExporterV2 offre un flusso di testo (QTextStream) per scrivere nel file esportato. Questo flusso di testo è esposto tramite la variabile membro this.stream.

Se l’output desiderato è un dialetto di codice G (ad es. G1 X10 Y20 per un movimento lineare), la configurazione può essere derivata dalla configurazione esistente per il codice G chiamata GCodeBase, definita nel file GCodeBase.js. È il caso della maggior parte dei controller delle macchine. Una di queste configurazioni di esempio per l’output di codice G in millimetri è definita nel file GCodeMM.js e disponibile nell’interfaccia utente come configurazione chiamata G-Code (G41/G42) [mm].

Create un file con un nome univoco a vostra scelta. Per questo esempio, chiamiamo la nostra nuova configurazione MyGCode e la memorizziamo in un file con lo stesso nome, ossia MyGCode.js nella cartella postprocessors della vostra installazione di QCAD/CAM.

Potete usare il vostro editor di testo semplice preferito per creare e scrivere il file, ad esempio Notepad su Windows, TextEdit su macOS o vim, Emacs, ecc. sui sistemi Linux.

MyGCode.js deve definire una classe chiamata MyGCode per essere una configurazione valida per QCAD/CAM. Sebbene in ECMAScript in senso stretto non esistano classi, possiamo creare un concetto simile collegando funzioni all’oggetto prototipo di una funzione costruttore. Come funziona esattamente esula dallo scopo di questa documentazione. Esiste tuttavia un modello semplice che potete usare per tutti i file di configurazione.

Per il nostro esempio, la definizione della classe MyGCode ha questo aspetto (notate che le righe che iniziano con // sono commenti e non sono richieste):

// Includere GCodeBase.js, che contiene la classe 'GCodeBase',
// usata come base per la nostra configurazione:
include("GCodeBase.js");
// Costruttore della nostra classe:
function MyGCode(documentInterface, newDocumentInterface) {
// Chiamare il costruttore della classe base:
GCodeBase.call(this, documentInterface, newDocumentInterface);
}
// Derivare la nostra classe dalla classe GCodeBase:
MyGCode.prototype = new GCodeBase();
// Nome visualizzato nell'interfaccia utente:
MyGCode.displayName = "My G-Code";

Ora abbiamo creato una nuova configurazione pienamente funzionante chiamata “My G-Code”, pronta per essere usata in QCAD/CAM e che produce codice G di base.

Il costruttore che abbiamo definito sopra chiama il costruttore della nostra classe base GCodeBase. Nel costruttore, possiamo impostare alcuni parametri per la nostra configurazione, come l’unità di output desiderata o se vogliamo usare G41/G42 per la compensazione del raggio utensile o calcolare il centro del percorso utensile.

Per configurare l’unità di output (ossia l’unità attesa dalla vostra macchina o dal controller), possiamo impostare la variabile membro unit su Inch o Millimeter, ad esempio:

this.unit = RS.Inch;

oppure

this.unit = RS.Millimeter;

Altre impostazioni che possono essere configurate nel costruttore sono:

Variabile Valori possibili Predefinito Descrizione
this.outputOffsetPath true o false false Impostare su true per calcolare la compensazione del raggio utensile invece di usare G41/G42.
this.lineNumber Numero 10 Numero iniziale usato per la numerazione delle righe (N…).
this.lineNumberIncrement Numero 10 Incremento del numero di riga da riga a riga.
this.fileExtensions Array [ "nc", "cnc" ] Elenco delle estensioni di file tra cui l’utente può scegliere durante l’esportazione tramite questo postprocessore.

Un costruttore completo potrebbe avere questo aspetto:

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

L’output del codice G è strutturato in blocchi di codice che vengono scritti nel file di output quando si usa la funzione di esportazione CAM in QCAD/CAM. Ad esempio, il primo blocco di codice scritto è il blocco di codice “header”. Ogni blocco di codice è definito in una variabile membro che lo identifica per nome, ad esempio this.header contiene il blocco di codice per l’intestazione del file.

I blocchi di codice possono essere sovrascritti per contenere qualsiasi codice / testo. I blocchi di codice contengono in genere variabili per emettere le coordinate X/Y correnti, il numero di riga, l’avanzamento, ecc.

Supponiamo che una singola linea venga esportata in codice G. La linea viene esportata con compensazione del raggio utensile a sinistra della linea (G41). I blocchi di codice scritti nel file di output sono i seguenti:

Blocco di codice Descrizione Esempio di output
header Intestazione dell’output (sempre il primo blocco di codice). G21 G17 G90 G40 G49 G80
rapidMoveZ Movimento rapido al livello di sicurezza. G0 Z100
rapidMove Movimento rapido alla prima posizione del primo contorno (qui l’inizio dell’entrata per la linea). G0 X5 Y10
toolHeader Primo blocco quando entra in azione un nuovo utensile (cambio utensile). T1
rapidMoveZ Movimento rapido verso il basso al livello di accostamento (in sospensione sopra il materiale). G0 Z5
firstLinearMoveZ Penetrazione nel materiale alla velocità di penetrazione. G1 Z-5 F50
toolpathHeader Primo blocco di un nuovo percorso utensile.
contourHeader Primo blocco di un nuovo contorno all’interno di un percorso utensile.
singleZPassHeader Intestazione per una singola passata Z. Stiamo tagliando l’intera profondità in un’unica passata.
zPassFirstHeader Prima intestazione di una o più passate Z.
linearMoveCompensationLeft Movimento lineare al punto iniziale della linea lungo l’entrata, attivando la compensazione del raggio utensile. G41 X10 Y10 F500
linearMove Movimento lineare lungo la linea fino al punto finale della linea. X30 Y10
linearMoveCompensationOff Movimento lineare lontano dal punto finale lungo l’uscita, disattivando la compensazione del raggio utensile. G40 X35 Y10
zPassLastFooter Ultimo piè di una o più passate Z.
singleZPassFooter Piè per una singola passata Z.
contourFooter Fine del contorno.
toolpathFooter Fine del percorso utensile.
linearMoveZ Movimento fuori dal materiale al livello di accostamento. Z5
rapidMoveZ Movimento rapido al livello di sicurezza. G0 Z100
toolFooter Fine per questo utensile.
footer Fine del programma. M30

Molti di questi blocchi di codice sono in genere inutilizzati e non producono alcun output (blocco di codice vuoto).

Variabile membro Nome variabile Descrizione
inputFileName INFILENAME Nome del file di input (ad es. file DXF).
inputFilePath INFILEPATH Nome del file di input con il percorso completo.
fileName FILENAME Nome del file di output.
filePath FILEPATH Nome del file di output con il percorso completo.
dateTime DATETIME Data e ora dell’esportazione.
lineNumber N Numero di riga corrente.
spindleSpeed S Velocità del mandrino, tipicamente in giri/min.
feedRate F Avanzamento.
plungeRate FP Velocità di penetrazione.
xHomePosition XH Posizione di riferimento come configurata nella configurazione CAM.
yHomePosition YH
zHomePosition ZH
zSafety ZS Livello di sicurezza Z per i cambi utensile e l’inizio / la fine.
zClearance ZU Livello di accostamento Z per l’avvicinamento al materiale.
zClearancePass ZUP Livello di accostamento Z tra più passate.
zCuttingDepth ZD Livello di taglio Z (totale).
xFirstPosition XF Prima posizione del primo contorno nel primo percorso utensile.
yFirstPosition YF
xStartPosition X1 Inizio dell’entità (punto iniziale della linea / dell’arco).
yStartPosition Y1
zStartPosition Z1
xPosition X Posizione di destinazione corrente. Punto finale della linea / dell’arco corrente.
yPosition Y
zPosition Z
xRelPosition XR Posizione di destinazione corrente come coordinata relativa, rispetto al punto iniziale.
yRelPosition YR
zRelPosition ZR
iArcCenterInc I Centro dell’arco, rispetto al punto iniziale.
jArcCenterInc J
iArcCenterAbs IA Centro dell’arco, assoluto.
jArcCenterAbs JA
arcRadius RADIUS Raggio dell’arco.
arcDiameter DIAMETER Diametro dell’arco.
arcSweep SWEEP Ampiezza dell’arco (angolo coperto dall’arco in rad, negativo in senso orario).
tool T Utensile corrente.
toolRadius TR Raggio dell’utensile.
toolDiameter TD Diametro dell’utensile.
toolpathOrder TOOLPATH_ORDER Ordine del percorso utensile nell’elenco dei percorsi utensile, a partire da 0 per il primo percorso utensile.
toolCalls TOOL_CALLS Numero di volte che questo utensile è stato usato.
toolpathName TOOLPATH_NAME Nome del percorso utensile corrente (definito dall’utente).
programName PROGRAM_NAME Nome del programma come configurato dall’utente nella configurazione CAM.
xMin X_MIN Estensione minima del disegno.
yMin Y_MIN
zMin Z_MIN
xMax X_MAX Estensione massima del disegno.
yMax Y_MAX
zMax Z_MAX

Per aggiungere o modificare codici G o codici M o altre informazioni nell’intestazione o nel piè di pagina, una configurazione può sovrascrivere le variabili membro header e footer nel costruttore, ad esempio come segue:

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

Per usare valori assoluti per i valori I/J del centro degli archi, potete sovrascrivere i blocchi di codice degli archi come segue:

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 unisce automaticamente un file modello DXF con lo stesso nome del file del postprocessore (se disponibile) quando si imposta o si cambia il postprocessore. Supponiamo che il postprocessore si chiami “MyGCode”, implementato in postprocessors/MyGCode.js. Create un file DXF con le definizioni degli utensili in postprocessors/MyGCode.dxf. Questo file può contenere definizioni di utensili, livelli predefiniti o il contorno della superficie disponibile. Nota: qualsiasi contenuto visibile del file modello viene automaticamente collocato su un livello bloccato durante l’unione, in modo che sia solo visibile ma non selezionabile.