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项目的编程技巧。

相关推荐
小Pawn爷7 小时前
2.Docker的存储
运维·docker·容器
CaracalTiger7 小时前
OpenClaw-VSCode:在 VS Code 中通过 WebSocket 远程管理 OpenClaw 网关的完整方案
运维·ide·人工智能·vscode·websocket·开源·编辑器
qq_5470261797 小时前
LangChain 1.0 核心概念
运维·服务器·langchain
生而为虫7 小时前
[Windows] 【浏览器自动化精灵V1.0】用Excel表格控制浏览器的自动化
运维·自动化
Fcy6487 小时前
Linux下 进程(二)(进程状态、僵尸进程和孤儿进程)
linux·运维·服务器·僵尸进程·孤儿进程·进程状态
第七序章7 小时前
【Linux学习笔记】初识Linux —— 理解gcc编译器
linux·运维·服务器·开发语言·人工智能·笔记·学习
迎仔7 小时前
A-总览:GPU驱动运维系列总览
linux·运维
AI_56787 小时前
阿里云OSS成本优化:生命周期规则+分层存储省70%
运维·数据库·人工智能·ai
yyy的学习记录7 小时前
Ubuntu下urdf模型转换成proto模型
linux·运维·ubuntu
猫头虎8 小时前
OpenClaw开源汉化发行版:介绍、下载、安装、配置教程
运维·windows·开源·aigc·ai编程·agi·csdn