西门子博途SCL编程语言系列分享2——表达式与运算符
前言:前面我们介绍了SCL语言的基本概念,接下来我们来看一下,SCL语言中的表达式与运算符,以及运算优先级的相关知识点。
一、表达式的概念:
表达式是在程序运行期间进行运算,然后返回一个值。一个表达式由操作数(如常数、变量或函数调用)和与之搭配的操作符(如 *、/、+ 或 -)组成。通过运算符可以将表达式连接在一起或相互嵌套。
二、表达式的类型
根据不同的运算符,分别可分为以下三种类型:算术表达式、关系表达式与逻辑表达式;
- 算术表达式
算术表达式既可以是一个数字值,也可以是由带有算术运算符的两个值或表达式组合而成。
- 关系表达式
关系表达式将对两个操作数的值进行比较,然后得到一个布尔值。如果比较结果为真,则结果为 TRUE,否则为 FALSE。
- 逻辑表达式
逻辑表达式由两个操作数以及逻辑运算符(AND、OR 或 XOR)或取反操作数 (NOT) 组成。
三、表达式的运算顺序
表达式的运算需遵循事先定义好的特定的优先规则:
- 相关运算符的优先级;
- 从左到右的顺序;
- 括号;
下面我们重点看一下运算符以及它的优先级,我简单地整理了一个表格如下:
运算符 | 运算 | 优先级 |
+ | 一元加 | 2 |
- | 一元减 | 2 |
+ | 加法 | 5 |
- | 减法 | 5 |
* | 乘法 | 4 |
/ | 除法 | 4 |
MOD | 模运算 | 4 |
** | 幂运算 | 3 |
+=,-=,*=,/= | 组合赋值运算 | 11 |
< | 小于 | 6 |
> | 大于 | 6 |
<= | 小于等于 | 6 |
>= | 大于等于 | 6 |
= | 等于 | 7 |
<> | 不等于 | 7 |
NOT | 取反 | 3 |
AND或& | 与运算 | 8 |
XOR | 异或运算 | 9 |
OR | 或 | 10 |
() | 括号 | 1 |
= | 赋值 | 11 |
有些朋友可能对上表中一元加/减会感到陌生,有计算机高级编程语言基础的朋友也许都明白一元/二元/三元的概念,这里的一元加/减与之类似。所谓的一元运算符就是只能有一个操作数,比如:+A; -B等,而加法/减法包括我们的乘法除法运算,则都需要两个操作数来完成,属于二元运算符,如:A+B;B+C等;对于一元加/减,我们可以简单地理解为操作数前面加正负号来表示。
四、表达式的数据类型
(以下摘录自博途V15.1帮助文档)
1、算术表达式:
算术运算符可以处理当前 CPU 所支持的各种数据类型。如果在该运算中有 2 个操作数,那么可根据以下条件来确定结果的数据类型:
- 如果这 2 个操作数均为有符号的整数,但长度不同,那么结果将采用长度较长的那个整数数据类型(例如,INT + DINT = DINT)。
- 如果这 2 个操作数均为无符号整数,但长度不同,那么结果将采用长度较长的那个整数数据类型(例如,USINT + UDINT = UDINT)。
- 如果一个操作数为有符号整数,另一个为无符号整数,那么结果将采用另一个长度较大的有符号数据类型(其包含此无符号整数)(例如,SINT + USINT = INT) 只有在未设置 IEC 检查时,才能执行具有此类操作数的运算。
- 如果一个操作数为整数,另一个为浮点数,那么结果将采用浮点数的数据类型(例如,INT + REAL = REAL)。
- 如果 2 个操作数均为浮点数,但长度不同,结果将采用长度较长的那个浮点数的数据类型(例如,REAL + LREAL = LREAL)。
- 对于操作数为“时间”和“日期和时间”的数据类型组,运算结果的数据类型请参见“算术表达式的数据类型”部分的表格。 设置了 IEC 检查时,不能使用数据类型组“时间”和“日期和时间”的数据类型。
2、关系表达式
关系运算符可以处理当前 CPU 所支持的各种数据类型。结果的数据类型始终为 BOOL。编写关系表达式时,请注意以下规则:
- 以下数据类型组中的所有变量都可以进行比较: 整数/浮点数 二进制数 字符串
- 对于以下数据类型/数据组,只能比较相同类型的变量: TIME、LTIME 日期和时间 PLC 数据类型 ARRAY STRUCT Any 指向的变量 VARIANT 指向的变量
- STRING 比较是对于 Windows 字符集编码的字符进行比较;而 WSTRING 比较则是对 UTF-16 编码的字符进行比较。在比较过程中,将比较变量的长度及各字符对应的数值。
- S5TIME 变量不能作为比较操作数。需要将 S5TIME 显式转换为 TIME 或 LTIME 数据类型。
3、逻辑表达式
逻辑运算符可以处理当前 CPU 所支持的各种数据类型。如果两个操作数都是 BOOL 数据类型,则逻辑表达式的结果也为 BOOL 数据类型。如果两个操作数中至少有一个是位字符串,则结果也为位字符串而且结果是由最高操作数的类型决定。例如,当逻辑表达式的两个操作数分别是 BYTE 类型和 WORD 类型时,结果为 WORD 类型。逻辑表达式中一个操作数为 BOOL 类型而另一个为位字符串时,必须先将 BOOL 类型的操作数显式转换为位字符串类型。
五、实例演示
实现功能:运用组合赋值表达式语句做一个计时器,完成0-59秒计时(不可TON指令)。
- 我们按部就班地来完成这个功能,首先创建一个1500CPU;
- 新建一个全局DB数据块,创建变量A int型,变量B bool型;
- 开始程序编写,整理下思路,要实现0-59的计时,不可用博途自带的定时器指令,这边我们可以用循环中断来完成,创建一个组织块OB30,循环时间设置成1S即可;
- 仿真演示
- 思考:
通过这个实例我们再来思考下组合赋值表达式A+=B;与普通算术表达式A=A+B;的区别?
感谢阅读,欢迎指正。
请先 后发表评论~