经常在现场遇到干扰很大的问题,在硬件措施没有办法完全解决的情况下,使用软件滤波就显得很有必要了,下面是我做的一段滤波程序,不是完全版,只是一个思路,已经实际应用,效果还不错。PS:变量定义部分未贴出。
FOR i := 1 TO ai_count BY 1 DO
sampleValue := WORD_TO_INT(IW[AIDB.VAL[i].address]);
IF (sampleValue > AI_Max OR sampleValue < 0) THEN
sampleValue := AI_Max;
END_IF;
IF (STATUS.sample_count = 0) THEN
AIDB.VAL[i].sum_input := 0;
AIDB.VAl[i].min_input := sampleValue;
AIDB.VAL[i].max_input := sampleValue;
ELSE
IF (sampleValue < AIDB.VAL[i].min_input) THEN
AIDB.VAl[i].min_input := sampleValue;
ELSIF (sampleValue > AIDB.VAL[i].max_input) THEN
AIDB.VAL[i].max_input := sampleValue;
END_IF;
END_IF;
AIDB.VAL[i].sum_input := AIDB.VAL[i].sum_input + sampleValue;
END_FOR;
STATUS.sample_count := STATUS.sample_count + 1;
//如果采样数到指定值
IF STATUS.sample_count = sample_count THEN
//将采样值取平均值
FOR i := 1 TO ai_count BY 1 DO
averageValue := DINT_TO_INT((AIDB.VAL[i].sum_input - AIDB.VAL[i].max_input - AIDB.VAL[i].min_input) / (sample_count - 2));
IF STATUS.avg_count < avg_count THEN //如果取平均值次数未到指定值
AIDB.VAL[i].avg_list[STATUS.avg_count + 1] := averageValue;
ELSE //如果取平均值次数超过指定值,减指定值,循环
AIDB.VAL[i].avg_list[STATUS.avg_count + 1 - avg_count] := averageValue;
END_IF;
END_FOR;
STATUS.avg_count := STATUS.avg_count + 1;