返回主站|会员中心|保存桌面

士林变频器|士林变频器(中国)服务商    

士林变频器、士林电机

新闻分类
  • 暂无分类
联系方式
  • 联系人:姚经理
  • 电话:18520143666
站内搜索
 
首页 > 新闻中心 > 用PLC语言做卡尔曼滤波算法!
新闻中心
用PLC语言做卡尔曼滤波算法!
发布时间:2025-11-19        浏览次数:24        返回列表

卡尔曼滤波是工业场景中经典的数据去噪 / 状态估计算法,PLC 实现卡尔曼滤波的核心是:简化单变量卡尔曼公式(适配 PLC 算力)+ 用结构化文本(ST)编写迭代逻辑(梯形图 LD 适合逻辑控制,数值计算优先 ST)。以下是从原理简化、变量定义到主流 PLC(西门子 / 三菱)的完整实现方案,以「PLC 采集模拟量(如温度 / 位移)去噪」为例。

一、先明确:PLC 适配的卡尔曼滤波简化版(单变量)

工业现场 PLC 采集的传感器数据(如 4-20mA 电流、0-10V 电压)多为单变量时序数据,无需复杂的矩阵运算,简化后核心公式如下(A=1,B=0,无控制输入 U):

阶段公式说明


预测状态预测:$\hat {X}_{kk-1} = \hat{X}_{k-1k-1}$假设当前状态 = 上一时刻最优状态(无系统变化)

协方差预测:$P_{kk-1} = P_{k-1k-1} + Q$Q= 过程噪声协方差(表征系统模型误差,如机械振动、电路漂移)
更新卡尔曼增益:$K_k = \frac {P_{kk-1}}{P_{kk-1} + R}$R= 测量噪声协方差(表征传感器误差,如温漂、电磁干扰)

状态更新:$\hat {X}_{kk} = \hat{X}_{kk-1} + K_k \times (Z_k - \hat{X}_{kk-1})$Zk= 当前传感器测量值,修正预测值得到最优估计

协方差更新:$P_{kk} = (1 - K_k) \times P_{kk-1}$更新协方差,为下一周期预测做准备

二、PLC 实现核心规则(避坑)

  1. 语言选择:优先结构化文本(ST)(所有主流 PLC 都支持),梯形图仅用于触发滤波逻辑(如定时中断),数值计算用 ST 更高效;

  2. 算力适配:仅实现单变量滤波(多变量矩阵运算会导致 PLC 扫描周期超限);

  3. 数据类型:全部用REAL(浮点数),避免整数运算丢失精度;

  4. 执行周期:建议用定时中断(如 100ms/200ms)执行滤波,避免扫描周期波动影响时序。

三、西门子 S7-1200/1500(TIA Portal)实现示例

步骤 1:变量定义(PLC 变量表)

变量名数据类型地址说明初始值
Z_kREALPIW256传感器测量值(如 4-20mA 转 REAL 后的值)0.0
X_hat_kREALDB1.DBD0第 k 次滤波后最优估计值(输出)0.0
X_hat_k_1REALDB1.DBD4上一周期最优估计值(缓存)0.0
P_kREALDB1.DBD8第 k 次协方差1.0
P_k_1REALDB1.DBD12上一周期协方差(缓存)1.0
K_kREALDB1.DBD16卡尔曼增益0.0
QREALDB1.DBD20过程噪声协方差(可调)0.01
RREALDB1.DBD24测量噪声协方差(可调)0.1
Init_FlagBOOLDB1.DBX28.0初始化标志FALSE

步骤 2:ST 代码(定时中断 OB35,周期 100ms)

st

// 卡尔曼滤波核心逻辑(西门子S7-1200/1500 ST代码)
PROGRAM OB35
VAR
    // 临时变量(无需定义到DB,仅中断内使用)
    P_k_predict: REAL; // 协方差预测值
END_VAR

// 第一步:初始化(首次运行时执行)
IF NOT Init_Flag THEN
    X_hat_k := Z_k;       // 初始最优值=第一个测量值
    X_hat_k_1 := X_hat_k; // 缓存初始值
    P_k := 1.0;           // 初始协方差
    P_k_1 := P_k;         // 缓存初始协方差
    Init_Flag := TRUE;    // 置位初始化完成标志
    RETURN;               // 初始化后退出本次中断
END_IF;

// 第二步:预测阶段
P_k_predict := P_k_1 + Q; // 协方差预测
// 状态预测:X_hat_k_predict = X_hat_k_1(无需赋值,直接复用)

// 第三步:更新阶段
K_k := P_k_predict / (P_k_predict + R); // 计算卡尔曼增益
X_hat_k := X_hat_k_1 + K_k * (Z_k - X_hat_k_1); // 状态更新
P_k := (1.0 - K_k) * P_k_predict; // 协方差更新

// 第四步:缓存当前值,为下一周期准备
X_hat_k_1 := X_hat_k;
P_k_1 := P_k;

四、三菱 FX5U/Q(GX Works3)实现示例

三菱 FX5U/Q 支持 ST 语言,逻辑与西门子一致,仅变量定义和语法略有差异。

步骤 1:变量定义(软元件 / 标签)

标签名数据类型软元件说明初始值
Z_kREALD100传感器测量值(AD 转换后的值,如温度)0.0
X_hat_kREALD200滤波后输出值0.0
X_hat_k_1REALD204上一周期最优值0.0
P_kREALD208当前协方差1.0
P_k_1REALD212上一周期协方差1.0
K_kREALD216卡尔曼增益0.0
QREALD220过程噪声0.01
RREALD224测量噪声0.1
Init_FlagBOOLM100初始化标志FALSE

步骤 2:ST 代码(定时中断程序,如 100ms)

st

// 三菱FX5U/Q 卡尔曼滤波ST代码
// 定时中断程序(设置为100ms执行一次)
IF Init_Flag = FALSE THEN
    // 初始化
    X_hat_k := Z_k;
    X_hat_k_1 := X_hat_k;
    P_k := 1.0;
    P_k_1 := P_k;
    Init_Flag := TRUE;
    RETURN;
END_IF;

// 预测阶段
VAR_TEMP
    P_k_predict: REAL; // 临时变量
END_VAR;
P_k_predict := P_k_1 + Q;

// 更新阶段
K_k := P_k_predict / (P_k_predict + R);
X_hat_k := X_hat_k_1 + K_k * (Z_k - X_hat_k_1);
P_k := (1.0 - K_k) * P_k_predict;

// 缓存值
X_hat_k_1 := X_hat_k;
P_k_1 := P_k;

五、关键调参技巧(PLC 场景适配)

卡尔曼滤波的核心是调QR,需根据现场传感器特性调整:

参数取值原则示例场景
Q系统越稳定(如静态温度采集),Q 越小(0.001~0.01);系统动态变化大(如位移),Q 越大(0.01~0.1)温度采集:Q=0.01;电机转速:Q=0.05
R传感器精度越高(如进口温变),R 越小(0.05~0.1);传感器噪声大(如普通电位器),R 越大(0.1~0.5)4-20mA 高精度传感器:R=0.1;电位器:R=0.3

六、PLC 实现注意事项

  1. 执行周期:必须用定时中断执行滤波(而非主循环),否则扫描周期波动会导致时序混乱,建议周期与传感器采集周期一致(如 100ms);

  2. 算力限制

    • 单变量滤波对所有 PLC 无压力(FX5U/S7-1200 均可);

    • 多变量(如 X/Y 轴位移)需用矩阵运算,仅建议在 S7-1500/Q 系列等中高端 PLC 实现,且需优化代码;

  3. 初始值:初始化时优先用第一个有效测量值(避免初始值 0 导致滤波初期偏差);

  4. 异常处理:增加测量值越限判断(如 Z_k > 最大值 /<- 最小值时,跳过本次滤波,沿用上次最优值),避免异常值污染滤波结果。

七、扩展:梯形图触发滤波(适配新手)

若习惯用梯形图,可将 ST 滤波逻辑封装为功能块(FB),梯形图仅做:

  1. 定时中断触发 FB 执行;

  2. 采集传感器值(AD 转换)赋值给 Z_k;

  3. 读取滤波输出 X_hat_k 用于后续控制(如 PID、报警)。

比如西门子梯形图触发 FB:

plaintext

// 梯形图逻辑
LD     SM0.0          // 始终ON
CALL   FB_KalmanFilter // 调用卡尔曼滤波FB
       Z_k := PIW256,
       X_hat_k := DB1.DBD0,
       Q := 0.01,
       R := 0.1

如果需要针对具体场景(如 PLC 采集电机转速、液压压力滤波)调整代码,或补充欧姆龙 / 罗克韦尔 PLC 的实现版本,可告知具体 PLC 型号和采集参数,我会细化到可直接下载使用的程度。

收缩
  • QQ咨询

  • 电话咨询

  • 18520143666
  • 添加微信客服