2. PLC编程基础回顾

在深入探讨功能块(FB)的封装与复用之前,我们必须先回到PLC编程的“宪法”——IEC 61131-3标准。这一标准不仅统一了全球PLC编程的术语与模型,更定义了五种编程语言及其内在逻辑关系。理解FB在标准中的定位,是理解结构化编程的基石。本章将系统梳理该标准的框架、五种语言的特点,并重点剖析FB(功能块)与函数(FC)的本质区别及其在工程复用中的核心地位。

IEC 61131-3 软件模型与FB地位 配置 (Configuration) 资源 (Resource) — 处理单元 任务 (Task) — 调度控制 程序组织单元 (POU) 函数 (FC) 功能块 (FB) 程序 (PROGRAM) IEC 61131-3 编程语言 LD 梯形图 FBD 功能块图 ST 结构化文本 IL 指令表 SFC 顺序功能图 FB = 数据 + 算法 + 实例化

上图清晰地展示了IEC 61131-3的软件模型层级:从顶层的配置(硬件映射)到底层的编程语言,FB位于程序组织单元(POU)的中间层,是连接程序与底层函数的桥梁。下面我们逐一拆解。

2.1 IEC 61131-3标准核心原理

IEC 61131-3是国际电工委员会制定的可编程控制器编程语言标准。它并非强制规定某一种语言,而是定义了软件模型、通信模型、编程模型三大支柱。其核心价值在于:程序组织单元(POU)的划分。POU是用户程序的最小软件单元,分为函数(FC)、功能块(FB)和程序(PROGRAM)三类。

  • 软件模型:从“配置”到“资源”再到“任务”的层级,实现了硬件无关的编程抽象。
  • 通信模型:通过全局变量和直接表示地址(如%I、%Q)实现数据交换。
  • 编程模型:允许在同一个项目中混合使用五种语言,极大提升了灵活性。

该标准最重要的贡献是引入了封装与复用的概念。在标准之前,PLC程序通常是线性化的指令列表,难以维护。标准推行后,工程师可以将重复的算法(如PID控制、电机启停逻辑)封装为FB,通过实例化多次调用,从而大幅降低代码冗余。

核心要点:IEC 61131-3不仅是一套语法规范,更是一种工程方法论的指导。它鼓励将程序分解为可管理的单元,这与现代软件工程中的“面向对象”思想高度契合。FB正是这一思想在PLC领域的具象化产物。

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时,如果试图在FC内部使用静态变量来记忆状态,这在IEC标准中是不被允许的(除非使用特殊扩展)。强行使用会导致程序行为不可预测,且难以调试。正确的做法是:如果需要记忆状态,必须使用FB。

举例说明:编写一个“平均值计算”算法,输入三个数值,输出平均值。这适合用FC,因为无需记忆。而编写一个“电机软启动”控制,需要记录当前启动时间、电流积分值,这必须用FB,因为需要跨扫描周期保持数据。

2.4 FB在结构化编程中的核心地位与实战场景

在大型自动化项目中,结构化编程的核心思想是“高内聚、低耦合”。FB正是实现这一思想的最佳载体。通过将设备控制逻辑(如阀门、变频器、伺服)封装为FB,程序变得极具可读性和可维护性。

操作流程(如何定义一个FB):

  1. 定义接口:明确输入变量(如启动命令、速度设定值)、输出变量(如运行反馈、故障代码)、内部变量(如计时器累计值)。
  2. 编写算法:在FB内部使用ST或LD编写控制逻辑,确保只通过接口与外部交互。
  3. 设置调用环境:在任务(Task)中调用FB实例,并分配扫描周期。
  4. 调试与监控:通过在线监控查看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内部参数,所有实例自动生效。

经验提醒:在创建FB时,建议将输入参数进行合理性检查(如设定值是否超限)。这虽然增加了少量代码,但能有效防止因操作员误操作导致的设备损坏。同时,FB的命名应遵循“设备类型_功能”的规范,如“Motor_StartStop”、“Valve_Control”。

2.5 常见误区与总结复盘

在推广IEC 61131-3和FB的过程中,工程师常陷入以下误区:

  • 误区一:FB万能论。认为所有逻辑都必须封装成FB。实际上,简单的逻辑(如一个与门)直接使用LD或FBD更高效,强行封装反而增加复杂度。
  • 误区二:忽视数据作用域。FB内部应避免直接访问全局变量,否则会破坏封装性,导致“牵一发而动全身”。
  • 误区三:实例滥用。虽然FB支持多实例,但每个实例都会占用内存。在资源受限的小型PLC上,创建过多实例可能导致内存溢出。
  • 误区四:语言割裂。认为ST是高级语言,LD是低级语言。实际上,在同一个工程中混合使用语言是标准所鼓励的,应发挥各自优势。