
这种设计体现了安全优先的原则,任何条件不满足都会禁止上升动作,防止事故发生。
它其实是在手动构造一个“所有条件都满足”的位掩码,且便于后期增加/删除条件(只需修改掩码)。
过程分析
第二步:UpPermit 这个 WORD 变量的二进制构成
UpPermit 是一个 16位 的 WORD 类型变量,每位依次被赋值:
text
位号: 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
─── ─── ─── ─── ─── ─── ─── ─── ─── ─── ─── ─── ─── ─── ─── ───
值: 0 0 0 0 0 0 0 0 0 0 [5] [4] [3] [2] [1] [0]
↑ ↑ ↑ ↑ ↑ ↑
│ │ │ │ │ │
整形 挂袋 回零 电机 模式 急停
假设所有条件都满足(全部为1):
text
UpPermit = 2#0000_0000_0011_1111 (二进制)
= 16#003F (十六进制)
= 63 (十进制)
第三步:按位与运算(AND W#16#3F)
st
#DI_ElevU.strMotionCond.Dir.UpPermit AND W#16#3F
W#16#3F = 二进制 0000_0000_0011_1111(低6位全为1,高位全为0)
与运算规则:只有两个位都是1,结果才是1
text
UpPermit = 0000_0000_0011_1111
AND W#16#3F = 0000_0000_0011_1111
───────────────────────────────────
运算结果 = 0000_0000_0011_1111
与运算的作用:屏蔽掉高位的干扰,只关心低6位的状态。即使高10位有任何值,都会被清零,不影响判断。
第四步:比较是否等于 W#16#3F
st
运算结果 = W#16#3F
即比较:
text
0000_0000_0011_1111 = 0000_0000_0011_1111 → TRUE (相等)
第五步:最终赋值
st
UpPermitOK := TRUE
完整数据流图
text
┌────────────────────────────────────────────────────────────────┐ │ 条件1: 无急停 ───► UpPermit.%X0 = 1 │ │ 条件2: 手动模式 ───► UpPermit.%X1 = 1 │ │ 条件3: 电机正常 ───► UpPermit.%X2 = 1 │ │ 条件4: 已回零 ───► UpPermit.%X3 = 1 ──┐ │ │ 条件5: 无挂袋位 ───► UpPermit.%X4 = 1 │ │ │ 条件6: 整形缩回 ───► UpPermit.%X5 = 1 ──┘ │ │ │ │ UpPermit = 0000_0000_0011_1111 │ │ │ │ │ ▼ │ │ AND W#16#3F │ │ │ │ │ ▼ │ │ 0000_0000_0011_1111 │ │ │ │ │ ▼ │ │ 比较是否 = W#16#3F ? │ │ │ │ │ ▼ │ │ TRUE (相等) │ │ │ │ │ ▼ │ │ UpPermitOK := TRUE │ └────────────────────────────────────────────────────────────────┘