> ## Content Index
> Fetch the complete content index at: https://www.hubwiz.com/blog/llms.txt
> Use this file to discover other available public pages before exploring further.

# 梯形图还是结构化文本？同一个启停回路，LAD、ST、SCL 写四遍
- URL: https://www.hubwiz.com/blog/ladder-logic-vs-structured-text-lad-st-scl/
- Published: 2026-11-12T12:28:48.000Z
- Updated: 2026-11-12T16:16:47.000Z
- Description: 同一个启停自保持回路写四遍：LAD 梯级、布尔表达式、IF/ELSIF、SCL。看每种写法丢掉了什么，比看功能对比表有用。
- Author: admin
- Tags: 梯形图, SCL, IEC 61131-3, TIA Portal

梯形图还是结构化文本？理解两者差别最快的办法不是列功能表，而是把**同一个程序**用两种语言各写一遍。本文拿经典的电机启停自保持回路当例子，写四个版本：梯形图的一个梯级、一个结构化文本表达式、一个 IF / ELSIF 判断，以及 TIA Portal 里的 SCL。然后比较每种写法各自擅长什么，并告诉你怎样在一个免费的在线 PLC 仿真器里并排试这两种写法。

![同一个启停程序：左边是梯形图，右边是结构化文本。](https://www.hubwiz.com/blog/content/images/2026/11/img_56cfe2053653a13737bc57a0afd30db1-800-1.jpg)

## 任务：带电机的启停自保持回路

一台电机由两个点动按钮控制。按下 START，电机运行，而且要**在松开 START 之后继续运行**。按下 STOP，电机停止；两个按钮同时按下时，STOP 必须获胜。一个绿色的 RUN 指示灯表示电机在运行。

注意 STOP 这个输入。按钮是**常闭**接线的，所以在没人按它的时候输入是 TRUE。按下 STOP，或者导线断开，输入变成 FALSE，电机停止。这就是为什么 STOP 在程序里以常开指令的形式出现：指令检测的是信号，而物理触点的类型不是它关心的事。

用一行布尔代数表示这段逻辑：

```text
Motor = Stop AND (Start OR Motor)

```

电机输出读取它自己的前一个状态。这个反馈就是**自保持**（seal-in），也叫保持支路或锁存支路。

## 版本 1：梯形图

在梯形图里，同一个想法看起来像一个接触器回路。START 和电机自己的一个触点并联，STOP 与整个并联组串联。

![梯级 0：START 与 Motor 触点并联，再与 STOP 串联。梯级 1：RUN 指示灯跟随电机。](https://www.hubwiz.com/blog/content/images/2026/11/img_c8a67a8158e2d0a69b9cae2fcf6174a0-800-1.jpg)

```text
// Rung 0
 Start        Stop      Motor
--+--[ ]--+----[ ]-----( )--
  | Motor |
  +--[ ]--+
// Rung 1
 Motor              RunLamp
-----[ ]-----------( )--

```

梯形图在这里擅长什么：

- **它读起来像电路图。** 一个从没给 PLC 编过程序的电工也能顺着梯级看下去。
- **在线监视是可视的。** 在运行的控制器上，你看见绿色能流，一眼看出哪个触点把通路挡住了。
- **STOP 的优先级是可见的。** STOP 与两条支路都串联，所以没有东西能绕过它。

## 版本 2：结构化文本写成布尔表达式

在结构化文本里，这个梯级变成一条赋值。括号承担了并联支路的作用：

```pascal
(* Motor start/stop with seal-in *)
Motor := (Start OR Motor) AND Stop;
RunLamp := Motor;

```

它短，而且精确。但注意你丢掉了什么。当电机没启动时，你只看到一个 FALSE 的结果，然后得在脑子里把这个表达式算一遍。两个输入时这很容易；十二个条件时就不是了。

## 版本 3：结构化文本写成 IF / ELSIF

同样的行为可以写成一个判断。这是很多程序员偏好的版本，因为 STOP 的优先级被显式写出来了：

![在仿真器里运行的 IF / ELSIF 版本，每个变量旁边显示实时值。](https://www.hubwiz.com/blog/content/images/2026/11/img_731e852ab5afdc845ed67a2d5857cc1f-800-1.jpg)

```pascal
(* Stop is TRUE when the NC button is released. *)
IF NOT Stop THEN
    Motor := FALSE;
ELSIF Start THEN
    Motor := TRUE;
END_IF;
RunLamp := Motor;

```

这里没有自保持支路。如果两个条件都不成立，IF 语句**不会碰** Motor，所以输出就保留上一个扫描周期的值。记忆存在变量里，而不是存在一个反馈触点里。因为先检查 STOP，所以两个按钮同时按下时它获胜。

## 版本 4：TIA Portal 里的 SCL

SCL 是西门子对 IEC 61131-3 结构化文本的实现，所以逻辑完全一样。在 TIA Portal 里能看见的差别是**标签语法**：全局 PLC 变量用双引号，块内的局部变量以 # 开头。

```pascal
// Global PLC tags in TIA Portal
"Motor" := ("Start" OR "Motor") AND "Stop";
"RunLamp" := "Motor";

```

或者写成显式 STOP 优先：

```pascal
IF NOT "Stop" THEN
    "Motor" := FALSE;
ELSIF "Start" THEN
    "Motor" := TRUE;
END_IF;

```

如果你已经会用 CODESYS 或 Connected Components Workbench 里的结构化文本，那么 SCL 你第一天就能读。

## 附加：SET / RESET 版本

还有第四种常见写法：置位与复位线圈。START 置位电机，STOP 复位它。

```text
// Rung 0
 Start          Motor
-----[ ]--------(S)--
// Rung 1
 Stop           Motor
-----[/]--------(R)--

```

用结构化文本写：

```pascal
IF Start THEN
    Motor := TRUE;
END_IF;
IF NOT Stop THEN
    Motor := FALSE;
END_IF;

```

这里**顺序很重要**。复位在置位之后执行，所以两个按钮同时按下时，复位是本次扫描里最后一次写入，STOP 获胜。把这两个梯级对调，START 就会获胜。这里的 STOP 指令用的是常闭触点，因为复位必须在 STOP 信号为 FALSE 时动作。

## 梯形图 vs 结构化文本：对比

实践中，大多数机器程序是两者混用的。互锁、与安全相关的许可条件、I/O 映射通常写在梯形图里，因为维修团队凌晨三点读的是它。计算、配方、通信和状态机交给结构化文本。

|      | 梯形图（LAD / LD）       | 结构化文本（ST / SCL） |
| ---- | ------------------- | --------------- |
| 读起来像 | 电路图 / 接触器回路         | 程序代码            |
| 最擅长  | 布尔互锁、I/O 映射、给维修人员排故 | 计算、循环、数据处理、状态机  |
| 在线监视 | 能流可视化，一眼看出哪里断       | 看变量值与表达式求值      |
| 丢掉的  | 复杂运算写起来笨重           | 「一眼看出哪一条不通」     |
| 典型用户 | 电工、维修、调试            | 程序员、算法、通信       |

## 语言会改变扫描周期吗？

对这种启停回路这样的简单布尔逻辑，梯形图与结构化文本在扫描周期上的差别通常可以忽略。两者都会被控制器的工程工具编译成机器码，结果更多取决于控制器本身、编译器和程序怎么写，而不是取决于你用哪个编辑器。对大量数学运算或对数组做循环，结构化文本可能更快，原因很简单：它表达这些操作更直接。**如果时序真的重要，就在你的目标控制器上测周期时间，不要猜。**

## 其他 IEC 61131-3 语言与厂商平台

梯形图和结构化文本只是 IEC 61131-3 定义的其中两种语言。其他的是功能块图（FBD）、用于步序的顺序功能图（SFC），以及更老的指令表（IL）——标准已把它标为废弃。西门子的 STL 是老一代西门子控制器里类似的一种文本语言。

能用哪些语言取决于平台：

- **西门子 TIA Portal：** S7-1500 上支持 LAD、FBD、SCL、GRAPH（SFC）和 STL。
- **罗克韦尔 Studio 5000（ControlLogix、CompactLogix）：** 梯形图、功能块图、结构化文本和 SFC。
- **罗克韦尔 Connected Components Workbench（Micro800）：** 梯形图、功能块图和结构化文本。
- **CODESYS：** 全部 IEC 61131-3 语言，外加 CFC。

可以在一个项目里混用语言：一个梯形图例程做互锁，它调用一个结构化文本写的功能块做计算。这种组合在真实的机器程序里很常见。

## 三个常见错误

- **STOP 只放在 START 支路里。** 这样自保持支路就绕过了 STOP，电机停不下来。STOP 必须与整个并联组串联。
- **给常闭按钮用了常闭指令。** 常闭接线本身已经让信号在松开时为 TRUE。在程序里再取反一次，逻辑就反了。
- **按住 START 做测试。** 自保持缺失在 START 被按住时是看不出来的。永远要测「短按一下然后松开」。

## 在仿真器里试一遍

原文把两个版本并排放在作者团队自己的免费在线仿真器里：Micro850 配置下有梯形图（LD）与结构化文本两个页面，S7-1200 配置下有 LAD 与 SCL；加一个第二页面、来回切换，按下 START 和 STOP 就能看实时值怎么变。原文还挂了带自动检查的启停练习与三门课——那些都是作者所在机构的产品，我们不在正文里替它放链接。

同一个回路的练习入口用我们自己的：[PLC 在线仿真器](https://plcsim.bimant.com/?utm%5Fsource=hubwiz-blog&utm%5Fmedium=referral&utm%5Fcampaign=lad-vs-st) 是免费网页版梯形图编辑器与仿真器，不用装博途、不用授权，打开就能画。这段回路的三个版本正好可以在里面各走一遍：

- **起保停**：START 与 Motor 的常开触点并联，再与 STOP 串联——对应版本 1；
- **RUN 指示灯**：直接用 Motor 的常开触点驱动——对应梯级 1；
- **SET/RESET 对照**：用置位/复位线圈搭一遍，然后把两个梯级的顺序故意对调，看谁获胜。

练完不必重画：同一张梯形图可以直接转成 SCL（[梯形图转 SCL](https://tia.hubwiz.com/lad2scl?utm%5Fsource=blog&utm%5Fmedium=article&utm%5Fcampaign=lad-vs-st)），也可以带进博途工程里逐网络对照（[TiaLink](https://tia.hubwiz.com/tia-link?utm%5Fsource=blog&utm%5Fmedium=article&utm%5Fcampaign=lad-vs-st)）。

这是一个**教学控制回路，不是安全等级急停设计**。真正的急停功能需要安全等级硬件和风险评估。

## 继续练：三个电路把差别练出来

- **起保停**（本文回路）：梯形图与 SCL 各写一遍，再写 SET/RESET 版；
- **电机正反转**：互锁的优先级在梯形图里是「位置」，在 SCL 里是「顺序」，这正好是两种语言的差别；
- **星三角启动**：定时器与状态切换，用来验证「记忆存在变量里」和「记忆存在触点里」的差别。

三个电路都可以在仿真器里画完直接跑；想先看现成写法，可以在[梯形图示例库](https://tia.hubwiz.com/learn-lad/?utm%5Fsource=blog&utm%5Fmedium=article&utm%5Fcampaign=lad-vs-st) 里按电路类型翻。

## 常见问题

### 梯形图比结构化文本更好吗？

一般来说没有谁更好。梯形图更适合布尔互锁，以及维修团队排故。结构化文本更适合数学、数据处理、循环和状态机。大多数程序两者都用。

### LAD 和 LD 是同一种语言吗？

是。LD（Ladder Diagram）是 IEC 61131-3 里的名字，LAD 是西门子在 TIA Portal 里对同一种梯形图语言的叫法。罗克韦尔和 CODESYS 用 LD。

### PLC 里的自保持电路是什么？

自保持（seal-in，也叫 holding 或 latching）电路让一个输出在点动输入松开之后继续保持。在梯形图里，它就是输出自己的一个触点，与 START 触点并联。

### 为什么 STOP 按钮要接常闭？

为了控制功能的安全。用常闭按钮，导线断开的效果与按下 STOP 相同，于是机器停下来，而不是变得无法停止。

### SCL 和结构化文本是同一种东西吗？

SCL 是西门子对 IEC 61131-3 结构化文本的实现。语法几乎相同；主要差别在 TIA Portal 的特殊写法，比如全局变量加双引号、局部变量用 #。

### 应该先学梯形图还是结构化文本？

大多数初学者从梯形图开始，因为它把逻辑可视化了。接下来学结构化文本，因为一旦超出简单 I/O 逻辑，你一定会用到它。

## 我们的整理：这段代码里藏着的三个判据

这篇的价值在于「同一件事写四遍」，但真正要带走的是三条判据，而不是四种写法：

1. **记忆在哪里。** 版本 2 和 3 里，状态的保持靠的是「扫描周期之间变量不被覆盖」这个隐含契约——一旦有人在别处也写 `Motor`，自保持就没了。梯形图和 SET/RESET 把记忆写在明面上，代价是断电重启后要知道它从哪个状态开始。**判断法：搜索这个变量被赋值的所有地方，只要不唯一，就别用「不碰它」当保持。**
2. **优先级写在哪里。** 版本 1 靠串联的物理位置表达 STOP 优先，版本 3 靠 IF 的分支顺序，SET/RESET 靠两段代码的先后。三种都能对，但只有一种会在你改动时**提醒你**：把 STOP 从串联里挪走，梯级会明显不对；把两段 IF 对调，代码看着一样却错了。所以代码评审时要专门查「顺序表达优先级」的那一类。
3. **谁在什么时间读这段代码。** 作者给了答案：凌晨三点的维修人员读梯形图，写算法的人读结构化文本。这不是风格偏好，是**读者模型**。同一条回路，如果维护方是外部团队，就把互锁留在梯形图里。

两条与 TIA Portal 相关的补充：

- 文中提到 STOP 用常闭指令、以及 NC 接线导致的取反陷阱。在博途里，这个话题的实际落点是**变量的常开/常闭语义**与**指令触点的取反**是两件事，混起来就会出现「编译 0 错误、机器不动」。改动这类回路时，先确认现场按钮的接线型式，再改程序。
- 关于「混用语言」：博途里同一个 FB 可以有不同的编程语言实现，但**一个块只能选一种**。要把梯形图互锁和 SCL 计算合起来，做法是在 OB/FB 里调用另一个语言的块，而不是在同一个块里切换。

如果手上的工程是别人写的、并且梯形图与 SCL 混杂，先要看清的是「谁在写这个变量」——同一个 `Motor` 被两个块写，自保持就会随时消失。这种调用关系与写点，可以在 [TiaLink](https://tia.hubwiz.com/tia-link?utm%5Fsource=blog&utm%5Fmedium=article&utm%5Fcampaign=lad-vs-st-graph) 的项目知识图谱里直接查（本机读工程、只读不改、不上传项目文件）；要整段梯形图换成 SCL、再逐网络对照验证，对应的是 [梯形图转 SCL](https://tia.hubwiz.com/lad2scl?utm%5Fsource=blog&utm%5Fmedium=article&utm%5Fcampaign=lad-vs-st-graph)。转换之后仍要按文中的三道判据逐条复核，尤其是记忆与优先级这两处。

来源：[Ladder Logic vs Structured Text: One Start/Stop Program in LAD, ST and SCL](https://controlbyte.tech/blog/ladder-logic-vs-structured-text/?ref=hubwiz.com)（Simon Adamek，ControlByte，2026-11-12）。原文另附作者团队的仿真器与课程链接，本文不重复其外链。

本文由汇智网 · Software 2.0 编译整理，转载请注明出处。

> **这是「AI × 工业 / PLC」专题的一部分。**完整地图见：[AI × 工业 / PLC 完全指南](https://www.hubwiz.com/blog/ai-industrial-stack/)