无心飞扬 发表于 2026-3-18 11:22:00

CoDeSys入门实战一起学习(十五):通滤波功能块开发实操案例

在 PLC(可编程逻辑控制器)编程领域,POU(Program Organization Unit,程序组织单元)是构建工控程序的核心骨架,包含程序、功能块(FB)、函数(FC)三类核心单元。本文将结合实际案例,从一阶低通滤波功能块开发,到程序的声明、调用、性能特性,全面解析 POU 的核心应用逻辑,帮助工控工程师夯实编程基础。
一、实战案例:PT1 一阶低通滤波功能块开发

在工业现场,传感器采集的数值(如温度、压力)往往存在高频噪声,一阶低通滤波(PT1)是实现数据平滑的经典算法。下面基于 PLC 结构化编程思想,自定义一个可复用的 PT1 滤波功能块。
1. 功能块接口声明

功能块的核心是定义输入输出接口和内部变量,确保参数可配置、状态可保持:


参数:rInput为原始采集值,rK为增益系数(默认 1.0),tT为时间常数(TIME 类型,如 T#100MS);输出参数:rOutput为平滑后的结果;内部变量:_rT用于时间常数的数值转换,_rY保存上一周期输出(实现状态保持,是功能块与函数的核心区别)。
2. 滤波算法核心逻辑

PT1 滤波的核心公式为:y(k) = (K/Ts)·x(k) + (1 - 1/Ts)·y(k-1)(Ts 为采样周期),结合 PLC 采样特性实现如下:


始化逻辑:首次调用时_rT为 0,直接将输入赋值给输出,避免初始值异常;采样周期适配:代码中/10对应 PLC 10ms 采样周期(需根据实际硬件调整);容错处理:时间常数≤0 时直接输出输入值,避免除零错误;状态保持:_rY保存当前输出,作为下一周期的历史值,实现连续平滑滤波。
3. 功能块调用效果

调用该功能块时,只需实例化并配置参数,即可实现不同采集点的滤波:


常数tT越大,输出越平滑(响应越慢);越小则响应越快,但滤波效果越弱,可根据现场需求调整。
二、PLC 程序(Program)核心知识点解析

程序(Program)是 POU 中权限最高的单元,是任务执行的入口,可调用函数、功能块甚至其他程序,也是工控逻辑的 “主骨架”。
1. 程序的核心特性

特性说明全局属性程序是全局单元,可定义全局变量、映射硬件地址,被其他 POU 调用无实例化程序无需实例化,直接绑定任务执行,与功能块(需实例化)本质不同调用限制不能递归调用(直接 / 间接调用自身),函数中不能调用程序状态保持程序调用后变量状态持续保持,直到下一次调用(区别于功能块实例)2. 程序的声明与调用

(1)程序声明规范

程序可声明全局变量、硬件映射变量,支持分级寻址:​​​​​​​


2)程序调用方式
文本编程语言(ST/IL):调用时必须加括号,输入参数用:=赋值,输出参数用=>接收:


图形化编程语言(LD/FBD):直接在程序块接口处填写变量 / 数值,直观易懂。
3. 程序与功能块 / 函数的调用关系



POU 的调用层级遵循 “程序> 功能块 > 函数” 的规则:
程序:可调用所有 POU(程序、功能块、函数),是任务执行的入口;功能块:可调用其他功能块和函数,不可调用程序;函数:仅可调用其他函数,不可调用程序 / 功能块(无状态保持,无法实例化)。
三、POU 创建的最佳实践原则

合理的 POU 设计是工控程序可维护、可复用的关键,建议遵循以下原则:
按工艺拆分程序:将不同工艺段(如进料、加热、出料)拆分为独立程序,降低耦合度;复用逻辑封装为功能块:如 100 台阀门控制、多路传感器滤波,只需编写一个功能块,实例化调用即可;算法逻辑封装为函数:如数值换算、CRC 校验等无状态的算法,封装为函数参与表达式运算;命名规范:POU / 变量名无空格,避免与其他 POU / 数据类型重名,同一 POU 内动作名唯一;状态与无状态分离:需要保持运行状态(如滤波历史值、阀门开度)用功能块,纯计算逻辑用函数。
总结

PT1 一阶低通滤波功能块通过状态保持变量(_rY) 实现数据平滑,核心公式需适配 PLC 采样周期,同时做好初始化和容错处理;程序(Program)是 PLC 任务执行的核心入口,具备全局属性,可调用所有 POU,但不可递归调用;POU 设计需遵循 “工艺拆分、逻辑复用” 原则:功能块封装带状态的复用逻辑,函数封装无状态的算法,程序搭建全局执行框架。
页: [1]
查看完整版本: CoDeSys入门实战一起学习(十五):通滤波功能块开发实操案例