这类指令是对字节、字或双字的各位分别同时进行逻辑运算的指令。有的PLC没有字节逻辑运算指令。
S7-200的取反(求反码)指令将输入变量中的二进制数逐位取反,即各位由0变为1,由1变为0(见图4-17a),并将结果装入输出地址中。
参与“与”运算的两个操作数的同一位均为1时,运算结果的对应位为1,否则为0。
参与“或”运算的两个操作数的同一位均为0时,运算结果的对应位为0,否则为1。
参与“异或”(Exclusive Or)运算的两个操作数的同一位不同时,运算结果的对应位为1,否则为0。
(1)求整数的绝对值
PLC的负数用2的补码的形式来表示,高位为1时该位为0,为1时该位为负数,将负数求补(各位取反后加1)得到它的绝对值。
FX系列有求二进制数补码的指令NEG,因为S7-200没有求补码的指令,需要用取反和加1这两条指令来实现。在下面的程序中,如果VW10中的数不是负数,比较触点断开,不会执行取反和加1指令。
LDW< VW10,O ∥如果VWlO中为负数
INVW VWlO ∥VW10逐位取反
INCW VWlO ∥加1得到VWlO的绝对值
(2)将字或字节中的某些位置为0
图4-17b中变量VB1的各位与十六进制常数FOH相“与”,因为16# FO的高4位为1,低4位为0,所以运算结束后VB1的低4位被清0,高4位不变。
(3)将字或字节中的某些位置为1 图4-17c中变量VB3的各位与十六进制常数16# OB(即二进制常数0000 1011)相“或”,16#OB的高4位为0,运算结束后VB3的高4位不变。因为常数16# OB的第3、第1和第0位为,1,不论VB3这几位为0还是为1,运算结束后Ⅵ粥这几位都被置为1。
(4)判断有哪些位发生了变化
两个相同的字节异或运算后运算结果的各位均为0。假设VB5和VB6中是在不同时刻采集的8位数字量的状态,对它们异或运算后的结果如果不是全0,说明有的位的状态发生了变化。状态发生了变化的位的异或结果为1。
(5)异或校验
为了检验
通信过程中接收到的数据是否正确,将接收到的需要校验的各字节作异或运算,并将异或的结果(异或校验码)作为报文的一部分发送到接收方。接收方计算出接收到的数据的异或校验码,并与发送方传送过来的校验码比较,如果不同,可以判断通信出错,要求发送方重发