Skip to content

Bộ hậu xử lý QCAD/CAM

QCAD/CAM có thể xuất các bản vẽ CAD sang nhiều định dạng được dùng trong CAM (sản xuất có sự hỗ trợ của máy tính). Các định dạng này có thể là các phương ngữ của G-Code hoặc các định dạng khác hoàn toàn khác biệt. Mỗi định dạng CAM được hỗ trợ được định nghĩa trong một tệp cấu hình (hoặc “bộ hậu xử lý”) là một tệp ECMAScript (JavaScript) triển khai các chi tiết của định dạng. Tất cả các cấu hình có sẵn được lưu trữ bên trong thư mục postprocessors. Các triển khai định dạng mới có thể được thêm vào cùng vị trí đó.

Mỗi tệp cấu hình chứa một lớp ECMAScript có cùng tên với tệp tập lệnh. Nếu tệp tập lệnh có tên MyGCode.js, lớp được định nghĩa bên trong tập lệnh phải có tên MyGCode.

Lớp ECMAScript phải kế thừa trực tiếp hoặc gián tiếp từ lớp CamExporterV2, được định nghĩa bởi QCAD/CAM. CamExporterV2 định nghĩa cấu trúc cơ bản của các lớp cấu hình bộ xuất CAM. Nhiều phương thức khác nhau trong CamExporterV2 được gọi để xuất phần đầu tệp, các đối tượng khác nhau trong bản vẽ CAD và phần chân. CamExporterV2 cũng xử lý các tính năng khác nhau của QCAD/CAM, ví dụ như bù bán kính dao, dẫn vào / dẫn ra, cắt các đường bao trong trước các đường bao ngoài, tối ưu hóa đường đi, v.v.

CamExporterV2 tự nó không xuất bất cứ thứ gì, mà sẽ tạo ra một tệp trống. CamExporterV2 cung cấp một luồng văn bản (QTextStream) để ghi vào tệp được xuất. Luồng văn bản này được hiển thị thông qua biến thành viên this.stream.

Nếu đầu ra mong muốn là một phương ngữ G-Code (ví dụ G1 X10 Y20 cho chuyển động tuyến tính), cấu hình có thể được kế thừa từ cấu hình hiện có cho G-Code có tên GCodeBase, được định nghĩa trong tệp GCodeBase.js. Đây là trường hợp của hầu hết các bộ điều khiển máy. Một cấu hình ví dụ như vậy để xuất G-Code theo Milimét được định nghĩa trong tệp GCodeMM.js và có sẵn trong giao diện người dùng dưới dạng cấu hình có tên G-Code (G41/G42) [mm].

Tạo một tệp với tên duy nhất do bạn chọn. Đối với ví dụ này, chúng ta đặt tên cấu hình mới của mình là MyGCode và lưu trữ nó trong một tệp có cùng tên, tức là MyGCode.js trong thư mục postprocessors của bản cài đặt QCAD/CAM của bạn.

Bạn có thể sử dụng trình soạn thảo văn bản thuần yêu thích của mình để tạo và viết tệp, ví dụ Notepad trên Windows, TextEdit trên macOS hoặc vim, Emacs, v.v. trên các hệ thống Linux.

MyGCode.js phải định nghĩa một lớp có tên MyGCode để là một cấu hình hợp lệ cho QCAD/CAM. Mặc dù nói một cách nghiêm ngặt thì không có lớp trong ECMAScript, chúng ta có thể tạo một khái niệm tương tự bằng cách gắn các hàm vào đối tượng nguyên mẫu của một hàm khởi tạo. Cách này hoạt động chính xác như thế nào nằm ngoài phạm vi của tài liệu này. Tuy nhiên, có một mẫu đơn giản mà bạn có thể sử dụng cho tất cả các tệp cấu hình.

Đối với ví dụ của chúng ta, định nghĩa của lớp MyGCode trông như thế này (lưu ý rằng các dòng bắt đầu bằng // là chú thích và không bắt buộc):

// Bao gồm GCodeBase.js chứa lớp 'GCodeBase',
// được dùng làm cơ sở cho cấu hình của riêng chúng ta:
include("GCodeBase.js");
// Hàm khởi tạo của lớp chúng ta:
function MyGCode(documentInterface, newDocumentInterface) {
// Gọi hàm khởi tạo của lớp cơ sở:
GCodeBase.call(this, documentInterface, newDocumentInterface);
}
// Kế thừa lớp của chúng ta từ lớp GCodeBase:
MyGCode.prototype = new GCodeBase();
// Tên hiển thị được hiển thị trong giao diện người dùng:
MyGCode.displayName = "My G-Code";

Bây giờ, chúng ta đã tạo một cấu hình mới, hoạt động đầy đủ có tên “My G-Code” sẵn sàng để sử dụng trong QCAD/CAM và tạo ra G-Code cơ bản.

Hàm khởi tạo mà chúng ta đã định nghĩa ở trên gọi hàm khởi tạo của lớp cơ sở GCodeBase. Trong hàm khởi tạo, chúng ta có thể đặt một số tham số cho cấu hình của mình như đơn vị đầu ra mong muốn hoặc nếu chúng ta muốn sử dụng G41/G42 để bù bán kính dao hoặc tính toán tâm của đường chạy dao.

Để cấu hình đơn vị đầu ra (đó là đơn vị mà máy hoặc bộ điều khiển của bạn mong đợi), chúng ta có thể đặt biến thành viên unit thành Inch hoặc Millimeter, ví dụ:

this.unit = RS.Inch;

hoặc

this.unit = RS.Millimeter;

Các cài đặt khác có thể được cấu hình trong hàm khởi tạo là:

Biến Giá trị có thể Mặc định Mô tả
this.outputOffsetPath true hoặc false false Đặt thành true để tính toán bù bán kính dao thay vì sử dụng G41/G42.
this.lineNumber Số 10 Số ban đầu được dùng để đánh số dòng (N…).
this.lineNumberIncrement Số 10 Bước tăng số dòng từ dòng này sang dòng khác.
this.fileExtensions Mảng [ "nc", "cnc" ] Danh sách phần mở rộng tệp mà người dùng có thể chọn khi xuất thông qua bộ hậu xử lý này.

Một hàm khởi tạo hoàn chỉnh có thể trông như thế này:

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

Đầu ra G-Code được cấu trúc thành các khối mã được ghi vào tệp đầu ra khi sử dụng hàm xuất CAM trong QCAD/CAM. Ví dụ, khối mã đầu tiên được ghi là khối mã “header”. Mỗi khối mã được định nghĩa trong một biến thành viên xác định nó bằng tên, ví dụ this.header chứa khối mã cho phần đầu tệp.

Các khối mã có thể được ghi đè để chứa bất kỳ mã / văn bản nào. Các khối mã thường chứa các biến để xuất tọa độ X/Y hiện tại, số dòng, tốc độ tiến dao, v.v.

Giả sử một đường thẳng đơn được xuất sang G-Code. Đường thẳng được xuất với bù bán kính dao bên trái của đường thẳng (G41). Các khối mã được ghi vào tệp đầu ra như sau:

Khối mã Mô tả Đầu ra ví dụ
header Phần đầu của đầu ra (luôn là khối mã đầu tiên). G21 G17 G90 G40 G49 G80
rapidMoveZ Di chuyển nhanh đến mức an toàn. G0 Z100
rapidMove Di chuyển nhanh đến vị trí đầu tiên của đường bao đầu tiên (ở đây là điểm bắt đầu của dẫn vào cho đường thẳng). G0 X5 Y10
toolHeader Khối đầu tiên khi một dao mới bắt đầu hoạt động (thay dao). T1
rapidMoveZ Di chuyển nhanh xuống đến mức khoảng hở (lơ lửng trên vật liệu). G0 Z5
firstLinearMoveZ Cắt vào vật liệu ở tốc độ đâm dao. G1 Z-5 F50
toolpathHeader Khối đầu tiên của một đường chạy dao mới.
contourHeader Khối đầu tiên của một đường bao mới trong một đường chạy dao.
singleZPassHeader Phần đầu cho một lần chạy Z đơn. Chúng ta cắt toàn bộ độ sâu trong một lần chạy.
zPassFirstHeader Phần đầu đầu tiên của một hoặc nhiều lần chạy Z.
linearMoveCompensationLeft Di chuyển tuyến tính đến điểm bắt đầu của đường thẳng dọc theo dẫn vào, bật bù bán kính dao. G41 X10 Y10 F500
linearMove Di chuyển tuyến tính dọc theo đường thẳng đến điểm cuối của đường thẳng. X30 Y10
linearMoveCompensationOff Di chuyển tuyến tính ra khỏi điểm cuối dọc theo dẫn ra, tắt bù bán kính dao. G40 X35 Y10
zPassLastFooter Phần chân cuối cùng của một hoặc nhiều lần chạy Z.
singleZPassFooter Phần chân cho một lần chạy Z đơn.
contourFooter Kết thúc đường bao.
toolpathFooter Kết thúc đường chạy dao.
linearMoveZ Di chuyển ra khỏi vật liệu đến mức khoảng hở. Z5
rapidMoveZ Di chuyển đến mức an toàn. G0 Z100
toolFooter Kết thúc cho dao này.
footer Kết thúc chương trình. M30

Nhiều khối mã trong số này thường không được sử dụng và không tạo ra đầu ra (khối mã trống).

Biến thành viên Tên biến Mô tả
inputFileName INFILENAME Tên tệp đầu vào (ví dụ tệp DXF).
inputFilePath INFILEPATH Tên tệp đầu vào với đường dẫn đầy đủ.
fileName FILENAME Tên tệp đầu ra.
filePath FILEPATH Tên tệp đầu ra với đường dẫn đầy đủ.
dateTime DATETIME Ngày và giờ xuất.
lineNumber N Số dòng hiện tại.
spindleSpeed S Tốc độ trục chính, thường là vòng/phút.
feedRate F Tốc độ tiến dao.
plungeRate FP Tốc độ đâm dao.
xHomePosition XH Vị trí gốc như được cấu hình trong cấu hình CAM.
yHomePosition YH
zHomePosition ZH
zSafety ZS Mức an toàn Z cho việc thay dao và bắt đầu / kết thúc.
zClearance ZU Mức khoảng hở Z để tiếp cận vật liệu.
zClearancePass ZUP Mức khoảng hở Z giữa nhiều lần chạy.
zCuttingDepth ZD Mức cắt Z (tổng).
xFirstPosition XF Vị trí đầu tiên của đường bao đầu tiên trong đường chạy dao đầu tiên.
yFirstPosition YF
xStartPosition X1 Điểm bắt đầu của đối tượng (điểm bắt đầu của đường thẳng / cung tròn).
yStartPosition Y1
zStartPosition Z1
xPosition X Vị trí đích hiện tại. Điểm cuối của đường thẳng / cung tròn hiện tại.
yPosition Y
zPosition Z
xRelPosition XR Vị trí đích hiện tại dưới dạng tọa độ tương đối, so với điểm bắt đầu.
yRelPosition YR
zRelPosition ZR
iArcCenterInc I Tâm của cung tròn, so với điểm bắt đầu.
jArcCenterInc J
iArcCenterAbs IA Tâm của cung tròn, tuyệt đối.
jArcCenterAbs JA
arcRadius RADIUS Bán kính của cung tròn.
arcDiameter DIAMETER Đường kính của cung tròn.
arcSweep SWEEP Góc quét của cung tròn (góc mà cung tròn bao phủ tính bằng rad, âm cho chiều kim đồng hồ).
tool T Dao hiện tại.
toolRadius TR Bán kính dao.
toolDiameter TD Đường kính dao.
toolpathOrder TOOLPATH_ORDER Thứ tự đường chạy dao trong danh sách đường chạy dao, bắt đầu với 0 cho đường chạy dao đầu tiên.
toolCalls TOOL_CALLS Số lần dao này đã được sử dụng.
toolpathName TOOLPATH_NAME Tên của đường chạy dao hiện tại (do người dùng định nghĩa).
programName PROGRAM_NAME Tên chương trình như được người dùng cấu hình trong cấu hình CAM.
xMin X_MIN Phạm vi tối thiểu của bản vẽ.
yMin Y_MIN
zMin Z_MIN
xMax X_MAX Phạm vi tối đa của bản vẽ.
yMax Y_MAX
zMax Z_MAX

Thay đổi phần đầu và phần chân

Section titled “Thay đổi phần đầu và phần chân”

Để thêm hoặc thay đổi G-Codes hoặc M-Codes hoặc thông tin khác trong phần đầu hoặc phần chân, một cấu hình có thể ghi đè các biến thành viên header và footer trong hàm khởi tạo, ví dụ như sau:

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

Để sử dụng các giá trị tuyệt đối cho các giá trị I/J cho tâm của các cung tròn, bạn có thể ghi đè các khối mã cung tròn như sau:

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 tự động hợp nhất một tệp mẫu DXF có cùng tên với tệp bộ hậu xử lý (nếu có) khi đặt hoặc chuyển đổi bộ hậu xử lý. Giả sử, bộ hậu xử lý có tên “MyGCode”, được triển khai trong postprocessors/MyGCode.js. Tạo một tệp DXF với các định nghĩa dao trong postprocessors/MyGCode.dxf. Tệp này có thể chứa các định nghĩa dao, các lớp mặc định hoặc đường viền của vùng bề mặt khả dụng. Lưu ý: Bất kỳ nội dung hiển thị nào của tệp mẫu đều được tự động đặt trên một lớp bị khóa khi hợp nhất, vì vậy nó chỉ hiển thị nhưng không thể chọn.