2. PLC编程基础回顾
在深入探讨功能块(FB)的封装与复用之前,我们必须先回到PLC编程的“宪法”——IEC 61131-3标准。这一标准不仅统一了全球PLC编程的术语与模型,更定义了五种编程语言及其内在逻辑关系。理解FB在标准中的定位,是理解结构化编程的基石。本章将系统梳理该标准的框架、五种语言的特点,并重点剖析FB(功能块)与函数(FC)的本质区别及其在工程复用中的核心地位。
上图清晰地展示了IEC 61131-3的软件模型层级:从顶层的配置(硬件映射)到底层的编程语言,FB位于程序组织单元(POU)的中间层,是连接程序与底层函数的桥梁。下面我们逐一拆解。
2.1 IEC 61131-3标准核心原理
IEC 61131-3是国际电工委员会制定的可编程控制器编程语言标准。它并非强制规定某一种语言,而是定义了软件模型、通信模型、编程模型三大支柱。其核心价值在于:程序组织单元(POU)的划分。POU是用户程序的最小软件单元,分为函数(FC)、功能块(FB)和程序(PROGRAM)三类。
- 软件模型:从“配置”到“资源”再到“任务”的层级,实现了硬件无关的编程抽象。
- 通信模型:通过全局变量和直接表示地址(如%I、%Q)实现数据交换。
- 编程模型:允许在同一个项目中混合使用五种语言,极大提升了灵活性。
该标准最重要的贡献是引入了封装与复用的概念。在标准之前,PLC程序通常是线性化的指令列表,难以维护。标准推行后,工程师可以将重复的算法(如PID控制、电机启停逻辑)封装为FB,通过实例化多次调用,从而大幅降低代码冗余。
2.2 五种编程语言概述与选型判断
标准定义了五种编程语言,每种语言都有其独特的语法结构和适用场景。工程师需要根据控制逻辑的复杂度和团队习惯进行选择。
| 语言 | 缩写 | 图形/文本 | 典型应用场景 | 优势 | 劣势 |
|---|---|---|---|---|---|
| 梯形图 | LD | 图形 | 离散逻辑、继电器控制回路 | 直观、电气工程师易上手 | 复杂数学运算与状态机难表达 |
| 功能块图 | FBD | 图形 | 信号流、过程控制、PID回路 | 适合数据流逻辑,便于FB调用 | 逻辑跳转不直观 |
| 结构化文本 | ST | 文本 | 复杂算法、数组处理、数学计算 | 类似Pascal,功能强大,注释方便 | 对电气背景人员门槛较高 |
| 指令表 | IL | 文本 | 底层优化、小型PLC程序 | 执行效率高,接近汇编 | 可读性差,维护困难 |
| 顺序功能图 | SFC | 图形 | 批量生产、步进流程、状态机 | 清晰划分步骤与转换条件 | 不适合纯组合逻辑 |
判断方法:在工程实践中,我们通常遵循“逻辑用LD,流程用SFC,算法用ST,通讯用FBD”的口诀。但无论使用哪种语言,FB都可以被无缝调用。例如,在LD中调用一个电机控制FB,在ST中调用一个PID FB,在FBD中连接两个FB的输入输出。
2.3 FB(功能块)与FC(函数)的本质区别
这是初学者最容易混淆的概念。虽然两者都是POU,但存在根本性差异:
- 记忆性(存储):FB拥有内部状态(静态变量),调用结束后数据会保留;FC没有内部状态,每次调用都是全新的,输出仅由输入决定。
- 实例化:FB必须创建实例(Instance)才能使用,每个实例拥有独立的数据副本;FC无需实例化,直接调用。
- 返回值:FC通常只有一个返回值(类似C语言函数);FB可以有多个输出变量,且输出在调用后持续存在。
举例说明:编写一个“平均值计算”算法,输入三个数值,输出平均值。这适合用FC,因为无需记忆。而编写一个“电机软启动”控制,需要记录当前启动时间、电流积分值,这必须用FB,因为需要跨扫描周期保持数据。
2.4 FB在结构化编程中的核心地位与实战场景
在大型自动化项目中,结构化编程的核心思想是“高内聚、低耦合”。FB正是实现这一思想的最佳载体。通过将设备控制逻辑(如阀门、变频器、伺服)封装为FB,程序变得极具可读性和可维护性。
操作流程(如何定义一个FB):
- 定义接口:明确输入变量(如启动命令、速度设定值)、输出变量(如运行反馈、故障代码)、内部变量(如计时器累计值)。
- 编写算法:在FB内部使用ST或LD编写控制逻辑,确保只通过接口与外部交互。
- 设置调用环境:在任务(Task)中调用FB实例,并分配扫描周期。
- 调试与监控:通过在线监控查看FB实例的内部变量,快速定位问题。
案例拆解:假设我们需要控制一条生产线上的10台变频器。如果不用FB,我们需要编写10段几乎相同的启动/停止/调速代码。使用FB后,我们只需编写一个“VFD_Control”FB,然后创建10个实例(VFD_1, VFD_2, ... VFD_10)。每个实例独立运行,互不干扰。
| 步骤 | 传统方式(无FB) | 结构化方式(使用FB) |
|---|---|---|
| 代码量 | 约500行重复逻辑 | FB定义100行 + 10行实例调用 |
| 修改需求 | 需修改10处 | 仅需修改FB内部一处 |
| 故障排查 | 需逐段检查 | 直接监控对应实例的故障输出 |
在这个案例中,FB的封装不仅减少了工作量,更重要的是将工程师的注意力从“如何实现”转移到了“如何配置”。当需要调整启动斜坡时间时,只需修改FB内部参数,所有实例自动生效。
2.5 常见误区与总结复盘
在推广IEC 61131-3和FB的过程中,工程师常陷入以下误区:
- 误区一:FB万能论。认为所有逻辑都必须封装成FB。实际上,简单的逻辑(如一个与门)直接使用LD或FBD更高效,强行封装反而增加复杂度。
- 误区二:忽视数据作用域。FB内部应避免直接访问全局变量,否则会破坏封装性,导致“牵一发而动全身”。
- 误区三:实例滥用。虽然FB支持多实例,但每个实例都会占用内存。在资源受限的小型PLC上,创建过多实例可能导致内存溢出。
- 误区四:语言割裂。认为ST是高级语言,LD是低级语言。实际上,在同一个工程中混合使用语言是标准所鼓励的,应发挥各自优势。