最近使用西门子PLC的高速计数器模块采集编码器信号,直接使用模块输出的瞬时速度跳变有点大,为了能让屏幕上显示的速度体现实时速度且平稳,需要在程序上进行处理一下,用更加专业的说法就是速度滤波。这里说的速度滤波就是一种数据处理算法。由于速度的跳变是在一个速度值左右来回跳变,所以选择的处理方法是算术平均数法。通过采集相同时间速度值N个,存入一个数组,然后对数组内的速度值进行排序,将最大值和最小值去掉后,计算平均值,将计算的平均值作为实时速度值在屏幕上显示。平均值的计算很简单,这里主要说一下里面涉及到的排序方法——冒泡排序如何通过SCL程序语言实现。 冒泡排序属于排序算法的一种,其排序原理是通过比较相邻的两个数据,根据大小交换位置,经过几轮比较后,数据就会按照从大到小或者从小到大的顺序排列储存。以下是冒泡排序算法的图解过程:
清楚明白冒泡排序算法的具体原理后,接下来就是要用SCL语言来实现,以下就是SCL语言实现冒泡算法的具体代码:
变量声明
//#Array:存储数据的数组//#Array_Lower:数组下限编号,通过指令LOWER_BOUND(ARR := #Array, DIM := 1)来获取//#Array_Upper:数组上限编号,通过指令UPPER_BOUND(ARR := #Array, DIM := 1)来获取//#Array_Lower := LOWER_BOUND(ARR := #Array, DIM := 1);//#Array_Upper := UPPER_BOUND(ARR := #Array, DIM := 1);//#Cycle_Limit:外循环次数//#Cycle_Num:每次循环的比较册数FOR#Cycle_Limit := #Array_Lower TO #Array_Upper-1 DOFOR#Cycle_Num := #Array_Lower TO #Array_Upper-#Cycle_Limit-1 DOIF#Array[#Cycle_Num]<#Array[#Cycle_Num+1] THEN#Array_Temp := #Array[#Cycle_Num + 1];#Array[#Cycle_Num + 1] := #Array[#Cycle_Num];#Array[#Cycle_Num] := #Array_Temp; END_IF; END_FOR;END_FOR;
SCL语言属于一种高级语言,所以冒泡排序实现的代码和C语言、JAVA等高级语言的实现代码很相似。由于PLC程序的执行是一种循环反复执行过程,所以在使用冒泡排序的时候可以考虑加入一个使能控制命令。 |