要点速览
编写 CNC M99 循环时 M99 的实际作用
M99 是控制指令,不是运动指令。系统读到它时,当前子程序结束,执行返回到启动该子程序的 M98 调用之后的程序段。作用就这些:一次返回,不等待,不换主轴。如果循环运行在主程序而非子程序中,M99 会回到第一个程序段,循环从头开始。
这一点很关键,因为同一个指令放在不同位置作用完全不同。在由 M98 调用的 O3001 末尾,M99 把控制权交回父程序。在主程序 O0001 末尾,M99 让机床反复加工该零件,直到有人按下复位。两者都合法,但通常只想要其中一种。
最常写的一对是 M98 调用、M99 返回。子程序用自己的 O 号存储,和主程序完全一样。调用程序段写明子程序号,并可选写重复次数。系统内部管理返回地址栈,你无需跟踪从哪来。
一个实用提醒:M99 本身不会复位模态状态。进给率、主轴转速、刀具偏置和工件坐标都会带回父程序。如果子程序把 G54 改成 G55 却没切回就返回,下一道工序会切错位置。返回程序段前,把你改过的模态值恢复。
- 1父程序用 M98 P….L… 调用子程序,调用返回后继续执行。
- 2子程序存放重复的几何形状,以 M99 结束。自己的 O 号写在第一行。
- 3返回地址由系统管理。你不用写,也无法跳过。
- 4模态状态不会自动恢复。进给、转速和偏置需自行复位。
子程序循环何时适用、何时应交给 CAM
当相同几何形状在已知偏置处重复时,用 M98 和 M99:一排孔、圆周分布的一组型腔,或仅工件偏置不同的同族零件。子程序存放一个图案。主程序移动工件坐标或加 G52 局部偏移,调用该图案,然后继续。控制器做算术,你的文件短到能在机床上直接读。
300 mm 圆周上的孔图案是典型例子。一个子程序在已知位置钻一个孔。主程序用 G52 偏移循环 12 次,或子程序自身分度转台。改一次孔深,所有孔跟着变。真正的好处是:一个修改点而不是十二个。
当每个特征的几何形状都不同时,不要用循环。如果每个型腔形状或深度都不同,子程序只会增加间接层。直接写出来或让 CAM 后处理。调试偏置花的时间会比短文件省下的更多。
循环也让棒料送料和托盘加工更简单。主程序末尾的 M99 回到开头,机床反复加工同一零件直到棒料用完。如果系统支持相应 M 代码,可配合零件计数器和条件跳过。不支持就别加。无人值守循环没有计数器,就是凌晨三点把刀具扎进成品零件的方式。
- 1适用重复图案、圆周孔、用偏置偏移的同族零件。
- 2不适用每个特征几何形状都不同。循环开销超过节省。
- 3棒料送料主程序末尾的 M99 重复执行直到棒料用完。
- 4安全离开循环程序前,加零件计数器或跳过条件。
编写 CNC M99 循环前需核对的系统差异
Fanuc 的写法是参照:M98 P3001 L4 调用 O3001 四次,M99 返回。多数系统基本遵循,但细节有出入。有些系统 L 字必须写在 P 字之前。另一些系统调用用完整文件名而不是四位 O 号。要读车间里那台具体系统的说明书,不要看论坛帖子。
先确认嵌套层数。Fanuc 类系统通常允许四级子程序嵌套,即四个子程序互相调用,而不是同一个子程序重复四次。有的系统允许八级,有的只允许两级。超过限制时,系统会在调用程序段报警并停止。实际程序保持两级嵌套,就不会触发限制。
重复次数限制也各不相同。L 计数通常是两到三位数。超过系统限制的值会触发报警,而不是静默截断。对于 10,000 件以上的批量,我们把循环次数设得保守一些,由棒料送料机或宏程序处理长计数。
注意有些系统对主程序末尾的 M99 处理方式不同。多数系统会回卷并重复执行,少数系统则像 M30 一样结束。如果你依赖回卷行为,先在主轴停止的状态下在机床上验证,再用于生产。
- 1字顺序P 和 L 的顺序因系统而异。查手册确认确切的程序段格式。
- 2嵌套通常四级。生产加工保持两级。
- 3重复次数L 受系统限制。次数过高可能报警,而不是截断。
- 4主程序末尾 M99多数系统会回卷。依赖前先在你的系统上确认。
M99 常见错误及在机床上的表现
最常见的故障是缺少 M99。系统执行到子程序末尾,找不到返回指令,就报警。修复只需一行,但在层层嵌套调用中找到它比写它更费时。把 M99 单独放在每个子程序末尾的程序段,不要藏在条件语句里。
第二个是死循环。主程序末尾的 M99 没有计数器就会无限运行。表现是零件加工完后机床还在继续切削。按进给保持和复位,然后加零件计数器或条件跳过。无人值守时绝不要留下没有计数器的循环程序。
返回地址错误表现为第一轮循环后刀具切在错误位置。这几乎总是子程序带回的模态状态:改了工件偏置、改了平面,或进给率留在了每分钟英寸而父程序期望每转进给。在返回程序段前恢复所有改动过的模态值。
最后,注意带转台分度的子程序的 L 计数。如果子程序旋转了转台并 M99 返回,下一次调用会从新位置开始。这通常是你想要的,但忘了分度的编程员不会这么预期。把分度、切削和返回写成三个独立的部分,方便下一个人阅读。
- 1缺少 M99系统在子程序末尾报警。补上返回程序段。
- 2死循环主程序回卷但没有计数器。加零件计数器或跳过。
- 3循环后位置错误模态状态被带回。恢复偏置、平面和进给模式。
- 4转台分度意外子程序旋转了转台;下一次调用从新角度开始。
如何编写并验证 M99 循环
按顺序逐项完成。不要跳过空运行。
- 11. 编写子程序并以 M99 结尾给它独立的 O 号,例如 O3001。把重复的几何形状放进去。以单独程序段的 M99 结尾。除非在返回前恢复,否则不要在子程序内修改工件偏置。
- 22. 在主程序中用 M98 调用用 M98 P3001 L4 运行四次。如果你的系统要求 L 字在前,写成 L4 P3001。先用 L1 观察一遍,再执行完整次数。
- 33. 在每次循环之间设置偏置或偏移在主程序中使用 G52 局部偏移或修改工件坐标系。步距值要等于阵列节距。50 mm 节距配 50.1 mm 偏移,到最后一个孔时会表现为累积误差。
- 44. 刀具抬高空运行Z 轴抬高 50 mm,快速倍率调低,运行完整循环次数。观察每次返回时的剩余距离显示。刀具应每轮回到同一点。
- 55. 增加层级前检查嵌套深度数一数互相调用的子程序。生产加工保持两级。如果需要三级,先确认系统限制。超过限制会在调用程序段报警。
- 66. 降低进给切削首件第一轮用 50% 进给倍率运行。测量第一个和最后一个特征。如果一致,循环逻辑正确。如果漂移,偏移值有误。
- 77. 为无人值守运行加零件计数器如果系统支持,使用宏计数器或条件跳过。没有计数器的循环程序会在最后一个零件后继续切削。没有计数器不要离开。
M99 循环模式及适用场景
选择与任务匹配的模式。不要堆叠不需要的模式。
| 图案 | 代码形式 | 适用场合 | 注意事项 |
|---|---|---|---|
| 简单重复 | M98 P3001 L4 | 相同几何形状、相同位置,四次 | 循环之间无偏移。刀具重复切削同一位置。 |
| 偏置重复 | G52 偏移,然后 M98 | 圆周孔或一排孔 | 偏移必须精确等于阵列节距。误差会累积。 |
| 转台分度 | 子程序分度转台,以 M99 结尾 | 圆柱零件周围的特征 | 下一次调用从新角度开始。确认这是预期行为。 |
| 棒料送料循环 | 主程序末尾 M99 | 运行到棒料用完 | 没有计数器就会永远运行。加一个。 |
| 零件族 | 用不同工件偏置的 M98 | 相同形状,多个工装夹具 | 返回程序段前必须恢复工件偏置。 |
常见问题
M98 和 M99 有什么区别?
M98 调用子程序。它用 P 字指定子程序,并可选地用 L 字设置重复次数。执行在该点跳入子程序。
M99 结束子程序并将控制返回到 M98 调用后的程序段。在主程序末尾,M99 则回卷到开头。同一个字,两种行为,取决于所在位置。
子程序最多可以重复调用多少次?
取决于控制系统。L 计数通常是两到三位数,因此多数系统在字溢出前最多接受 99 或 999 次重复。
大批量生产时,循环次数不要设得太大,其余交给棒料送料机或宏程序处理。把 L 上限推到最大值,很容易在加工中途触发报警。
子程序里可以再嵌套子程序吗?
可以,受系统限制。Fanuc 类系统通常允许 4 层嵌套,有的允许 8 层,有的只允许 2 层。
生产加工建议控制在 2 层。每多一层,返回栈更难调试,对多数工件也没有好处。嵌套更深之前先查手册。
为什么第一次循环后刀具切在了错误位置?
子程序的模态状态带回了主程序。常见原因是工件坐标系被改、加工平面被改,或进给模式留在了错误的单位。
在 M99 返回程序段之前,把改动过的模态值全部恢复。如果子程序把 G54 改成了 G55,就改回来;如果选了 G91 增量,就回到 G90 绝对。
M99 和 M30 一样吗?
不一样。M30 结束程序、把程序复位到开头,多数系统还会清除模态状态。主程序末尾的 M99 则回卷并重复,不清除模态。
在子程序末尾,M99 只是返回。子程序里的 M30 会结束整个加工任务,这几乎从来不是想要的结果。
车铣复合或五轴机床可以用 M99 循环吗?
可以,循环逻辑相同。区别在于返回前需要恢复的轴数。五轴机床上,如果子程序摆动了旋转轴,必须在 M99 前把它们回到已知方位。
在车铣复合加工中心上,要确认子程序运行在车削模式还是铣削模式,并确保控制返回主程序时模式正确。
