GreatLight CNC 加工工厂 logo
CNC 加工
快速原型打样
材料
行业
新闻
关于 GL

获取即时报价

CNC 编程指南

如何编写 CNC M99 循环程序

M99 结束子程序并把控制权交回父程序。调用、重复次数和返回位置写错,就会报废零件或撞断刀具。本指南面向自行编写或调试代码的加工人员和工艺工程师。读完后你能判断循环该写在程序里还是交给 CAM 输出。

M98 P….L…M99 返回4 级嵌套Fanuc 风格控制系统
在加工中心控制系统上编写 CNC M99 循环
快速回答

要点速览

M99 是返回,不是停止它结束子程序,把控制权跳回父程序中 M98 调用之后的程序段。
M98 负责调用M98 P3001 L4 执行子程序 O3001 四次;不带 L 时该程序段只执行一次。
嵌套保持浅层多数系统允许四级子程序。两级足以覆盖几乎所有实际加工。
刀具远离工件试运行切削前先以快速倍率空运行,并设置 50 mm 的 Z 向偏置。
主程序末尾的 M99它会回到程序开头并重复整个程序。适合棒料送料机,忘了就会出事。
加工原理

编写 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 循环

按顺序逐项完成。不要跳过空运行。

  • 1
    1. 编写子程序并以 M99 结尾给它独立的 O 号,例如 O3001。把重复的几何形状放进去。以单独程序段的 M99 结尾。除非在返回前恢复,否则不要在子程序内修改工件偏置。
  • 2
    2. 在主程序中用 M98 调用用 M98 P3001 L4 运行四次。如果你的系统要求 L 字在前,写成 L4 P3001。先用 L1 观察一遍,再执行完整次数。
  • 3
    3. 在每次循环之间设置偏置或偏移在主程序中使用 G52 局部偏移或修改工件坐标系。步距值要等于阵列节距。50 mm 节距配 50.1 mm 偏移,到最后一个孔时会表现为累积误差。
  • 4
    4. 刀具抬高空运行Z 轴抬高 50 mm,快速倍率调低,运行完整循环次数。观察每次返回时的剩余距离显示。刀具应每轮回到同一点。
  • 5
    5. 增加层级前检查嵌套深度数一数互相调用的子程序。生产加工保持两级。如果需要三级,先确认系统限制。超过限制会在调用程序段报警。
  • 6
    6. 降低进给切削首件第一轮用 50% 进给倍率运行。测量第一个和最后一个特征。如果一致,循环逻辑正确。如果漂移,偏移值有误。
  • 7
    7. 为无人值守运行加零件计数器如果系统支持,使用宏计数器或条件跳过。没有计数器的循环程序会在最后一个零件后继续切削。没有计数器不要离开。
参考

M99 循环模式及适用场景

选择与任务匹配的模式。不要堆叠不需要的模式。

图案代码形式适用场合注意事项
简单重复M98 P3001 L4相同几何形状、相同位置,四次循环之间无偏移。刀具重复切削同一位置。
偏置重复G52 偏移,然后 M98圆周孔或一排孔偏移必须精确等于阵列节距。误差会累积。
转台分度子程序分度转台,以 M99 结尾圆柱零件周围的特征下一次调用从新角度开始。确认这是预期行为。
棒料送料循环主程序末尾 M99运行到棒料用完没有计数器就会永远运行。加一个。
零件族用不同工件偏置的 M98相同形状,多个工装夹具返回程序段前必须恢复工件偏置。

保持循环简单并空运行验证

两级嵌套、一个编辑点,加上刀具抬高的空运行,几乎能在问题到达主轴前发现所有 M99 问题。如果几何形状并非真正重复,就展开写出来。

常见问题

常见问题

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 前把它们回到已知方位。

在车铣复合加工中心上,要确认子程序运行在车削模式还是铣削模式,并确保控制返回主程序时模式正确。

把图纸发给我们,我们来报价

我们承接原型和批量加工,从 1 件到 10,000 件以上,具备五轴、四轴和车铣复合能力,发货前 100% 检验。

12 小时报价100% 全检无最小起订量

关注 GreatLight

更多 CNC 编程笔记

我们发布来自工厂车间的装夹记录、刀具试验和检测数据。

FacebookTikTokYouTubeLinkedInInstagramThreadsPinterest

深受全球工程师和制造商信赖

Tesla Ford Motor Company 比亚迪汽车 电装 麦格纳国际 波音 空客 美敦力 库卡 发那科