Zum Inhalt springen

QCAD/CAM Postprozessor

QCAD/CAM kann CAD-Zeichnungen in verschiedene, in der CAM (computergestützte Fertigung) verwendete Formate exportieren. Diese Formate können Dialekte von G-Code oder andere, völlig unterschiedliche Formate sein. Jedes unterstützte CAM-Format ist in einer Konfigurationsdatei (oder einem „Postprozessor”) definiert, die eine ECMAScript-Datei (JavaScript) ist und die Details des Formats implementiert. Alle verfügbaren Konfigurationen sind im Verzeichnis postprocessors gespeichert. Neue Formatimplementierungen können am selben Ort hinzugefügt werden.

Jede Konfigurationsdatei enthält eine ECMAScript-Klasse mit demselben Namen wie die Skriptdatei. Wenn die Skriptdatei MyGCode.js heißt, muss die im Skript definierte Klasse MyGCode heißen.

Die ECMAScript-Klasse muss direkt oder indirekt von der Klasse CamExporterV2 abgeleitet werden, die von QCAD/CAM definiert wird. CamExporterV2 definiert die Grundstruktur von CAM-Exporter-Konfigurationsklassen. Verschiedene Methoden in CamExporterV2 werden aufgerufen, um den Dateikopf, die verschiedenen Objekte in der CAD-Zeichnung und den Dateifuß zu exportieren. CamExporterV2 kümmert sich außerdem um die verschiedenen Funktionen von QCAD/CAM, zum Beispiel Werkzeugradiuskompensation, Einfahrt/Ausfahrt, das Schneiden innerer Konturen vor äußeren Konturen, Wegoptimierung usw.

CamExporterV2 gibt von sich aus nichts aus, sondern würde für sich genommen eine leere Datei erzeugen. CamExporterV2 bietet einen Textstream (QTextStream), um in die exportierte Datei zu schreiben. Dieser Textstream wird über die Membervariable this.stream bereitgestellt.

Wenn die gewünschte Ausgabe ein G-Code-Dialekt ist (z. B. G1 X10 Y20 für eine lineare Bewegung), kann die Konfiguration von der bestehenden Konfiguration für G-Code namens GCodeBase abgeleitet werden, die in der Datei GCodeBase.js definiert ist. Dies ist bei den meisten Maschinensteuerungen der Fall. Eine solche Beispielkonfiguration für die Ausgabe von G-Code in Millimetern ist in der Datei GCodeMM.js definiert und in der Benutzeroberfläche als Konfiguration namens G-Code (G41/G42) [mm] verfügbar.

Erstellen Sie eine Datei mit einem eindeutigen Namen Ihrer Wahl. Für dieses Beispiel nennen wir unsere neue Konfiguration MyGCode und speichern sie in einer Datei mit demselben Namen, das heißt MyGCode.js im Verzeichnis postprocessors Ihrer QCAD/CAM-Installation.

Sie können Ihren bevorzugten reinen Texteditor verwenden, um die Datei zu erstellen und zu schreiben, zum Beispiel Notepad unter Windows, TextEdit unter macOS oder vim, Emacs usw. unter Linux-Systemen.

MyGCode.js muss eine Klasse namens MyGCode definieren, um eine gültige Konfiguration für QCAD/CAM zu sein. Auch wenn es in ECMAScript streng genommen keine Klassen gibt, können wir ein ähnliches Konzept schaffen, indem wir Funktionen an das Prototyp-Objekt einer Konstruktorfunktion anhängen. Wie das genau funktioniert, geht über den Rahmen dieser Dokumentation hinaus. Es gibt jedoch eine einfache Vorlage, die Sie für alle Konfigurationsdateien verwenden können.

Für unser Beispiel sieht die Definition der Klasse MyGCode so aus (beachten Sie, dass die mit // beginnenden Zeilen Kommentare und nicht erforderlich sind):

// GCodeBase.js einbinden, das die Klasse 'GCodeBase' enthält,
// die als Basis für unsere eigene Konfiguration verwendet wird:
include("GCodeBase.js");
// Konstruktor unserer Klasse:
function MyGCode(documentInterface, newDocumentInterface) {
// Konstruktor der Basisklasse aufrufen:
GCodeBase.call(this, documentInterface, newDocumentInterface);
}
// Unsere Klasse von der Klasse GCodeBase ableiten:
MyGCode.prototype = new GCodeBase();
// In der Benutzeroberfläche angezeigter Anzeigename:
MyGCode.displayName = "My G-Code";

Nun haben wir eine neue, voll funktionsfähige Konfiguration namens „My G-Code” erstellt, die bereit ist, in QCAD/CAM verwendet zu werden, und grundlegenden G-Code erzeugt.

Der oben definierte Konstruktor ruft den Konstruktor unserer Basisklasse GCodeBase auf. Im Konstruktor können wir einige Parameter für unsere Konfiguration festlegen, etwa die gewünschte Ausgabeeinheit oder ob wir G41/G42 für die Werkzeugradiuskompensation verwenden oder den Mittelpunkt des Werkzeugwegs berechnen möchten.

Um die Ausgabeeinheit zu konfigurieren (das ist die von Ihrer Maschine oder Steuerung erwartete Einheit), können wir die Membervariable unit auf Inch oder Millimeter setzen, zum Beispiel:

this.unit = RS.Inch;

oder

this.unit = RS.Millimeter;

Weitere Einstellungen, die im Konstruktor konfiguriert werden können, sind:

Variable Mögliche Werte Standard Beschreibung
this.outputOffsetPath true oder false false Auf true setzen, um die Werkzeugradiuskompensation zu berechnen, anstatt G41/G42 zu verwenden.
this.lineNumber Zahl 10 Anfangszahl für die Zeilennummerierung (N…).
this.lineNumberIncrement Zahl 10 Zeilennummer-Inkrement von Zeile zu Zeile.
this.fileExtensions Array [ "nc", "cnc" ] Liste der Dateiendungen, aus denen der Benutzer beim Export über diesen Postprozessor wählen kann.

Ein vollständiger Konstruktor könnte so aussehen:

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

Die G-Code-Ausgabe ist in Codeblöcke gegliedert, die beim Verwenden der CAM-Exportfunktion in QCAD/CAM in die Ausgabedatei geschrieben werden. Zum Beispiel ist der erste geschriebene Codeblock der Codeblock „header”. Jeder Codeblock ist in einer Membervariable definiert, die ihn über den Namen identifiziert, zum Beispiel enthält this.header den Codeblock für den Dateikopf.

Codeblöcke können überschrieben werden, um beliebigen Code/Text zu enthalten. Codeblöcke enthalten typischerweise Variablen, um die aktuellen X/Y-Koordinaten, Zeilennummer, Vorschub usw. auszugeben.

Nehmen wir an, eine einzelne Linie wird nach G-Code exportiert. Die Linie wird mit Werkzeugradiuskompensation links von der Linie exportiert (G41). Die in die Ausgabedatei geschriebenen Codeblöcke sind wie folgt:

Codeblock Beschreibung Beispielausgabe
header Kopf der Ausgabe (immer der erste Codeblock). G21 G17 G90 G40 G49 G80
rapidMoveZ Eilgang auf Sicherheitshöhe. G0 Z100
rapidMove Eilgang zur ersten Position der ersten Kontur (hier der Anfang der Einfahrt für die Linie). G0 X5 Y10
toolHeader Erster Block, wenn ein neues Werkzeug zum Einsatz kommt (Werkzeugwechsel). T1
rapidMoveZ Eilgang nach unten auf Freifahrhöhe (schwebend über dem Material). G0 Z5
firstLinearMoveZ Eintauchen in das Material mit Eintauchvorschub. G1 Z-5 F50
toolpathHeader Erster Block eines neuen Werkzeugwegs.
contourHeader Erster Block einer neuen Kontur innerhalb eines Werkzeugwegs.
singleZPassHeader Kopf für einen einzelnen Z-Durchgang. Wir schneiden die gesamte Tiefe in einem einzigen Durchgang.
zPassFirstHeader Erster Kopf von einem oder mehreren Z-Durchgängen.
linearMoveCompensationLeft Lineare Bewegung zum Startpunkt der Linie entlang der Einfahrt, wobei die Werkzeugradiuskompensation eingeschaltet wird. G41 X10 Y10 F500
linearMove Lineare Bewegung entlang der Linie zum Endpunkt der Linie. X30 Y10
linearMoveCompensationOff Lineare Bewegung vom Endpunkt weg entlang der Ausfahrt, wobei die Werkzeugradiuskompensation ausgeschaltet wird. G40 X35 Y10
zPassLastFooter Letzter Fuß von einem oder mehreren Z-Durchgängen.
singleZPassFooter Fuß für einen einzelnen Z-Durchgang.
contourFooter Ende der Kontur.
toolpathFooter Ende des Werkzeugwegs.
linearMoveZ Bewegung aus dem Material heraus auf Freifahrhöhe. Z5
rapidMoveZ Eilgang auf Sicherheitshöhe. G0 Z100
toolFooter Ende für dieses Werkzeug.
footer Ende des Programms. M30

Viele dieser Codeblöcke werden typischerweise nicht verwendet und erzeugen keine Ausgabe (leerer Codeblock).

Membervariable Variablenname Beschreibung
inputFileName INFILENAME Eingabedateiname (z. B. DXF-Datei).
inputFilePath INFILEPATH Eingabedateiname mit vollständigem Pfad.
fileName FILENAME Ausgabedateiname.
filePath FILEPATH Ausgabedateiname mit vollständigem Pfad.
dateTime DATETIME Datum und Uhrzeit des Exports.
lineNumber N Aktuelle Zeilennummer.
spindleSpeed S Spindeldrehzahl, typischerweise in U/min.
feedRate F Vorschub.
plungeRate FP Eintauchvorschub.
xHomePosition XH Referenzposition, wie in der CAM-Konfiguration konfiguriert.
yHomePosition YH
zHomePosition ZH
zSafety ZS Z-Sicherheitshöhe für Werkzeugwechsel und Anfang/Ende.
zClearance ZU Z-Freifahrhöhe zum Anfahren des Materials.
zClearancePass ZUP Z-Freifahrhöhe zwischen mehreren Durchgängen.
zCuttingDepth ZD Z-Schnitttiefe (gesamt).
xFirstPosition XF Erste Position der ersten Kontur im ersten Werkzeugweg.
yFirstPosition YF
xStartPosition X1 Anfang des Objekts (Startpunkt von Linie/Bogen).
yStartPosition Y1
zStartPosition Z1
xPosition X Aktuelle Zielposition. Endpunkt der aktuellen Linie/des aktuellen Bogens.
yPosition Y
zPosition Z
xRelPosition XR Aktuelle Zielposition als relative Koordinate, relativ zum Startpunkt.
yRelPosition YR
zRelPosition ZR
iArcCenterInc I Mittelpunkt des Bogens, relativ zum Startpunkt.
jArcCenterInc J
iArcCenterAbs IA Mittelpunkt des Bogens, absolut.
jArcCenterAbs JA
arcRadius RADIUS Radius des Bogens.
arcDiameter DIAMETER Durchmesser des Bogens.
arcSweep SWEEP Überstrichener Winkel des Bogens (vom Bogen überdeckter Winkel in rad, negativ im Uhrzeigersinn).
tool T Aktuelles Werkzeug.
toolRadius TR Werkzeugradius.
toolDiameter TD Werkzeugdurchmesser.
toolpathOrder TOOLPATH_ORDER Reihenfolge des Werkzeugwegs in der Liste der Werkzeugwege, beginnend mit 0 für den ersten Werkzeugweg.
toolCalls TOOL_CALLS Anzahl der Verwendungen dieses Werkzeugs.
toolpathName TOOLPATH_NAME Name des aktuellen Werkzeugwegs (benutzerdefiniert).
programName PROGRAM_NAME Programmname, wie vom Benutzer in der CAM-Konfiguration konfiguriert.
xMin X_MIN Minimale Ausdehnung der Zeichnung.
yMin Y_MIN
zMin Z_MIN
xMax X_MAX Maximale Ausdehnung der Zeichnung.
yMax Y_MAX
zMax Z_MAX

Um G-Codes oder M-Codes oder andere Informationen im Kopf oder Fuß hinzuzufügen oder zu ändern, kann eine Konfiguration die Membervariablen header und footer im Konstruktor überschreiben, zum Beispiel wie folgt:

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

Um absolute Werte für die I/J-Werte für den Mittelpunkt von Bögen zu verwenden, können Sie die Bogen-Codeblöcke wie folgt überschreiben:

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 fügt beim Setzen oder Wechseln des Postprozessors automatisch eine DXF-Vorlagendatei mit demselben Namen wie die Postprozessordatei ein (falls verfügbar). Nehmen wir an, der Postprozessor heißt „MyGCode”, implementiert in postprocessors/MyGCode.js. Erstellen Sie eine DXF-Datei mit den Werkzeugdefinitionen in postprocessors/MyGCode.dxf. Diese Datei kann Werkzeugdefinitionen, Standardlayer oder den Umriss der verfügbaren Fläche enthalten. Hinweis: Jeglicher sichtbare Inhalt der Vorlagendatei wird beim Einfügen automatisch auf einen gesperrten Layer gelegt, sodass er nur sichtbar, aber nicht auswählbar ist.