简介:这份文档面向数控编程初学者、机床操作人员与工艺技术人员,围绕数控机床标准G代码和M代码展开,帮助读者在识读加工程序、编写指令及核对系统功能时快速查找对应说明。压缩包内共1个doc文件,约123KB,以表格化代码释义和功能范围说明为主,单文件结构便于按指令区间检索。目前已有272人学习下载,适合作为日常编程、教学讲解与岗前培训的参考材料。内容覆盖G00至G99常用准备功能,涉及快速定位、直线与圆弧插补、暂停、平面选择、工件坐标系、比例与镜像、刀具长度及半径补偿、固定循环和进给模式;同时列出M03、M04、M05、M06、M08、M09、M30等辅助功能。文中还提示不同数控系统在代码定义上可能存在差异,特殊用途需在程序格式中说明,便于读者结合机床手册进一步核对。
1. 数控机床标准G、M代码这张表,真正关键的是中间那列组号
有人第一次独立上机,程序头老老实实写了 G90 绝对值编程,中间为了走一段相对距离补了 G91,走完忘了切回来,后面所有坐标全变成增量叠加,一刀扎进夹具。这种事故跟“背没背熟指令”关系不大——数控机床标准G、M代码对照表背得再滚瓜烂熟,模态残留照样能把人送进撞刀现场。这份 G、M 代码速查表真正有价值的地方,不是让你多认识几个指令,而是中间那一列组号:它标明了哪两条代码互相排斥、哪条会一直生效到被同组代码顶掉、哪条干完就失效。刚接手加工中心编程的人能拿它当骨架,干了几年只熟自己那台系统的老手,也能拿它做交叉核对,尤其是换厂、换系统的时候。
2. 组号是冲突检测表:把 G00 到 G99 拆成六个可记忆的块
2.1 同组代码互斥,这就是模态的完整定义
拿到任何一份 G 代码对照表,先别看“功能”那列,先看数字列。G00、G01、G02、G03 后面都跟着 01,意思是这四个指令属于同一组,机床在任意时刻只认其中一个作为当前插补方式。你在一个程序段里写了 G01,后面再写 G00,不是“两个动作都做”,而是 G00 覆盖 G01,从这一段起快速移动生效,直到下一次被 01 组的其他代码替换。
这套规则的价值在于:它把“这段程序到底在干什么”变成一个可以静态推导的问题。不用真上机,只要顺序扫一遍程序,看每个组最后一次被赋值的是什么,就能知道每个程序段执行时机床处于什么状态。刀具半径补偿组最后一次是 G41,那后面每一段都在左补状态;刀具长度补偿组最后一次是 G49,那 Z 向就没有刀长补偿,撞刀风险直接摆在明面上。
对照表里的组号大致分这么几类,记住分类比记单个代码有用得多:
| 组号 | 成员 | 管什么 | 高频误用 |
|---|---|---|---|
| 00 | G04 G09 G28 G30 G52 G53 G60 G65 G92 | 一次性动作 | 以为 G92 会一直生效 |
| 01 | G00 G01 G02 G03 G33 | 插补方式 | G01 之后忘了它一直有效 |
| 03 | G90 G91 | 绝对/增量 | G91 用完不切回 G90 |
| 05 | G94 G95 | 进给单位 | 每分钟与每转混着写 |
| 06 | G20 G21 | 尺寸单位 | 中途切换,坐标全变 |
| 07 | G40 G41 G42 | 刀具半径补偿 | 起刀段距离不够 |
| 08 | G43 G44 G49 | 刀具长度补偿 | H 号与刀号对不上 |
| 09 | G73 G74 G76 G80 至 G89 | 固定循环 | 循环结束不写 G80 |
| 10 | G98 G99 | 循环返回点 | R 点与初始点搞混 |
| 14 | G54 至 G59 | 工件坐标系 | 同段写两个坐标系 |
| 13 | G96 G97 | 恒线速度 | 车削系统常用 |
| 16 | G68 G69 | 坐标系旋转 | 旋转后忘 G69 |
| 17 | G15 G16 | 极坐标 | 直角坐标下误开 |
| 18 | G50.1 G51.1 | 可编程镜像 | 镜像后刀补方向反 |
这张表里,00 组是唯一的例外——它不参与互斥,因为里面的代码全是“执行一次就结束”的非模态指令,写几个都行,谁也不会覆盖谁。
2.2 00 组为什么特殊:G04、G28、G53 都是执行一次就失效
模态指令的状态会一直挂着,非模态指令执行完立刻失效,程序段结束状态就没了。G04 暂停是最典型的:写G04 X1.5,机床停 1.5 秒,下一秒这个 G04 就不再存在,后面不会因为你“写过 G04”而一直停着。G28 回参考点、G30 回第二参考点、G53 切机床坐标系、G65 调用宏程序,都是这个脾气。
这里有个反直觉的地方:G52 在多数系统里被归进 00 组,但它的效果却是叠加式的——G52 X20. Y15.会在当前工件坐标系上再叠一层局部偏移,这层偏移不会因为下一段写了别的 00 组代码就消失,必须显式写G52 X0 Y0才撤销。所以看表看到“G52 属 00 组”就当它是一次性动作,是很容易翻车的地方。
提示:同一份代码在不同系统里的组号和模态属性可能不一样,表里的分组只作为推导骨架,上机前务必和自己机床的系统说明书对一遍。
2.3 G92 的两种身份,是跨系统核对的重点
对照表里 G92 写的是“设定工件坐标系”,这在铣削系统里是对的:G92 X0 Y0 Z0把当前位置定义成工件坐标系原点。但在车削系统里,G92 是螺纹切削循环,后面跟的是 X、Z、F 之类的螺纹参数。同样一个代码,一个是坐标系设定,一个是切削循环,写错一句轻则报警,重则丝杠带着刀往卡盘上撞。
我一般会把对照表当成“待验证清单”用,而不是“标准答案”。看到 G92、G50、G70、G74、G76 这几个,一定单独标出来,去自己那台系统的说明书里查一遍,确认它的组号和含义,再写进程序模板。这一步花十分钟,能省掉后面一整天。
2.4 用一段脚本把程序里的同组冲突扫出来
手工扫程序容易漏,尤其是几百行的模具程序。我用一个很小的 Python 脚本做静态检查,把表里的组号直接写成字典,扫描程序文件,报出同段冲突、刀长补偿缺 H 号、固定循环没取消、增量编程没切回这四类问题。
import re import sys # 组号字典:只收互斥性最强、最容易出事的几组 GROUP = { 1: ["G00", "G01", "G02", "G03"], 3: ["G90", "G91"], 5: ["G94", "G95"], 6: ["G20", "G21"], 7: ["G40", "G41", "G42"], 8: ["G43", "G44", "G49"], 9: ["G73", "G74", "G76", "G80", "G81", "G82", "G83", "G84", "G85", "G86", "G87", "G88", "G89"], 10: ["G98", "G99"], 14: ["G54", "G55", "G56", "G57", "G58", "G59"], 16: ["G68", "G69"], } CODE2GROUP = {code: g for g, codes in GROUP.items() for code in codes} G_RE = re.compile(r"\bG(\d+(?:\.\d+)?)\b", re.I) def clean(line): # 去掉 ; 和 ( ) 注释后再转大写,避免注释里的 G 代码干扰判断 return re.split(r"[;(]", line)[0].upper().strip() def check_conflict(lines): for ln, raw in enumerate(lines, 1): s, seen = clean(raw), {} for m in G_RE.finditer(s): code = "G" + m.group(1) g = CODE2GROUP.get(code) if g is None: # 00 组和未收录代码直接跳过 continue if g in seen and seen[g] != code: yield ln, "同段互斥:%s 与 %s 同属 %02d 组" % (seen[g], code, g) seen[g] = code def check_g43_h(lines): for ln, raw in enumerate(lines, 1): s = clean(raw) if re.search(r"\bG4[34]\b", s) and not re.search(r"\bH\d+", s): yield ln, "G43/G44 没有跟 H 刀长补偿号" def check_cycle(lines): active = None for ln, raw in enumerate(lines, 1): s = clean(raw) for m in re.finditer(r"\bG(8[0-9])\b", s): code = "G" + m.group(1) active = None if code == "G80" else (code, ln) if active: yield active[1], "%s 一直到程序结束都没有 G80 取消" % active[0] def check_incremental(lines): start = None for ln, raw in enumerate(lines, 1): s = clean(raw) if re.search(r"\bG91\b", s) and start is None: start = ln if re.search(r"\bG90\b", s): start = None if start: yield start, "G91 增量编程之后没有切回 G90" if __name__ == "__main__": path = sys.argv[1] lines = open(path, encoding="utf-8", errors="ignore").readlines() issues = [] for fn in (check_conflict, check_g43_h, check_cycle, check_incremental): issues.extend(fn(lines)) for ln, msg in sorted(issues): print("L%-5d %s" % (ln, msg)) print("共发现 %d 条问题" % len(issues))脚本的关键设计有三个:clean()先剥注释,避免程序头那行(G41 左补 D01)之类的中文注释造成误判;CODE2GROUP用字典反查,加新组号只要往GROUP里补一行;四类检查彼此独立,哪个不适用删掉对应函数就行。用法是python scan.py O0101.nc,输出按行号排序,一眼能看到问题集中在哪几段。
参数上有一点要注意:check_cycle只做“到文件末尾还没 G80”这一个判断,因为固定循环本身允许连续多孔沿用,中间不写 G80 是正常写法,只有在换工序或者回安全高度时才必须取消。同理,check_incremental允许一个程序里出现 G91/G90 交替,只抓“最后停在增量状态”这一种情况。
3. 从坐标系到固定循环:三段能在机床上跑通的程序骨架
3.1 G53、G54、G52 的层级关系,谁叠加谁
这三条是坐标系里最容易糊在一起的。G54 到 G59 是六个互相独立的工件坐标系,各自存一套偏置值;G52 是在当前选中的工件坐标系内部再叠一层局部偏移,常用于同一工件上多个相同型腔;G53 则完全跳出工件坐标系,直接使用机床机械坐标,而且它是非模态的,只在本程序段有效,执行完自动回到原来的工件坐标系状态。
这个层级决定了它们的用法分工:装夹找正是 G54 干的事,一组型腔之间的间距用 G52 挪,回换刀位、回托盘交换位这种跟工件无关的动作必须用 G53。G53 后面跟的坐标是机床坐标,不能带工件偏置,写成G53 G00 X0 Y0是把主轴开到机床零点,而不是开到工件原点——这一点新手最容易搞反。
O0101 (坐标系层级演示) G40 G49 G80 G21 G90 ; 安全段:注销刀补、注销循环、公制、绝对值 G54 ; 选中 1 号工件坐标系 G52 X20. Y15. ; 在 G54 内部再建局部偏移,原点右移 20、前移 15 G00 X0 Y0 Z50. ; 定位到局部原点正上方 G01 Z-5. F200 ; 下刀 G01 X60. F400 G52 X0 Y0 ; 撤销局部偏移,回到 G54 原点 G53 G00 Z0 ; 非模态,本段用机床坐标回 Z 零点 G53 G00 X-300. Y-200. ; 回换刀位,也用机床坐标 M30这段程序里,G52 X0 Y0那一行不能省,哪怕后面不再用局部偏移,也要显式撤销,否则下一次调用 G54 时偏移还在。G53两个程序段都带着G53前缀,因为它不保持,写完这一行就失效,下一行不写就又回到 G54。
参数上有两个边界:G53 必须配合 G90 绝对值状态使用,在 G91 状态下写 G53 的结果各系统不一致;G52 的偏移量是相对当前工件坐标系的增量,不是绝对位置,第二次写G52 X20.是在上一次的基础上再叠,而不是回到 20。
3.2 G41/G42 与 G43/G49 的落刀顺序,差一步就过切
刀具半径补偿和刀具长度补偿虽然都是“补偿”,运行逻辑完全不同。长度补偿管 Z 向,用 G43 配 H 号,把对刀仪测出的刀长值加进去;半径补偿管 XY 平面轮廓,用 G41/G42 配 D 号,让刀心轨迹偏离编程轮廓一个刀具半径。两者都必须在刀具真正接触工件之前建立,在离开工件之后注销。
建立半径补偿的那一段有个硬性要求:移动距离必须大于刀具半径,而且方向要尽量垂直于轮廓的第一段。写G41 D01 X0 Y0然后直接开始走轮廓,如果起刀点离轮廓只有几个毫米,刀具半径却有 6mm 以上,系统就找不到足够的空间做补偿过渡,轻则报警“刀补启动失败”,重则在过渡段把工件啃掉一块。
O0202 (外轮廓左补 + 刀长补偿) G40 G49 G80 G21 G90 T01 M06 ; 换 1 号刀 G43 H01 Z50. ; 建立刀长补偿,H01 对应刀补表第 1 项 G00 X-30. Y-30. ; 起刀点放在轮廓外侧,留足建立空间 G01 Z-3. F150 G41 D01 X0 Y0 F300 ; 沿进给切入,同时建立左补,D01 是半径值 G01 X80. G03 X100. Y20. R20. G01 Y60. G40 X110. Y70. ; 用一段斜向移动注销刀补,带轴移动 G00 Z50. M30G40那一行带X110. Y70.,是为了让系统有移动可以走完注销过渡;如果只写光秃秃一行G40,部分系统会直接报警,另一些系统会静默注销但留下一小段未补偿的轨迹,尺寸上表现为轮廓末端有台阶。
参数说明:G41 是沿进给方向看刀具在左侧,G42 是右侧,选错方向的表现是轮廓整体偏移一个直径,不是简单的尺寸偏差。D 号与 H 号是两套独立的补偿表,T01 刀的半径可以存在 D01,也可以存在 D31 之后的高位号,具体看系统分配,程序里写哪个号,就必须在机床的补偿表里把哪个号填对。
3.3 G73/G76/G80 固定循环的参数与取消
固定循环是 09 组的天下,从 G73 到 G89 都归它管。这一组的特点是“一个程序段给全参数,之后自动沿用”,直到被另一个 09 组代码替换或被 G80 取消。对照表里 G73 是深孔钻削(啄钻),G76 是精镗,G80 是取消,这三个配合起来就是一套完整的孔加工流程。
O0303 (深孔钻与精镗) G40 G49 G80 G21 G90 T02 M06 G43 H02 Z50. G00 X20. Y20. G98 G73 Z-40. R2. Q5. F120 ; 每次啄深 5mm,返回初始点 X50. ; 模态沿用 G73,只改孔位 G80 ; 必须显式取消 G00 X80. Y20. G98 G76 Z-40. R2. Q0.3 P1. F80 ; 精镗,Q 为退刀偏置,P 为孔底暂停 G80 G00 Z50. M30参数逐个说清:Z 是孔底绝对坐标,R 是 R 点高度(相对工件坐标系),Q 在 G73/G83 里是每次啄钻的增量深度、在 G76 里是孔底退刀偏移量,P 是孔底暂停时间(单位毫秒,不同系统可能是秒,需核对),F 是切削进给。G98 与 G99 决定循环结束后刀具回到初始平面还是 R 点,前者适合孔与孔之间有障碍物,后者适合连续密集孔位,能省不少空行程。
G80那两行不能省。固定循环是模态的,钻完第一个孔不取消就接着写G00 X80. Y20.,系统会把这个 G00 当成循环的新孔位继续钻,表现就是“机床突然跑到一个没打算钻的位置往下扎”。这类事故在夜班、批量件上特别常见。
4. M 代码的时序账:主轴、换刀、冷却在程序段里谁先谁后
4.1 常用 M 代码的功能分组
M 代码管的是辅助动作,主轴、冷却、换刀、程序结束都归它。对照表里没有列出全部 M 代码,但常用的是这几个:
| M 代码 | 功能 | 使用位置 |
|---|---|---|
| M00 | 程序停止 | 中途需要人工干预处 |
| M01 | 计划停止 | 需配合面板开关生效 |
| M02 | 程序结束 | 程序末段 |
| M03 | 主轴正转 | 切削前 |
| M04 | 主轴反转 | 反镗、攻丝退刀 |
| M05 | 主轴停止 | 抬刀之后 |
| M06 | 自动换刀 | 刀具交换 |
| M07 | 雾状冷却 | 轻切削 |
| M08 | 切削液开 | 下刀前 |
| M09 | 切削液关 | 抬刀后 |
| M19 | 主轴定向 | 反镗、精镗退刀 |
| M30 | 程序结束并复位 | 程序末段 |
| M98 | 调用子程序 | 换刀宏、重复加工 |
| M99 | 子程序返回 | 子程序末段 |
这张表比 G 代码表简单,但 M 代码的执行时序比 G 代码复杂,因为它是“动作”,不是“状态”。
4.2 同一程序段里 G 与 M 谁先执行
大部分系统在同一个程序段里,会先执行 M 代码再执行轴移动,所以M08 G01 Z-2. F100这一行的实际顺序是冷却液先开、再下刀。这个顺序在大件、深腔加工里是好事,但在精加工面上,冷却液提前喷上去会把切屑冲到已经加工好的表面上,留下压痕。
我的习惯是把 M 代码单独占一行,尤其是 M05 和 M09。主轴停止需要时间,写在M05 G00 Z50.里,有些系统是停了主轴才抬刀,有些是抬完才停,行为不统一。抬刀前主轴还在转,刀具从工件上螺旋退出来会刮出螺旋线;停了主轴再抬,就干净得多。
O0401 (换刀与主轴时序) G40 G49 G80 G90 G21 G00 Z100. ; 先抬到安全高度再换刀 T03 M06 ; 换 3 号刀 S1200 M03 ; 给转速并启动主轴 G43 H03 Z50. G00 X30. Y30. M08 ; 冷却液单独一行 G01 Z-2. F100 G01 X80. F300 G00 Z50. M09 ; 先关冷却 M05 ; 再停主轴 M30M06 换刀那一段有个细节:T03 M06和M06 T03在不同系统里行为不同,前者是先选 3 号刀再执行换刀,后者是先执行换刀动作再读刀号,部分系统会报“T 代码与当前刀不一致”。稳妥写法是分两行写,T03一行,M06一行,中间不夹别的指令。
4.3 换刀段与子程序调用
批量件程序的换刀段会重复很多次,用 M98 调子程序把换刀宏包起来,程序主体会干净很多。换刀宏里通常要做三件事:抬到安全 Z 高度、主轴定向 M19、调用 M06,然后 G43 建立新的刀长补偿。
O0500 (换刀子程序) G91 G28 Z0. ; 增量方式回 Z 参考点 G90 M19 ; 主轴定向,保证刀柄键槽对齐 M06 M99 O0501 (主程序调用) G40 G49 G80 G90 G21 T04 M98 P0500 ; 调用换刀子程序 G43 H04 Z50.参数说明:G91 G28 Z0.是“以增量方式回参考点”,G28的中间点由前面的轴移动决定,写Z0.在 G91 下就是相对当前位置回零,这是回参考点的标准写法。如果写成G90 G28 Z0.,就是先走到工件坐标 Z0 再回参考点,中间会多插一次扎刀动作。
M98 的 P 后面是子程序号,注意多位数的子程序号在不同系统的写法略有差异,有的系统 P0500 和 P500 等价,有的系统会截断,先按四位数写最保险。
5. 避坑:七条撞刀与尺寸超差的现场记录
5.1 坐标系与单位相关的四条
局部偏移没撤销,整批工件错位。现象是第二件工件整体偏了 20mm,尺寸全对但位置全错。原因是上一把程序用了G52 X20.建局部偏移,结束时只写了 M30,没写G52 X0 Y0;部分系统在程序结束复位时会清除局部偏移,部分不会。解决方式是把G52 X0 Y0写进程序尾固定模板,或者干脆把 G52 的撤销放在主程序 M30 之前显式执行。
尺寸差 25.4 倍。现象是加工出来的尺寸比图纸大一圈,算下来正好是英寸换算的比例。原因是程序头没写 G21,机床保留了上一次操作面板上手动设的英制状态。解决方式是所有程序的第一行固定写安全段G40 G49 G80 G21 G90,不依赖机床当前状态。
同段写两个工件坐标系。现象是有的系统报警“坐标系统冲突”,有的系统不报错但只认后写的那个,调试时以为选了 G54,实际跑的是 G55。原因是 G54 到 G59 全在 14 组,同组互斥。解决方式是一个程序段只给一个坐标系,切换坐标系之前先把刀抬到安全高度,避免在工件里切换。
G53 后面跟了工件坐标。现象是本来想回换刀位,结果机床开到工件原点附近撞上夹具。原因是 G53 后面的坐标必须按机床坐标写,操作者按图纸上的工件坐标填了数。解决方式是在程序里给换刀位留一行注释,写清“本行为机床坐标”,并在调试时用单段加低倍率确认一遍。
5.2 刀补与固定循环相关的三条
刀补起刀段太短,轮廓第一段过切。现象是轮廓起点位置总是多切一条弧,尺寸上表现为第一段直线短了一截。原因是 G41 所在程序段的移动距离小于刀具半径,系统在建立补偿时走了过冲过渡。解决方式是把起刀点往外移,保证起刀段的移动距离大于刀具半径的两倍,并且方向尽量垂直于第一段轮廓。
H 号写错,Z 向扎刀。现象是换刀后第一刀直接扎进工件 3mm,尺寸全部报废。原因是 G43 带的 H 号和实际刀号对不上,某个 H 号对应的补偿表项是空的或是旧值。解决方式是换刀段固定写成T03 M06加G43 H03,H 号永远等于刀号,对刀数据更新后必须重跑一次空运行。
固定循环没取消,孔位乱飞。现象是钻完一组孔后,机床突然跑到一个图纸上没有的位置继续往下钻。原因是 G81 或 G73 是 09 组的模态指令,后面写G00 X.. Y..时系统把这个快速定位当作新的孔位继续钻。解决方式是每次固定循环结束写一行 G80,宁可多写,不能漏写。
注意:这七条里有一半以上不是“不懂代码”造成的,而是“懂了但没按固定模板写”造成的。把安全段、注销段、程序尾做成三段固定模板,每次复制,比靠记忆可靠得多。
6. 把自己机床的差异补进表里:同名代码的不同含义
对照表最后那句“以各机床系统为主”,是整个资源里最值得重视的一句话。同一串 G 代码在不同系统里的含义差别,比大多数人想象的大。我一般会单独建一张差异表,只收录那些“同名不同义”或者“同义不同名”的代码,上机前先对一遍:
| 代码 | 铣削类系统常见含义 | 车削类系统常见含义 | 落地建议 |
|---|---|---|---|
| G50 | 比例缩放取消 | 主轴最高转速限制 | 程序里避免用 G50,改用系统专用写法 |
| G52 | 局部坐标系设定 | 局部坐标系设定 | 含义一致,但撤销方式要核对 |
| G70 | 精加工循环 | 精加工循环 | 基本一致 |
| G74 | 左旋螺纹攻丝循环 | 端面切槽循环 | 必须按手册确认 |
| G76 | 精镗固定循环 | 螺纹切削复合循环 | 最典型的同名不同义 |
| G92 | 设定工件坐标系 | 螺纹切削循环 | 车削程序里绝不用 G92 设坐标系 |
| G96/G97 | 恒线速度与取消 | 恒线速度与取消 | 车削常用,铣削少用 |
这张表不用一次填满,遇到一个填一个。填的方式是:程序跑出异常行为,先查这个代码在自己系统里的定义,确认和对照表是否一致,不一致就记一笔,写清“系统类型 + 代码 + 本机含义 + 触发条件”。一年下来,这张表就是自己那台机床的字典,比任何通用对照表都准。
首件试切我固定走三段。第一段空运行,机床锁住或者走图形模拟,只看轨迹和坐标,不看切削;这一段能抓出坐标系选错、刀补方向反了这类大问题。第二段单段加最低倍率,一程序段一停,重点看换刀、下刀、建立刀补这三个位置,手指放在进给保持上,随时能停。第三段才是正常倍率跑完整件,跑完立刻量关键尺寸,跟图纸对一遍再放手做第二件。
有一年我在一批铝合金件上跳过了空运行,直接单段起跑,结果 G52 的偏移从上一把程序里带过来,第一件整个偏了 20mm,刀具切到夹具上崩了刃口。从那以后我每次换程序都强制走一遍空运行加单段,哪怕这段程序昨天刚跑过、哪怕只改了一个孔位,也不省这两分钟。希望帮到你。
本文还有配套的精品资源,点击获取