在工业自动化领域,PLC(可编程逻辑控制器)的编程语言选择往往让人头疼。ST(结构化文本)、SCL(结构化控制语言)和 STL(语句表)这三者经常被混淆,但它们在语法风格、应用场景和执行逻辑上其实差异显著。
咱们不妨从定义本质、语法特征、应用场景以及核心区别这四个维度,把这三者的关系理清楚。
一、先搞清楚它们到底是什么
| 语言 | 全称 | 本质定位 | 所属标准 |
|---|---|---|---|
| STL | Statement List(语句表) | 汇编级的低级指令语言,基于 PLC 指令集逐条执行 | IEC 61131-3(可选,厂商差异大) |
| ST | Structured Text(结构化文本) | 类 Pascal/C 的高级文本语言,结构化、模块化 | IEC 61131-3 标准语言 |
| SCL | Structured Control Language(结构化控制语言) | 西门子对 ST 的定制扩展版,核心兼容 ST | 基于 IEC 61131-3,西门子私有扩展 |
这里有个关键前提:SCL 本质就是 ST 的西门子版本,两者语法高度兼容,常被混称;而 STL 是完全不同的低级指令语言,与前两者没有语法交集。
二、语法特征对比
1. STL(语句表)—— 指令式'汇编风格'
STL 的语法形式以'指令 + 操作数'的单行指令为主,很像单片机汇编,依赖 PLC 的硬件指令集(比如西门子 S7-300/400 的 STL 指令)。
它的核心特点是逐条执行,需要手动控制指令流(如跳转、栈操作),直接操作寄存器或存储区(I、Q、M、DB)。因为没有函数或循环块等结构化语法,逻辑全靠标签或跳转来实现。
实际编写时,代码长这样:
A I0.0 // 检测输入 I0.0(与操作)
AN I0.1 // 检测输入 I0.1 取反(与非操作)
= Q0.0 // 结果输出到 Q0.0
L DB1.DBW0 // 加载数据块 1 的字 0 到累加器
L 100 // 加载常数 100 到累加器
+I // 整数加法
T DB1.DBW2 // 结果存入 DB1.DBW2
2. ST(结构化文本)—— 高级'类编程风格'
ST 的语法形式接近 Pascal 或 C,支持变量声明、条件判断、循环、函数/FB(功能块),结构化程度很高。
它符合 IEC 61131-3 标准,跨厂商通用(施耐德、倍福、罗克韦尔等都能用)。面向逻辑而非硬件,无需关注寄存器或栈操作,还支持复杂算法(数学运算、浮点处理、数组/结构体)。
看个标准 ST 的例子:
PROGRAM Main
VAR
In1: BOOL := I0.0;
In2: BOOL := I0.1;
Out1: BOOL := Q0.0;
Val1: INT := DB1.DBW0;
Val2: INT := 100;
Res: INT := DB1.DBW2;
END_VAR
// 逻辑判断
IF In1 AND NOT In2 THEN
Out1 := TRUE;
ELSE
Out1 := FALSE;
END_IF;
// 数学运算
Res := Val1 + Val2;
3. SCL(西门子结构化控制语言)—— ST 的'西门子定制版'
SCL 完全兼容 ST 的核心语法,但新增了西门子专属扩展,比如系统函数 SFC/SFB、数据块操作、西门子特有的数据类型。
它仅适用于西门子 PLC(S7-1200/1500、TIA Portal),保留了 ST 的结构化优势,同时新增西门子硬件适配指令(通信、运动控制等)。语法细节也更贴近工业场景,比如定时器/计数器的调用更简化。
在西门子环境下,代码通常写成这样:
PROGRAM Main
VAR
In1: BOOL := "I0.0"; // 西门子风格的地址引用
In2: BOOL := "I0.1";
Out1: BOOL := "Q0.0";
Val1: INT := "DB1".Val1; // 符号化数据块引用
Val2: INT := 100;
Res: INT := "DB1".Res;
TON1: TON; // 西门子标准定时器 FB
END_VAR
// 西门子专属定时器调用
TON1(IN := In1, PT := T#5S);
Out1 := TON1.Q AND NOT In2;
// 数学运算(与 ST 一致)
Res := Val1 + Val2;

