QCAD/CAM Postprocessor
QCAD/CAM kan CAD-tekeningen exporteren naar diverse formaten die in de CAM (computerondersteunde productie) worden gebruikt. Deze formaten kunnen dialecten van G-code zijn of andere, volledig verschillende formaten. Elk ondersteund CAM-formaat wordt gedefinieerd in een configuratiebestand (of “postprocessor”) dat een ECMAScript-bestand (JavaScript) is dat de details van het formaat implementeert. Alle beschikbare configuraties worden opgeslagen in de map postprocessors. Nieuwe formaatimplementaties kunnen op dezelfde locatie worden toegevoegd.
Basisstructuur
Section titled “Basisstructuur”Elk configuratiebestand bevat een ECMAScript-klasse met dezelfde naam als het scriptbestand. Als het scriptbestand MyGCode.js heet, moet de in het script gedefinieerde klasse MyGCode heten.
De ECMAScript-klasse moet direct of indirect afgeleid zijn van de klasse CamExporterV2, die door QCAD/CAM wordt gedefinieerd. CamExporterV2 definieert de basisstructuur van CAM-exporter-configuratieklassen. Diverse methoden in CamExporterV2 worden aangeroepen om de bestandsheader, de diverse objecten in de CAD-tekening en de footer te exporteren. CamExporterV2 zorgt ook voor de diverse functies van QCAD/CAM, bijvoorbeeld gereedschapsradiuscompensatie, insteek / uitsteek, het snijden van binnencontouren vóór buitencontouren, padoptimalisatie, enz.
CamExporterV2 geeft op zichzelf niets uit, maar zou op zichzelf een leeg bestand produceren. CamExporterV2 biedt een tekststroom (QTextStream) om naar het geëxporteerde bestand te schrijven. Deze tekststroom wordt beschikbaar gesteld via de lidvariabele this.stream.
Als de gewenste uitvoer een G-code-dialect is (bijv. G1 X10 Y20 voor een lineaire beweging), kan de configuratie worden afgeleid van de bestaande configuratie voor G-code genaamd GCodeBase, die is gedefinieerd in het bestand GCodeBase.js. Dit is het geval bij de meeste machinebesturingen. Een dergelijke voorbeeldconfiguratie voor het uitvoeren van G-code in millimeters is gedefinieerd in het bestand GCodeMM.js en beschikbaar in de gebruikersinterface als de configuratie genaamd G-Code (G41/G42) [mm].
Een configuratie afleiden van GCodeBase
Section titled “Een configuratie afleiden van GCodeBase”Maak een bestand met een unieke naam naar keuze. Voor dit voorbeeld noemen we onze nieuwe configuratie MyGCode en slaan we deze op in een bestand met dezelfde naam, dat wil zeggen MyGCode.js in de map postprocessors van uw QCAD/CAM-installatie.
U kunt uw favoriete platte-teksteditor gebruiken om het bestand te maken en te schrijven, bijvoorbeeld Notepad onder Windows, TextEdit onder macOS of vim, Emacs, enz. onder Linux-systemen.
MyGCode.js moet een klasse genaamd MyGCode definiëren om een geldige configuratie voor QCAD/CAM te zijn. Hoewel er in ECMAScript strikt genomen geen klassen zijn, kunnen we een vergelijkbaar concept creëren door functies aan het prototype-object van een constructorfunctie te koppelen. Hoe dit precies werkt, valt buiten het bestek van deze documentatie. Er is echter een eenvoudig sjabloon dat u voor alle configuratiebestanden kunt gebruiken.
Voor ons voorbeeld ziet de definitie van de klasse MyGCode er zo uit (let op: de regels die met // beginnen zijn commentaar en zijn niet vereist):
// GCodeBase.js insluiten, dat de klasse 'GCodeBase' bevat,// gebruikt als basis voor onze eigen configuratie:include("GCodeBase.js");
// Constructor van onze klasse:function MyGCode(documentInterface, newDocumentInterface) { // Constructor van de basisklasse aanroepen: GCodeBase.call(this, documentInterface, newDocumentInterface);}
// Onze klasse afleiden van de klasse GCodeBase:MyGCode.prototype = new GCodeBase();
// Weergavenaam getoond in de gebruikersinterface:MyGCode.displayName = "My G-Code";Nu hebben we een nieuwe, volledig werkende configuratie genaamd “My G-Code” gemaakt, die klaar is om in QCAD/CAM te worden gebruikt en die basale G-code produceert.
Configuratievoorkeuren
Section titled “Configuratievoorkeuren”De hierboven gedefinieerde constructor roept de constructor van onze basisklasse GCodeBase aan. In de constructor kunnen we enkele parameters voor onze configuratie instellen, zoals de gewenste uitvoereenheid of of we G41/G42 willen gebruiken voor gereedschapsradiuscompensatie of het midden van het gereedschapstraject willen berekenen.
Om de uitvoereenheid te configureren (dat is de eenheid die uw machine of besturing verwacht), kunnen we de lidvariabele unit instellen op Inch of Millimeter, bijvoorbeeld:
this.unit = RS.Inch;of
this.unit = RS.Millimeter;Andere instellingen die in de constructor kunnen worden geconfigureerd zijn:
| Variabele | Mogelijke waarden | Standaard | Beschrijving |
|---|---|---|---|
this.outputOffsetPath |
true of false | false | Op true zetten om de gereedschapsradiuscompensatie te berekenen in plaats van G41/G42 te gebruiken. |
this.lineNumber |
Getal | 10 | Beginnummer gebruikt voor de regelnummering (N…). |
this.lineNumberIncrement |
Getal | 10 | Regelnummer-increment van regel tot regel. |
this.fileExtensions |
Array | [ "nc", "cnc" ] |
Lijst van bestandsextensies waaruit de gebruiker kan kiezen bij het exporteren via deze postprocessor. |
Een volledige constructor zou er zo uit kunnen zien:
function MyGCode(documentInterface, newDocumentInterface) { GCodeBase.call(this, documentInterface, newDocumentInterface);
this.unit = RS.Inch; this.outputOffsetPath = true; this.lineNumber = 1; this.lineNumberIncrement = 1;}De G-code-uitvoer definiëren
Section titled “De G-code-uitvoer definiëren”Codeblokken
Section titled “Codeblokken”De G-code-uitvoer is gestructureerd in codeblokken die naar het uitvoerbestand worden geschreven bij het gebruik van de CAM-exportfunctie in QCAD/CAM. Het eerste codeblok dat wordt geschreven, is bijvoorbeeld het codeblok “header”. Elk codeblok wordt gedefinieerd in een lidvariabele die het op naam identificeert, bijvoorbeeld this.header bevat het codeblok voor de bestandsheader.
Codeblokken kunnen worden overschreven om willekeurige code / tekst te bevatten. Codeblokken bevatten doorgaans variabelen om de huidige X/Y-coördinaten, het regelnummer, de voeding, enz. uit te voeren.
Stel dat één enkele lijn naar G-code wordt geëxporteerd. De lijn wordt geëxporteerd met gereedschapsradiuscompensatie links van de lijn (G41). De codeblokken die naar het uitvoerbestand worden geschreven, zijn als volgt:
| Codeblok | Beschrijving | Voorbeelduitvoer |
|---|---|---|
header |
Header van de uitvoer (altijd het eerste codeblok). | G21 G17 G90 G40 G49 G80 |
rapidMoveZ |
Snelle beweging naar het veiligheidsniveau. | G0 Z100 |
rapidMove |
Snelle beweging naar de eerste positie van de eerste contour (hier het begin van de insteek voor de lijn). | G0 X5 Y10 |
toolHeader |
Eerste blok wanneer een nieuw gereedschap in actie komt (gereedschapswissel). | T1 |
rapidMoveZ |
Snelle beweging omlaag naar het naderingsniveau (zwevend boven het materiaal). | G0 Z5 |
firstLinearMoveZ |
Insteken in het materiaal met de insteeksnelheid. | G1 Z-5 F50 |
toolpathHeader |
Eerste blok van een nieuw gereedschapstraject. | |
contourHeader |
Eerste blok van een nieuwe contour binnen een gereedschapstraject. | |
singleZPassHeader |
Header voor één enkele Z-doorgang. We snijden de volledige diepte in één doorgang. | |
zPassFirstHeader |
Eerste header van één of meerdere Z-doorgangen. | |
linearMoveCompensationLeft |
Lineaire beweging naar het startpunt van de lijn langs de insteek, waarbij de gereedschapsradiuscompensatie wordt ingeschakeld. | G41 X10 Y10 F500 |
linearMove |
Lineaire beweging langs de lijn naar het eindpunt van de lijn. | X30 Y10 |
linearMoveCompensationOff |
Lineaire beweging weg van het eindpunt langs de uitsteek, waarbij de gereedschapsradiuscompensatie wordt uitgeschakeld. | G40 X35 Y10 |
zPassLastFooter |
Laatste footer van één of meerdere Z-doorgangen. | |
singleZPassFooter |
Footer voor één enkele Z-doorgang. | |
contourFooter |
Einde van de contour. | |
toolpathFooter |
Einde van het gereedschapstraject. | |
linearMoveZ |
Beweging uit het materiaal naar het naderingsniveau. | Z5 |
rapidMoveZ |
Snelle beweging naar het veiligheidsniveau. | G0 Z100 |
toolFooter |
Einde voor dit gereedschap. | |
footer |
Einde van het programma. | M30 |
Veel van deze codeblokken zijn doorgaans ongebruikt en produceren geen uitvoer (leeg codeblok).
Variabelen
Section titled “Variabelen”| Lidvariabele | Variabelenaam | Beschrijving |
|---|---|---|
| inputFileName | INFILENAME | Naam van het invoerbestand (bijv. DXF-bestand). |
| inputFilePath | INFILEPATH | Naam van het invoerbestand met het volledige pad. |
| fileName | FILENAME | Naam van het uitvoerbestand. |
| filePath | FILEPATH | Naam van het uitvoerbestand met het volledige pad. |
| dateTime | DATETIME | Datum en tijd van de export. |
| lineNumber | N | Huidig regelnummer. |
| spindleSpeed | S | Spilsnelheid, typisch in tpm. |
| feedRate | F | Voeding. |
| plungeRate | FP | Insteeksnelheid. |
| xHomePosition | XH | Referentiepositie zoals geconfigureerd in de CAM-configuratie. |
| yHomePosition | YH | |
| zHomePosition | ZH | |
| zSafety | ZS | Z-veiligheidsniveau voor gereedschapswissels en begin / einde. |
| zClearance | ZU | Z-naderingsniveau voor het naderen van het materiaal. |
| zClearancePass | ZUP | Z-naderingsniveau tussen meerdere doorgangen. |
| zCuttingDepth | ZD | Z-snijniveau (totaal). |
| xFirstPosition | XF | Eerste positie van de eerste contour in het eerste gereedschapstraject. |
| yFirstPosition | YF | |
| xStartPosition | X1 | Begin van het object (startpunt van lijn / boog). |
| yStartPosition | Y1 | |
| zStartPosition | Z1 | |
| xPosition | X | Huidige doelpositie. Eindpunt van de huidige lijn / boog. |
| yPosition | Y | |
| zPosition | Z | |
| xRelPosition | XR | Huidige doelpositie als relatieve coördinaat, ten opzichte van het startpunt. |
| yRelPosition | YR | |
| zRelPosition | ZR | |
| iArcCenterInc | I | Middelpunt van de boog, ten opzichte van het startpunt. |
| jArcCenterInc | J | |
| iArcCenterAbs | IA | Middelpunt van de boog, absoluut. |
| jArcCenterAbs | JA | |
| arcRadius | RADIUS | Straal van de boog. |
| arcDiameter | DIAMETER | Diameter van de boog. |
| arcSweep | SWEEP | Bestreken hoek van de boog (door de boog overspannen hoek in rad, negatief met de klok mee). |
| tool | T | Huidig gereedschap. |
| toolRadius | TR | Gereedschapsradius. |
| toolDiameter | TD | Gereedschapsdiameter. |
| toolpathOrder | TOOLPATH_ORDER | Volgorde van het gereedschapstraject in de lijst van gereedschapstrajecten, beginnend met 0 voor het eerste gereedschapstraject. |
| toolCalls | TOOL_CALLS | Aantal keren dat dit gereedschap is gebruikt. |
| toolpathName | TOOLPATH_NAME | Naam van het huidige gereedschapstraject (door de gebruiker gedefinieerd). |
| programName | PROGRAM_NAME | Programmanaam zoals geconfigureerd door de gebruiker in de CAM-configuratie. |
| xMin | X_MIN | Minimale uitgestrektheid van de tekening. |
| yMin | Y_MIN | |
| zMin | Z_MIN | |
| xMax | X_MAX | Maximale uitgestrektheid van de tekening. |
| yMax | Y_MAX | |
| zMax | Z_MAX |
Voorbeelden
Section titled “Voorbeelden”De header en footer wijzigen
Section titled “De header en footer wijzigen”Om G-codes of M-codes of andere informatie in de header of footer toe te voegen of te wijzigen, kan een configuratie de lidvariabelen header en footer in de constructor overschrijven, bijvoorbeeld als volgt:
this.header = [ "[N] G0 Z100" ];this.footer = [ "[N] G0 Z100", "[N] M30" ];Absolute I/J
Section titled “Absolute I/J”Om absolute waarden voor de I/J-waarden voor het middelpunt van bogen te gebruiken, kunt u de boog-codeblokken als volgt overschrijven:
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]";Postprocessor-sjabloonbestand
Section titled “Postprocessor-sjabloonbestand”QCAD/CAM voegt bij het instellen of wisselen van de postprocessor automatisch een DXF-sjabloonbestand met dezelfde naam als het postprocessorbestand samen (indien beschikbaar). Stel dat de postprocessor “MyGCode” heet, geïmplementeerd in postprocessors/MyGCode.js. Maak een DXF-bestand met de gereedschapsdefinities in postprocessors/MyGCode.dxf. Dit bestand kan gereedschapsdefinities, standaardlagen of de omtrek van het beschikbare oppervlak bevatten. Let op: alle zichtbare inhoud van het sjabloonbestand wordt bij het samenvoegen automatisch op een vergrendelde laag geplaatst, zodat deze alleen zichtbaar maar niet selecteerbaar is.