Technical Article
Fagor 8055算10*3 MOD 4,为什么结果是30?
按Fagor 8055 M/EN V02.2x手册拆解MOD高于乘除的优先级,比较10*3 MOD 4与(10*3) MOD 4的结果,给出纯参数对照和五组边界值,避免循环分组算式括号丢失。
想先算10×3,再把结果除以4取余,写成10*3 MOD 4,在Fagor 8055的这套规则下得到的却是30,不是2。这里不是取余失效,而是MOD比乘法先算。要表达“先乘后取余”,应把乘法写进括号:(10*3) MOD 4。
本文限定Fagor CNC 8055 / 8055i、M与EN型号、软件V02.2x的高层语言,依据Ref.1711编程手册。下列片段使用程序或子程序当前局部参数组的P0、P1,不用于手册所称的user channel(该通道不允许局部参数),也不带轴运动、刀补或PLC写入;加入现有程序前,必须确认这两个局部参数不是当前宏的输入或工作变量。
同一条算式,先后顺序在哪里变了?
手册第390页将MOD定义为除法余数,第392页把EXP、MOD列在乘法和除法之前。因此10*3 MOD 4的实际分组是10*(3 MOD 4):先得到3,再乘10,结果为30。若先把10×3算成30,再取除以4的余数,才得到2。

不要把这里的MOD写法直接复制到其他品牌宏语言里。本文要解决的是这版8055的表达式优先级;它既不是普通计算器默认的按键顺序,也不是由书写位置决定“从左到右全部算完”。只有处在同一优先级的相关运算,才按手册指定的结合顺序处理。
改动应落在乘法两侧,不是再加一层整行括号
8055高层赋值使用(目标=表达式)形式。下面第一行是对照,第二行才表达先乘后取余。最外层圆括号属于赋值指令,不能代替右侧乘法子表达式的分组。
(P0=10*3 MOD 4)
(P1=(10*3) MOD 4)
按手册规则推导,P0为30,P1为2。若程序本来就有(P0=...),不要因为看见整行已经被括起来就判断“括号够了”。应从等号右侧逐层看:先生成累积量的乘法是否有独立括号,再看MOD作用于哪个结果。
只代入4,反而发现不了问题
假定要把非负整数累积量10×n按4分组取余,n取1到5。错误分组得到10、20、30、0、10;先乘后取余得到2、0、2、0、2。第四组两边都为0,若调试时恰好只看这一组,程序看起来会“算对”。

本例目标是非负整数除以正整数4后的余数,因此结果必须落在0、1、2、3中。出现30,可以先沿算式的分组查找原因。但这个范围检查只适用于本文的输入条件,不能扩大为带负数、小数或除数为0时的统一判据。
后处理输出也要保留运算结构
若公式由后处理拼成字符串,审核修改前后的NC时,要比对内层括号,不只比对P编号和常数。把(10*n) MOD 4“简化”为10*n MOD 4,字符更少,含义却已改变。也不要把最终结果硬改成2:那只遮住n=3这一组,下一组输入仍会暴露问题。
可以先把公式意图写成两步:“求累积量”与“对累积量取余”,再决定是一条嵌套表达式,还是用已确认空闲的临时参数分两段赋值。涉及循环号、刀位号或工件组号时,先检查数值落入接口允许范围,再把它接到后续选择逻辑;MOD本身不会检查目标编号是否存在。
需要调整这类输出时,可按后处理最小修改与回归比对的方法保留前后NC。咨询时提供系统软件版本、原始赋值行、输入值与预期运算顺序,比只截取最终参数值更容易定位。完整机床与后处理接口资料可参考后处理与机床匹配资料。
核对依据
Fagor《CNC 8055 M/EN Programming Manual》,Ref.1711,Soft V02.2x:第340页局部参数与通道范围,第390页MOD定义,第392页运算优先级与括号,第396页赋值形式。两张技术示意图按本文整数算例原创绘制。