搜索文章与案例

Technical Article

三菱 M80 宏里2 AND 1,两个都非零为什么结果是0?

三菱M80加工中心用户宏的AND是32位逐位运算。用2 AND 1及6 AND 2解释非零条件、单比特掩码与结果判定,避免把取位结果固定与1比较。

宏里两个数分别是2和1,都不是零;写下2 AND 1,结果却是0。若本意是判断“两个条件都成立”,这不是数值丢了,也不应该先改成另一个比较符号。三菱M80用户宏算式里的AND按二进制位逐位运算,并不先把每个非零数统一变成“真”。

本文限定三菱M80加工中心系统的用户宏,依据《M800/M80/E80/C80 Series Programming Manual (Machining Center System)》IB-1501277-U,第14.6.1、14.6.2节。算例只使用已赋值的非负小整数,不涉及空变量、小数、负数、超出32位的数,也不读取或改写机床I/O信号。

先把2和1写成二进制,再看AND保留哪一位

手册把AND定义为32位中的逐位逻辑积。对同一位,只有两边都是1,结果才是1。2的低三位是010,1是001:一个在数值权重2的位置有1,另一个在权重1的位置有1,两边没有任何同一位同时为1,所以结果为000,也就是0。

2的二进制低三位010与1的001逐位AND,没有共同为1的位,结果000即0;其余29个高位均为0

图1只展开低三位,是因为本例其余29个高位全为0,不是说M80只计算三位。不能把“两个操作数都非零”直接代入每一位的规则。手机可横向滑动查看完整位列。

下面是用于解释结果的赋值片段,不是完整加工程序。变量号仅作示例,放入已有宏之前必须确认这些局部变量没有承担参数或中间结果,不能直接覆盖现场变量。

#1 = 2
#2 = 1
#3 = #1 AND #2

按上述整数位运算,#3得到0。它回答的是“2和1哪些位共同为1”,并没有回答“#1不等于0并且#2不等于0”。后者应分别检查两个比较条件,再按程序流程组合判断;不要拿两个原始数直接做AND来代替。

用AND取标志位时,结果也不一定是1

AND适合保留一组已定义的位。假设某个自定义整数状态值为6,其低三位是110;用2作为掩码,二进制是010。6 AND 2得到010,也就是2。这里“掩码”指只选择要检查的位的数,不是刀具补偿值,也不是某个真实机床信号地址。

自定义状态6的低三位110与掩码2的010作AND,得到010即2;该位被选中时结果为2而非固定为1

若随后用“结果等于1”检查这个位,就会误判,因为该位的权重是2。对这里单一掩码2而言,结果只会是0或2;要判断它有没有被置位,可以把结果与0比较。手册的控制命令章节提供NE(不等于)等比较符号,并要求EQ、NE只用于整数比较,本例正是整数结果。

#1 = 6
#2 = 2
#3 = #1 AND #2
IF [#3 NE 0] GOTO 100

这段只展示取位与分支的连接,省略了分支后的内容,不能单独作为完整程序执行。N100必须存在于同一程序中,且序号要位于对应程序段开头;示例并不授权把某个现有N100当作目标。无需通过输出动作来证明结果,先检查运算值和分支目标即可。

“有任一位”与“全部位”也要分开

如果掩码不再只有一位,例如掩码6(二进制110),状态2 AND 6仍得到2。结果非零只能说明选中的位中至少有一位为1,不能说明权重2和4这两位全部为1。对于这里的非负整数,要求掩码中每一位都存在,应检查AND结果是否等于整个掩码;2不等于6,因此这个例子不满足“全部位”。

这一层区别应写进宏的注释或设计说明:变量是普通数量、单独0/1标志,还是按位组合的状态值?若是普通数量,用NE、GT等关系比较表达条件;若是状态位,先写清各位的含义,再选择掩码。不要仅因变量当前恰好等于1,就把所有场景都写成EQ 1。

本文没有为真实PLC信号分配位号。现场状态字的定义必须来自对应机床资料,不能把例子中的2或6当成某个传感器的地址或有效状态。涉及宏调用参数本身时,还应核对三菱G65参数与局部变量对应,避免计算前变量已经被另一个参数覆盖。

修改时只改清楚判断,不顺带改运动

如果旧宏把两个非零数AND起来当作“同时满足”,先列出0、1、2、6这类整数测试值,比较原判定与预期判定。相反,原本按状态位设计的宏,也不能未经核对就把AND改成两个非零比较,否则会丢掉指定掩码的含义。保存修改前后代码,可沿用后处理与NC最小差异对照,让逻辑修正不扩展为无关的坐标、刀补或输出信号变化。

官方依据:三菱加工中心系统编程手册IB-1501277-U第14.6.1节(印刷509–511页)与第14.6.2节(514页)。2 AND 1、6 AND 2和2 AND 6为原创整数推导;两张示意图没有使用厂家图片,未声称在机床上执行或验证I/O联锁。