S7-1200 -1500 案例之中位平均值滤波算法

发布者: fangrong | 发布时间: 2025-1-10 08:27| 查看数: 24925| 评论数: 0|帖子模式



S7-1200-1500案例之中位平均值滤波算法

相关软(硬)件:

1、编程软件:TIA_V15.1

2、仿真软件:PLCSIM

控制要求:

1)模拟量滤波:采样中位平均值滤波算法。

中位平均值滤波算法原理:相当于“中位值滤波法”+“算术平均滤波法”

连续采集N个模拟量数据值,将数据累加后,去掉最大值和最小值后,再求平均值,将结果作为滤波后的输出值。

例如,采集 n 个数据 x1, x2,..., xn,滤波后的输出值 y 计算公式为 y = (x1 + x2 +... + xn) /(n-2)。

N值的选 取:3~14,N值较大时信号平滑度较高,但灵敏度较低;

N值较小时信号平滑度较低,但灵敏度较高。

优点:融合了两种滤波法的优点,对于偶然出现的脉冲性干扰,可消除由于脉冲干扰所引起的采样值偏差;

缺点:对于测量速度较慢或要求数据计算速度较快的实时控制不适用,比较浪费内存。

注:程序仅供参考!!!

一、中位平均值模拟量滤波:

(新建项目、新建FB、FC块、添加变量、编写程序、调用FB、FC块、关联变量、下载测试)

1、新建FC块(FC_AverageValue_MM)、定义块接口参数:



定义块接口参数

2、编写程序:   



中位平均值计算子程序
(* 中位平均值计算子程序:求连续的N个数据,去掉最大值和最小值后的平均值。公众号Smart Auto Control -- WangQuanFuGui 原创连续 n 个数据 x1, x2,..., xn,输出值: y = (x1 + x2 +... + xn) /(n - 2)。INOUT:arraySort:(Array of Int)变长数组,数据源Return:AverageValue_MM:(REAL)返回中位平均值*)
REGION average value    //初始化总和     #ValueSum := 0;    //获取数组的下限、上限    #tempLowerBound := LOWER_BOUND(ARR := #arraySort, DIM := 1);    #tempUpperBound := UPPER_BOUND(ARR := #arraySort, DIM := 1);
    //冒泡排序升序    FOR #i := #tempLowerBound TO #tempUpperBound - 1 DO        FOR #j := #tempLowerBound TO (#tempLowerBound + #tempUpperBound - #i - 1) DO            IF #arraySort[#j] > #arraySort[#j + 1] THEN                #tempINT := #arraySort[#j + 1];                #arraySort[#j + 1] := #arraySort[#j];                #arraySort[#j] := #tempINT;            END_IF;        END_FOR;    END_FOR;
    //计算数组总和    FOR #i := #tempLowerBound TO #tempUpperBound BY 1 DO        #ValueSum := #ValueSum + #arraySort[#i];    END_FOR;    //获取最大值、最小值      #ArrayMax := DINT_TO_REAL(#arraySort[#tempUpperBound]);    #ArrayMin := DINT_TO_REAL(#arraySort[#tempLowerBound]);    //计算中位平均值:(总和减去最大值、最小值后)除以(数组上限减下限减一)    #FC_AverageValue_MM := (DINT_TO_REAL(#ValueSum) - (#ArrayMax + #ArrayMin)) / DINT_TO_REAL(#tempUpperBound - #tempLowerBound - 1);END_REGION

中位平均值计算子程序

3、新建FB块(AnalogFiltering_MM)、定义块接口参数:



定义块接口参数



定义块接口参数

4、编写程序:   


   

中位平均值滤波程序
(*模拟量数据转换INT_TO_REAL;算术平均值滤波算法公众号Smart Auto Control -- WangQuanFuGui 原创===========================================================================================中位平均值滤波算法原理:相当于“中位值滤波法”+“算术平均滤波法”连续采集N个模拟量数据值,将数据累加后,去掉最大值和最小值后,再求平均值,将结果作为滤波后的输出值。例如,采集 n 个数据 x1, x2,..., xn,滤波后的输出值 y 计算公式为 y = (x1 + x2 +... + xn) /(n-2)。N值的选 取:3~14,N值较大时信号平滑度较高,但灵敏度较低;N值较小时信号平滑度较低,但灵敏度较高。 优点:融合了两种滤波法的优点,对于偶然出现的脉冲 性干扰,可消除由于脉冲干扰所引起的采样值偏差;缺点:对于测量速度较慢或要求数据计算速度较快的实时控制不适用,比较浪费内存*)
REGION Edge       //秒脉冲    #SecondPulseU := #SecondPulse AND NOT #SecondPulseSave;    #SecondPulseSave := #SecondPulse;    //初始化    #AccumValue := 0;    IF #SecondPulseU AND #TimeAdd < 10 THEN        #TimeAdd := #TimeAdd + 1;      //采样时间累加    ELSIF #TimeAdd >= 10 THEN        #TimeAdd := 0;                 //采样周期复位    END_IF;END_REGION
REGION sampling    //输入数据比较    IF #InChx < #InRawMin THEN        #tempInChx := REAL_TO_INT(#InRawMin);    ELSIF #tempInChx > #InRawMax THEN        #tempInChx := REAL_TO_INT(#InRawMax);    ELSE        #tempInChx := #InChx;    END_IF;    //赋值    CASE #TimeAdd OF        0:            #ArrayData[0] := #tempInChx;        1:            #ArrayData[1] := #tempInChx;        2:            #ArrayData[2] := #tempInChx;        3:            #ArrayData[3] := #tempInChx;        4:            #ArrayData[4] := #tempInChx;        5:            #ArrayData[5] := #tempInChx;        6:            #ArrayData[6] := #tempInChx;        7:            #ArrayData[7] := #tempInChx;        8:            #ArrayData[8] := #tempInChx;        9:            #ArrayData[9] := #tempInChx;    END_CASE;END_REGION
REGION Out       IF #SecondPulse THEN        FOR #i := #ArrayLowLimit TO #ArrayUpLimit BY 1 DO            #ArrayData0[#i] := #ArrayData[#i];    //数据转存        END_FOR;        //计算平均值、调用中位平均值计算函数         #AverageValue := "FC_AverageValue_MM"(#ArrayData0);    END_IF;    //数据转换    #tempReal := (#AverageValue - #InRawMin) * (#InEuMax - #InEuMin) / (#InRawMax - #InRawMin) + #InEuMin;    //数据保留两位小数:将数据转换为长实数、长实数乘以100,截取整数部分、再除以100,最后长实数转换为实数    #tempReal := LREAL_TO_REAL(TRUNC_LREAL(REAL_TO_LREAL(#tempReal) * 100) / 100);    //数据输出保留两位小数        IF #tempReal > 0.0 THEN        #OutReal := #tempReal;    ELSIF #tempReal <= 0.0 THEN        #OutReal := 0.0;    END_IF;END_REGION
REGION Alarm        IF #InChx > #InRawMax THEN        #HighAlarm := 1;    //高报警    ELSE        #HighAlarm := 0;    END_IF;    IF #InChx < 0 THEN        #LowAlarm := 1;     //低报警    ELSE        #LowAlarm := 0;    END_IF;END_REGION

中位平均值滤波程序

5、新建DB(AnalogDB)、FB块(AnalogSwitch):



定义变量



FB块(AnalogSwitch)中程序



FB块(AnalogSwitch)中程序



FB块(AnalogSwitch)中程序

6、调用FB块(AnalogSwitch)、下载测试:



调用FB块(AnalogSwitch)



下载测试



下载测试



下载测试

二、中位平均值模拟量滤波:

(新建项目、新建FB、添加变量、编写程序、调用FB块、关联变量、下载测试)

1、新建FB块(Median Mean Filtering)、定义块接口参数:



定义块接口参数



定义块接口参数

2、编写程序:   


   

中位平均值滤波程序
(*模拟量数据转换INT_TO_REAL;算术平均值滤波算法公众号Smart Auto Control -- WangQuanFuGui 原创===========================================================================================中位平均值滤波算法原理:相当于“中位值滤波法”+“算术平均滤波法”连续采集N个模拟量数据值,将数据累加后,去掉最大值和最小值后,再求平均值,将结果作为滤波后的输出值。例如,采集 n 个数据 x1, x2,..., xn,滤波后的输出值 y 计算公式为 y = (x1 + x2 +... + xn) /(n-2)。N值的选 取:3~14,N值较大时信号平滑度较高,但灵敏度较低;N值较小时信号平滑度较低,但灵敏度较高。 优点:融合了两种滤波法的优点,对于偶然出现的脉冲 性干扰,可消除由于脉冲干扰所引起的采样值偏差;缺点:对于测量速度较慢或要求数据计算速度较快的实时控制不适用,比较浪费内存*)
REGION Edge       //秒脉冲    #SecondPulseU := #SecondPulse AND NOT #SecondPulseSave;    #SecondPulseSave := #SecondPulse;    //初始化    #ValueSum := 0;    IF #SecondPulseU AND #TimeAdd < 10 THEN        #TimeAdd := #TimeAdd + 1;      //采样时间累加    ELSIF #TimeAdd >= 10 THEN        #TimeAdd := 0;                 //采样周期复位    END_IF;END_REGION
REGION sampling    //输入数据比较    IF #InChx < #InRawMin THEN        #tempInChx := REAL_TO_INT(#InRawMin);    ELSIF #tempInChx > #InRawMax THEN        #tempInChx := REAL_TO_INT(#InRawMax);    ELSE        #tempInChx := #InChx;    END_IF;    //赋值    CASE #TimeAdd OF        0:            #ArrayData[0] := #tempInChx;        1:            #ArrayData[1] := #tempInChx;        2:            #ArrayData[2] := #tempInChx;        3:            #ArrayData[3] := #tempInChx;        4:            #ArrayData[4] := #tempInChx;        5:            #ArrayData[5] := #tempInChx;        6:            #ArrayData[6] := #tempInChx;        7:            #ArrayData[7] := #tempInChx;        8:            #ArrayData[8] := #tempInChx;        9:            #ArrayData[9] := #tempInChx;    END_CASE;END_REGION
REGION average value    IF #SecondPulse THEN        FOR #i := #ArrayLowLimit TO #ArrayUpLimit BY 1 DO            #ArrayData0[#i] := #ArrayData[#i];          //数据转存        END_FOR;    END_IF;    //冒泡排序升序    FOR #i := #ArrayLowLimit TO #ArrayUpLimit - 1 DO        FOR #j := #ArrayLowLimit TO (#ArrayLowLimit + #ArrayUpLimit - #i - 1) DO            IF #ArrayData0[#j] > #ArrayData0[#j + 1] THEN                #tempINT := #ArrayData0[#j + 1];        //数据交换                #ArrayData0[#j + 1] :=#ArrayData0[#j];  //数据交换                #ArrayData0[#j] := #tempINT;            //数据交换            END_IF;        END_FOR;    END_FOR;    //计算数组总和    FOR #i := #ArrayLowLimit TO #ArrayUpLimit BY 1 DO        #ValueSum := #ValueSum + #ArrayData0[#i];       END_FOR;     //获取最大值、最小值      #ArrayMax := DINT_TO_REAL(#ArrayData0[#ArrayUpLimit]);    #ArrayMin := DINT_TO_REAL(#ArrayData0[#ArrayLowLimit]);    //计算中位平均值:(总和减去最大值、最小值后)除以(数组上限减下限减一)    #AverageValue:= (DINT_TO_REAL(#ValueSum) - (#ArrayMax + #ArrayMin)) / DINT_TO_REAL(#ArrayUpLimit - #ArrayLowLimit - 1);END_REGION
REGION Out       //数据转换    #tempReal := (#AverageValue - #InRawMin) * (#InEuMax - #InEuMin) / (#InRawMax - #InRawMin) + #InEuMin;    //数据保留两位小数:将数据转换为长实数、长实数乘以100,截取整数部分、再除以100,最后长实数转换为实数    #tempReal := LREAL_TO_REAL(TRUNC_LREAL(REAL_TO_LREAL(#tempReal) * 100) / 100);    //数据输出保留两位小数        IF #tempReal > 0.0 THEN        #OutReal := #tempReal;    ELSIF #tempReal <= 0.0 THEN        #OutReal := 0.0;    END_IF;END_REGION
REGION Alarm        IF #InChx > #InRawMax THEN        #HighAlarm := 1;    //高报警    ELSE        #HighAlarm := 0;    END_IF;    IF #InChx < 0 THEN        #LowAlarm := 1;     //低报警    ELSE        #LowAlarm := 0;    END_IF;END_REGION

中位平均值滤波程序

3、在FB块(AnalogSwitch),调用子程序:



调用FB块(Median Mean Filtering)



调用FB块(Median Mean Filtering)  



下载测试



下载测试

注:程序仅供参考!!!

(参考文章:S7-1200 -1500 案例之算术平均值滤波算法)

(参考文章:S7-1200 -1500 案例之生成动态验证码)

(参考文章:S7-1200 -1500 案例之生成随机数)

(参考文章:S7-200 SMART 案例之设备轮询控制优化)

(参考文章:S7-200 SMART 案例之设备周期循环控制)

(参考文章:S7-200 SMART多从站Modbus-RTU通讯)

感谢您点赞、分享、给小编加鸡腿。






如需程序源码请打赏小编或私信留言。


参考文献《STEP7和WinCC Engineering系统手册》

STEP 7 和 WinCC EngineeringV16-V20

链接:https://pan.baidu.com/s/1yndwGyRb0o6o5m6N2SbYAA?pwd=1234

提取码:1234

全集成自动化获取 TIA Portal 相关信息的最短途径!

https://docs.tia.siemens.cloud/           

搜索答案-智能支持系统

https://www.ad.siemens.com.cn/service/answer/NewHl/HlSearch.aspx?boardId=1027&cid=1072&lcid=               

S7-200SMART快速访问链接

https://w2.siemens.com.cn/smart/

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册哦

x

最新评论