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 局部变量 在PRG和FB中有记忆,在FC和Method中没有记忆
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

Author: 徐大军

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注