各高手,现有这样一问题:一个通道采集N次数据,每次数据存入不同寄存器地址,并且,在采集数据同时,在上位机实时显示最大两个数据。
望各位高手提供思路。
问题补充:
客户要求是这样:
假若采集5次数据:第一次数据为4,存入VW0
上位机显示:最大值:4,第二大值0
第二次数据为3,存入VW2
上位机显示:最大值:4,第二大值3
第三次数据为8,存入VW4
上位机显示:最大值:8,第二大值4
第四次数据为8,存入VW6
上位机显示:最大值:8,第二大值4
第五次数据为9,存入VW8
上位机显示:最大值:9,第二大值8
恳请大家支招。
最佳答案
学习之中1先生:按您“一个通道采集N次数据,每次数据存入不同寄存器地址,并且,在采集数据同时,在上位机实时显示最大两个数据”的要求,编制如下程序。输入通道为AIW2(您可按自己意愿设定),采样周期500ms,采样大值分别存入VW100、VW104,采样较小值分别存入VW102、VW106。比较两大值,把最大值存入VW108,次大值存入VW110。当两大值相等时,把其中之一存入VW108作为最大值;再比较两较小值,把其中大的存入VW110作为次大值;若两较小值
相等时,把其中之一存入VW110作为次大值。这样,所有采样的最大、次大值一直都存在VW108、VW110存储器中,您可以随时调用。程序有注释便于您理解,程序如下:
换一种方式
LD SM0.0
LPS
AN M10.0
TON T32, 500 //1ms定时器,设置500ms
LRD
A T32
= M10.0 //M10.0与T32组成500ms脉冲开关
LRD
A M10.0
INCB VB10 //T32导通VB10加1
LRD
AB>= VB10, 1
MOVB 0, VB10 //VB=1时VB复位
INCB VB10
LRD
AB= VB10, 0 //vb=0导通
LPS
AW>= AIW2, VW100 //采集信号与大值比较
MOVW AIW2, VW100 //采集信号大值存VW100
LPP
AW< AIW2, VW100 //采集信号与大值比较
MOVW AIW2, VW102 //采集信号小值存VW102
LRD
AB= VB10, 1 //vb=1导通
LPS
AW>= AIW2, VW104 //采集信号与大值比较
MOVW AIW2, VW104 //采集信号大值存VW104
LPP
AW< AIW2, VW104 //采集信号与大值比较
MOVW AIW2, VW106 //采集信号小值存VW106
LRD
AW> VW100, VW104 //采集大值比较
MOVW VW100, VW108 //最大值存VW108
MOVW VW104, VW110 //次大值存VW110
LRD
AW> VW104, VW100 //采集大值比较
MOVW VW104, VW108 //最大值存VW108
MOVW VW100, VW110 //次大值存VW110
LPP
AW= VW100, VW104 //采集大值相等时
LPS
MOVW VW100, VW108 //最大值存VW108
AW> VW102, VW106 //采集较小值比较
MOVW VW102, VW110 //校大值存即次大值存VW110
LRD
AW> VW106, VW102 //采集较小值比较
MOVW VW106, VW110 //校大值存即次大值存VW110
LPP
AW= VW102, VW106 //采集较小值相等时
MOVW VW102, VW110 //次大值存VW110
东方探索
提问者对于答案的评价:
非常感谢“东方探索”,您的程序给我提供了很好的思路,谢谢您的辛苦。我模拟了您编写的程序,结果如下:最大值能实时正确的显示,次最大值不是真正意义上的次最大值,是一个比最大值小的实时值(我是在改动VB10复位语句位置的结果,我把VB10复位语句放在程序的结尾),因时间较紧,我模拟很可能出现偏差,望见谅!
现在我的问题已经解决,因为客户对工件需要连续采集多次数据,除开最大值和次最大值,其它数据还需要作另外运算,所以我编写程序思路如下:把实时数据分别存入连续地址的寄存器,采用间接寻址和循环比较找出最大值和次最大值,经过几次模拟,最大值和次最大值能够实时准确的显示。
感谢“0不是1”,看了您的“中值循环滤波”,获益匪浅。也谢谢其他热情回答者。
原创文章,作者:more0621,如若转载,请注明出处:https://www.zhaoplc.com/plc314117.html