跳到内容
CADCAMFUN
文档

文档

CAM 和 G 代码

生成刀具路径、后加工程序、重放发出的 NC,并检查每个结果附带的证据。

从英文自动翻译。 查看英文原文

从几何到程序

@cadcamfun/core 暴露制造功能 cam。操作生成器将几何形状和加工参数转换为刀具路径移动。帖子将机器中立的程序转换为控制器文本。生成器适配器还支持申请表使用的铣床、车床和 3D 打印机请求。

本机制造内核添加了一个有序管道:准备零件和资源、计划或接受操作、计算切削数据、生成运动、发出一个 NC 程序、独立重放该 NC 并附加证据。生成的文本、解析的程序和经过验证的制造工件是具有不同保证的不同输出。

发出现有程序
import { cam } from "@cadcamfun/core"

const post = cam.getPost("fanuc")
if (post === undefined) throw new Error("Post is unavailable")
const nc = post.emit(program, { decimals: 3, tolerance: 0.01 })

刀具路径表示

程序包含有序的刀具路径,每个刀具路径都与刀具标识符和移动列表相关联。坐标以毫米为单位,切削进给以毫米/分钟为单位,持续时间以秒为单位。在常规操作坐标中,切削深度相对于坯料顶部为负 Z。帖子转换输出单位而不更改域约定。

动作是 Rapid, Linear, Arc, Dwell, Comment, Cycle, 和 Orient。圆弧中心为绝对XY坐标;一篇文章计算了控制器相对 I/J 偏移量。匹配的起始和结束 XY 坐标表示一个完整的圆。循环通过其退刀平面和进给保留钻削、停留、啄削或断屑意图。

线性和快速移动的旋转场表示同步轴运动; Orient 表示索引定位。这些角度场使用度数。不支持旋转运动的方言会拒绝这样的程序,而不是丢弃其旋转字段。

操作和生成器 API

操作库包括轮廓、型腔、钻孔、端面、雕刻、表面加工、残料加工、螺纹加工、倒角、自适应加工和多轴生成。每个操作都公开其参数契约和纯生成函数。刀具尺寸、深度限制、间隙、进给量和几何形状必须满足操作的验证规则。

POST /api/toolpaths/generate 接受发电机设置、几何形状和打印机附加信息和返回 gcode, cycles, warnings, stats, program,并通常生成证据。无法生成程序的有效请求返回 400 以及原因;意外的计算失败变为 500。生成不保存刀具路径。

/api/toolpaths/suggest 导出元素驱动的参数、反馈、切割统计、操作文本和警告。 /api/toolpaths/parse 将提供的 G 代码解释为程序移动和统计数据。建议和解析并不能确定程序是安全的或几何上正确的。

控制器方言

内置注册表实现 generic, fanuc, grbl, 和 haas. linuxcnc 是一个公认的帖子标识符,在此注册表中没有实现; getPost 可以返回未定义。在调用之前解决并检查该帖子。

帖子共享一个具有固定十进制格式、注释清理、工具更改、弧处理、可选行编号和循环扩展的发射器。默认值为小数点后三位、启用固定循环、IJK 圆弧、启用标头以及 0.01 mm 公差。不支持的弧格式通过方言支持的形式和线性化进行回退。

toolNumbers 将工具标识符映射到显式正整数口袋。未映射的工具使用首次使用编号,同时避免占用编号。 retractBeforeToolChange 已选择加入;它将 Z 提升到换刀前程序达到的最高位置。子程序发射也是可选的,并且取决于方言支持。在生产使用之前检查所选控制器的输出和机器配置。

重复的刀具路径可以作为子程序发出。如果一条刀具路径在其定位移动之后,其运动是在 5 × 10⁻⁶ mm 内平移的另一个刀具路径的运动,并且具有相同的移动类型、进给和圆弧感应,则该刀具路径合格。每组至少需要六个身体动作,并且总共必须保存至少十二个动作。带有固定循环或旋转字的刀具路径绝不是候选路径(packages/core/src/cam/post/subprograms.ts).

本机制造和发布级别

POST /api/toolpaths/manufacture 接受 CamKernelRequest,版本 1 CAD 快照,包含身份、材料、可选机器、库存、工具、操作、质量控制和工件偏移。缺少的操作会调用规划器;缺少的刀具使用默认的刀具库。不支持的输入、未知的材料或工具、空的零件几何形状、无效的库存以及不可计划的工作返回显式问题。

内核计算每次操作的进给量、主轴速度、啮合度、功率和力估计、警告、时间和移除体积。它发布一个程序并独立解释其发出的 NC。该工件保留了程序、剪切器、NC 文本、库存统计、操作结果、身份摘要、声明和问题。

release 是 blocked, preview, 或者 verified-program。硬故障或空 NC 块释放。验证要求相关声明通过;当前的发布规则允许不受支持的机器旅行证据,同时仍将程序标记为已验证。在确定证据是否涵盖预期机器之前,检查每项索赔,包括不受支持和未解决的状态。

索赔涵盖切削数据、机器限制、已完成的操作、快速间隙、刀柄间隙、气刨、材料去除、NC 重放、机器行程和机器间隙。证据与工件的 NC 和来源身份相关。编辑 NC 或更改源设置会使该连接无效,除非再次评估作业。

重放验证及其局限性

POST /api/toolpaths/verify 针对轴对齐毛坯重放 G 代码或程序。准确提供一个运动源、一个工具和库存范围。可选的固定装置是轴对齐的封套;可选的目标实体或网格可以进行凿孔和剩余库存比较。缺少凹槽、柄、突出部或支架尺寸会使相应的检查无法建模。

验证器将运动采样到高度场并返回问题、移除统计数据、接合/空切长度和显示预览。默认公差为 0.05 毫米。分辨率默认来自刀具直径,并且可以粗化以适应计算预算; ResolutionCoarsened 报告发生变化。网格分辨率限制了结果可以支持的几何证据。

结果与 ok: true 没有错误严重性问题。如果没有目标,就无法确定成品的精度;如果没有固定装置或支架几何形状,则无法确定其间隙。内核的集成重播和机器检查添加了特定于其捕获作业的证据,而独立验证仅反映其提供的请求。

实施图

cam/ir.ts 拥有搬迁和节目合同; operations/ 拥有策略生成器; post/ 拥有控制器发射; generator/ 调整应用程序设置并解析文本; model/ 构建零件几何形状; verify/ 拥有高度场回放; kernel/ 拥有制造编排和证据。 setup.ts 和 indexing.ts 提供工作框架验证和索引表转换。

保存文档、检查图纸访问以及保留源证据都属于 sidecar 服务。看 设置 用于便携式操作文档和持久性检查。

深度、高度、进给和默认值

核心操作参数区分正切割深度和绝对 Z 平面。 totalDepth 和 stepdown 需要正有限长度; 5 毫米深度和 2 毫米步距可在顶部下方的 2、4 和 5 毫米处产生走刀。默认值仅在缺少字段时应用,因此保留明确允许的零。

场地默认/单位意义
clearanceHeight10 毫米用于清晰快速定位的平面。
safeHeight5 毫米操作进给/退出高度。
retractHeight2 毫米通道之间的停车高度;零可以是有效的。
feed / plungeFeed800 / 300 毫米/分钟正向切削和切入进给。
spindleRpm / coolant10,000 / off操作级主轴和冷却液意图。

高度必须满足间隙 ≥ 安全 ≥ 缩回。轮廓默认值包括外部补偿、爬升方向、零精加工余量、直接导入、圆弧拟合关闭和 0.01 mm 公差。坡道角度默认为 3° 并接受 0.1–45°;螺旋螺距默认为每转 1 毫米。声明的边和余量会移动刀具中心路径,而不是更改源轮廓。

这些是纯操作默认值。应用程序生成器的设置和本机内核的材料衍生过程数据是单独的参数层;不要假定它们具有相同的字段名称或默认值。

来源: packages/core/src/cam/params.ts 和 operations/profile.ts.

螺纹铣削使用 ISO 68-1 基本轮廓高度:0.54127 × 内螺纹螺距和 0.61343 × 外螺纹螺距(packages/core/src/cam/operations/thread.ts)。刀具路径查看器假设在没有进给的情况下切削移动为 500 mm/min,在动画计时时为急流假设为 1,000 mm/min;这些是播放假设,而不是机器估计。

重放一个小型 NC 程序

此内存中示例在 4 × 3 × 40 mm 毛坯模型中切割出一个 40 mm 宽、10 mm 深的直槽。它使用 HTTP 端点使用的相同核心验证器,而不保存工具路径。

检查库存去除和碰撞
import { cam } from "@cadcamfun/core"

const report = cam.verify.verifyToolpath({
  gcode: "G21\nG90\nG0 X-10 Y0 Z5\nG0 Z0\nG1 Z-3 F200\nG1 X10 F400\nG0 Z5\nM30",
  stock: { minX: -20, maxX: 20, minY: -20, maxY: 20, minZ: -10, maxZ: 0 },
  tool: { kind: "endmill", diameter: 4 },
  fixtures: [], tolerance: 0.05, resolution: 0.25
})
console.log(report.ok) // true for this stock/tool model
console.log(report.stats.removedVolume)
console.log(report.issues)

将暴跌更改为 G0 Z-3 产生一个 RapidInMaterial 发现。添加较短的切削长度或刀柄尺寸可能会导致原始请求无法测试的刀柄/刀柄问题。提供目标几何形状增加成品比较;这个例子没有对目标或装置做出任何声明。

验证者最多预算 2、500、000 个网格单元和 3、000、000 个路径样本,工作预算为 80、000、000。可以对请求进行粗化以满足这些限制。预览库存经过缩减采样以供显示,因此其像素不是第二个更精细的验证结果。

来源: packages/core/src/cam/verify/verify.ts 和 verify/verify.test.ts.

当重放调用子程序的文本时,解释器遵循 M98 嵌套最多八层深度,并在 2、000、000 行停止展开,因此大量重复计数不会耗尽内存(packages/core/src/cam/subprogram-text.ts).

读取失败或预览工件

内核问题包括 tag, severity, stage, message, and optional operation ID, NC line, and point. Follow that stage to the input that caused it: preparation checks stock/material/tools; planning selects strategies; cutting-data checks process limits; generation creates motion; posting writes the controller format; replay/evidence checks the resulting bytes.

  • NoSuitableTool 或 UnknownTool:检查所选刀具 ID 和几何限制,包括直径、凹槽长度、伸出量和提供的刀具库。
  • RapidInStock 或 HolderCollision:找到报告的操作/点并检查入口、收回、库存和支架/工作台间隙。增加切削进给量并不能修复不安全的快速切削。
  • Gouge:检查轮廓侧面、顶部/底部水平、精加工余量和目标几何形状。内核测试外部部分的内部配置文件作为真正的重放失败。
  • RemainingStock:在解释剩余体积之前检查难以接近的拐角、刀具半径、精加工策略和验证分辨率。
  • ReplayMismatch:将发布的运动及其声明的 IR 视为不一致并从捕获的作业中重新生成。

机器预设代表典型类别,而不是测量的机器。可用的快照预设 ID 为 vmc-standard, haas-vf2, hsc-mill, desktop-mill, 和 cnc-router。第一个是默认的。检查实际的机器行程和间隙证据,而不是从预设的显示名称推断。

来源: packages/core/src/cam/kernel/execute.ts, machines.ts, 和 kernel.test.ts;电线问题字段位于 packages/api/src/cam-kernel.ts.

生成一个口袋并发布它

CAM 层是纯函数的管道:几何图形和参数进入一个操作,该操作返回一个 Toolpath 中间表示(IR)动作, Program 对刀具路径进行分组,后处理器将程序转换为特定于方言的文本。这篇文章之前不知道 G 代码字,因此可以为 GRBL、Fanuc、Haas 或通用方言发出相同的刀具路径。

pocket.ts — 完整,可与 Bun 一起运行
import { cam } from "@cadcamfun/core"

const tool = { id: "t6", name: "6 mm flat end mill", kind: "endmill",
               diameter: 6, flutes: 3, maxRpm: 18000 }
// 60 × 40 × 10 mm block; its top face is at origin.z (Z = 0)
const stock = { x: 60, y: 40, z: 10, origin: { x: 0, y: 0, z: 0 },
                material: "aluminium-6061" }

const params = new cam.PocketParams({
  name: "Pocket 30x20",
  totalDepth: 3,   // mm below the stock top
  stepdown: 1.5,   // two levels: -1.5 and -3.0
  entry: "ramp",   // default is "helix"
})

const ring = [{ x: 15, y: 10 }, { x: 45, y: 10 }, { x: 45, y: 30 }, { x: 15, y: 30 }]
const pocket = cam.generatePocket(params, ring, tool, stock)

const program = { name: "pocket-demo", units: "mm", workOffset: "G54",
                  toolpaths: [pocket] }
const gcode = cam.getPost("grbl")!.emit(program)
console.log(gcode)
型腔刀具路径:30 × 20 mm,深 3 mm,Ø6 立铣刀 拖动进行轨道旋转·滚动进行缩放·右键拖动进行平移
The moves generated by the example below, drawn in machine coordinates. Dashed amber lines are rapids (G0); green lines are feed moves (G1). Watch the ramp entry spiral down at the start of each 1.5 mm level, then the offset rings work outward (order insideOut). The translucent block is the 60 × 40 × 10 mm stock, whose top face is Z = 0.
输出(GRBL,85行,中间省略)
(PROGRAM: pocket-demo)
(UNITS: MM)
(WORK OFFSET: G54)
(OP 1: Pocket 30x20 | T1 [t6] | S10000 | F300-800)
G21 G90 G17 G94
G54
(OPERATION: Pocket 30x20)
(TOOL T1)
M3 S10000
(Pocket: Pocket 30x20)
G0 X30.000 Y21.000 Z10.000
Z5.000
Z2.000
Z1.000
G1 X36.000 Z0.732 F300
Y19.000 Z0.643
X24.000 Z0.107
Y21.000 Z0.018
X30.000 Z-0.250
X36.000 Z-0.518
Y19.000 Z-0.607
X24.000 Z-1.143
Y21.000 Z-1.232
X30.000 Z-1.500
...
(the second level repeats the ramp from Z-1.500 to Z-3.000)
...
X18.000
Y27.000
G0 Z2.000
Z10.000
M5
M2

从顶部读取输出:标题注释列出了程序、单位、零点偏移和每次操作摘要(刀具编号、ID、主轴转速和进给范围)。 G21 G90 G17 G94 选择毫米、绝对坐标、XY 平面和每分钟进给量。 GRBL 没有工具更换器,因此第一个工具以注释形式公布,后来的工具更改为 (CHANGE TO TOOL Tn) 其次是 M0. The pocket starts with rapids down through clearance (10), safe (5), and retract (2) heights, then ramps at the 300 mm/min plunge feed. Once the ramp reaches depth it switches to the 800 mm/min cutting feed. The program ends with M5 (主轴停止)和 M2.

报告空几何体,而不是默默地跳过

如果该区域不是封闭边界,则该操作会发出注释 (nothing to cut: no closed boundary) 并且没有任何动作。将环点传递为 { x, y } 对象。当操作不产生剪切时,在生成的程序中搜索该注释。

操作参数和默认值

每个操作的参数类都扩展相同的公共字段。高度为绝对Z值,必须满足间隙≥安全≥缩回;该模式拒绝任何其他内容。深度是指股票顶部以下的正距离;最后一次传递被剪裁为 totalDepth.

公共领域默认意义
id, nameoperation, Operation评论和摘要中显示的身份。
clearanceHeight10操作之间移动的高度。
safeHeight5区域之间移动的高度。
retractHeight2切入/进给前的高度。
totalDepth必需的股票顶部下方的正深度。
stepdown必需的每次走刀深度为正。
feed800切削进给,毫米/分钟。
plungeFeed300切入和斜坡进给,毫米/分钟。
spindleRpm10000主轴转速。
coolantoff冷却液模式。
手术特定字段(默认)
Pocketstepover 40(直径的百分比,1–100), allowance 0, finishPass 错误的, climb 真的, entry helix | ramp | plunge, order insideOut | outsideIn, helixPitch 1, helixRadius 0(=刀具半径), rampAngle 3° (0.1–45), tolerance 0.01, toolCentre 错误的。
Profileside outside | inside | onLine, climb 真的, allowance 0, leadIn direct | ramp | helix | arc, helixPitch 1, helixRadius 0, leadRadius 2, rampAngle 3°, tabs [](每个选项卡: position 沿着路径0–1, width, height), arcFit 错误的, tolerance 0.01.
Drill不 stepdown 或 feed. peck 0(一笔), chipBreak 错误的, dwell 0 秒。深孔循环使最后深度上方的间隙保持为 0.5 毫米,断屑退刀量为 0.5 毫米。
Facestepover 60, overshoot 0(= 刀具半径 + 1 毫米), alongX 真的, tolerance 0.01.
Engravetolerance 0.01.
Thread螺纹铣削;轮廓深度 0.54127 × 内部螺距和 0.61343 × 外部螺距。
Adaptive、静止、曲面、倒角、多轴从同一模块导出更多策略;倒角添加 tipOffset 0。2 和 lead 1.

构造参数与 new cam.PocketParams({ ... }) (或匹配的类),以便应用默认值并检查一次约束。每个操作也作为一对导出,例如 cam.Pocket = { Params, generate },用于按操作类型分派的代码。

后处理器和输出选项

帖子是通过ID注册的 cam.posts 抬头看着 cam.getPost(id)。这 linuxcnc ID是保留的但没有实现,所以 getPost("linuxcnc") 回报 undefined。打电话之前检查一下 emit.

邮政固定循环停留单元旋转轴换刀程序框架
generic是的秒是的Tn M6没有任何
grbl否(扩展到移动)秒拒绝评论一下,然后 M0 暂停没有任何
fanuc是的毫秒是的Tn M6 + G43 Hn% / O####, 子程序
haas是的毫秒是的, G234 传输控制协议Tn M6 + G43 Hn% / O####, 子程序

所有四个都接受弧作为 ijk 或 radius; linearize 总是有可能的。移动带有旋转角度的程序会被 GRBL 拒绝,而不是默默地丢失角度。

发出选项默认Effect
decimals3小数点后的数字。
lineNumbers离开{ start, step } 例如,写入 N 个单词 N10, N20.
useCannedCyclestrue在方言有的地方发出钻孔循环。
arcModeijkijk, radius, 或者 linearize.
headertrue编写描述性评论标题。
tolerance0.01圆弧线性化时的弦公差。
toolNumbers首次使用顺序工具 ID 到转盘口袋的映射。丢失的条目保留首次使用的编号,而不会与明确的口袋发生冲突。
retractBeforeToolChange离开将 Z 轴升高至换刀前达到的最高点。
stamp缺席的标头印章。为了确定性输出,将其保留。
subprograms离开将重复的翻译刀具路径写入一次作为增量子程序(Fanuc 和 Haas)。
具有行号的 Fanuc 控制的相同程序
const text = cam.getPost("fanuc")!.emit(program, { lineNumbers: { start: 10, step: 10 } })
// %
// O1000
// (PROGRAM: POCKET-DEMO)          comments are upper-cased
// ...
// N10 G21 G90 G17 G94 G40 G49 G80
// N20 G54
// N30 T1 M6
// N40 G43 H1
// N50 M3 S10000

默认情况下字节相同

默认情况下,更改输出的选项(换刀缩回、子程序、标记)处于关闭状态,因此重新生成存储的请求会生成相同的文本。这 cam/gcode 工作流程步骤依赖于此来检测过时的程序。

在将程序发送到机器之前

  1. 确认库存:尺寸、最小角的原点以及顶面在 origin.z。每个深度都是从该面开始测量的。
  2. 检查固定装置的高度。间隙、安全和缩回高度是工件偏置中的绝对 Z 值。
  3. 选择实际控制人职务并确认落实(getPost 回帖)。
  4. 重播程序并进行验证并阅读每一期。不要将没有错误注释视为证据。
  5. 如果 NC 文本是手动编辑的,请重新生成或重新验证。针对原文计算的证据不再适用。
  6. 在零件上方的机器上进行空运行,并减少进给倍率,就像任何新程序一样。

生成的代码不是机器保证

内核和帖子检查他们知道的几何、限制和方言规则。他们不知道您的夹具、刀具长度或机器状况。经过验证的程序只是证据,而不是安全削减的保证。

原生内核证据声明

除了上面显示的生成器之外,本机内核还返回具有十个声明的工件。每一个都是 passed, failed, unsupported 或 unresolved,带有详细信息字符串。发布级别总结了它们: blocked, preview 或 verified-program.

宣称状态示例内核返回的详细信息
cutting-data通过了每个操作均按照针对 Acetal POM-C (Delrin) 及其刀具计算的切削数据运行
machine-limits通过了主轴转速、进给、功率、扭矩和刀具偏转均在限制范围内
operations-complete通过了生成了 3 操作;每个计划的功能都有一个操作
no-rapid-in-stock通过了重播时没有快速波动触及股票
holder-clearance通过了柄和支架远离库存(3轴高度场重播)
no-gouge通过了超出 0.030 mm(横向松弛一格)的部分下方无切口
material-removed通过了回放的库存与 0.110 mm 内的部分匹配
nc-replay通过了独立于帖子解释了 3035 NC 动作;范围在 2.0e-3 mm 内一致
machine-travel不支持的机器未配置行程限制
machine-clearance通过了已检查 3035 步;刀柄和柄距工作台至少 6.500 毫米

这些行是本机制造指南中 POM 毛坯的真实结果:3 操作,3071 NC 线,发布 verified-program。神器的机岗还可以 linuxcnc 在架构中,但没有实现 LinuxCNC post,因此预设不使用它。