在大约2秒的时间内,有大量的模拟量数据经模拟量输入口输入,已经转化为实际数值,每一个扫描周期来一个数,现在的问题是如何把其中最大的50个数据取出来并按由大到小的顺序依次放在相邻的存储单元里。
问题补充:
我用的循环比较,大于等于后一个数,小于等于前一个数时,把数写入这个位置,后面的依次移一位,可问题是最开始的五十个没法进来,我不知道怎么处理了 !
针对我的思路,大家给点意见.
最佳答案
首先定义一张表,每次循环将数值存入表中,存满50次以后,根据下面的排序程序,进行排序
将下一个循环进来的数据保存在另外一个区(如:vw200),然后通过FOR 循环,与每一个数进行比较,从大数开始比较,如果vw200与到第一个比vw200的数值,将后面的数据用BMB指令后移一位,将vw200数据保存在该位置
以下数据处理上同
你也可以不用排序,在进数据的时候,就采用上面的方法
附:排序程序如下:
排序程序注释:
该程序主要是对字节、字、双字连续数据区进行排序,开始地址为vb0(可以修改),长度控制vw100,选择排序的字节、字、双字的长度,类型选择用 vw102区,分类如下
vw102(值) 字节 字 双字
0 √
1 √
2 √
程序默认长度是10,类型是字,升序(请在DB块中设定)
主程序:
LD SM0.0
CALL circle:SBR0
子程序:
circle:SBR0
TITLE=程序注释
Network 1
LDW> VW102, 2
OW< VW102, 0
CRET
Network 2 // 网络标题
// 网络注释
LD SM0.0
MOVD &VB0, AC0
MOVW 0, LW20
Network 3
LD SM0.0
FOR LW0, 1, VW100
Network 4
LDW<> LW0, LW20 //次数保存
MOVD AC0, AC1 //首地址
MOVW LW0, LW20
MOVD AC1, AC2
AENO
LPS
AW= VW102, 1
+D 2, AC2 //次地址
LRD
AW= VW102, 0
INCD AC2
LPP
AW= VW102, 2
+D 4, AC2
Network 5
LD SM0.0
MOVW LW0, LW4 //循环次数减1
INCW LW4
Network 6
LD SM0.0
FOR LW2, LW4, VW100
Network 7
LD SM0.0
LPS
AW= VW102, 1
AW<= *AC2, *AC1
CALL SBR1, *AC1, *AC2, *AC1, *AC2
LRD
AW= VW102, 0
AB<= *AC2, *AC1
CALL SBR2, *AC1, *AC2, *AC1, *AC2
LPP
AW= VW102, 2
AD<= *AC2, *AC1
CALL SBR3, *AC1, *AC2, *AC1, *AC2
Network 8
LD SM0.0
LPS
AW= VW102, 1
+D 2, AC2
LRD
AW= VW102, 0
INCD AC2
LPP
AW= VW102, 2
+D 4, AC2
Network 9
NEXT
Network 10
LD SM0.0
LPS
AW= VW102, 1
+D 2, AC0
LRD
AW= VW102, 0
INCD AC0
LPP
AW= VW102, 2
+D 4, AC0
Network 11
NEXT
exchange_word:SBR1
LD SM0.0
MOVW LW0, LW6
MOVW LW2, LW4
exchange_byte:SBR2
LD SM0.0
MOVB LB0, LB3
MOVB LB1, LB2
exchange_dword:SBR3
LD SM0.0
MOVD LD0, LD12
MOVD LD4, LD8
提问者对于答案的评价:
谢谢 .
原创文章,作者:ximenziask,如若转载,请注明出处:https://www.zhaoplc.com/plc358629.html