1.IEC61131-3标准
IEC 61131-3 是国际电工委员会(IEC)制定的关于可编程控制器(PLC)的重要标准,属于 IEC 61131 系列标准的第3部分,全称为:
“Programmable controllers – Part 3: Programming languages”
(可编程控制器 — 第3部分:编程语言)
📌 核心目标
IEC 61131-3 的核心目标是:
- 统一工业自动化领域的 PLC 编程语言规范
- 提升不同厂商设备之间的互操作性与代码可移植性
- 引入现代软件工程理念(如模块化、封装、复用)
🔧 五种标准化编程语言
IEC 61131-3 定义了5 种编程语言,分为图形化和文本化两类:
| 类型 | 语言缩写 | 中文名称 | 特点 |
|---|---|---|---|
| 图形化 | LD | 梯形图(Ladder Diagram) | 直观,适合电气逻辑控制,源自继电器电路 |
| 图形化 | FBD | 功能块图(Function Block Diagram) | 基于信号流的功能块连接,适合过程控制 |
| 图形化 | SFC | 顺序功能图(Sequential Function Chart) | 状态机式编程,适合流程控制(如启停序列) |
| 文本化 | ST | 结构化文本(Structured Text) | 类似 Pascal/C,适合复杂算法、数学运算 |
| 文本化 | IL | 指令列表(Instruction List) | 类汇编语言,低级但高效(注:在 IEC 61131-3:2013 后已弃用) |
✅关键优势:允许在同一个项目中混合使用多种语言,按需选择最合适的表达方式。
🧱 模块化与程序组织单元(POU)
IEC 61131-3 引入了程序组织单元(POU)概念,支持三种类型:
- Program(主程序)
- Function(函数,无内部状态,纯输入输出)
- Function Block(功能块,可保存内部状态,支持实例化)
这使得代码可以:
- 封装复用
- 隐藏实现细节
- 提高可维护性
🧾 变量与数据类型
- 支持标准数据类型(BOOL, INT, REAL, STRING 等)
- 允许用户自定义结构体(STRUCT)、枚举(ENUM)、数组等
- 变量声明格式示例:
MyVar : INT := 100; // 初始值为100的整型变量 - 支持自动/手动地址分配(如 %IX0.1 表示输入位)
🌐 跨平台兼容性
只要 PLC 开发环境符合 IEC 61131-3 标准(如 CODESYS、TwinCAT、OpenPCS、国产汇川、和利时等),你写的程序逻辑就具备:
- 品牌无关性
- 一定程度的可移植性
- 降低厂商锁定风险
📚 国内对应标准
中国等效采用 IEC 61131-3,发布为:
- GB/T 15969.3《可编程控制器 第3部分:编程语言》
📅 最新版本
- IEC 61131-3:2025(第4版)已于2025年5月22日发布
- 此前主要版本包括 1993(初版)、2003(第二版)、2013(第三版)
注:2013 版已弃用 IL(指令列表),2025 版进一步强化了安全、面向对象扩展和现代工程实践支持。
✅ 总结:IEC 61131-3 解决了什么问题?
| 传统PLC痛点 | IEC 61131-3 的解决方案 |
|---|---|
| 各厂商语言不兼容 | 统一5种标准语言 |
| 代码无法复用 | 模块化 POU + 封装 |
| 逻辑混乱难维护 | 结构化编程 + 清晰接口 |
| 复杂算法难实现 | 支持 ST 高级文本语言 |
| 新人学习成本高 | 标准化降低碎片化 |
如果你是自动化工程师、控制系统开发者或学生,掌握 IEC 61131-3 是进入工业自动化领域的基石技能。建议从 LD 和 ST 入手,逐步理解 POU、数据类型和多语言协同开发。
2.提供一个简单的 IEC 61131-3 示例程序
当然可以!下面提供一个简单但完整的 IEC 61131-3 示例程序,使用结构化文本(Structured Text, ST)和顺序功能图(Sequential Function Chart, SFC)两种语言实现一个常见的工业场景:
🎯 应用场景:电机启停控制带安全互锁
功能需求:
- 按下启动按钮(Start),电机运行;
- 按下停止按钮(Stop),电机停止;
- 如果急停按钮(EStop)被按下 或电机过热(Overheat = TRUE),则立即停止电机并禁止重启,直到故障复位;
- 提供一个复位按钮(Reset)用于清除故障状态。
✅ 第一部分:变量声明(在全局变量表或 POU 中)
// 全局变量 (通常在 GVL - Global Variable List 中定义) VAR_GLOBAL Start : BOOL := FALSE; // 启动按钮(常开) Stop : BOOL := FALSE; // 停止按钮(常开) EStop : BOOL := FALSE; // 急停按钮(常闭,逻辑取反后使用) Overheat : BOOL := FALSE; // 电机过热传感器 Reset : BOOL := FALSE; // 复位按钮 MotorOn : BOOL := FALSE; // 电机输出线圈 Fault : BOOL := FALSE; // 故障标志 END_VAR💡 注:实际硬件中,急停按钮通常是常闭触点,因此
EStop = FALSE表示急停被按下。这里为简化,假设EStop = TRUE表示急停激活。
✅ 第二部分:用结构化文本(ST) 实现逻辑
创建一个Function Block(FB_MotorCtrl):
FUNCTION_BLOCK FB_MotorCtrl VAR_INPUT Start : BOOL; Stop : BOOL; EStop : BOOL; Overheat : BOOL; Reset : BOOL; END_VAR VAR_OUTPUT MotorOn : BOOL; Fault : BOOL; END_VAR VAR _running : BOOL; // 内部状态 END_VAR // 故障条件:急停或过热 IF EStop OR Overheat THEN Fault := TRUE; END_IF; // 复位故障(仅当急停释放且无过热时才允许复位) IF Reset AND NOT EStop AND NOT Overheat THEN Fault := FALSE; END_IF; // 电机控制逻辑(仅在无故障时允许操作) IF NOT Fault THEN IF Start THEN _running := TRUE; END_IF; IF Stop THEN _running := FALSE; END_IF; ELSE _running := FALSE; // 故障时强制停机 END_IF; MotorOn := _running;✅ 第三部分:用顺序功能图(SFC) 实现相同逻辑(可选对比)
SFC 更适合描述状态流程。以下是文字描述的 SFC 结构(可用图形化工具绘制):
[初始步 Initial] | | (Transition: always true) v [等待启动 WaitStart] | | (Transition: Start AND NOT Fault) v [电机运行 Running] | | (Transition: Stop OR Fault) v [等待复位 WaitReset] ←─┐ | | | (Transition: Reset AND NOT (EStop OR Overheat)) └────────────────────┘每个步的动作:
- WaitStart: MotorOn := FALSE;
- Running: MotorOn := TRUE;
- WaitReset: MotorOn := FALSE; Fault := TRUE;
💡 在支持 SFC 的 IDE(如 CODESYS、TwinCAT)中,你可以用图形拖拽实现上述流程。
✅ 主程序调用(Program)
PROGRAM PLC_PRG VAR motorCtrl : FB_MotorCtrl; END_VAR // 调用功能块 motorCtrl( Start := Start, Stop := Stop, EStop := EStop, Overheat := Overheat, Reset := Reset, MotorOn => MotorOn, Fault => Fault );🔧 实际部署说明
- 将
Start,Stop等连接到 PLC 的数字输入模块; MotorOn输出到继电器或变频器使能端;- 可在 HMI 上显示
Fault状态并提供Reset按钮。
✅ 优势体现(符合 IEC 61131-3)
- 模块化:逻辑封装在
FB_MotorCtrl中,可复用; - 多语言支持:既可用 ST 编写复杂逻辑,也可用 SFC 描述流程;
- 清晰接口:输入/输出明确,便于调试与维护;
- 标准兼容:可在任何支持 IEC 61131-3 的平台(CODESYS、Beckhoff、Siemens TIA Portal*等)上移植(*注:西门子部分支持,需注意语法差异)。