西门子PLC结构化编程_线性插值算法功能块

文章目录


前言

在之前的文章中,我们详细分析了PID算法的原理和推导过程,同时给出了各种各样的PID功能块及仿真块程序。

见文章:

  1. 《西门子PLC结构化编程_基于线性回归模型的过程值预测》
  2. 《西门子PLC结构化编程_通用型PID过程仿真模型》
  3. 《西门子PLC结构化编程_基于一阶惯性加纯滞后环节的过程仿真模型》
  4. 《西门子PLC结构化编程_带前馈控制功能的增量式PID控制器》
  5. 《西门子PLC结构化编程_带前馈控制功能的位置式PID控制器》
  6. 《西门子PLC结构化编程_增量式PID功能块》
  7. 《SIMATIC S7-1200 PID串级控制(以巧克力加热炉温度控制为例)》

在某些工控场景下,不需要PID这种精确的控制算法,可使用线性插值法等低精度低运算量的算法。本文对线性插值法做简要介绍,并给出程序实现方法。


一、算法原理

线性插值基于两点确定一条直线的思想。已知输入量(温度)在两个边界点(低温度、高温度)对应输出量(频率)的两个边界值(低频率、高频率),则对于任意介于两者之间的输入量,其输出量可通过直线方程计算得出。公式如下:

二、功能概述

  1. 分为手动、自动模式;
  2. 手动模式下,手动给定输出值,自动模式下,根据线性插值法自动计算出输出值;
  3. 手自动无扰切换,当模式切换为手动时,当前时刻的输出值传递给手动设定输出值,以防止手自动切换时产生输出值震荡;
  4. 采用分段控制,过程值小于某个值时,以最小输出值输出,过程值大于某个值时,以最大输出值输出,过程值在此之间时,根据线性插值法计算出的输出值输出;
  5. 可选择正作用控制器,还是反作用控制器。

三、程序编写

1. 新建数据类型"1_LerpType"

图1

2. 新建FB块"FB615_Lerp"

建立如下引脚变量:

图2

3. 编程

程序段4:

c 复制代码
REGION 手自动无扰切换
    
    IF #Lerp.HMI.HMIManual THEN
        #Lerp.HMI.ManualSetpoint := #Lerp.OutPut.Output;
    END_IF;
    
END_REGION

REGION 模式切换
    
    IF #Lerp.InPut.Running THEN
        IF #Lerp.HMI.Auto_DO THEN
            IF #Lerp.InPut.ProcessValue < #Lerp.HMI.PVLow THEN
                #Lerp.Static.Step := 0;
            END_IF;
            
            IF #Lerp.InPut.ProcessValue > #Lerp.HMI.PVHigh THEN
                #Lerp.Static.Step := 1;
            END_IF;
            
            IF (#Lerp.HMI.PVLow < #Lerp.InPut.ProcessValue) AND (#Lerp.InPut.ProcessValue < #Lerp.HMI.PVHigh) THEN
                #Lerp.Static.Step := 2;
            END_IF;
        ELSIF
            #Lerp.HMI.Manual_DO THEN
            #Lerp.Static.Step := 3;
        END_IF;
    ELSE
        #Lerp.Static.Step := 4;
    END_IF;
    
END_REGION

REGION 输出值计算
    
    CASE #Lerp.Static.Step OF
        0:
            IF #Lerp.HMI.Direction THEN
                #Lerp.Static.OutputTemp := #Lerp.HMI.LowSetpoint;
            ELSE
                #Lerp.Static.OutputTemp := #Lerp.HMI.HighSetpoint;
            END_IF;
        1:
            IF #Lerp.HMI.Direction THEN
                #Lerp.Static.OutputTemp := #Lerp.HMI.HighSetpoint;
            ELSE
                #Lerp.Static.OutputTemp := #Lerp.HMI.LowSetpoint;
            END_IF;
        2:
            #Lerp.Static.PV_Percent := (#Lerp.InPut.ProcessValue - #Lerp.HMI.PVLow) / (#Lerp.HMI.PVHigh - #Lerp.HMI.PVLow);
            IF #Lerp.HMI.Direction THEN
                #Lerp.Static.OutputTemp := #Lerp.HMI.LowSetpoint + #Lerp.Static.PV_Percent * (#Lerp.HMI.HighSetpoint - #Lerp.HMI.LowSetpoint);
            ELSE
                #Lerp.Static.OutputTemp := #Lerp.HMI.HighSetpoint - #Lerp.Static.PV_Percent * (#Lerp.HMI.HighSetpoint - #Lerp.HMI.LowSetpoint);
            END_IF;
        3:
            #Lerp.Static.OutputTemp := #Lerp.HMI.ManualSetpoint;
        4:
            #Lerp.Static.OutputTemp := #Lerp.OutPut.Output;
    END_CASE;
    
    IF #Lerp.HMI.Enable THEN
        // 频率输出限幅
        #Lerp.OutPut.Output := LIMIT(MN := #Lerp.Static.OutputMIN, IN := #Lerp.Static.OutputTemp, MX := #Lerp.Static.OutputMAX);
        
        // 频率输出转换
        "FC607_AnalogOutPutConver"(AO_IN := #Lerp.OutPut.Output,
                                   IN_MAX := #Lerp.Static.OutputMAX,
                                   IN_MIN := #Lerp.Static.OutputMIN,
                                   OUT_MAX := 27648,
                                   OUT_MIN := 0,
                                   AO_OUT => #Lerp.OutPut.Output_PER);
    END_IF;
    
END_REGION

REGION 按钮自复位
    
    #Lerp.HMI.HMIManual := #Lerp.HMI.HMIManual AND NOT #Lerp.Static.ReSet[0];
    #Lerp.HMI.HMIAuto := #Lerp.HMI.HMIAuto AND NOT #Lerp.Static.ReSet[1];
    
    #Lerp.Static.ReSet[0] := #Lerp.HMI.HMIManual;
    #Lerp.Static.ReSet[1] := #Lerp.HMI.HMIAuto;
    
END_REGION

其中,"FC607_AnalogOutPutConver"是指调用FC块"FC607_AnalogOutPutConver",该程序块可将工程量转换为模拟量。参考文章《西门子PLC常用底层逻辑块分享_模拟量写入》


总结

本文详细阐述了线性插值算法在西门子博途编程平台中的程序实现过程。在实际工业控制场景中,可代替PID用于简单的开环控制环节,以降低程序的复杂度。

相关推荐
cpp_25013 小时前
P8377 [PFOI Round1] 暴龙的火锅
数据结构·c++·算法·题解·洛谷
uesowys3 小时前
Apache Spark算法开发指导-Factorization machines classifier
人工智能·算法
季明洵3 小时前
C语言实现单链表
c语言·开发语言·数据结构·算法·链表
shandianchengzi3 小时前
【小白向】错位排列|图文解释公考常见题目错位排列的递推式Dn=(n-1)(Dn-2+Dn-1)推导方式
笔记·算法·公考·递推·排列·考公
I_LPL3 小时前
day26 代码随想录算法训练营 回溯专题5
算法·回溯·hot100·求职面试·n皇后·解数独
Yeats_Liao4 小时前
评估体系构建:基于自动化指标与人工打分的双重验证
运维·人工智能·深度学习·算法·机器学习·自动化
cpp_25014 小时前
P9586 「MXOI Round 2」游戏
数据结构·c++·算法·题解·洛谷
浅念-4 小时前
C语言编译与链接全流程:从源码到可执行程序的幕后之旅
c语言·开发语言·数据结构·经验分享·笔记·学习·算法
有时间要学习4 小时前
面试150——第五周
算法·深度优先
晚霞的不甘5 小时前
Flutter for OpenHarmony 可视化教学:A* 寻路算法的交互式演示
人工智能·算法·flutter·架构·开源·音视频