搜索文章与案例

Technical Article

三菱M80嵌套IF的ELSE走错分支:先看内层ENDIF

依据三菱M80加工中心手册,用四组整数输入拆解内层ENDIF与ELSE归属,解释紧凑IF嵌套和P289排查,避免只靠缩进判断分支。

缩进没变,ELSE却接到了另一层

三菱M80宏中,外层条件为真、内层条件为假时,本来希望保留原值,结果却执行了原本给外层准备的ELSE。先检查内层IF后面有没有明确的ENDIF。把代码排成两格或四格缩进,并不能让控制器按视觉层级配对。

本文限定于三菱M80加工中心系统,依据M800/M80/E80/C80系列编程手册IB-1501277-U第14.6.2节、印刷515页的IF-THEN-ELSE-ENDIF规则。这里分析用户宏分支,不涉及PLC语言;该手册版本不是机床软件小版本,应用前应确认机床提供相应用户宏功能。

内层写在一行,也不能忽略它的边界

手册允许运算指令写在THEN后面,形成紧凑形式。但紧凑形式放进另一个IF时,仍要求指定ENDIF。手册特别比较了内层ENDIF存在和省略时的差异:紧接其后的ELSE会分别对应外层条件或内层条件。因此,“这一行已经赋值结束”不等于“这一层条件已经结束”。

三菱M80内层ENDIF存在或遗漏时ELSE归属的结构示意
图1:把配对关系画出来,比单看缩进更容易找到漏掉的结束标记。

先用不含运动的变量片段明确预期

下例约定#1、#2是整数输入,#3是观察结果。变量号仅用于解释;它们是局部变量,若已有宏把它们用作调用参数,就不能直接粘贴覆盖。片段不含坐标移动、主轴或I/O输出,也不构成完整加工程序。

#3 = 99
IF [#1 EQ 0] THEN
  IF [#2 EQ 1] THEN #3 = 10
  ENDIF
ELSE
  #3 = 20
ENDIF

第一行把结果设为99,便于看出“没有执行赋值”的路径。内层条件满足时改成10;外层条件不满足时改成20。位于ELSE前的第一个ENDIF明确结束内层,最后一个ENDIF结束外层。

这里的整数比较与浮点公差判断不同;若输入来自坐标计算,不要把本例EQ直接套用,可参阅三菱宏显示值相同与公差窗口判断。

四组输入把归属问题暴露出来

当#1=0、#2=1时,两层都真,#3由99变成10。当#1=0、#2=0时,外层为真但内层为假,内层没有ELSE,因此#3保持99。当#1=1时,不论#2是0还是1,外层都为假,#3得到20。以上是根据结构做的逻辑推演,不是机床实测记录。

完整嵌套IF的四组整数输入与结果99、10、20对照
图2:用99作为初值,能区分未赋值与执行外层ELSE。

若怀疑遗漏内层ENDIF,不要只测两层条件都真的一组。真正有区分度的是外层真、内层假的组合:原本不该执行的ELSE是否进入了?修改前后保留同一组输入和初值,才有可比性。

不要把所有P289都当作少写一个ENDIF

手册说明,块式IF漏掉ENDIF可产生P289;没有对应IF却出现THEN、ELSE或ENDIF,也可产生P289。所以排查顺序应是逐层确认开始、分支与结束,而不是在文件末尾不断补ENDIF。已有完整配对时,再检查是否将执行语句或多条命令塞进不合适的紧凑形式。

修改范围只限分支边界。不要同时改坐标、进给或刀补,也不要用两个原始非零数的AND替代条件结构;三菱AND逐位运算与布尔判断的区别解释了另一种容易混入此类修复的错误。

官方依据:IB-1501277-U第14.6.2节,印刷515页。本文的变量编号、初值、四组输入和两幅图为独立编排,不声称验证了任何具体机床的运行结果。