我先抛砖引玉,发个模拟量输入滤波程序,看看大家各有什么高招。

已锁定

LeeWheel

  • 帖子

    356
  • 精华

    4
  • 被关注

    25

论坛等级:侠士

注册时间:2004-04-20

普通 普通 如何晋级?

我先抛砖引玉,发个模拟量输入滤波程序,看看大家各有什么高招。

1638

0

2008-03-13 10:50:22

经常在现场遇到干扰很大的问题,在硬件措施没有办法完全解决的情况下,使用软件滤波就显得很有必要了,下面是我做的一段滤波程序,不是完全版,只是一个思路,已经实际应用,效果还不错。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;
我先抛砖引玉,发个模拟量输入滤波程序,看看大家各有什么高招。 已锁定
编辑推荐: 关闭

请填写推广理由:

本版热门话题

SIMATIC S7-300/400

共有54051条技术帖

相关推荐

热门标签

相关帖子推荐

guzhang

恭喜,你发布的帖子

评为精华帖!

快扫描右侧二维码晒一晒吧!

再发帖或跟帖交流2条,就能晋升VIP啦!开启更多专属权限!

top
您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。