第4章:IEC 61131-3标准与编程语言

各位搞风电的同行,咱们今天聊聊IEC 61131-3这个标准。说实话,我刚入行那会儿,觉得这玩意儿就是个理论框架,离实际编程远着呢。直到有一次在风场调试,老外工程师指着我的程序说“你这不符合标准”,我才意识到——嗯,这东西真不是摆设。

4.1 标准概述:为什么要有这个标准?

你想想看,十年前的风机PLC,各家有各家的写法。西门子的程序拿到倍福上用不了,倍福的代码搬到贝加莱上得重写。这就像每个风场都有自己的“方言”,沟通成本极高。

IEC 61131-3就是来统一“普通话”的。它定义了五种编程语言,让不同品牌的PLC能互相理解。我个人习惯把这五种语言分成两类:

  • 图形化语言:LD(梯形图)、FBD(功能块图)、SCL(顺序功能图)
  • 文本化语言:ST(结构化文本)、IL(指令表)

核心要点:标准不是限制你的创造力,而是让程序更可读、可维护、可移植。我在项目中遇到过,一个老工程师用LD写了三千行逻辑,后来新人接手直接崩溃。如果按标准模块化设计,至少能省一半时间。

下面这张图是我自己整理的IEC 61131-3知识体系,你看一眼就能明白各语言之间的关系:

IEC 61131-3 编程语言体系 IEC 61131-3 图形化语言 文本化语言 扩展语言 LD 梯形图 FBD 功能块图 ST 结构化文本 IL 指令表 SCL 顺序功能图 应用场景建议 • 逻辑控制、继电器电路 → LD 梯形图 • 数据处理、算法运算 → ST 结构化文本 • 流程控制、状态切换 → SCL 顺序功能图

4.2 LD(梯形图)基础

梯形图是风电行业用得最多的语言,没有之一。为什么?因为它长得像继电器电路,老电工一看就懂。我在风场做调试时,很多现场工程师只认梯形图,你给他写ST代码,他直接说“看不懂”。

梯形图的核心逻辑就三个东西:

  • 常开触点(-| |-):条件为真时导通
  • 常闭触点(-|/|-):条件为假时导通
  • 线圈(-( )-):输出结果

我的经验:写梯形图时,记得把“安全链”放在最前面。比如急停信号、超速信号,这些必须用常闭触点串联。我曾经见过一个新手,把急停写成了常开,结果按下急停按钮风机反而继续转...那场面,啧啧。

举个简单的例子,风机启动的梯形图逻辑:

| 急停_OK | 风速_正常 | 电网_正常 | 启动_输出 |
|---| |-------| |-------| |-------( )---|
|          | 启动_输出 |          |          |
|---| |-------| |-------| |-------| |-------|

这段逻辑的意思是:急停正常、风速在范围内、电网正常,这三个条件同时满足,或者启动输出已经自保持,那么风机就处于启动状态。

4.3 FBD(功能块图)基础

功能块图,说白了就是把一个个功能模块拼起来。我个人特别喜欢用FBD做模拟量处理,比如变桨角度计算、温度转换这些。

FBD的写法像搭积木:

  • 左边是输入引脚
  • 中间是功能块(比如ADD、MUL、PID)
  • 右边是输出引脚

避坑指南:我曾经在变桨控制里用FBD做PID调节,结果发现功能块的输出没有做限幅。变桨角度直接冲到了95度,差点触发硬件保护。记住,所有模拟量输出都要加LIMIT功能块。

一个典型的风机功率计算FBD示例:

风速 ---|       |
        | MUL   |--- 理论功率
风速 ---|       |
        |       |
密度 ---|       |

4.4 ST(结构化文本)基础

ST是我最推荐风电工程师掌握的语言。它像C语言,但比C简单。处理数组、字符串、复杂运算时,ST比梯形图高效十倍。

ST的基本语法:

  • 赋值用 :=
  • 条件用 IF...THEN...ELSE
  • 循环用 FOR...DO
  • 注释用 (* ... *)

举个例子,计算风机平均风速:

VAR
    WindSpeed : ARRAY[1..10] OF REAL;
    SumSpeed  : REAL := 0.0;
    AvgSpeed  : REAL;
    i         : INT;
END_VAR

FOR i := 1 TO 10 DO
    SumSpeed := SumSpeed + WindSpeed[i];
END_FOR

AvgSpeed := SumSpeed / 10.0;

注意:ST里变量声明一定要写清楚类型。我见过有人把REAL声明成INT,结果风速小数部分全丢了,算出来的发电量偏差巨大。嗯,这种低级错误其实很容易犯。

4.5 SCL(顺序功能图)基础

SCL也叫SFC(Sequential Function Chart),最适合描述流程控制。比如风机的启动流程:待机→启动→并网→发电→停机,每一步就是一个状态。

SCL的核心元素:

  • 步(Step):每个状态
  • 转换(Transition):状态切换条件
  • 动作(Action):在该状态下执行的操作

我建议用SCL写风机的主控逻辑,因为流程清晰,调试时一眼就能看出当前在哪个状态。有一次在风场排查故障,我打开SCL程序,看到风机卡在“等待并网”这一步,再查转换条件,发现是电网频率信号丢了——十分钟搞定。

4.6 IL(指令表)基础

指令表是最古老的语言,现在用得少了。但有些老系统还在用,比如早期的伍德沃德控制器。IL像汇编语言,一条指令一个操作。

IL的基本指令:

指令 含义 示例
LD 加载值 LD WindSpeed
ST 存储值 ST AvgSpeed
ADD 加法 ADD 10
GT 大于比较 GT 25.0
JMP 跳转 JMP Label1

我的建议:除非你维护的是20年前的老系统,否则别用IL写新程序。可读性太差,维护成本高。我见过一个IL程序,整整500行没有注释,原作者离职后没人敢动。

4.7 语言选择策略

说了这么多,到底该用哪种语言?我的原则很简单:

  • 安全逻辑:用LD,现场电工能看懂,便于审核
  • 控制算法:用ST,计算能力强,代码简洁
  • 流程控制:用SCL,状态清晰,调试方便
  • 信号处理:用FBD,模块化设计,复用性好

实际项目中,往往是混合使用。比如主控用SCL写状态机,每个状态里用ST做计算,安全链用LD实现。这样各取所长,程序既高效又易读。

好了,这一章的内容就到这里。记住,语言只是工具,关键是思路。下次你写程序时,先想想:这个逻辑用哪种语言写最合适?想清楚了再动手,事半功倍。


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