4、PLC编程语言基础:LAD、FBD、SCL、STL对比与选择

做风电控制这些年,我经常被问到同一个问题:

“到底该学哪种PLC编程语言?”

说实话,这问题没有标准答案。但如果你让我选,我会说——别只学一种。每种语言都有自己的脾气,就像工具箱里的扳手和螺丝刀,各有各的用处。

4.1 四种语言,先混个脸熟

IEC 61131-3标准定义了五种编程语言,风电行业最常用的是下面四种。我一个个说。

语言 全称 特点 风电场景
LAD 梯形图 图形化,像继电器电路 逻辑控制、急停、连锁
FBD 功能块图 模块化,数据流清晰 PID、滤波、算法封装
SCL 结构化文本 类Pascal,适合复杂计算 变桨角度计算、功率曲线
STL 指令表 汇编风格,效率高 底层驱动、中断处理

4.2 LAD(梯形图)—— 电工师傅的最爱

梯形图长什么样?说白了,就是左右两条竖线,中间一堆触点线圈。左边是电源,右边是输出。

我在风电现场调试时,最常用LAD来处理急停逻辑。你想想看,一个急停按钮按下,所有继电器都得断开,这个用LAD画出来,一目了然。

// 一个简单的电机启动/停止梯形图逻辑
// 启动按钮 I0.0,停止按钮 I0.1,电机输出 Q0.0
// 自锁回路

   I0.0      I0.1      Q0.0
---| |-------|/|-------( )---
   |                  |
   Q0.0              |
---| |---------------|

优点:

  • 直观,电工出身的人一看就懂
  • 调试时在线监控方便,哪个触点通了一目了然
  • 适合简单的开关量控制

缺点:

  • 复杂运算写起来要命
  • 超过100行就乱成一锅粥
  • 数组、循环?别想了
我的建议:急停、安全链、手动操作面板这些,用LAD。别用它写变桨角度计算,你会疯的。

4.3 FBD(功能块图)—— 模块化思维的好帮手

FBD就像搭积木。你把一个个功能块拖出来,连上线,数据就从输入流到输出了。

我记得做变桨系统时,PID调节器就是用FBD搭的。比例、积分、微分三个模块,输入是角度偏差,输出是转矩指令。调试的时候改参数特别方便。

// FBD风格示意(文字描述)
// 输入:角度设定值 Setpoint,实际角度 Actual
// 输出:转矩指令 TorqueCmd

   Setpoint ──┬──[SUB]──┬──[PID]── TorqueCmd
              │         │
   Actual  ───┘         │
                        │
   Kp ──[MUL]───────────┘
   Ki ──[INT]
   Kd ──[DER]

优点:

  • 模块化,复用性强
  • 数据流清晰,适合信号处理
  • 封装好的功能块可以直接调用

缺点:

  • 逻辑分支多了,连线像蜘蛛网
  • 调试时看不到中间变量,得自己加监控
避坑指南:我曾经在FBD里写了一个带20个输入的功能块,结果连线连到怀疑人生。后来学乖了,超过10个输入就拆成子功能块。

4.4 SCL(结构化文本)—— 程序员的菜

SCL长得很像Pascal,也像C语言。如果你写过高级语言,上手SCL基本没难度。

风电里最复杂的计算,比如变桨角度查表、功率曲线拟合、故障诊断逻辑,我全用SCL写。为什么?因为能写注释,能写循环,能写条件判断,代码结构清晰。

// SCL 示例:变桨角度限幅
// 输入:目标角度 TargetAngle (REAL)
// 输出:限幅后的角度 LimitedAngle (REAL)

IF TargetAngle > 90.0 THEN
    LimitedAngle := 90.0;
ELSIF TargetAngle < 0.0 THEN
    LimitedAngle := 0.0;
ELSE
    LimitedAngle := TargetAngle;
END_IF;

// 顺便做个故障判断
IF ABS(TargetAngle - ActualAngle) > 5.0 THEN
    FaultFlag := TRUE;
ELSE
    FaultFlag := FALSE;
END_IF;

优点:

  • 处理复杂逻辑得心应手
  • 代码可读性好,能写注释
  • 支持数组、结构体、循环

缺点:

  • 对电工师傅不友好
  • 在线监控不如LAD直观
我的习惯:所有算法、计算、数据处理,一律用SCL。逻辑控制、连锁保护,用LAD。各司其职。

4.5 STL(指令表)—— 老司机的选择

STL是汇编风格的PLC语言。一条指令一个操作,效率极高,但可读性极差。

说实话,我现在很少用STL写完整程序了。只有在两种情况下会用:一是做底层驱动,比如高速计数器、脉冲输出;二是程序空间不够了,用STL能省几个字节。

// STL 示例:简单的位操作
// 将 M0.0 置位,然后延时 100ms

   SET
   =   M0.0
   L   S5T#100MS
   SE  T1
   A   T1
   R   M0.0

优点:

  • 执行效率最高
  • 占用内存最少
  • 能实现一些其他语言做不到的底层操作

缺点:

  • 可读性差,维护困难
  • 写100行就头晕
  • 新人根本看不懂
警告:别在团队项目里大量使用STL。你写的时候爽,别人维护的时候想打人。我见过一个项目,前任用STL写了3000行,后来没人敢碰,最后全部重写。

4.6 怎么选?我的实战经验

说了这么多,到底怎么选?我给你一个简单粗暴的原则:

  • 逻辑控制、连锁保护、急停 → LAD
  • 信号处理、PID、滤波、封装算法 → FBD
  • 复杂计算、数据处理、故障诊断 → SCL
  • 底层驱动、中断、优化性能 → STL(慎用)

但说实话,实际项目中很少只用一种语言。我写变桨程序时,主逻辑用SCL,安全链用LAD,PID用FBD。混着用,取长补短。

核心原则:哪种语言能让代码更清晰、更容易维护,就用哪种。别为了炫技用STL写一个简单的与或逻辑,也别用LAD写一个100行的数学公式。

4.7 知识体系一览

下面这张图,是我自己总结的四种语言在风电项目中的定位。你一看就明白。

风电PLC编程语言选择框架 LAD 梯形图 逻辑控制 · 连锁保护 · 急停 优点:直观易调试 缺点:复杂运算困难 FBD 功能块图 PID控制 · 滤波 · 算法封装 优点:模块化复用 缺点:连线复杂 SCL 结构化文本 复杂计算 · 数据处理 · 诊断 优点:代码清晰 缺点:对电工不友好 STL 指令表 底层驱动 · 中断 · 性能优化 优点:效率最高 缺点:可读性差 混用取长补短

嗯,这张图你看懂了吗?简单说就是:没有最好的语言,只有最合适的场景

最后说一句:别纠结学哪种。先精通一种(我建议SCL,因为通用性强),然后慢慢拓展。等你四种都玩过一遍,自然就知道什么时候该用哪个了。


公众号:蓝海资料掘金营,微信deep3321