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