ST语言概述
- - - - - -
ST(结构化文本)是一种通用的高级文本语言,其语法类似于Pascal语言。 适用于包含数值分析或复杂算法的程序。 它可以在程序中,功能或功能块的主体中����使用,以及用于描述SFC元素内的动作和转换。 根据IEC 61131-3,关键字必须以大写字母输入。 空格和制表符不影响语法;可以在任何地方使用它们。
ST中的表达式与Pascal中的表达式完全相同:
\[ 变量\] := \[值\];
它们的执行顺序是从右到左。 表达式由操作数和运算符组成。 操作数是文字,变量,结构化变量,结构化变量的组成部分,函数调用或直接地址。
# ◇ 1. 数据类型
根据IEC 61131-3标准,ST语言支持全部必需的类型集,类似于经典编程语言。 整数类型:SINT(字符),USINT(无符号字符),INT(短整数),UINT(无符号整数),DINT(长整数),UDINT(无符号长整数),LINT(64位整数),ULINT(64位整数,无签字)。 有效类型为:REAL(浮点型),LREAL(双精度型)。 特殊类型BYTE,WORD,DWORD,LWORD分别是8位,16位,32位和64位长度的位串。 ST中没有位字段。 可以逐位直接访问位串。 例如:
a.3:= 1; (*设置*变量的第3位)
布尔类型BOOL可以为TRUE或FALSE。 在物理上,BOOL类型的变量可以对应一位。 字符串STRING是字符串,而不是数组。 可以使用标准运算符比较和复制字符串。 例如:
strA:= strB;
有一组用于处理字符串的标准函数(请参见附录2,"带有STRING类型的变量的字符串操作"一节)。
IEC标准中的特殊类型定义为持续时间(TIME),一天中的时间(TOD),日历日期(DATE)和时间点(DT)。
表3.1列出了与上述类型相对应的默认值。
表3.1-IEC 61131-3数据类型的默认值
数据类型值BOOL,SINT,INT,DINT,LINT0 USINT,UINT,UDINT,ULINT0 BYTE,WORD,DWORD,LWORD0 REAL0.0 TIMET#0S DATED#0001-01-01 TIME*OF*DAYTOD#00:00 00 DATE*AND*TIMEDT#0001-01-01-00:00:00 STRING''(空字符串) 默认情况下,所有变量都初始化为零。 声明变量时,可以显式指定其他值。 例如:
str1:STRING:='Hello world';
在某些情况下,开发软件模块时,可以方便地使用类型概括。 一组数据类型的一般命名。 这些概括在表3.2中给出。
表3.2-IEC 61131-3数据类型概括
ANY ANY\_BITANY\_NUMANY\_DATETIME STRING 和其他数据类型 BOOL BYTE WORD DWORD LWORDANY\_INTANY\_REALDATE TIME*OF*DAY DATE*AND*TIME INT SINT DINT LINTUINT USINT UDINT ULINTREAL LREAL ## ◇ 1.1. 语言设计
ST语言构造包括:
- 算术运算;
- 逻辑(按位)操作;
- 比较操作;
- 赋值操作;
- IF-ELSEIF-ELSE结构;
- FOR循环
- DO WHILE循环
- REPAET UNTIL循环
- CASE分支
编写算术表达式时,允许使用括号来表示计算顺序。 编写表达式时,允许使用变量(局部和全局)和常量。
## ◇ 1.2. 算术运算
算术运算包括:
- " +"-加法;
- "-"-减法;
- " \*"-乘法;
- " /"-除;
- " Mod"是整数除法的余数。
表3.4中显示了表达式中运算的优先级(优先级越高,执行操作越早)。
逻辑(按位)操作
这些操作包括:
" OR"-逻辑(按位)加法;
" AND"-逻辑(按位)乘法;
" XOR"-逻辑(按位)"异或";
" NOT"-逻辑(按位)取反。
比较运算
支持以下比较操作:
" ="-比较是否相等;
" <>"-不平等的比较;
">"-比较更多;
"> =-比较不少;
" <"-比较少;
" <="-不再进行比较。
比较的结果总是使用BOOL类型的值。
赋值
为了指示赋值,使用了双符号":="。 表达式的左右部分必须包含相同类型的操作数(不提供自动类型转换)。 在表达式的左侧(接收侧)只能使用变量。 右侧可以包含表达式或常量。
表3.4显示了执行上述操作的优先级。
表3.4-操作优先级
操作优先级对照1 加,减2 乘法,除法3 OR4 与,异或5 NOT6 一元减7 函数调用8 建设IF-ELSEIF-ELSE
使用大括号和方括号来描述某些语言构造很方便。 据信:
花括号中的表达式可以连续使用零次或多次。
方括号中的表达式是可选的。
IF-ELSEIF-ELSE构造具有以下格式:
IF <布尔表达式> THEN <语句列表>
\[ ELSEIF <布尔表达式> THEN <语句列表>\]
\[ ELSE <声明列表>\]
END\_IF;
例如:
如果Var <> 0
然后变量:= 1
ELSEIF Var> 0
然后变量:= 0;
ELSE Var:= 10;
END\_IF;
该设计允许嵌套,即 在一个IF内可以再有一个,依此类推。 例如:
如果Var> 10 THEN
如果Var < +>
然后变量:= 10;
ELSE Var:= 0;
END\_IF;
END\_IF;
周期
用于设置具有固定迭代次数的循环。 设计格式如下:
FOR <控制变量>:= <表达式1>到<表达式2>
\[ BY \]做
<声明清单>
END\_FOR;
指定循环条件时,假定<控制变量>,<表达式1> ... <表达式3>的类型为INT。 如果循环变量的值超过值,则循环将退出。 例如:
对于i:= 1到10乘2 DO
k:= k \* 2;
END\_FOR;
BY运算符指定循环变量的增量(在这种情况下,每次循环时,我将增加2)。 如果未指定BY运算符,则增量为1。例如:
对于i:= 1 TO k / 2 DO
var:= var + k;
k:= k-1;
END\_FOR;
在循环内部,可以使用其他循环,IF和CASE语句。 EXIT语句可用于退出循环(任何类型)。 例如:
对于i:= 1到10乘2 DO
k:= k \* 2;
如果k> 20 THEN
EXIT;
END\_IF;
END\_FOR;
注1:表达式 ... 是在进入循环之前计算的,因此,在这些表达式中的任何一个中更改变量的值都不会更改迭代次数。 例如:
01:k:= 10;
02:对于I:= 1 TO k / 2 DO
03:k:= 20;
04:END\_FOR;
在第3行中,变量k被更改,但是该循环仍将仅执行五次。 注2:循环变量的值可以在循环体内改变,但是在下一次迭代开始时,将根据循环条件设置该变量的值。 例如:
01:对于我:= 1至5
02:我:= 55;
03:END\_FOR;
在第一次通过时,I的值将等于1,然后在第2行中将其更改为55,但是在第二次通过时,I的值将等于2-根据循环条件的下一个值。
循环周期
它用于确定带有先决条件的循环。 循环将一直运行,直到WHILE子句中的表达式返回TRUE。 设计格式如下:
WHILE <布尔表达式> DO
<声明清单>
END\_WHILE;
在每次迭代时检查的值。 如果表达式返回FALSE,则循环将结束。 例如:
k:= 10;
当k> 0时
i:= I + k;
k:= k –1;
END\_WHILE;
在循环内部,可以使用其他循环,IF和CASE语句。 为了尽早终止循环,请使用EXIT运算符(请参见FOR循环说明中的示例)。
重复直到循环
它用于确定具有后置条件的循环。 当UNTIL子句中的表达式返回FALSE时,循环将结束。 换句话说:循环将执行直到满足UNTIL子句中的条件。 设计格式如下:
REPEAT
<声明清单>
UNTIL <布尔表达式>;
END\_REPEAT;
例如:
k:= 10;
REPEAT
i:= i + k;
k:= k-1;
直到k = 0;
END\_REPEAT;
在循环内部,可以使用其他循环,IF和CASE语句。 为了尽早终止循环,请使用EXIT运算符(请参见FOR循环说明中的示例)。
施工case
该设计用于组织从一系列值中进行选择。 设计格式如下:
case<表达式>
CASE*ELEMENT {CASE*ELEMENT}
\[ ELSE <声明列表>\]
END\_CASE;
CASE*ELEMENT是值列表,以逗号分隔。 列表项可以是整数或整数范围。 范围设置如下BEGIN*VAL .. END\_VAL。
如果当前值不属于任何CASE\_ELEMENT,则控制权将转移到ELSE子句。 如果未指定ELSE子句,则不会采取任何措施。
的值只能是整数。 例如:
01:CASE k OF
02:1:
03:k:= k \* 10;
04:2..5:
05:k:= k \* 5;
06:i:= 0;
07:6,9..20:
08:k:= k-1;
09:其他
10:k:= 0;
11:i:= 1;
12:END\_CASE;
第4行包含一系列值。 如果k的值属于数字段\[2,5\],则将执行第5和第6行。
第7行使用值列表。 如果值k等于6或属于数字段\[9,20\],则将执行第8行。
如果k <1或6 20,则将执行第10行和第11行(在这种情况下,ELSE子句将起作用)。
指定值列表时,必须满足以下条件:
同一CASE中的一组值不应重叠;
指定值范围时,该范围的开始应小于其结束。
表3.5显示了CASE构造的正确和错误记录代码的示例。
为处理每种CASE情况而提供的操作可以使用循环,IF语句和CASE语句。
表3.5-CASE施工记录
记录不正确 正确记录
01:CASE k OF
02:1:
03:k:= k \* 10;
04:2..5:
05:k:= k \* 5;
06:i:= 0;
07:5,9..20:
08:k:= k-1;
09:其他
10:k:= 0;
11:i:= 1;
12:END\_CASE;
第4行和第7行的范围相交
01:CASE k OF
02:1:
03:k:= k \* 10;
04:2..5:
05:k:= k \* 5;
06:i:= 0;
07:6,9..20:
08:k:= k-1;
09:其他
10:k:= 0;
11:i:= 1;
12:END\_CASE;
01:CASE k OF
02:1:
03:k:= k \* 10;
04:2..5:
05:k:= k \* 5;
06:i:= 0;
07:6,20..9:
08:k:= k-1;
09:其他
10:k:= 0;
11:i:= 1;
12:END\_CASE;
在第7行中,值的范围设置不正确。
01:CASE k OF
02:1:
03:k:= k \* 10;
04:2..5:
05:k:= k \* 5;
06:i:= 0;
07:6,9..20:
08:k:= k-1;
09:其他
10:k:= 0;
11:i:= 1;
12:END\_CASE;
在ST上编写程序时,可以使用标准和用户定义的功能以及功能块。
- - - - - -
[< 前页](SFC.html) [回目录](_index.html) [后页 >](IL.html)
![](images~/theme_switcher.png)
- 软件操作手册
- 软件安装与使用
- 开发环境界面
- 程序的主菜单
- 工具栏
- 项目树
- 项目设置面板
- ST和IL语言的的文本编辑器
- 梯形图LD语言编辑器
- 功能块图FBD语言编辑器
- SFC语言编辑器
- 资源编辑面板
- 数据类型编辑面板
- 项目实例面板
- 功能和功能块库
- 调试控制台
- 搜索项目
- 调试面板
- 图形面板用于在调试模式下更改变量的值
- 软件操作
- 快速操作流程
- 项目操作实践
- IO变量挂载
- 应用程序选项
- 程序下载与调试
- Modbus配置使用方法
- 通过U盘更新应用程序
- 串口下载应用程序
- C语言嵌入
- 状态指示
- 重置内部文件存储
- IEC61131编程语言
- LD语言概述
- FBD语言
- SFC语言概述
- ST语言概述
- IL语言
- 函数库和功能块的说明