ST结构化文本语言与示例(持续更新)

进制

进制

表示

备注

二进制

2#00110011

 

八进制

8#17

 

十进制

10#522或522

 

十六进制

16#AF10

 

数据类型

类型名称

类型标识符

数据下限

数据上限

存储空间

布尔型

BOOL

0

1

1bit

整型

字节型

BYTE

0

255

1byte

字型

WORD

0

65535

2byte

双字型

DWORD

0

4294967295

4byte

短整型

SINT

-128

127

1byte

无符号短整型

USINT

0

255

1byte

整型

INT

-32768

32767

2byte

无符号整型

UINT

0

65535

2byte

长整型

DINT

-2147483648

2147483647

4byte

无符号长整型

UDINT

0

4294967295

4byte

实数型

REAL

-3.402823E+38

3.402823E+38

4byte

字符串行

STRING

默认80个字符,最大255个字符,第一个字节存储字符串长度。

256byte

时间型

时间型

TIME

TIME表示一个时间值,单位为毫秒,初始值为0。

4byte

时刻型

TOD

TOD表示当天的时刻,单位为毫秒,初始值为凌晨0点0分。

4byte

日期型

DATE

DATE表示当前日期,单位为秒,初始值是1970年1月1日。

4byte

日期时刻型

DT

DT 表示当前日期和时刻,单位为秒,初始值是1970年1月1日凌晨0点0分。

4byte

转义符号

转义符号

意义

备注

$$

美元

 

$L

换行

 

$N

新行

 

$R

回车符

 

$T

制表符

 

$P

换页

 

变量属性

属性类型

意义

备注

VAR

局部变量

 

VAR_GLOBAL

全局变量

 

VAR_RETAIN

掉电保持型变量

 

VAR_CONSTANT

常量

 

VAR_IN

输入变量

 

VAR_OUT

输出变量

 

VAR_IN_OUT

输入输出变量

 

VAR_TEMP

临时变量

 

VAR_STAT

静态变量

 

自定义数据类型

数组定义: <数组名>:ARRAY [<L1>..<M1>,<L2>..<M2>,<L3>..<M3>] OF <基本数据类型>一维数组 A1: ARRAY[0..9] OF BOOL; 二维数组 A2: ARRAY[0..9, 0..9] OF REAL; 三维数组 A3: ARRAY[0..9, 0..9, 0..9] OF INT; 枚举: TYPE<标识符>:(<Enum_1>,<Enum_2>,…,<Enum_3>); END_TYPE 定义举例 TYPE Color : ( Red := 0, Green, Yellow ); END_TYPE 结构: TYPE <结构名>: STRUCT <变量声明1> <变量声明2> <变量声明n> END_STRUCT END_TYPE 定义举例 TYPE Motor : STRUCT V:REAL; A:REAL; Hz:REAL; END_STRUCT END_TYPE 指针: <指针名>: POINTER TO <数据类型或功能块类型>

语句

IF 表达式1 THEN 语句块1; ELSIF 表达式2 THEN 语句块2; …… ELSE 语句块3 END_IF; CASE 表达式 OF 值1:语句块1; 值2:语句块2; …… ELSE:语句块; END_CASE; WHILE 表达式 DO 语句块; END_WHILE; FOR 控制变量:=初始值 TO 结束值 BY 增量值 DO 语句块; END_FOR

常用指令

VAR intVar1: INT; intVar2: INT; intVar3: INT; boolVar1: BOOL; VarOut: INT; VarIn: INT; wordVar1: WORD; wordVar2: WORD; wordVar3: WORD; realVar1: REAL; realVar2: REAL; intArr1: ARRAY[0..9] OF INT; dintVarAddress1:POINTER TO INT; uintVar1: UINT; R_TRIG1: R_TRIG; F_TRIG1: F_TRIG; CTUD1: CTUD; CTD1: CTD; CTU1: CTU; TON1: TON; TOF1: TOF; END_VAR //赋值运算符 intVar1:=123; //算数运算符 intVar1:=intVar2+123; intVar1:=intVar2-123; intVar1:=intVar2*123; intVar1:=intVar2/123; intVar1:=intVar2 MOD 123; (*取余*) //选择指令 intVar3:=SEL(boolVar1,intVar1,intVar2);(*二选一*) intVar1:=MUX(intVar2,-123,456,789);(*多选一*) intVar3:=MIN(intVar1,intVar2); intVar3:=MAX(intVar1,intVar2); VarOut:=LIMIT(intVar1,VarIn,intVar2);(*极限值指令*) //比较指令 boolVar1:=intVar1<intVar2; boolVar1:=intVar1<=intVar2; boolVar1:=intVar1>intVar2; boolVar1:=intVar1>=intVar2; boolVar1:=intVar1<>intVar2; boolVar1:=intVar1=intVar2; //移位指令 wordVar1:=SHR(2#10011001,2); wordVar1:=ROR(2#10011001,2); wordVar1:=SHL(2#10011001,2); wordVar1:=ROL(2#10011001,2); //逻辑运算指令 wordVar1:=NOT wordVar2; wordVar1:=wordVar2 AND wordVar3; wordVar1:=wordVar2 OR wordVar3; wordVar1:=wordVar2 XOR wordVar3; //初等数学运算指令 realVar1:=SQRT(realVar2); realVar1:=ABS(realVar2); realVar1:=EXP(realVar2); realVar1:=LN(realVar2); realVar1:=LOG(realVar2); realVar1:=EXPT(realVar2,5); realVar1:=SIN(realVar2); realVar1:=ASIN(realVar2); realVar1:=COS(realVar2); realVar1:=ACOS(realVar2); realVar1:=TAN(realVar2); realVar1:=ATAN(realVar2); //地址运算指令 uintVar1:=SIZEOF(intArr1);(*获取变量所占字节数*) dintVarAddress1:=ADR(intVar1);(*获取变量地址*) intVar2:=dintVarAddress1^;(*获取指针变量所指向的值*) //数据转换指令 _TO_ intVar1:=BOOL_TO_INT(boolVar1); //计数器 CTUD1(CU:= , CD:= , RESET:= , LOAD:= , PV:= ,QU=> , QD=> ,CV=> ); CTD1(CD:= , LOAD:= ,PV:= , Q=> , CV=> ); CTU1(CU:= , RESET:= , PV:= , Q=> , CV=> ); //定时器 TON1(IN:= , PT:= , Q=> , ET=> ); TOF1(IN:= , PT:= , Q=> , ET=> ); //触发指令 R_TRIG1(CLK:=boolVar1 , Q=> ); F_TRIG1(CLK:=boolVar1 , Q=> );

示例 上升沿下降沿触发指令

FUNCTION_BLOCK R_F_TRIG VAR_INPUT CLK: BOOL; END_VAR VAR_OUTPUT QR: BOOL; QF: BOOL; END_VAR VAR_STAT TEMP: BOOL := FALSE; END_VAR QR:=CLK AND (NOT TEMP); QF:=(NOT CLK) AND TEMP; TEMP:=CLK; PROGRAM MAIN VAR R_F_TRIG_0: R_F_TRIG; C: BOOL; ADD1: INT; ADD2: INT; END_VAR R_F_TRIG_0(CLK:=C , QR=> , QF=> ); IF R_F_TRIG_0.QR THEN ADD1:=ADD1+1; END_IF IF R_F_TRIG_0.QF THEN ADD2:=ADD2+1; END_IF