梯形图还是结构化文本?同一个启停回路,LAD、ST、SCL 写四遍

同一个启停自保持回路写四遍:LAD 梯级、布尔表达式、IF/ELSIF、SCL。看每种写法丢掉了什么,比看功能对比表有用。

分享
梯形图还是结构化文本?同一个启停回路,LAD、ST、SCL 写四遍

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

同一个启停程序:左边是梯形图,右边是结构化文本。

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

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

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

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

Motor = Stop AND (Start OR Motor)

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

版本 1:梯形图

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

梯级 0:START 与 Motor 触点并联,再与 STOP 串联。梯级 1:RUN 指示灯跟随电机。
// Rung 0
 Start        Stop      Motor
--+--[ ]--+----[ ]-----( )--
  | Motor |
  +--[ ]--+
// Rung 1
 Motor              RunLamp
-----[ ]-----------( )--

梯形图在这里擅长什么:

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

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

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

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

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

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

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

在仿真器里运行的 IF / ELSIF 版本,每个变量旁边显示实时值。
(* 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 变量用双引号,块内的局部变量以 # 开头。

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

或者写成显式 STOP 优先:

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

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

附加:SET / RESET 版本

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

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

用结构化文本写:

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 在线仿真器 是免费网页版梯形图编辑器与仿真器,不用装博途、不用授权,打开就能画。这段回路的三个版本正好可以在里面各走一遍:

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

练完不必重画:同一张梯形图可以直接转成 SCL(梯形图转 SCL),也可以带进博途工程里逐网络对照(TiaLink)。

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

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

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

三个电路都可以在仿真器里画完直接跑;想先看现成写法,可以在梯形图示例库 里按电路类型翻。

常见问题

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

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

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 的项目知识图谱里直接查(本机读工程、只读不改、不上传项目文件);要整段梯形图换成 SCL、再逐网络对照验证,对应的是 梯形图转 SCL。转换之后仍要按文中的三道判据逐条复核,尤其是记忆与优先级这两处。

来源:Ladder Logic vs Structured Text: One Start/Stop Program in LAD, ST and SCL(Simon Adamek,ControlByte,2026-11-12)。原文另附作者团队的仿真器与课程链接,本文不重复其外链。

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

这是「AI × 工业 / PLC」专题的一部分。完整地图见:AI × 工业 / PLC 完全指南