M98/M99 子程序:重复形状只写一次、多次调用
通过示例说明用 M98 调用子程序、用 M99 返回的结构,P 号与重复次数 L,用增量子程序在多个位置加工同样的槽的方法,以及调用错误的类型。
为什么要用子程序
在五个地方铣同样的槽,或者只改变深度多次加工同一轮廓,这种情况很常见。每次都复制粘贴同样的程序段,程序会变长,改一个尺寸就要改五个地方。只要漏掉一处,五件中就会有一件尺寸不同而成为废品。
子程序是把重复的部分单独做成一个程序,由主程序在需要时调用的结构。形状只在一个地方维护,主程序只需说明“在哪里、做几次”。
调用与返回
| 指令 | 含义 | 示例 |
|---|---|---|
M98 P_ | 调用 P 号(O 号)的程序 | M98 P3100 |
L_ 或 P 的高位 | 重复次数 | L3 → 3 次 |
M99 | 返回调用程序段的下一行 | O3100 的最后一行 |
M99 P_ | 返回,但转到指定的程序段号 | 用于分支和循环结构 |
示例:用增量子程序加工三条槽
子程序 O3100 以 G91 增量方式编写。从当前位置下降 6 mm,沿 X 铣 30 mm 的槽,上升 6 mm 后一边回到起始 X 一边沿 Y 移动 10 mm。结束位置就是下一次重复的起始位置,所以只要把同一调用重复三次,就能得到三条间距 10 mm 的槽。
用 L3 调用子程序 O3100 三次,加工三条间距 10 mm 的槽
O3007
T1 M6
G21 G90 G17 G94
G54
S3000 M03
G00 X0. Y0. Z5.
M98 P3100 L3
G90 G00 Z50.
M30
O3100
G91 G01 Z-6. F100
X30. F300
G00 Z6.
X-30. Y10.
M99上图是CNC Path Analyzer对该程序的解析结果 (快速移动 8 段, 直线切削 6 段).
主程序应遵守的规则
- 恢复模式:子程序以 G91 状态结束,因此返回后要立即在主程序中重新指令
G90。示例中的G90 G00 Z50.就起这个作用。不写 G90 只写Z50.,会被解释为“比当前高 50 mm”而不是“高度 50”。这次是向上的移动,问题不大;但如果是下一把刀的接近程序段,就可能导致碰撞。 - 起始位置:增量子程序的结果取决于调用时的位置。在调用之前,用绝对坐标明确指令起始位置。
- 补偿与循环状态:在刀具半径补偿或固定循环有效时调用,子程序中的移动可能会被意外地解释。调用前后要有意识地整理模态状态。
- M30 的位置:把子程序放在同一文件中时,要放在主程序的
M30之后。主程序在 M30 处结束,子程序就不会被误执行。
重复次数与循环时间计算
子程序执行一次的切削移动是 Z 6 mm(F100)和 X 30 mm(F300),分别为 3.6 秒和 6 秒,一次 9.6 秒,三次约 29 秒为纯切削时间。把重复次数改为 L5,只改主程序中的一个字符,就是五条槽、切削约 48 秒。这说明重复结构让程序修改和时间估算都变得简单。计算方法在加工时间计算中有更详细的介绍。
调用错误的类型
在工具中,可以把主程序和单独文件中的被调用程序一起载入,P 号对应的是文件中的 O 号,而不是文件名。
| 错误 | 原因 | CNC Path Analyzer 的显示 |
|---|---|---|
| 找不到被调用程序 | 没有与 P 号相同 O 号的程序 | 调用行和找不到的编号 |
| O 号重复 | 同一编号的程序有两个以上 | 无法确定使用哪一个的警告 |
| 缺少 M99 | 子程序没有结束而延续到下一个程序 | 缺少返回的警告 |
| 无限调用 | 互相不断调用,或调用自身 | 因递归或超出执行上限而中止计算 |
常见问题
子程序中还能再调用子程序吗?
可以。这称为嵌套调用,允许的层数(通常 4 层以上)因控制器而异。层数越深,越难跟踪模态状态,建议控制在 2 层以内。
M98 与 G65 宏调用有什么不同?
G65 是把自变量(A、B、C……)作为变量传递的宏调用。用于以不同尺寸调用同一形状,而 M98 是不带自变量地重复同样的动作。