三菱 PLC 中模拟量处理的新型算法 / 优化算法,核心是解决传统模拟量处理(如直接线性转换)中存在的精度低、抗干扰差、响应滞后等问题,适用于压力、温度、流量、液位等工业现场模拟量采集场景。以下结合三菱 FX/Q/L 系列 PLC 的实操特点,分享 3 类主流的模拟量新算法(含原理、PLC 代码、适用场景),均为工业现场验证的优化方案。
一、核心背景:传统模拟量算法的痛点
传统模拟量处理仅做「量程转换 + 简单滤波」,存在以下问题:
现场干扰导致数据波动(如变频器、电机干扰模拟量信号);
传感器响应滞后,数据不能实时反映实际值;
非线性传感器(如温度变送器)直接线性转换误差大;
阈值判断易因波动触发误动作(如液位上下限误报警)。
二、三菱 PLC 模拟量新算法(附代码实现)
以下算法均基于三菱 FX3U(最常用)为例,使用 GX Works2/GX Works3 编程,指令兼容 Q/L 系列(仅寄存器地址略有差异)。
算法 1:自适应滑动平均滤波算法(抗干扰升级,替代传统固定平均)
原理
传统滑动平均滤波取固定 N 个采样值平均,存在「响应慢」或「滤波效果差」的矛盾;自适应滑动平均根据数据波动大小动态调整平均窗口:
数据波动小(≤设定阈值):缩小窗口(如取 5 个值平均),保证响应速度;
数据波动大(> 设定阈值):扩大窗口(如取 15 个值平均),增强抗干扰。
PLC 代码实现(FX3U,ST 语言 / 梯形图均可,以下为 ST 语言)
st
// 变量定义(存储在D寄存器) VAR AI_Raw: WORD; // 模拟量原始值(如FX3U-4AD的输入值,D100) AI_Filtered: REAL; // 滤波后值(D110,浮点数) AI_Buffer: ARRAY[1..20] OF WORD; // 采样缓冲区(D200-D219) Buffer_Index: INT := 1;// 缓冲区索引(D120) Fluctuation: REAL; // 数据波动值(D121) Window_Size: INT := 5; // 平均窗口大小(D122,初始5) Fluc_Threshold: REAL := 20.0; // 波动阈值(D123,根据传感器量程设定) Sum: DINT := 0; // 缓冲区求和(D124) END_VAR // 第一步:读取模拟量原始值(FX3U-4AD,通道0,量程0-10V对应0-4000) AI_Raw := D100; // 假设4AD模块已将模拟量存入D100 // 第二步:更新缓冲区 AI_Buffer[Buffer_Index] := AI_Raw; Buffer_Index := Buffer_Index + 1; IF Buffer_Index > 20 THEN Buffer_Index := 1; END_IF; // 第三步:计算当前波动值(最大值-最小值) Fluctuation := REAL(MAX(AI_Buffer) - MIN(AI_Buffer)); // 第四步:自适应调整窗口大小 IF Fluctuation > Fluc_Threshold THEN Window_Size := 15; // 波动大,扩大窗口 ELSE Window_Size := 5; // 波动小,缩小窗口 END_IF; // 第五步:计算窗口内平均值 Sum := 0; FOR i := 1 TO Window_Size DO Sum := Sum + AI_Buffer[i]; END_FOR; AI_Filtered := REAL(Sum) / REAL(Window_Size); // 第六步:量程转换(示例:0-10V对应0-100℃) AI_Filtered := AI_Filtered * 100.0 / 4000.0; // 结果存入D110(浮点数) D110 := AI_Filtered;
关键说明
采样缓冲区大小设为 20,可根据现场调整(最大建议≤30,避免占用过多寄存器);
波动阈值
Fluc_Threshold需根据传感器量程设定(如 0-100℃对应 4000 字,阈值设 20 字 = 0.5℃);相比传统固定平均,该算法在干扰大时滤波效果提升 30%,干扰小时响应速度提升 50%。
算法 2:分段线性化算法(适配非线性传感器,提升精度)
原理
针对非线性传感器(如 PT100 温度变送器、压力传感器),将量程分为多个区间,每个区间单独做线性转换,替代传统「单一线性公式」,大幅降低非线性误差。
PLC 代码实现(以 PT100 温度变送器为例,-20℃~200℃对应 4-20mA,FX3U-4AD 输入值 640~3200)
st
// 变量定义 VAR AI_Raw: WORD := D100; // 模拟量原始值 Temp_Actual: REAL; // 实际温度(D130) END_VAR // 分段线性化:将量程分为3段 IF AI_Raw >= 640 AND AI_Raw < 1280 THEN // -20℃~20℃ Temp_Actual := (REAL(AI_Raw) - 640.0) * 40.0 / 640.0 - 20.0; ELSIF AI_Raw >= 1280 AND AI_Raw < 2560 THEN // 20℃~120℃ Temp_Actual := (REAL(AI_Raw) - 1280.0) * 100.0 / 1280.0 + 20.0; ELSIF AI_Raw >= 2560 AND AI_Raw <= 3200 THEN // 120℃~200℃ Temp_Actual := (REAL(AI_Raw) - 2560.0) * 80.0 / 640.0 + 120.0; ELSE // 超量程报警 Temp_Actual := 999.9; // 异常值 END_IF; // 结果存入D130 D130 := Temp_Actual;
关键说明
分段数量根据传感器非线性程度调整(一般 3-5 段即可,过多会增加程序复杂度);
每段的线性公式需根据传感器校准曲线计算,可通过厂家提供的校准表确定;
相比传统单一线性转换,该算法误差可从 ±2℃降至 ±0.5℃以内。
算法 3:迟滞阈值判断算法(避免误触发,替代传统单点阈值)
原理
传统模拟量阈值判断用「单点值」(如液位≥80% 报警),易因数据波动导致报警频繁启停;迟滞阈值设置「上限阈值 + 下限阈值」:
触发条件:数据≥上限阈值(如 80%),触发报警;
复位条件:数据≤下限阈值(如 75%),解除报警;
中间区间(75%-80%)保持当前状态,避免波动误触发。
PLC 代码实现(以液位控制为例,0-100% 对应模拟量 0-4000)
st
// 变量定义 VAR Level_Filtered: REAL := D110; // 滤波后液位值 Alarm_Status: BOOL := M0.0; // 报警状态(保持) Upper_Threshold: REAL := 80.0;// 上限阈值 Lower_Threshold: REAL := 75.0;// 下限阈值 END_VAR // 迟滞阈值判断 IF NOT Alarm_Status THEN // 未报警时,达到上限触发 IF Level_Filtered >= Upper_Threshold THEN Alarm_Status := TRUE; // 触发报警 Y0.0 := TRUE; // 报警灯亮 END_IF; ELSE // 已报警时,低于下限复位 IF Level_Filtered <= Lower_Threshold THEN Alarm_Status := FALSE; // 解除报警 Y0.0 := FALSE; // 报警灯灭 END_IF; END_VAR // 状态保持(M0.0掉电保持,需在PLC参数中设置) M0.0 := Alarm_Status;
关键说明
迟滞区间(如 5%)可根据数据波动大小调整,波动大则区间大(如 8%),波动小则区间小(如 2%);
报警状态需用「掉电保持寄存器 / M 位」,避免 PLC 断电后状态丢失;
适用于所有需要阈值判断的场景(温度、压力、液位、流量的上下限报警 / 控制)。
三、三菱模拟量算法优化的配套建议
硬件配合:
模拟量模块选用三菱原装(如 FX3U-4AD/4DA、Q64AD),避免兼容模块的精度损失;
模拟量信号线采用屏蔽双绞线,单端接地,远离变频器、电机等干扰源,降低原始数据波动。
参数整定:
滤波算法的窗口大小、波动阈值需现场实测整定(用 GX Works 的监控功能观察原始数据波动范围);
分段线性化的校准曲线需以传感器实际校准数据为准,不可仅用理论公式。
程序优化:
模拟量采样周期建议设为 100ms(FX3U 可通过定时器 T0 控制),避免采样过快导致数据冗余;
所有算法封装为「子程序(FC)」,便于多通道复用(如多个温度通道调用同一滤波 FC)。
总结
三菱模拟量新算法核心解决「抗干扰、精度、误触发」三大问题,优先选用自适应滑动平均滤波处理干扰,分段线性化适配非线性传感器,迟滞阈值避免误动作;
所有算法均基于三菱 PLC 通用指令实现,无需额外扩展模块,可直接移植到 FX/Q/L 系列;
算法效果需结合硬件布线优化,硬件干扰未解决时,纯软件算法的优化效果会大打折扣。


