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.
Struttura di base
Sezione intitolata “Struttura di base”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].
Derivare una configurazione da GCodeBase
Sezione intitolata “Derivare una configurazione da GCodeBase”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.
Preferenze di configurazione
Sezione intitolata “Preferenze di configurazione”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;}Definire l’output del codice G
Sezione intitolata “Definire l’output del codice G”Blocchi di codice
Sezione intitolata “Blocchi di codice”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).
Variabili
Sezione intitolata “Variabili”| 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 |
Modificare l’intestazione e il piè di pagina
Sezione intitolata “Modificare l’intestazione e il piè di pagina”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" ];I/J assoluti
Sezione intitolata “I/J assoluti”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]";File modello del postprocessore
Sezione intitolata “File modello del postprocessore”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.