我这边要采集的数据量是不固定的,但都大于5个,所以我希望这个是个变量。
然后我这边是要去除2个最大的和2个最小的值,然后取平均数。不知道哪位大神能帮帮忙
问题补充:
如果是应用冒泡法,如何能简单的算取中间数值的平均值呢,而且我如何知道我已经排序好了呢?
最佳答案
1:首先 ,你需要 新建个数组比如64个REAL 类型的。
2:采样次数必须<=64.
3:编写个FC 程序,做个POINTER参数,指向你新建的数组
4::你是 去除一个最大值和1个最小值?还是2个最大值和2个最小值?如果是后者,需要排序算法。如果是前者,相对简单,是个标准的中位值平均滤波
参数
VAR_INPUT
FilterFactor : INT ;
InValue : REAL ;
Queue : POINTER ;
MovingAverage : BOOL ;
MedianAverage : BOOL ;
ParNoFilter : BOOL ;
END_VAR
VAR_IN_OUT
OutValue : REAL ;
EnterAcc : INT ;
END_VAR
VAR_TEMP
tmpMax : REAL ;
tmpMin : REAL ;
tmpSum : REAL ;
tmpAddr : DWORD ;
DBNumber : INT ;
tmpIdex : INT ;
tmpbool : BOOL ;
AR1Restore : DWORD ;
END_VAR
代码
TAR1 #AR1Restore
A #ParNoFilter
JC Nc3
L P##Queue
LAR1
L W [AR1,P#0.0]
T #DBNumber
L D [AR1,P#2.0]
SLD 8
SRD 8
T #tmpAddr
OPN DB [#DBNumber]
LAR1 #tmpAddr
L P#4.0
L #EnterAcc
*D
+AR1
L #InValue
T DBD [AR1,P#0.0]
L #EnterAcc
INC 1
T #EnterAcc
L #FilterFactor
>=I
= #tmpbool
JNB Rst1
L 0
T #EnterAcc
Rst1: NOP 0
A #tmpbool
O #MovingAverage
JCN Nc1
LAR1 #tmpAddr
L DBD [AR1,P#0.0]
T #tmpMax
T #tmpMin
L 0.000000e+000
T #tmpSum
L #FilterFactor
MAF1: T #tmpIdex
LAR1 #tmpAddr
A #MovingAverage
JC Sum
L #tmpMax
L DBD [AR1,P#0.0]
<=R
JCN MAX
L DBD [AR1,P#0.0]
T #tmpMax
字数有限,剩余部分 见图片
补充:关键是去一个最大和一个最小,还是第一大的和第二大的数值,以及最小和第二小的数值,如果这样需要排序,不然只要你只要比较出最大值和最小值。
图片说明:
提问者对于答案的评价:
谢谢~~
专家置评
已阅,最佳答案正确。
原创文章,作者:more0621,如若转载,请注明出处:https://www.zhaoplc.com/plc229300.html