[西门子] 西门子SCL编程实例—冒泡排序算法的实现

[复制链接]
查看53190 | 回复0 | 2024-5-15 21:41:16 | 显示全部楼层 |阅读模式
最近使用西门子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程序的执行是一种循环反复执行过程,所以在使用冒泡排序的时候可以考虑加入一个使能控制命令。

本帖子中包含更多资源

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

x
您需要登录后才可以回帖 登录 | 注册哦

本版积分规则