上个星期车间来了批新活,一块 800×600 的板子上要打 200 多个孔,间距 50mm。CAM 生成程序跑了半小时,代码两千多行。我用宏程序重写,三十行搞定。
WHILE 循环基本语法
FANUC 宏程序的 WHILE 循环格式:
WHILE [条件] DO m
(循环体)
END mm 是循环标号 1-3,同一个标号嵌套不超过三层。条件用 EQ/NE/GT/GE/LT/LE 表示等于/不等于/大于/大于等于/小于/小于等于。
直线阵列孔加工
最实用的场景——等间距孔阵列:
#100 = 5 (行数)
#101 = 8 (列数)
#102 = 50.0 (X间距)
#103 = 40.0 (Y间距)
#104 = 1 (行计数)
WHILE [#104 LE #100] DO 1
#105 = 1 (列计数)
WHILE [#105 LE #101] DO 2
#106 = [#105 - 1] * #102
#107 = [#104 - 1] * #103
G90 G81 X#106 Y#107 Z-20. R3. F100
#105 = #105 + 1
END 2
#104 = #104 + 1
END 1
G80两层循环,外层管行,内层管列。变量 #106 和 #107 就是当前孔的 XY 坐标。行列数、间距全部参数化,换活只改开头四个变量。
圆周均布孔
比直线阵列多一步三角函数:
#100 = 6 (孔数)
#101 = 35.0 (分布圆半径)
#102 = 0 (当前角度)
#103 = 360. / #100 (角度增量)
WHILE [#102 LT 360.] DO 1
#104 = #101 * COS[#102]
#105 = #101 * SIN[#102]
G90 G81 X#104 Y#105 Z-15. R3. F120
#102 = #102 + #103
END 1边界处理的坑
循环次数算错是常见 bug。比如 WHILE [#104 LE #100],#100=5 时循环 5 次(1,2,3,4,5)。但如果写成 LT 就只循环 4 次。我一般用 LE 并把计数器从 1 开始,逻辑最清晰。
还有浮点数累加的精度问题。角度增量 360./6 = 60. 是整数还好,但如果是 360./7 = 51.42857...,累加七次后可能得到 359.99999 而不是 360,最后一个孔位置偏差。解决办法:不用累加,用乘法 #102 = (循环次数-1) * 增量。