1. 项目背景与核心价值
在工业自动化控制领域,三菱FX3U系列PLC因其高性价比和稳定性能,成为中小型项目的主流选择。模拟量处理作为PLC控制中的重要环节,直接影响着温度、压力、流量等关键参数的采集精度和控制效果。然而在实际工程中,我们发现工程师们往往需要重复编写类似的模拟量处理程序,这不仅降低开发效率,还容易因个体差异导致程序质量参差不齐。
这个函数块(Function Block)的开发初衷,正是为了解决以下三个典型痛点:
- 模拟量转换公式重复编写(如4-20mA转实际工程值)
- 信号滤波处理缺乏标准化实现
- 报警功能实现方式五花八门
通过封装这些通用功能,我们实现了:
- 开发效率提升50%以上 - 典型模拟量通道配置时间从30分钟缩短到5分钟
- 代码质量统一化 - 所有项目采用相同处理逻辑,维护成本降低
- 高级功能内置 - 包含死区处理、移动平均滤波等工业场景实用功能
2. 函数块架构设计
2.1 输入输出参数定义
函数块接口设计遵循工业控制领域的"显性化"原则,所有关键参数一目了然:
structured复制// 输入参数
VAR_INPUT
bEnable : BOOL; // 功能使能
nRawValue : INT; // 原始AD值(0-4000)
rScaleMin : REAL; // 量程下限(工程单位)
rScaleMax : REAL; // 量程上限(工程单位)
nFilterSamples : INT; // 滤波采样次数(1-10)
END_VAR
// 输出参数
VAR_OUTPUT
rEngValue : REAL; // 工程值输出
bHiAlarm : BOOL; // 上限报警
bLoAlarm : BOOL; // 下限报警
END_VAR
关键设计要点:量程参数采用REAL类型而非INT,确保高精度场合的适用性。滤波采样次数限制在10次以内,避免FX3U处理能力过载。
2.2 内部处理逻辑分解
函数块内部采用三级处理流水线:
-
基准转换层
核心算法采用工业标准的线性变换公式:code复制EngValue = (RawValue - 0) * (ScaleMax - ScaleMin) / (4000 - 0) + ScaleMin针对FX3U的特殊性,我们做了两点优化:
- 增加AD值超限保护(实测某些传感器会输出4050等异常值)
- 零漂自动补偿(当RawValue<10时强制归零)
-
数字滤波层
提供三种可选滤波方式:- 移动平均滤波(默认)
- 一阶滞后滤波
- 中值滤波
实测表明,对于FX3U的12位AD分辨率,5点移动平均即可有效抑制工频干扰。
-
报警判断层
采用"回差比较"算法避免报警抖动:structured复制IF rEngValue > (rHiAlarmSet + rHysteresis) THEN bHiAlarm := TRUE; ELSIF rEngValue < (rHiAlarmSet - rHysteresis) THEN bHiAlarm := FALSE; END_IF
3. 关键实现技术解析
3.1 浮点运算优化技巧
FX3U的浮点处理能力有限,我们通过以下手段提升性能:
-
定点数预处理
在进入浮点运算前,先对AD值进行整数倍放大:structured复制nTemp := nRawValue * 1000; // 转换为定点数 rResult := INT_TO_REAL(nTemp) / 1000.0;实测显示,这种方法比直接浮点运算快1.8倍。
-
查表法替代除法
对于固定量程的应用,预先计算好转换系数:structured复制// 在初始化时计算 rK := (rScaleMax - rScaleMin) / 4000.0; // 转换时简化计算 rEngValue := INT_TO_REAL(nRawValue) * rK + rScaleMin;
3.2 滤波算法实现细节
移动平均滤波的环形缓冲区实现方案:
structured复制// 变量声明
VAR
aBuffer : ARRAY[1..10] OF REAL;
nIndex : INT := 1;
rSum : REAL := 0;
END_VAR
// 滤波执行逻辑
IF nFilterSamples > 1 THEN
rSum := rSum - aBuffer[nIndex]; // 减去最旧值
aBuffer[nIndex] := rEngValue; // 存入新值
rSum := rSum + rEngValue;
nIndex := nIndex + 1;
IF nIndex > nFilterSamples THEN
nIndex := 1;
END_IF
rEngValue := rSum / INT_TO_REAL(nFilterSamples);
END_IF
实测数据:在10ms采样周期下,5点滤波可使信号波动幅度降低70%,CPU负荷仅增加3%。
4. 工程应用实例
4.1 温度控制系统配置
以PT100温度传感器(量程0-200℃)为例:
-
硬件接线
- FX3U-4AD模块通道1接入
- 三线制接法,补偿导线电阻
- 信号调理器输出4-20mA
-
参数设置
structured复制// 调用函数块 FB_TempSensor( bEnable := TRUE, nRawValue := D100, // AD值存放地址 rScaleMin := 0.0, // 0℃ rScaleMax := 200.0, // 200℃ nFilterSamples := 5 // 5点滤波 ); -
报警设置
在函数块外部添加:structured复制// 高温报警(180℃) IF FB_TempSensor.rEngValue > 180.0 THEN Y10 := ON; // 报警输出 END_IF
4.2 压力监测系统特殊处理
对于压力传感器的非线性补偿:
-
分段线性化处理
在函数块后级添加补偿算法:structured复制// 0-50%量程补偿系数1.02 IF rPressValue < 50.0 THEN rPressValue := rPressValue * 1.02; // 50-100%量程补偿系数0.98 ELSE rPressValue := 51.0 + (rPressValue - 50.0) * 0.98; END_IF -
信号突变检测
增加梯度限制保护:structured复制// 允许最大变化率10%/秒 IF ABS(rPressValue - rLastValue) > 10.0 THEN rPressValue := rLastValue; END_IF rLastValue := rPressValue;
5. 调试与优化指南
5.1 在线调试技巧
-
监视器特殊设置
- 显示格式选择"浮点+工程单位"
- 采样周期设置为200ms(避免通信负荷过高)
-
典型故障排查
现象 可能原因 解决方案 值固定为0 使能信号未接通 检查bEnable输入 值跳变剧烈 滤波参数过小 增加nFilterSamples 超量程显示 传感器接线错误 检查4AD模块LED状态
5.2 性能优化建议
-
扫描周期控制
- 关键通道:每扫描周期处理
- 非关键通道:通过计数器分时处理
structured复制// 每5次扫描处理一次 IF nCounter MOD 5 = 0 THEN FB_Process(); END_IF nCounter := nCounter + 1; -
内存优化方案
- 多个相同量程的通道共用转换系数
- 将报警判断移至主程序,减少函数块复杂度
6. 扩展应用方向
6.1 多通道批量处理
通过结构体数组实现批量配置:
structured复制TYPE ST_ChannelCfg :
STRUCT
bEnable : BOOL;
nRawAddr : INT;
rScaleMin : REAL;
rScaleMax : REAL;
END_STRUCT
END_TYPE
VAR
aChannels : ARRAY[1..8] OF ST_ChannelCfg;
aFB : ARRAY[1..8] OF FB_AnalogProcess;
END_VAR
// 批量调用
FOR i := 1 TO 8 DO
aFB[i](
bEnable := aChannels[i].bEnable,
nRawValue := D[aChannels[i].nRawAddr],
rScaleMin := aChannels[i].rScaleMin,
rScaleMax := aChannels[i].rScaleMax
);
END_FOR
6.2 与HMI的集成技巧
-
数据映射优化
- 在HMI中直接显示函数块输出变量
- 报警状态绑定函数块报警输出
-
参数在线修改
structured复制// HMI写入到D寄存器 IF bScaleChanged THEN rScaleMin := D100; rScaleMax := D101; bScaleChanged := FALSE; END_IF
在实际项目中,这个函数块已经成功应用于30+个不同类型的控制系统,包括:
- 注塑机温度控制
- 水处理PH值监测
- 空压机压力保护
- 包装机张力控制
特别在设备改造项目中,使用标准化函数块使程序移植时间缩短了70%。一个典型的案例是将某生产线控制程序从FX2N迁移到FX3U平台,原本需要2天的人工适配工作,通过这个函数块仅用4小时就完成了核心功能的迁移。