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/ |