Technical Article
FANUC 宏循环报 P/S 124:DO、END 都有,为什么还不配对?
FANUC 21i-MB宏循环DO、END都有却报P/S124?按原厂手册区分交叉范围与正确嵌套,用无运动2×3计数说明END顺序和内层计数器重置位置。
FANUC宏程序里,DO1、DO2各写了一次,END1、END2也都在,却出现P/S 124。问题可能不是少了结束语句,而是内层还没结束,就先关掉了外层:DO1→DO2→END1→END2形成交叉范围。排查时先把这四个位置连起来,比继续补一个END更直接。
本文按FANUC 21i-MB/210i-MB加工中心、具备Custom Macro功能的条件说明,依据B-63614EN/01第15.5.3节。报警编号与编号范围限定在这版手册,不把它们直接套到其他代际或其他控制系统。
先关内层,不是“编号小的先结束”
DO后面的数字是范围识别编号,不是优先级,也不是重复次数。进入DO1后再进入DO2,就应先经过END2结束内层范围,再到END1结束外层。把END1提前放到END2前面,即使数量一一对应,两条范围线仍会交叉。

图1为原创示意,窄屏可左右滑动查看。
对应的修改不是给外层换一个更大的号码,而是让循环范围正确包含:DO1→DO2→END2→END1。移动END语句时,还要同时确认哪些计算或运动段属于内层、哪些只应由外层执行;不能机械地交换两行,顺带改变加工次数。
用无运动的2×3计数,把执行顺序走一遍
下面片段只做变量赋值和计数,没有轴运动、主轴或夹紧指令。#1是外层计数,#2是内层计数,#3累计循环体执行次数;它们是本例占用的局部变量,不能不核对现有用途就粘进生产宏。片段用于阅读推演,不是包含调用、退出和机床状态的完整主程序。
#1=1;
#3=0;
WHILE[#1 LE 2]DO1;
#2=1;
WHILE[#2 LE 3]DO2;
#3=#3+1;
#2=#2+1;
END2;
#1=#1+1;
END1;
第一次进入外层时#1=1,把#2置为1;内层分别在#2=1、2、3时把#3加1。随后#2变成4,条件4 LE 3不成立,退出内层,才执行#1=#1+1。
第二轮外层#1=2,必须再次执行#2=1,于是内层再计三次。最后#1变成3,3 LE 2为假,退出外层。结果是#3=6,同时#1=3、#2=4。这里的6是代码逻辑推演结果,不是加工件数或实机测试成绩。

图2为原创示意,窄屏可左右滑动查看。
若把#2=1移到外层之前,第一轮结束后#2仍为4。第二轮虽然进入了外层,内层条件一开始就是假,循环体不会再执行三次。这是计数器初始化位置的问题,即使DO、END范围正确,也可能让实际执行次数少一半。
DO1可以重复使用,但要先结束上一段范围
该版手册允许识别编号1、2、3重复使用,并给出两个先后执行的DO1—END1范围;这不等于允许两条循环范围交叉。它还规定DO循环最多嵌套三层。若改写成DO4,不是在请求第四层,而是用了范围以外的编号,对应P/S 126。
因此,P/S 124优先检查范围交叉;看到DO4则核对编号范围,不要把两种问题都归成“少一个END”。外部跳转也不能直接跳进某个循环内部;如果改动过GOTO目标,要把目标行与DO、END位置一起审查。
检查后处理输出时,留下能解释差异的对照
把修改前后的循环段并排,先标出DO/END顺序,再标出计数器初始化、递增以及判断位置。若循环体含加工动作,逐段确认动作归属;本例只有#3加1,所以能先隔离结构问题,不需要靠猜测机床移动来解释报警。
宏调用方式还应与循环结构分开检查,可继续阅读G65与M98调用区别;涉及后处理修改时,用修改前后NC对照保留范围和执行次数的证据。
依据:FANUC原厂《Series 21i/210i-MB Operator’s Manual》GFZ-63614EN/01,2001年7月,第15.5.3节、印刷页306—307。公开手册副本由Warp9托管,不是FANUC官网页面。两张图为按规则重新绘制的原创说明图。