在前两篇博客中,我们掌握了POU的基础概念与函数(FUN)的编程方法。本文将聚焦POU的另外两类核心单元------功能块(FB)与程序(PRG),深入讲解FB的实例化、扩展性,PRG的调用逻辑与工程配置,结合案例说明两类POU在实际项目中的应用场景,帮助大家构建完整的PLC编程知识体系。
一、功能块(FB)深度解析:与函数的核心区别
功能块(FB)是带内部状态、可复用的复杂逻辑单元,常用于反复调用的控制场景(如计数器、定时器、PID控制),其与函数(FUN)的核心区别可通过下表强化记忆:
|-------|----------------|-------------------|
| 对比维度 | 函数(FUN) | 功能块(FB) |
| 内存分配 | 无指定内存地址,无内部存储 | 分配固定内存地址,存储内部状态变量 |
| 输入/输出 | 多输入,仅1个返回值 | 多输入、多输出(或无输出) |
| 调用关系 | 仅可调用函数 | 可调用函数、其他功能块 |
| 使用前提 | 无需实例化,直接调用 | 必须实例化后才能调用 |
| 核心特征 | 无状态,相同输入必获相同输出 | 有状态,相同输入可能获不同输出 |
二、功能块(FB)的核心属性与实操
1. 实例化:FB使用的前提
FB的类型是抽象结构定义,并非具体数据实体,必须通过实例化转换为具体对象才能调用。实例化的本质是"定义FB类型的变量",每个实例拥有独立的内部状态与内存空间,互不干扰。
实例化步骤(以TON延时ON功能块为例):
在目标POU(如主程序)的声明区,声明FB实例,格式为"实例名 : FB类型;";
- 示例代码:

- 调用实例:在代码区通过实例名调用FB,赋值输入参数,读取输出参数

注意:同一FB类型可实例化多个对象(如Time9、),实例名在同一POU中不可重复,各自的内部状态独立(如Time9的延时计数不影响其他定时器)。
2. 扩展性:面向对象的FB扩展
CoDeSys支持面向对象编程,FB可通过"EXTENDS"关键字派生子FB,子FB继承父FB的所有变量与方法,同时可添加自定义逻辑、重写父FB方法,实现功能扩展。
扩展FB实操步骤:
- 自定义父FB(fbA),声明变量与方法(如基础开关逻辑);

- 新建子FB(fbB),在声明行添加"EXTENDS fbA",继承父FB属性;

3. 自定义FB案例:简易增/减计数器
自定义一个FB(FB_Counter),实现增计数、减计数、复位功能,步骤如下:
- 新建FB,名称设为"FB_Counter",编程语言选ST;
- 声明区变量:

- 码区逻辑:// 复位逻辑(优先级最高)

- 实例化调用:在主程序中声明FB实例,调用并测试计数逻辑。

三、程序(PRG):全局逻辑的核心载体
程序(PRG)是POU中最大的单元,作为全局逻辑的核心载体,可调用函数、功能块及其他程序,需绑定任务才能执行。其核心作用是整合分散的POU模块,实现完整的控制流程。
1. 程序(PRG)的核心性能
- 支持地址配置:可声明PLC物理地址变量(如%IX1.1、%QD12),支持分级寻址,直接映射硬件信号;
- 禁止自调用:不能直接或间接调用自身(避免死循环);
- 实例化规则:仅在资源中实例化,需与任务绑定(否则不执行),无实例名,通过任务触发执行;
- 调用权限:可被其他POU调用,函数不可调用程序。
2. 程序调用:文本与图形化方式
(1)文本语言调用(ST/IL)
调用程序时需加括号,输入参数用":="赋值,输出参数用"=>"接收,示例:
|--------------------------------------------------------------------------------------|
| // 调用程序Prog1,输入参数in_var赋值为10,输出参数out_var传入erg变量 Prog1(in_var:= 10, out_var => erg); |
可通过F2快捷键打开"输入助手",自动列出程序参数,简化赋值操作。
(2)图形化语言调用(LD/FBD)
直接拖拽程序到编辑界面,在接口处填写变量或数值即可,直观展示调用关系,适合复杂控制链路的可视化编程。
3. 程序绑定任务:确保执行的关键步骤
程序需绑定任务才能被PLC执行,步骤如下:
- 在左侧项目设备树中,找到"任务配置",双击打开;

- 右键目标任务(如循环任务),选择"添加对象"→"程序调用";

- 选择需绑定的程序(PRG),点击确定,程序将随任务周期执行(如循环任务每10ms执行一次)。

四、工程实践:POU创建的核心原则
在实际项目中,合理设计POU可大幅提升开发效率与代码可维护性,建议遵循以下原则:
- 按工艺/功能拆分:将工程按流程拆分(如加料、搅拌、出料),每个流程对应一个程序(PRG),降低逻辑复杂度;
- 重复逻辑封装为FB:如多台设备的开关控制、相同检测逻辑,封装为一个FB,通过实例化调用,减少代码冗余;
- 独立算法设为FUN:如数据转换、数学运算等无状态逻辑,设为函数,便于表达式运算与复用;
- 命名规范统一:POU、变量、实例名无空格、不重名,采用"类型_功能"命名(如FB_PID、F_Scale),提升可读性;
- 内存优化:FB中优先用VAR_IN_OUT替代VAR_INPUT/VAR_OUTPUT,减少内存占用。
五、总结
至此,POU系列博客已全部更新完毕。我们从基础概念出发,逐步讲解了函数(FUN)、功能块(FB)、程序(PRG)的核心属性、实操方法与工程应用,形成了完整的知识闭环。在实际编程中,需根据场景灵活选择POU类型,通过"拆分-封装-复用"的思路设计程序,既能提升开发效率,又能降低后期维护成本。后续可结合标准库中的POU(如定时器、计数器),多做实操练习,逐步掌握复杂PLC项目的编程技巧。