如果大家学过数电,应该会比较好理解这一章节内容。逻辑运算符就是我们数电中常说的是“与或非”。(异或我们用的并不多)在CoDeSys 中,从功能上分可 以分为:按位逻辑运算及布尔逻辑运算。
按位逻辑运算: 对两个整型数据的相应位逐一进行布尔逻辑运算,并返回兼容的整数结果。 布尔逻辑运算: 对两个布尔类型数据执行逻辑运算。
布尔逻辑运算
1.布尔-与逻辑-AND
vb_Result := 条件A AND 条件B AND 条件C; 当且只当,条件A和条件B和条件C同时都为TRUE的时候,vb_Result输出才为true。只要条件ABC中任一条件为FALSE,则结果为FALSE;这个逻辑语句,就是数电上学习的“逻辑与”。
布尔,实际上就是BOOL,代表的意思是只有两种状态:True或False。
布尔“与”运算用于计算两个布尔表达式的“与”结果。当两个布尔表达式的结果都为 真时,则返回为真,其中只要有一个为假时,则返回为假。
VAR
bResult:BOOL;
iVar1:INT:=30;
END_VAR
bResult:=iVar1 <80;
由于30 的确小于80,故等式右边的条件为真,程序的运行结果是bResult 为TRUE。
2.布尔-或逻辑-OR
布尔“或”运算指令用于计算两个布尔表达式的“或”结果。当两个布尔表达式中有一 个表达式返回为真时,则结果为真;当两个布尔表达式的结果都是假时,则结果为假。
bool值代表结果只有true-or-false两种情况。
创建一个POU,利用布尔“或”运算,判断运算返回值,代码如下:
VAR
bResult:BOOL;
bVar1:BOOL;
iVar1:INT:=30;
END_VAR
bResult:=bVar1 OR (iVar1 <80);
由于iVar1 的初始值为30,故iVar1<80 条件为真,而bVar1 的初始值为“0”,故为假,一真一假最终的“或”逻辑结果可根据表6-x 可以看出,为真。故等式右边的条件为真,程序的运行结果是bResult 为TRUE。
3.布尔-非逻辑-NOT
布尔“非”运算指令用于计算单个布尔表达式的结果。当输入为真时,结果为假;当输入为假时,结果为真。
例子: 创建一个POU,利用布尔“非”运算,判断运算返回值,具体代码如下。
VAR
bResult:BOOL;
bVar1:BOOL;
iVar1:INT:=30;
END_VAR
bResult:=NOT ( 80 < iVar1 );
80<30 该命题为假,使用NOT 指令对该布尔表达式取反后,得到的结果为真,故最后bResult的结果为True。
按位逻辑运算
4.按位-与逻辑-AND
按位“与”运算指令是比较两个整数的相应位。当两个数的对应位都是1 时,返回相应的结果位是“1”;当两个整数的相应位都是“0”或者其中一个位是“0”时,则返回相 应的结果位是“0”。假如变量A数值为7,变量B数值为8,变量C数值为9. A对应二进制位:0111 B对应二进制位:1000 C对应二进制位:1001 则D := A AND B;A的每一个二进制位与B的每一个二进制位做“与”逻辑运算,得到的结果是D := 0001也就是1.
E := B AND C;则B的每一个二进制位与C的每一个二进制位做“与”逻辑运算,得到的结果是E := 1000也就是8
例子: 创建一个POU,声明两个整形变量iVar1 和iVar2,分别对其进行赋值1 和 85,并对这两个变量进行按位与运算,输出结果至iResult,具体实现代码如下所示。
VAR
iVar1:INT:=1;
iVar2:INT:=85;
iResult:INT;
END_VAR
iResult:=iVar1 and iVar2;
10 进制数1 对应2 进制数为0000 0001,10 进制数85 对应2 进制数为0101 0101。根据按位与运算的定义,将每一个独立位逐一进行“与”运算,得出最终的结果0000 0001,即10 进制数值1,见图4.4.1 所示。
5.按位-或逻辑-OR
按位“或”运算指令是比较两个整数的相应位。当两个数的对应位有一个是“1”或者都是“1”时,返回相应的结果位为“1”。当两个整数的相应位都是“0”时,则返回 相应的结果为是“0”。其“或”逻辑真值表如下所示:
输入1 | 输入2 | 结果 |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 1 |
例子: 创建一个POU,对变量iVar1 和iVar2 进行按位“或”运算,并对这两个变量进行按位或运算,输出结果至iResult,具体实现代码如下所示。
VAR
iVar1:INT:=1;
iVar2:INT:=85;
iResult:INT;
END_VAR
iResult:=iVar1 OR iVar2;
程序的最终运行结果为85。
6.按位-非逻辑-NOT
对逻辑串进行取反,将当前的值由“0”变“1”,或由“1”变“0”。按位“非”运算指令是将变量或常量逐一取非。其逻辑见如下真值表: |输入1 | 结果| |:-----| |0|1| |1|0|
例子: 创建一个POU,利用按位“非”运算,判断运算返回值,具体代码如下。
VAR
byVar1:BYTE:=1;
byVar2:BYTE;
END_VAR
byVar2:=NOT byVar1;
由于byVar1 的值为1,将其转换为2 进制后为0000 0001,进行按位取反后,结果为1111 1110。最终的输出结果为254。
下面的异或逻辑,我们不常用,不需要记忆了……
7.按位“异或”XOR
按位“异或”运算指令比较两个整数的相应位。当两个整数的对应位是一个“1”而另外一个是“0”时,返回相应的结果位是“1”。当两个整数的相应位都是“1”或是“0”时,则返回相应的结果位是“0”。
创建一个POU,对变量iVar1 和iVar2 进行按位“异或”运算,并输出结果,具体 实现代码如下。
VAR
iVar1:INT:=1;
iVar2:INT:=85;
iResult:INT;
END_VAR
iResult:=iVar1 XOR iVar2;
10 进制的1 对应2 进制数是0000 0001,10 进制数85 对应的2 进制数是0101 0101。根据按位“异或”运算指令的定义,其结果为84。