IEC61131-3 ST语言入门 - 概述与基础语法
ST/PLC
IEC61131-3 ST 语言入门 - 概述与基础语法
什么是 ST 语言?
ST(Structured Text,结构化文本)是 IEC61131-3 标准定义的五种 PLC 编程语言之一。它是一种高级文本编程语言,语法类似于 Pascal 和 C 语言,特别适合处理复杂算法、数学运算和数据处理。
ST 语言的优势
- 📝 易读性强 - 类似高级语言的语法结构,有编程基础的上手快
- 🔢 数学运算强大 - 适合复杂计算和公式
- 📊 数据处理便捷 - 数组、字符串操作方便
- 🔄 逻辑控制清晰 - IF/CASE/FOR 等控制结构完善
- 🚀 执行效率高 - 编译优化好,运行速度快
五种 IEC61131-3 编程语言对比
| 语言 | 类型 | 适用场景 |
|---|---|---|
| IL | 指令表 | 简单逻辑,类似汇编 |
| LD | 梯形图 | 继电器逻辑替代 |
| FBD | 功能块图 | 信号处理,流程控制 |
| SFC | 顺序功能图 | 顺序流程,状态机 |
| ST | 结构化文本 | 复杂算法,数据处理 |
1. 基本语法规范
1.1 注释
// 这是单行注释(双斜线)
(*
这是块注释
可以跨越多行
*)
1.2 赋值与比较
// 赋值用 := (注意不是 =)
Speed := 1500;
Running := TRUE;
// 比较用 =
IF Speed = 1500 THEN
Status := TRUE;
END_IF;
1.3 语句结束
// 每条语句以分号结尾
Variable1 := Value1;
Variable2 := Value2;
2. POU 程序组织结构
IEC61131-3 中的程序单元称为 POU(Program Organization Unit),包含三种类型:
2.1 PROGRAM(程序)
PROGRAM Main
VAR
// 变量声明区
Motor_Speed : INT := 0;
Running : BOOL := FALSE;
END_VAR
// 程序逻辑区
Motor_Speed := 1500;
Running := TRUE;
END_PROGRAM
2.2 FUNCTION_BLOCK(功能块)
FUNCTION_BLOCK FB_Motor
VAR_INPUT
Start : BOOL;
Stop : BOOL;
END_VAR
VAR_OUTPUT
Running : BOOL;
END_VAR
VAR
Internal_State : INT;
END_VAR
// 逻辑实现
IF Start AND NOT Stop THEN
Running := TRUE;
END_IF;
END_FUNCTION_BLOCK
2.3 FUNCTION(函数)
FUNCTION FC_Calculate : REAL
VAR_INPUT
Value1 : REAL;
Value2 : REAL;
END_VAR
// 函数名本身就是返回值
FC_Calculate := (Value1 + Value2) / 2.0;
END_FUNCTION
三种 POU 的区别
| 类型 | 返回值 | 状态保持 | 多实例 |
|---|---|---|---|
| PROGRAM | 无 | 是 | 唯一 |
| FUNCTION_BLOCK | 无 | 是 | 可创建多个实例 |
| FUNCTION | 有 | 否 | 可多次调用 |
3. 数据类型
3.1 基本数据类型
| 类型 | 大小 | 范围 | 示例 |
|---|---|---|---|
| BOOL | 1 bit | TRUE/FALSE | Flag := TRUE; |
| BYTE | 8 bit | 0~255 | Data := 16#FF; |
| WORD | 16 bit | 0~65535 | Status := 16#FFFF; |
| DWORD | 32 bit | 0~4294967295 | ID := 16#FFFFFFFF; |
| SINT | 8 bit | -128~127 | Count : SINT := -10; |
| INT | 16 bit | -32768~32767 | Speed : INT := 1500; |
| DINT | 32 bit | -2³¹~2³¹-1 | Position : DINT := 100000; |
| LINT | 64 bit | -2⁶³~2⁶³-1 | BigValue : LINT; |
| USINT | 8 bit | 0~255 | ByteVal : USINT; |
| UINT | 16 bit | 0~65535 | WordVal : UINT; |
| UDINT | 32 bit | 0~4294967295 | DWordVal : UDINT; |
| REAL | 32 bit | ±1.18e-38~±3.4e38 | Temp : REAL := 36.5; |
| LREAL | 64 bit | ±2.23e-308~±1.79e308 | Precision : LREAL; |
| TIME | 32 bit | T#0ms ~ T#24d20h31m23s647ms | Delay : TIME := T#5s; |
| STRING | 变长 | 字符串 | Msg : STRING := 'Hello'; |
3.2 时间格式写法
T#10ms // 10 毫秒
T#5s // 5 秒
T#1m30s // 1 分 30 秒
T#1h // 1 小时
T#2d5h // 2 天 5 小时
3.3 十六进制与二进制
// 十六进制用 16# 前缀
HexWord : WORD := 16#FF00;
HexByte : BYTE := 16#A5;
// 二进制用 2# 前缀(部分平台支持)
BinByte : BYTE := 2#1010_0101;
4. 数据类型转换
4.1 隐式转换(自动)
// 小范围转大范围自动进行
IntVal : INT := 100;
DintVal : DINT;
DintVal := IntVal; // 自动转换为 DINT
4.2 显式转换(手动)
// 类型名(值) 的语法
RealVal := REAL(IntVal); // INT → REAL
IntVal2 := INT(RealVal); // REAL → INT(截断小数)
// 标准转换函数
BOOL_TO_INT(TRUE); // → 1
INT_TO_REAL(100); // → 100.0
REAL_TO_INT(3.14); // → 3
STRING_TO_INT('123'); // → 123
DWORD_TO_DINT(Data); // DWORD → DINT
4.3 常见转换场景
// 整数除法转 REAL
Result := REAL(Numerator) / REAL(Denominator);
// 计时器时间转 REAL 用于计算
ElapsedSec := TIME_TO_REAL(Timer.ET) / 1000.0;
// 字符串转数值
SetPoint := STRING_TO_REAL(InputString);
5. 编程小贴士
变量声明与初始化
VAR
// 基本声明
Counter : INT;
Temperature : REAL := 25.0;
Enabled : BOOL := FALSE;
Message : STRING[80] := 'System Ready';
// 常量
PI : CONSTANT REAL := 3.14159;
MAX_SPEED : CONSTANT INT := 3000;
END_VAR
命名建议
- 变量:驼峰式
MotorSpeed或下划线motor_speed - 常量:全大写
MAX_SPEED - 功能块:
FB_前缀FB_MotorControl - 函数:
FC_前缀FC_Calculate - 全局变量:
g_前缀g_SystemMode
文档版本:1.0 | 更新日期:2026-04-28 | 作者:JianLin Studio