资讯详情 数控G/M代码组号速查:模态指令、刀补与固定循环避坑
📅 2026/10/29 6:30:25
简介这份文档面向数控编程初学者、机床操作人员与工艺技术人员围绕数控机床标准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 向就没有刀长补偿撞刀风险直接摆在明面上。对照表里的组号大致分这么几类记住分类比记单个代码有用得多组号成员管什么高频误用00G04 G09 G28 G30 G52 G53 G60 G65 G92一次性动作以为 G92 会一直生效01G00 G01 G02 G03 G33插补方式G01 之后忘了它一直有效03G90 G91绝对/增量G91 用完不切回 G9005G94 G95进给单位每分钟与每转混着写06G20 G21尺寸单位中途切换坐标全变07G40 G41 G42刀具半径补偿起刀段距离不够08G43 G44 G49刀具长度补偿H 号与刀号对不上09G73 G74 G76 G80 至 G89固定循环循环结束不写 G8010G98 G99循环返回点R 点与初始点搞混14G54 至 G59工件坐标系同段写两个坐标系13G96 G97恒线速度车削系统常用16G68 G69坐标系旋转旋转后忘 G6917G15 G16极坐标直角坐标下误开18G50.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, encodingutf-8, errorsignore).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 H03H 号永远等于刀号对刀数据更新后必须重跑一次空运行。固定循环没取消孔位乱飞。现象是钻完一组孔后机床突然跑到一个图纸上没有的位置继续往下钻。原因是 G81 或 G73 是 09 组的模态指令后面写G00 X.. Y..时系统把这个快速定位当作新的孔位继续钻。解决方式是每次固定循环结束写一行 G80宁可多写不能漏写。注意这七条里有一半以上不是“不懂代码”造成的而是“懂了但没按固定模板写”造成的。把安全段、注销段、程序尾做成三段固定模板每次复制比靠记忆可靠得多。6. 把自己机床的差异补进表里同名代码的不同含义对照表最后那句“以各机床系统为主”是整个资源里最值得重视的一句话。同一串 G 代码在不同系统里的含义差别比大多数人想象的大。我一般会单独建一张差异表只收录那些“同名不同义”或者“同义不同名”的代码上机前先对一遍代码铣削类系统常见含义车削类系统常见含义落地建议G50比例缩放取消主轴最高转速限制程序里避免用 G50改用系统专用写法G52局部坐标系设定局部坐标系设定含义一致但撤销方式要核对G70精加工循环精加工循环基本一致G74左旋螺纹攻丝循环端面切槽循环必须按手册确认G76精镗固定循环螺纹切削复合循环最典型的同名不同义G92设定工件坐标系螺纹切削循环车削程序里绝不用 G92 设坐标系G96/G97恒线速度与取消恒线速度与取消车削常用铣削少用这张表不用一次填满遇到一个填一个。填的方式是程序跑出异常行为先查这个代码在自己系统里的定义确认和对照表是否一致不一致就记一笔写清“系统类型 代码 本机含义 触发条件”。一年下来这张表就是自己那台机床的字典比任何通用对照表都准。首件试切我固定走三段。第一段空运行机床锁住或者走图形模拟只看轨迹和坐标不看切削这一段能抓出坐标系选错、刀补方向反了这类大问题。第二段单段加最低倍率一程序段一停重点看换刀、下刀、建立刀补这三个位置手指放在进给保持上随时能停。第三段才是正常倍率跑完整件跑完立刻量关键尺寸跟图纸对一遍再放手做第二件。有一年我在一批铝合金件上跳过了空运行直接单段起跑结果 G52 的偏移从上一把程序里带过来第一件整个偏了 20mm刀具切到夹具上崩了刃口。从那以后我每次换程序都强制走一遍空运行加单段哪怕这段程序昨天刚跑过、哪怕只改了一个孔位也不省这两分钟。希望帮到你。本文还有配套的精品资源点击获取