周三夜班,一台立加的程序死循环了,主轴转了一夜,第二天早上发现工件废了、刀断了、电还费了不少。查了半天,问题出在宏程序的 IF 判断上——变量更新语句漏了。
IF 的三种格式
FANUC 宏程序的 IF 有三种用法:
IF [条件] GOTO n (条件成立跳到 n 行)
IF [条件] THEN 语句 (条件成立执行 then 后面)
IF [条件] GOTO n
...
IF [条件] GOTO m (配合 GOTO 做循环)最常用的是第一种,配合 GOTO 实现条件跳转。
死循环的根源
那天夜班的程序是这样的:
N100 #100 = 1
N110 #101 = #100 * 2.
N120 G01 X#101 F500
N130 IF [#100 LT 10] GOTO 110
N140 ...看着像循环 10 次对吧?问题在 N110——#100 赋值后永远是 1,因为循环体里没人改 #100。N130 的条件永远成立,就无限跳到 N110。
正确写法:
N100 #100 = 1
N110 #101 = #100 * 2.
N120 G01 X#101 F500
N130 #100 = #100 + 1
N140 IF [#100 LE 10] GOTO 110把 #100 的更新写在跳转判断之前,循环就能正确退出。
条件表达式的陷阱
比较运算符必须是两个字母:EQ、NE、GT、GE、LT、LE。新手有时写成单个字母或者用符号 < >,系统直接报警。
还有空格问题。IF [#100 EQ 5] GOTO 200 里的空格最好别省,有些系统解析器对空格敏感。
GOTO 的行号管理
行号 N 是跳转目标。我一般把行号当标签用,不连续编号:
N10 (循环开始)
N20 ...
N30 IF [#100 GT 20] GOTO 90
N40 ...
N50 GOTO 10
N90 (循环结束)N10 到 N90 之间留足空间,方便以后插代码。跳转目标用整十数,一眼看出逻辑分段。
安全保护:跳出死循环
现在我写宏程序都会加一个保护变量:
#199 = 0 (循环计数保护)
N10 #199 = #199 + 1
IF [#199 GT 500] GOTO 999 (超限强制退出)
...
GOTO 10
N999 #3000 = 1 (TOOL LOOP LIMIT)#3000 是系统报警变量,触发后程序停机并显示报警信息。这一招救过我好几次,调试阶段特别有用。
宏程序的逻辑错误比坐标错误更隐蔽——坐标错了看尺寸,逻辑错了直接撞机。写完之后自己模拟跑一遍,确认循环次数对得上。