QCAD/CAM 後處理器
QCAD/CAM 可將 CAD 圖面匯出為 CAM(電腦輔助製造)所使用的各種格式。這些格式可以是 G 代碼的方言,也可以是其他完全不同的格式。每一種支援的 CAM 格式都定義在一個設定檔(或稱「後處理器」)中,該檔案是一個實作格式細節的 ECMAScript(JavaScript)檔。所有可用的設定都儲存在 postprocessors 目錄內。新的格式實作也可以加入到相同的位置。
每個設定檔都包含一個 ECMAScript 類別,其名稱與指令碼檔名相同。如果指令碼檔名為 MyGCode.js,那麼檔案內定義的類別就必須命名為 MyGCode。
該 ECMAScript 類別必須直接或間接衍生自 CamExporterV2 類別,此類別由 QCAD/CAM 所定義。CamExporterV2 定義了 CAM 匯出設定類別的基本結構。CamExporterV2 中的各種方法會被呼叫,以匯出檔案標頭、CAD 圖面中的各個圖元以及檔尾。CamExporterV2 也負責處理 QCAD/CAM 的各種功能,例如刀具半徑補償、切入/切出、在切割外輪廓之前先切割內輪廓、路徑最佳化等等。
CamExporterV2 本身不會輸出任何內容,單獨使用時只會產生一個空檔案。CamExporterV2 提供了一個文字串流(QTextStream)用以寫入匯出的檔案。這個文字串流透過成員變數 this.stream 公開。
如果所需的輸出是一種 G 代碼方言(例如以 G1 X10 Y20 表示線性移動),該設定可以衍生自現有的 G 代碼設定 GCodeBase,其定義於檔案 GCodeBase.js 中。大多數的機器控制器都屬於這種情況。用於輸出以毫米為單位之 G 代碼的一個範例設定定義於檔案 GCodeMM.js 中,並在使用者介面中以名為 G-Code (G41/G42) [mm] 的設定形式提供。
從 GCodeBase 衍生設定
Section titled “從 GCodeBase 衍生設定”建立一個您自選的、名稱唯一的檔案。在此範例中,我們將新設定命名為 MyGCode,並將其儲存在同名的檔案中,即位於 QCAD/CAM 安裝目錄下 postprocessors 目錄中的 MyGCode.js。
您可以使用自己喜歡的純文字編輯器來建立與撰寫該檔案,例如 Windows 下的記事本、macOS 下的 TextEdit,或 Linux 系統下的 vim、Emacs 等。
MyGCode.js 必須定義一個名為 MyGCode 的類別,才能成為 QCAD/CAM 的有效設定。雖然嚴格來說 ECMAScript 中並沒有類別,但我們可以透過將函式附加到建構函式的原型物件上,建立出類似的概念。其確切運作方式超出本文件的範圍。不過,您可以使用一個直接可用的範本來撰寫所有設定檔。
以我們的範例而言,MyGCode 類別的定義如下所示(請注意,以 // 開頭的行是註解,並非必要):
// Include GCodeBase.js which contains the class 'GCodeBase',// used as base for our own configuration:include("GCodeBase.js");
// Constructor of our class:function MyGCode(documentInterface, newDocumentInterface) { // Call constructor of base class: GCodeBase.call(this, documentInterface, newDocumentInterface);}
// Derive our class from class GCodeBase:MyGCode.prototype = new GCodeBase();
// Display name shown in user interface:MyGCode.displayName = "My G-Code";現在,我們已經建立了一個名為「My G-Code」的全新、完全可用的設定,它已可在 QCAD/CAM 中使用,並能產生基本的 G 代碼。
我們上面定義的建構函式會呼叫基底類別 GCodeBase 的建構函式。在建構函式中,我們可以為設定設定一些參數,例如所需的輸出單位,或是我們想要使用 G41/G42 進行刀具半徑補償,還是計算刀具路徑的中心。
若要設定輸出單位(也就是您的機器或控制器所預期的單位),我們可以將成員變數 unit 設為 Inch 或 Millimeter,例如:
this.unit = RS.Inch;或
this.unit = RS.Millimeter;其他可在建構函式中設定的項目如下:
| 變數 | 可能的值 | 預設 | 說明 |
|---|---|---|---|
this.outputOffsetPath |
true 或 false | false | 設為 true 以計算刀具半徑補償,而非使用 G41/G42。 |
this.lineNumber |
數字 | 10 | 用於行號編號(N…)的起始號碼。 |
this.lineNumberIncrement |
數字 | 10 | 每行之間的行號遞增量。 |
this.fileExtensions |
陣列 | [ "nc", "cnc" ] |
使用者透過此後處理器匯出時可選擇的副檔名清單。 |
一個完整的建構函式可能如下所示:
function MyGCode(documentInterface, newDocumentInterface) { GCodeBase.call(this, documentInterface, newDocumentInterface);
this.unit = RS.Inch; this.outputOffsetPath = true; this.lineNumber = 1; this.lineNumberIncrement = 1;}定義 G 代碼輸出
Section titled “定義 G 代碼輸出”G 代碼輸出被組織成多個程式碼區塊,在 QCAD/CAM 中使用 CAM 匯出功能時,這些區塊會被寫入輸出檔。例如,寫入的第一個程式碼區塊是「header」區塊。每個程式碼區塊都定義在一個以名稱標識的成員變數中,例如 this.header 包含檔案標頭的程式碼區塊。
程式碼區塊可以被覆寫以包含任何程式碼/文字。程式碼區塊通常會包含變數,以輸出目前的 X/Y 座標、行號、進給率等。
假設要將一條直線匯出為 G 代碼。這條直線以位於直線左側的刀具半徑補償(G41)匯出。寫入輸出檔的程式碼區塊如下:
| 程式碼區塊 | 說明 | 範例輸出 |
|---|---|---|
header |
輸出的標頭(永遠是第一個程式碼區塊)。 | G21 G17 G90 G40 G49 G80 |
rapidMoveZ |
快速移動至安全高度。 | G0 Z100 |
rapidMove |
快速移動至第一條輪廓的第一個位置(此處為該直線切入路徑的起點)。 | G0 X5 Y10 |
toolHeader |
當有新刀具開始作用時(換刀)的第一個區塊。 | T1 |
rapidMoveZ |
快速下降至清空高度(懸停於材料上方)。 | G0 Z5 |
firstLinearMoveZ |
以下刀速率切入材料。 | G1 Z-5 F50 |
toolpathHeader |
新刀具路徑的第一個區塊。 | |
contourHeader |
刀具路徑中新輪廓的第一個區塊。 | |
singleZPassHeader |
單次 Z 進給的標頭。我們以單次進給切削整個深度。 | |
zPassFirstHeader |
單次或多次 Z 進給的第一個標頭。 | |
linearMoveCompensationLeft |
沿切入路徑線性移動至直線的起點,並開啟刀具半徑補償。 | G41 X10 Y10 F500 |
linearMove |
沿直線線性移動至直線的終點。 | X30 Y10 |
linearMoveCompensationOff |
沿切出路徑從終點線性移出,並關閉刀具半徑補償。 | G40 X35 Y10 |
zPassLastFooter |
單次或多次 Z 進給的最後檔尾。 | |
singleZPassFooter |
單次 Z 進給的檔尾。 | |
contourFooter |
輪廓結束。 | |
toolpathFooter |
刀具路徑結束。 | |
linearMoveZ |
移出材料至清空高度。 | Z5 |
rapidMoveZ |
移動至安全高度。 | G0 Z100 |
toolFooter |
此刀具的結束。 | |
footer |
程式結束。 | M30 |
其中許多程式碼區塊通常未被使用,不會產生任何輸出(空的程式碼區塊)。
| 成員變數 | 變數名稱 | 說明 |
|---|---|---|
| inputFileName | INFILENAME | 輸入檔名(例如 DXF 檔)。 |
| inputFilePath | INFILEPATH | 含完整路徑的輸入檔名。 |
| fileName | FILENAME | 輸出檔名。 |
| filePath | FILEPATH | 含完整路徑的輸出檔名。 |
| dateTime | DATETIME | 匯出的日期與時間。 |
| lineNumber | N | 目前的行號。 |
| spindleSpeed | S | 主軸轉速,通常為 rpm。 |
| feedRate | F | 進給率。 |
| plungeRate | FP | 下刀速率。 |
| xHomePosition | XH | CAM 設定中所設定的原點位置。 |
| yHomePosition | YH | |
| zHomePosition | ZH | |
| zSafety | ZS | 用於換刀及起始/結束的 Z 安全高度。 |
| zClearance | ZU | 接近材料的 Z 清空高度。 |
| zClearancePass | ZUP | 多次進給之間的 Z 清空高度。 |
| zCuttingDepth | ZD | Z 切削高度(總計)。 |
| xFirstPosition | XF | 第一條刀具路徑中第一條輪廓的第一個位置。 |
| yFirstPosition | YF | |
| xStartPosition | X1 | 圖元的起點(直線/弧的起點)。 |
| yStartPosition | Y1 | |
| zStartPosition | Z1 | |
| xPosition | X | 目前的目標位置。目前直線/弧的終點。 |
| yPosition | Y | |
| zPosition | Z | |
| xRelPosition | XR | 目前目標位置的相對座標,相對於起點。 |
| yRelPosition | YR | |
| zRelPosition | ZR | |
| iArcCenterInc | I | 弧的圓心,相對於起點。 |
| jArcCenterInc | J | |
| iArcCenterAbs | IA | 弧的圓心,絕對值。 |
| jArcCenterAbs | JA | |
| arcRadius | RADIUS | 弧的半徑。 |
| arcDiameter | DIAMETER | 弧的直徑。 |
| arcSweep | SWEEP | 弧的掃掠(弧所涵蓋的角度,以弧度表示,順時針為負)。 |
| tool | T | 目前的刀具。 |
| toolRadius | TR | 刀具半徑。 |
| toolDiameter | TD | 刀具直徑。 |
| toolpathOrder | TOOLPATH_ORDER | 刀具路徑在刀具路徑清單中的順序,第一條刀具路徑從 0 開始。 |
| toolCalls | TOOL_CALLS | 此刀具被使用的次數。 |
| toolpathName | TOOLPATH_NAME | 目前刀具路徑的名稱(使用者定義)。 |
| programName | PROGRAM_NAME | 使用者在 CAM 設定中所設定的程式名稱。 |
| xMin | X_MIN | 圖面的最小範圍。 |
| yMin | Y_MIN | |
| zMin | Z_MIN | |
| xMax | X_MAX | 圖面的最大範圍。 |
| yMax | Y_MAX | |
| zMax | Z_MAX |
變更標頭與檔尾
Section titled “變更標頭與檔尾”若要在標頭或檔尾中新增或變更 G 代碼、M 代碼或其他資訊,設定可以在建構函式中覆寫成員變數 header 與 footer,例如如下所示:
this.header = [ "[N] G0 Z100" ];this.footer = [ "[N] G0 Z100", "[N] M30" ];絕對 I/J
Section titled “絕對 I/J”若要對弧的圓心使用絕對的 I/J 值,您可以如下覆寫弧的程式碼區塊:
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]";後處理器範本檔
Section titled “後處理器範本檔”在設定或切換後處理器時,QCAD/CAM 會自動合併一個與後處理器檔案同名的 DXF 範本檔(若有的話)。假設後處理器名為「MyGCode」,實作於 postprocessors/MyGCode.js。請在 postprocessors/MyGCode.dxf 中建立一個包含刀具定義的 DXF 檔。此檔案可能包含刀具定義、預設圖層或可用工作面積的輪廓。注意:範本檔中任何可見的內容在合併時都會自動放置於一個鎖定的圖層上,因此它只會顯示但無法被選取。