博文

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 基本数据类型

类型大小范围示例
BOOL1 bitTRUE/FALSEFlag := TRUE;
BYTE8 bit0~255Data := 16#FF;
WORD16 bit0~65535Status := 16#FFFF;
DWORD32 bit0~4294967295ID := 16#FFFFFFFF;
SINT8 bit-128~127Count : SINT := -10;
INT16 bit-32768~32767Speed : INT := 1500;
DINT32 bit-2³¹~2³¹-1Position : DINT := 100000;
LINT64 bit-2⁶³~2⁶³-1BigValue : LINT;
USINT8 bit0~255ByteVal : USINT;
UINT16 bit0~65535WordVal : UINT;
UDINT32 bit0~4294967295DWordVal : UDINT;
REAL32 bit±1.18e-38~±3.4e38Temp : REAL := 36.5;
LREAL64 bit±2.23e-308~±1.79e308Precision : LREAL;
TIME32 bitT#0ms ~ T#24d20h31m23s647msDelay : 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

← 返回博文列表