CNC 程序段是如何构成的
控制系统执行的每一行都是一个程序段,程序段由若干字组成。一个字是一个字母加一个数字:G01、X50.0、F250。字母是地址,数字是值,控制系统把这一对一起读取。换掉字母,同一个数字含义完全不同。X50.0 是位置,F50.0 是进给率,T50 是刀具。
程序段之间用程序段结束符分隔,通常是分号或换行。大多数控制系统按固定的内部顺序执行同一程序段内的字,而不是按书写顺序从左到右。少数老式控制系统对顺序敏感,但目前的 Fanuc、Siemens 和 Mitsubishi 控制系统都遵循内部顺序。
两条规则能覆盖大多数新手错误。同一程序段内不要重复同一地址,因为控制系统保留最后一个值,悄悄丢掉第一个。每个程序段只保留一个明确意图,不要让进给移动和快速移动出现在同一行。
模态字一直有效,直到同组的另一个字取代它。G01 对后续每个程序段都有效,直到出现 G00 或 G02。这就是程序看起来很短却能切出很长路径的原因,也是子程序末尾一个残留模态值可能毁掉下一道工序的原因。
O、N 与结构字母
O 是程序号。在 Fanuc 控制系统上,它是 O 加四位数字,机床靠它在内存中查找程序,而不是靠文件名。同一台机床上两个程序不能共用同一个 O 号。车间收到一个名为 1234.nc 的文件时,仍要有人决定它在机床上用哪个 O 号。
N 是顺序号,每个程序段一个。它不影响运动。它的价值在恢复:当刀具在 N240 处断裂,操作员可以搜索该号码,从故障点附近重新启动,而不必翻几百行。按十递增编号,给以后插入程序段留出空间。
子程序用 M98,P 地址指定程序号,L 地址指定重复次数。M98 P1000 L3 表示运行程序 O1000 三次。子程序末尾的 M99 把控制权返回调用程序。省略 L 表示执行一次。
这一层要保持简单。N 号跳来跳去、O 号与现有任务冲突、子程序缺少匹配的 M99,这些浪费的车间时间比任何切削参数都多。
G 代码:运动与模式族
G 代码设定机床的模式。它们按组划分,同组只能有一个代码生效。G00 快速移动、G01 直线进给、G02 顺时针圆弧和 G03 逆时针圆弧构成运动组。G17、G18 和 G19 选择圆弧和刀具补偿的工作平面。G20 和 G21 选择英寸或公制。
平面选择比多数人以为的更重要。在 G17 下用 X 和 Z 终点编程圆弧会报警,或者更糟,切出意外结果。G18 期望 X 和 Z,G19 期望 Y 和 Z。检查平面要先于检查圆弧半径。
补偿代码改变机床实际走的路径。G41 向编程方向左侧偏移,G42 向右侧偏移,G40 取消。偏移值存在控制系统刀具偏置表的 D 号下,不在程序里。这是有意的分工:编程员控制几何形状,操作员控制磨损。
固定循环是隐藏较长序列的 G 代码。G81 钻孔,G83 啄钻并完全退刀,G73 啄钻并部分退刀,G84 攻丝,G76 带偏移的镗孔。每个循环用自己的一组地址字母表示深度、退刀和暂停,所以要读循环定义,而不只是代码号。
M 代码:运动路径之外的机床动作
M 代码负责开关。M03 主轴顺时针启动,M04 逆时针,M05 停止。M08 开切削液,M09 关切削液,M07 雾状切削液介于两者之间。这些不是运动指令,所以不关心刀具在哪里。
程序停止代码值得单独一段。M00 停止一切并等待循环启动。M01 是可选停止,只有操作员打开可选停止开关时才生效。M30 结束程序并回到开头。M02 在许多控制系统上结束程序但不回卷,这会改变下一次循环启动时的行为。
换刀通过 M06 执行,通常与程序段中较早调用的 T 地址配对。有些控制系统接受同一行上的 T 然后 M06,另一些要求 T 放在上一行,以便刀具在刀库中预置。遵循机床制造商的顺序。
托盘和旋转功能遵循同样的模式。M84 和 M95 在卧式机床上处理托盘交换,M10 和 M11 夹紧和松开旋转轴。在不熟悉的控制系统上绝不要猜 M 代码。查制造商手册,因为 M 代码的标准化程度远低于 G 代码。
坐标与进给字母
X、Y、Z 是直线轴。A、B、C 是绕 X、Y、Z 的旋转轴。U、V、W 在车床上通常是 X、Y、Z 的增量版本,在某些系统上则是第二组平行轴。同一个字母在两台机床上可能含义不同,所以在信任一份转手程序之前,先读机床参数表。
R 和 I、J、K 定义圆弧几何。R 是半径形式,易读,但对超过 180° 的圆弧有歧义,系统无法判断你指的是圆的哪一侧。I、J、K 是圆弧起点到圆心的偏移,没有这种歧义。超过半圆的圆弧,用 I、J、K。
F 是进给率,G94 模式下为单位/分钟,G95 模式下为单位/转。车床上通常选每转进给,因为主轴转速变化时它能保持切屑负载恒定。铣床上更常用每分钟进给。在程序中途混用两种模式,是断刀的可靠原因。
S 是主轴转速,可以是直接 RPM,也可以在恒线速生效时为表面速度值。暂停用 P 还是 X 取决于系统,单位通常由参数设为毫秒或秒。在写锪平暂停之前,先确认适用哪一个。
系统在切削之前对你的代码做了什么
现代系统不会直接执行你的文件。它读取程序段,解析模态状态,应用刀具长度和直径补偿,然后才驱动伺服。这就是为什么看起来正确的程序仍可能切错尺寸:补偿是运算的一部分,而它们存在于文件之外。
前瞻会改变运动本身。系统向前扫描若干程序段并混合拐角,使机床不会在每一行停下。在公差紧的轮廓上,这种混合可能略微切掉拐角。G61 强制精确停止,G64 恢复正常混合,所以两者之间的选择是真正的精度决策,不是风格偏好。
刀具补偿又加了一层。编程路径是零件边缘,系统按 D 值偏移刀具。如果 D 值错了,即使代码正确,零件也是错的。首次切削前,务必对照刀具清单核对补偿表。
子程序和宏变量叠加在这一切之上。宏中的 WHILE 循环可以用不同值运行同一程序段数千次,所以可见文件很短,实际执行的路径很长。调试时,数执行次数,而不是数行数。
字母组及其出错之处
每一行是一个地址族。故障列是我们在来料程序中最常看到的错误。
| 字母 | 它们控制什么 | 典型失效 |
|---|---|---|
| O、N | 程序和顺序号 | O 号重复;重启点断裂 |
| G | 运动模式、平面、补偿 | 圆弧平面错误;补偿未取消 |
| M | 主轴、切削液、停止、托盘 | 本应使用 M30 的地方用了 M02 |
| X Y Z A B C U V W | 轴位置和方向 | 同一程序段混用绝对和增量 |
| R I J K | 圆弧半径或圆弧圆心 | 在超过 180 度的圆弧上使用 R |
| F S T D H | 进给、转速、刀具、补偿、长度 | 在 G95 模式下写了每分钟进给 |
| P Q L | 暂停、循环深度、重复次数 | 省略重复次数,子程序只运行一次 |
关于 CNC 程序代码的常见问题
所有 CNC 系统都使用相同的字母地址吗?
不是。X、Y、Z、F 和 S 接近通用,但 M 代码和固定循环参数因制造商而异。Fanuc、Siemens、Heidenhain 和 Mitsubishi 在托盘交换、测头和高速度模式等方面各有自己的代码集。
把 G 和 M 代码表当作机床专用文档,而不是通用知识。当程序在同一车间的两台机床之间转移时,首次运行前重新核对每一个 M 代码。
为什么我的程序在看起来正确的圆弧上报警?
先检查当前平面。G17 期望 X 和 Y,G18 期望 X 和 Z,G19 期望 Y 和 Z。在错误平面上写的圆弧会在半径或终点上报警。
如果平面正确,看圆弧跨度。超过 180° 的圆弧应使用 I、J、K 圆心偏移而不是 R,因为 R 给系统两个可能的圆心,它可能选错。
M00、M01 和 M30 有什么区别?
M00 停止程序并等待操作员按循环启动。M01 作用相同,但仅在可选停止开关生效时执行,这使它适合用于你并不总是需要的检查暂停。
M30 结束程序并返回文件顶部。M02 在许多系统上结束程序但不返回。如果下一次循环启动行为异常,缺少 M30 是常见原因。
我能只用 G01 而不用固定循环写整个程序吗?
可以,对于单件零件,这通常比查循环参数更快。代价是程序长度和可读性。一个啄钻循环用一行替代几十行。
在生产运行中,固定循环还减少了重复程序段中打错字的机会。一旦你确信每个循环期望的地址字母,就使用它们。
如何判断问题是代码还是刀具补偿?
在刀具远离零件的情况下空运行同一程序段,观察位置显示。如果指令位置与图纸一致,代码正确,补偿表是嫌疑对象。
对照该装夹的刀具清单比较 D 和 H 值。长度补偿中一个数字颠倒,就会移动程序中的每一次 Z 移动。
每个程序段都应出现顺序号吗?
不是每个程序段,但每个重要的程序段都要。重启点、换刀和循环启动是操作员在中断后要查找的地方。
以十为步长编号,这样以后插入程序段时无需重新编号整个文件。跳号在系统上没有任何代价。
