300PLC在一个功能块内读取一个数据块内的数据进行排序,将排序结果写入另一个数据块
最佳答案
1、在一个功能块内读取一个数据块内的数据进行排序:
假定数据块DB1与DB20已建立,各有20个整型数据。原始数据放在DB1中,安放顺序如下:
DBW0
DBW2
…
DBW38
采用冒泡法进行排序:
下面是程序:
FC1:
OPN DB 1 /////打开DB1这个数据块
L 20 ////装载10到MB0中,因为有十个数据,要进行十次排序,9次也可以的
LL0: T MB 0
L P#0.0 ////装载地址指针,这是关键,不要搞错了
LAR1
L 19
LL1: T MB 2 ////内部循环,进行19次,直到把最大值排到最后
L DBD [AR1,P#0.0]
L DBD [AR1,P#2.0]
<I
JC LL2 ////比较前后两个值,如果前面大于后面的,则前后数据交换
L DBD [AR1,P#0.0]
T #m_temp
L DBD [AR1,P#2.0]
T DBD [AR1,P#0.0]
L #m_temp
T DBD [AR1,P#2.0]
LL2: +AR1 P#2.0 ////指针自动进行加2,,所以要跳过2个字节
L MB 2
LOOP LL1 ///这个指令自动的将A寄存器里的值减1
L MB 0
LOOP LL0
2、将排序结果写入另一个数据块:
将DB1中的数据共20个字送入DB20中
L P#0.0 //初始读指针
LAR1
L P#0.0 //初始写指针
LAR2
L 20 // 20个字的循环计数为初值
M001: T MB 10 //计数值 送入MB 10
OPN DB 1 //打开DB1
L DBW [AR1,P#0.0] //按读指针指示的地址读数据
OPN DB 20 //打开DB 20
T DBW [AR2,P#0.0] //按写指针指示的地址写数据
+AR1 P#2.0 //读指针指向下一数据地址
+AR2 P#2.0 //写指针指向下一数据地址
L MB 10 //取循环计数值
LOOP M001 //循环计数值如为0则结束循环;如不为0减1后则转向标号为M001的语句,继续循环。
提问者对于答案的评价:
非常感谢
原创文章,作者:more0621,如若转载,请注明出处:https://www.zhaoplc.com/plc291839.html