CoDeSys入门实战一起学习(十四):功能块(FB)与程序(PRG):实例化、调用与工程实践

在前两篇博客中,我们掌握了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类型;";

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

注意:同一FB类型可实例化多个对象(如Time9、),实例名在同一POU中不可重复,各自的内部状态独立(如Time9的延时计数不影响其他定时器)。

2. 扩展性:面向对象的FB扩展

CoDeSys支持面向对象编程,FB可通过"EXTENDS"关键字派生子FB,子FB继承父FB的所有变量与方法,同时可添加自定义逻辑、重写父FB方法,实现功能扩展。

扩展FB实操步骤:

  1. 自定义父FB(fbA),声明变量与方法(如基础开关逻辑);
  2. 新建子FB(fbB),在声明行添加"EXTENDS fbA",继承父FB属性;

3. 自定义FB案例:简易增/减计数器

自定义一个FB(FB_Counter),实现增计数、减计数、复位功能,步骤如下:

  1. 新建FB,名称设为"FB_Counter",编程语言选ST;
  2. 声明区变量:
  3. 码区逻辑:// 复位逻辑(优先级最高)
  4. 实例化调用:在主程序中声明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执行,步骤如下:

  1. 在左侧项目设备树中,找到"任务配置",双击打开;
  2. 右键目标任务(如循环任务),选择"添加对象"→"程序调用";
  3. 选择需绑定的程序(PRG),点击确定,程序将随任务周期执行(如循环任务每10ms执行一次)。

四、工程实践:POU创建的核心原则

在实际项目中,合理设计POU可大幅提升开发效率与代码可维护性,建议遵循以下原则:

  1. 按工艺/功能拆分:将工程按流程拆分(如加料、搅拌、出料),每个流程对应一个程序(PRG),降低逻辑复杂度;
  2. 重复逻辑封装为FB:如多台设备的开关控制、相同检测逻辑,封装为一个FB,通过实例化调用,减少代码冗余;
  3. 独立算法设为FUN:如数据转换、数学运算等无状态逻辑,设为函数,便于表达式运算与复用;
  4. 命名规范统一:POU、变量、实例名无空格、不重名,采用"类型_功能"命名(如FB_PID、F_Scale),提升可读性;
  5. 内存优化:FB中优先用VAR_IN_OUT替代VAR_INPUT/VAR_OUTPUT,减少内存占用。

五、总结

至此,POU系列博客已全部更新完毕。我们从基础概念出发,逐步讲解了函数(FUN)、功能块(FB)、程序(PRG)的核心属性、实操方法与工程应用,形成了完整的知识闭环。在实际编程中,需根据场景灵活选择POU类型,通过"拆分-封装-复用"的思路设计程序,既能提升开发效率,又能降低后期维护成本。后续可结合标准库中的POU(如定时器、计数器),多做实操练习,逐步掌握复杂PLC项目的编程技巧。

相关推荐
码农学院2 小时前
基于运维监控体系的网络品牌推广方案:从架构设计到技术实现
运维·网络
大耳朵-小飞象11 小时前
电力安全运维的智能密码:BACS如何破解设备全生命周期管理难题,让电网安全“看得见、管得住”?
运维·安全·智慧城市·能耗系统·楼宇智控·未来生活
极客侃科技11 小时前
制造企业 MES/APS 选型:SAP PP/DS 集成、ERP-MES 边界划分与一体化架构要点
运维·架构·制造
微硬创新11 小时前
耐达讯自动化 CC-Link IE 转 PROFINET网关在污水厂智能化升级实战
人工智能·物联网·网络协议·自动化·信息与通信
生活爱好者!14 小时前
我把NAS当作下载机,docker一键部署qb
运维·docker·容器
尽兴-16 小时前
企业业务系统架构选型与渐进式演进
运维·系统架构·devops
通信小小昕16 小时前
Ubuntu 26.04 中文输入法安装
linux·运维·ubuntu
壮哥_icon17 小时前
【Android 系统开发】使用 BAT 脚本高效自动化管理 /system/priv-app/ 系统应用(安装与卸载)
android·运维·自动化
RD_daoyi17 小时前
外链权重暴跌至13%,品牌提及反超传统链接——2026年不做Digital PR,你的独立站等于隐形
运维·网络·学习·机器学习·搜索引擎
电商API_1800790524717 小时前
企业ERP进销存场景|京东商品详情接口自动同步方案|凭证鉴权批量调用技术实操
大数据·运维·人工智能·爬虫·数据挖掘·网络爬虫