您好,欢迎访问一九零五行业门户网

西门子S7-200PLC由“冒泡法”排序算法的逆向思考

在一些c语言资料上看到,“冒泡法”排序一般是从最后一个数据开始,向地址小的方向相邻两个数据比较,并按照从小到大或者从大到小排序的一种算法。在数据比较、移动的过程中,数据的运动,看起来好像水中的气泡向上运动。故而称之为“冒泡法”排序。
“冒泡法”排序,在知道数据的起始地址、数据个数、数据类型后,需要算出最后一个数据的地址,并从最后的一个地址开始运算排序。我在想,为什么不能从数据的起始地址开始排序呢,如果采用这种“下沉法”排序,还能省去计算数据的结束地址,程序应该会更简洁。于是自己就试着写了一下“下沉法”排序的plc程序代码,并测试通过。
排序环境:224cpu,从vb1000开始连续20个整数,从小到大排序。“下沉法”排序算法参考代码如下:
//******************给外循环体、内循环体的循环次数赋初值***********************
ld sm0.0 //开始执行从小到大的排序程序
movw 19, lw2 //给外循环次数(数据个数-1)赋初值
movw 19, lw6 //给内循环次数(数据个数-1)赋初值
//*******************建立外循环体并定义排序的其实地址*****************************
for lw0, +1, lw2 //for外循环体循执行lw2次
movd &vb1000, ac1 //将v区的起始地址赋给ac1,定义排序的起始地址
//**************建立内循环体并开始进行相邻的两个数据比较、移动****************
for lw4, +1, lw6 //for内循环体循执行lw6次
movd ac1, ac2 //把当前ac1里面的地址存储到ac2里面
+d +2, ac2 //ac2当前地址+2,存入ac2
ldw< *ac2, *ac1 //如果ac2指向的地址里面的内容小于ac1指向的地址里面的内容
movw *ac1, lw8 //那么将当前两个地址里面的内容互换
movw *ac2, lw10 //如果ac2指向的地址里面的内容不小于ac1指向的地址里面的内容
movw lw8, *ac2 //那么当前两个地址里面的内容保持不变
movw lw10, *ac1 //如果把小于比较指令改成大于比较指令,那么数据就是从大到小排序
ld sm0.0
+d +2, ac1 //ac1当前地址+2,存入ac1
next //跳转到for内循环,如果内循环执行结束,程序往下执行
//*******************内循环执行结束,进入外循环执行*****************************
decw lw6 //内循环体执行结束,将内循环体的循环次数减1
next //跳转到for外循环,如果外循环执行结束,程序往下执行
上面代码基本采用临时变量作运算的,其实还可以将其封装成一个子程序,实现多次调用。
其它类似信息

推荐信息