CNC 编程代码示例 —— 从入门到实战
一、什么是 CNC 编程?
CNC(Computer Numerical Control,计算机数控)编程,是指通过编写一系列指令代码,控制数控机床按照预定轨迹和工艺参数自动完成零件加工的过程。这些指令代码,最核心的就是 G 代码(准备功能)和 M 代码(辅助功能)。
无论你是从事机械加工的一线操作工,还是机电一体化的在校学生,掌握 CNC 编程都是提升核心竞争力的关键一步。本文将从基础指令讲起,配合大量可直接上机验证的代码示例,带你系统掌握 CNC 编程。
二、坐标系与编程基础
2.1 机床坐标系
CNC 编程使用的是右手直角坐标系:
Z 轴:与主轴轴线平行,刀具远离工件的方向为正方向
X 轴:水平方向(车床为径向,铣床为工作台左右方向)
Y 轴:由右手定则确定(铣床常用,车床一般不涉及)
2.2 绝对坐标与增量坐标
这是初学者最容易混淆的概念:
模式 指令 含义
绝对坐标 G90 所有坐标值均以工件坐标系原点为基准
增量坐标 G91 坐标值表示从当前点出发的位移量
G90 G00 X50.0 Z10.0 ; 绝对模式:移动到 X=50, Z=10 的位置
G91 G00 X50.0 Z10.0 ; 增量模式:从当前位置向 X+方向移动50, Z+方向移动10
💡 经验之谈:初学阶段建议默认使用 G90 绝对坐标编程,思维更直观,不易出错。只有在铣削轮廓循环、子程序调用等特定场景才切换到 G91。
三、常用 G 代码指令速查
G 代码 功能 所属组 模态
G00 快速定位 01 ✅
G01 直线插补(切削进给) 01 ✅
G02 顺时针圆弧插补 01 ✅
G03 逆时针圆弧插补 01 ✅
G04 暂停( dwell ) 00 ❌
G17 选择 XY 平面 02 ✅
G18 选择 ZX 平面 02 ✅
G19 选择 YZ 平面 02 ✅
G20 英制单位(英寸) 06 ✅
G21 公制单位(毫米) 06 ✅
G28 返回参考点 00 ❌
G40 取消刀具半径补偿 07 ✅
G41 刀具半径左补偿 07 ✅
G42 刀具半径右补偿 07 ✅
G43 刀具长度正补偿 08 ✅
G49 取消刀具长度补偿 08 ✅
G54~G59 工件坐标系选择 14 ✅
G73 高速深孔钻孔循环 09 ✅
G81 钻孔循环 09 ✅
G83 深孔啄钻循环 09 ✅
G84 攻丝循环 09 ✅
G80 取消固定循环 09 ✅
G90 绝对坐标模式 03 ✅
G91 增量坐标模式 03 ✅
G96 恒线速度控制 13 ✅
G97 恒转速控制(取消恒线速) 13 ✅
📌 模态指令(Modal):同一组的 G 代码是互斥的,一旦设定会一直保持有效,直到被同组的其他 G 代码替换。比如 G01 激活后,后续所有直线运动都按进给速度执行,直到你切换回 G00。
四、常用 M 代码指令速查
M 代码 功能 执行时机
M00 程序暂停 程序段执行后
M01 可选暂停(需开启选择停止开关) 程序段执行后
M02 程序结束(不返回开头) 程序段执行后
M03 主轴正转(CW) 与本段同步
M04 主轴反转(CCW) 与本段同步
M05 主轴停止 程序段执行后
M06 自动换刀 程序段执行后
M08 冷却液开 与本段同步
M09 冷却液关 程序段执行后
M30 程序结束并返回开头 程序段执行后
M98 调用子程序 程序段执行后
M99 子程序返回 程序段执行后
五、实战编程示例
5.1 数控车床 —— 外圆与端面车削
加工一根 φ50×100mm 的阶梯轴,材料为 45# 钢:
; ==========================================
; 程序号:O0001
; 零件:阶梯轴 φ50→φ40→φ30
; 毛坯:φ55×105mm 45#钢
; 刀具:T01 外圆车刀(主偏角93°)
; ==========================================
O0001
G21 G40 G97 G99 ; 公制/取消补偿/恒转速/每转进给
G28 U0 W0 ; 回参考点
T0101 ; 换1号刀,取1号刀补
M03 S800 ; 主轴正转 800rpm
G00 X60.0 Z2.0 ; 快速移动到安全位置
M08 ; 开冷却液
; --- 粗车外圆 φ50 ---
G01 Z0.0 F0.3 ; 靠近端面
X-1.0 ; 车端面
G00 X55.0 Z2.0 ; 退刀
G90 ; 外圆切削循环
X51.0 Z-50.0 F0.25 ; 第一刀
X47.0 ; 第二刀
X43.0 ; 第三刀
X40.5 ; 半精车留量0.5mm
; --- 精车外圆 φ40 ---
S1200 ; 提高转速
G00 X40.0 Z2.0
G01 Z-50.0 F0.12
X50.0 ; 车台阶端面
G00 Z2.0
X30.0
G01 Z-30.0
X40.0 ; 车台阶端面
G00 X100.0 Z100.0
M09 ; 关冷却液
G28 U0 W0 ; 回参考点
M05 ; 主轴停止
M30 ; 程序结束
5.2 数控车床 —— 圆弧与螺纹加工
加工带 R5 圆角和 M30×2 螺纹的台阶轴:
; ==========================================
; 程序号:O0002
; 零件:带圆角和螺纹的台阶轴
; 刀具:T01 外圆车刀 / T02 外螺纹车刀
; ==========================================
O0002
G21 G40 G97 G99
G28 U0 W0
; ==== 外圆加工(T01)====
T0101
M03 S1000
G00 X55.0 Z2.0
M08
; 车外圆 φ30,带 R5 圆角过渡
G01 X26.0 Z0.0 F0.2
G03 X30.0 Z-2.0 R5.0 ; 逆时针圆弧(R5圆角)
G01 Z-40.0
X42.0
G03 X46.0 Z-42.0 R2.0
G01 Z-60.0
X52.0
G00 X100.0 Z100.0
; ==== 螺纹加工(T02)====
T0202
G00 X35.0 Z5.0 ; 螺纹起点(X方向留安全距离)
G76 P020060 Q100 R50 ; 螺纹复合循环
G76 X27.4 Z-38.0 P1300 Q400 F2.0
; P: 02=精车2次 00=无倒角 60=刀尖角60°
; X27.4 = 螺纹底径 (30-2×1.3mm)
; P1300 = 牙高1.3mm F2.0 = 螺距2mm
G00 X100.0 Z100.0
M09
G28 U0 W0
M05
M30
5.3 数控铣床 —— 矩形轮廓铣削
铣削一个 80×60mm 的矩形外形,使用 G41 刀具半径补偿:
; ==========================================
; 程序号:O0003
; 零件:80×60mm 矩形轮廓
; 刀具:φ12 立铣刀
; ==========================================
O0003
G21 G40 G49 G80 G90 ; 安全初始化
G17 ; 选择 XY 平面
G54 ; 选择工件坐标系
G28 G91 Z0 ; Z轴回参考点
T01 M06 ; 换1号刀 φ12立铣刀
G90 G00 X-60.0 Y-50.0 ; 移动到下刀位置
G43 Z50.0 H01 ; 刀具长度补偿
M03 S2500 ; 主轴正转 2500rpm
M08
; --- 分层铣削(每层2mm,共铣6层)---
#100 = 0 ; 变量:当前深度
WHILE [#100 LT 12] DO1 ; 循环:深度 < 12mm
G00 Z[-#100 + 2] ; 快速下到安全高度
G01 Z[-#100 - 2] F500 ; 切削进给到当前深度
; 建立刀具半径左补偿
G41 X-40.0 Y-40.0 D01 F800
; 铣削矩形轮廓
Y30.0
X40.0
Y-30.0
X-40.0
; 取消补偿并抬刀
G40 X-60.0 Y-50.0
G00 Z2.0
#100 = #100 + 2 ; 深度递增
END1
G00 Z100.0
M09
G49 Z0 ; 取消长度补偿
G28 G91 Z0
M05
M30
5.4 数控铣床 —— 圆周均布钻孔
在 φ80 的圆周上均布 6 个 φ8 的孔,使用 G83 深孔啄钻循环:
; ==========================================
; 程序号:O0004
; 零件:圆周均布6孔 PCD=φ80
; 刀具:T02 φ8 钻头
; ==========================================
O0004
G21 G40 G49 G80 G90
G17
G54
G28 G91 Z0
T02 M06 ; φ8 钻头
G90 G00 X0 Y0 ; 圆心位置
G43 Z50.0 H02
M03 S1800
M08
; 用宏程序实现圆周均布钻孔
#1 = 6 ; 孔数
#2 = 360 / #1 ; 角度增量 = 60°
#3 = 0 ; 当前角度
#4 = 40.0 ; 分布圆半径(PCD/2)
#5 = -15.0 ; 孔深
WHILE [#3 LT 360] DO1
#10 = #4 * COS[#3] ; X = R × cos(θ)
#11 = #4 * SIN[#3] ; Y = R × sin(θ)
G00 X#10 Y#11 ; 移动到孔位上方
G00 Z5.0 ; 快速到安全平面
G83 Z#5 Q3.0 R2.0 F120 ; 深孔啄钻(每啄3mm退屑)
; Q = 每次啄钻深度 R = 参考平面
G80 ; 取消钻孔循环
G00 Z20.0 ; 抬刀
#3 = #3 + #2 ; 角度递增
END1
G00 Z100.0
M09
G49 Z0
G28 G91 Z0
M05
M30
5.5 数控铣床 —— 整圆铣削与型腔加工
铣削一个 φ60 的圆形型腔,深 10mm:
; ==========================================
; 程序号:O0005
; 零件:φ60 圆形型腔 深10mm
; 刀具:T03 φ16 键槽铣刀(可轴向切入)
; ==========================================
O0005
G21 G40 G49 G80 G90
G17
G54
G28 G91 Z0
T03 M06 ; φ16 键槽铣刀
G90 G00 X0 Y0
G43 Z50.0 H03
M03 S2000
M08
; --- 螺旋下刀 + 环切法铣型腔 ---
#1 = 0 ; 当前深度
#2 = -10.0 ; 目标深度
#3 = 0 ; 当前半径
#4 = 22.0 ; 目标半径(30 - 8 刀具半径)
#5 = 2.0 ; 每层深度
#6 = 8.0 ; 径向步距(刀径的50%)
G00 Z2.0
WHILE [#1 GT #2] DO1 ; 深度循环
#1 = #1 - #5
IF [#1 LT #2] THEN #1 = #2 ; 确保最后一刀到位
; 螺旋下刀到当前层深
G01 Z#1 F300
#3 = 0 ; 重置半径
WHILE [#3 LT #4] DO2 ; 径向循环(环切)
#3 = #3 + #6
IF [#3 GT #4] THEN #3 = #4
G01 X#3 Y0 F600
G02 I-#3 J0 ; 顺时针整圆
END2
G01 X0 Y0 ; 回中心
END1
G00 Z100.0
M09
G49 Z0
G28 G91 Z0
M05
M30
六、FANUC 宏程序编程
宏程序是 CNC 编程的高级技能,通过变量和逻辑控制实现参数化加工。以下是变量类型速查:
变量类型 编号范围 说明 断电保持
局部变量 #1 ~ #33 仅在当前宏程序中有效 ❌
公共变量 #100 ~ #199 各程序共享,断电清零 ❌
公共变量 #500 ~ #999 各程序共享 ✅
系统变量 #1000+ 机床状态、坐标、刀具等 —
6.1 宏程序运算与函数
; 常用运算符
#1 = #2 + #3 ; 加法
#1 = #2 - #3 ; 减法
#1 = #2 * #3 ; 乘法
#1 = #2 / #3 ; 除法
; 常用函数(FANUC)
#1 = SIN[#2] ; 正弦(角度,单位度)
#1 = COS[#2] ; 余弦
#1 = TAN[#2] ; 正切
#1 = ATAN[#2] ; 反正切
#1 = SQRT[#2] ; 平方根
#1 = ABS[#2] ; 绝对值
#1 = ROUND[#2] ; 四舍五入
#1 = FIX[#2] ; 向下取整
#1 = FUP[#2] ; 向上取整
6.2 条件判断与循环
; IF 条件判断
IF [#1 GT 10] GOTO 100 ; 如果 #1 > 10,跳转到 N100
IF [#1 EQ #2] THEN #3 = 0 ; 如果相等,执行 THEN 后的语句
; 比较运算符
; EQ(=) NE(≠) GT(>) LT(<) GE(≥) LE(≤)
; WHILE 循环
#1 = 0
WHILE [#1 LE 10] DO1
G01 X#1 F500
#1 = #1 + 1
END1
; 循环嵌套(最多 3 层)
WHILE [条件] DO1
WHILE [条件] DO2
WHILE [条件] DO3
END3
END2
END1
6.3 椭圆的宏程序加工
这是一个经典的宏程序应用 —— 在铣床上加工椭圆外形:
; ==========================================
; 程序号:O0006
; 功能:椭圆轮廓铣削(长轴 a=50, 短轴 b=30)
; 椭圆参数方程:X = a×cos(θ), Y = b×sin(θ)
; ==========================================
O0006
G21 G40 G49 G80 G90 G17
G54
G28 G91 Z0
T01 M06
G90 G00 X55.0 Y0
G43 Z50.0 H01
M03 S3000
M08
G00 Z2.0
G01 Z-5.0 F300 ; 下刀到加工深度
; 建立刀具半径补偿
G41 X50.0 Y0 D01 F600
; 用角度增量逼近椭圆
#1 = 0 ; 角度 θ(起始)
#2 = 50.0 ; 长半轴 a
#3 = 30.0 ; 短半轴 b
#4 = 1.0 ; 角度增量(越小越光滑)
WHILE [#1 LE 360] DO1
#10 = #2 * COS[#1] ; X = a × cos(θ)
#11 = #3 * SIN[#1] ; Y = b × sin(θ)
G01 X#10 Y#11 F800
#1 = #1 + #4
END1
G40 X55.0 Y0
G00 Z100.0
M09
G49 Z0
G28 G91 Z0
M05
M30
七、程序结构规范与安全编程
7.1 推荐的程序框架
Oxxxx ; 程序号(xxxx=0001~9999)
; ===== 程序头 =====
(PROGRAM: 零件名称)
(DATE: 2026-07-06)
(TOOLS: T01-外圆车刀 T02-钻头)
(MATERIAL: 45#钢)
; ===== 安全初始化 =====
G21 G40 G49 G80 G90 G17 ; 取消所有补偿和循环
G54 ; 选择工件坐标系
G28 G91 Z0 ; Z轴回参考点
G28 X0 Y0 ; X/Y轴回参考点
; ===== 加工主体 =====
; ... 你的加工代码 ...
; ===== 程序尾 =====
M09 ; 关冷却液
G49 Z0 ; 取消长度补偿
G28 G91 Z0 ; Z轴回零
G28 Y0 ; Y轴回零
M05 ; 主轴停止
M30 ; 程序结束并返回
7.2 安全编程注意事项
⚠️ 以下每一条都是用真金白银换来的教训:
开机必回零。每次开机或急停后,必须先执行回参考点操作,否则机床坐标系会偏移。
首次运行用单段 + 低速。新程序上机,先空运行检查轨迹,再低速试切。进给倍率旋钮调到最低。
刀具半径补偿的建立与取消必须在 G00/G01 模式下。切勿在 G02/G03 圆弧插补时建立或取消刀补。
Z 轴安全高度。每次换刀或工序切换,确保 Z 轴在安全高度(一般 > 50mm),避免撞刀。
换刀前取消所有补偿。执行 M06 前应先 G40 G49 G80,确保刀具状态干净。
括号注释用英文或拼音。部分老旧 FANUC 系统不支持中文注释,建议统一使用英文或拼音。
固定循环后必须 G80 取消。否则后续定位指令可能意外触发钻孔动作。
八、不同系统的 G 代码差异
虽然 G 代码是 ISO 标准,但不同数控系统之间仍存在差异。以下是 FANUC、Siemens 和 Heidenhain 三大主流系统的对比:
功能 FANUC Siemens 840D Heidenhain
绝对坐标 G90 G90 坐标直接书写
增量坐标 G91 G91 / IC() IX, IY, IZ
公制单位 G21 G71 系统参数设定
刀具补偿 G41/G42 + D G41/G42 + D RL/RR
钻孔循环 G81~G89 CYCLE81~89 CYCL DEF 200~
坐标系 G54~G59 G54~G57/G505~ CYCLE DEF 7.0
子程序 M98 Pxxxx Lxxxx / CALL CALL PGM
变量 #1~#33, #100+ R0~R99 Q1~Q1999
📌 跨平台建议:如果你的车间有多种系统,建议在注释中标注目标系统,或为每种系统维护独立的程序库。CAM 后处理是另一个更省心的方案。
九、学习路径建议
如果你是从零开始学习 CNC 编程,建议按以下路径循序渐进:
阶段 内容 周期
① 基础认知 机床结构、坐标系、装夹与对刀 1~2 周
② 手编入门 G00/G01/G02/G03 + M代码,车削/铣削简单零件 2~4 周
③ 固定循环 G70~G76(车削复合循环)、G81~G89(钻孔循环) 2 周
④ 刀补与子程序 G41/G42/G43、M98/M99 子程序调用 1~2 周
⑤ 宏程序 变量、运算、条件、循环 → 参数化加工 3~6 周
⑥ CAM 软件 Mastercam / UG NX / PowerMill → 后处理配置 持续提升
⑦ 实战优化 工艺参数优化、刀具路径策略、效率与表面质量平衡 持续积累
💡 关键建议:手编是基础,理解每行代码的含义能帮你更好地使用 CAM 软件和排查问题。不要跳过手编阶段直接学 CAM —— 那会让你在出了问题后束手无策。
十、总结
CNC 编程是一门理论 + 实操紧密结合的技能。本文涵盖了:
✅ G 代码与 M 代码核心指令表
✅ 数控车床外圆、圆弧、螺纹的完整编程示例
✅ 数控铣床轮廓、钻孔、型腔的完整编程示例
✅ FANUC 宏程序的变量、运算、条件、循环语法
✅ 椭圆等非圆曲线的宏程序加工方法
✅ 程序结构规范与安全编程注意事项
✅ 主流数控系统的代码差异对比
✅ 从零开始的学习路径规划
代码示例可以直接在 FANUC 0i 系列机床上运行,其他系统(Siemens、Heidenhain、华中数控等)需要根据上文对比表做适当调整。
如果你觉得这篇文章有帮助,欢迎 点赞 + 收藏 + 关注,后续我会持续分享更多数控加工、宏程序和 CAM 编程的实战经验。
—— 全文完 ——
