在工业自动化领域,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),贴近硬件。由于没有结构化语法(无函数、循环块),逻辑实现靠标签或跳转完成。
以西门子 S7-300 为例,STL 写法更接近底层指令:
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 的结构化优势,新增西门子硬件适配指令(如通信、运动控制),语法细节更贴近工业场景(如定时器/计数器的简化调用)。
西门子 SCL 示例:
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;

