|
发表于 2014-3-18 21:10:34
|
显示全部楼层
可以写一个定时中断,在中断中将模拟量的值做累加。
比如做一个200MS中断,在中断中将模拟量的值做累加放入MD0,同时对中断的执行次数进行计数放入MW4,(执行够5次后,将MD0除以5,结果放入MW6,同时将计数值MW4清零以便继续做累加,MW6中即是平均值)。
过1秒加1次剔除最高和最低值,加后总数除次数再输出刷新。或将仪表信号负与24V-短接看能不能使信号平滑些,从源头处理问题比较好,对程序滤波不要抱太高的希望。
可以写一个定时中断,在中断中将模拟量的值做累加。
比如做一个200MS中断,在中断中将模拟量的值做累加放入MD0,同时对中断的执行次数进行计数放入MW4,(执行够5次后,将MD0除以5,结果放入MW6,同时将计数值MW4清零以便继续做累加,MW6中即是平均值)。
1、可以应用冒泡排序方法进行排序,其后取位于中间的数值即可:
2、冒泡法程序,注意这是对双字进行排序,如果对字进行排序,需要将指针 DBD[AR1,P#4.0],改为 DBW[AR1,P#2.0]:
转帖:
假定十个数据,放在DB1中,安放顺序如下:
DBD0
DBD4
…
DBD36
下面是西门子的程序
OPN DB 1 /////打开DB1这个数据块
L 10 ////装载10到MB0中,因为有十个数据,要进行十次排序,9次也可以的
LL0: T MB 0
L P#0.0 ////装载地址指针,这是关键,不要搞错了
LAR1
L 9
LL1: T MB 2 ////内部循环,进行9次,直到把最大值排到最后
L DBD [AR1,P#0.0]
L DBD [AR1,P#4.0]
<R
JC LL2 ////比较前后两个值,如果前面大于后面的,则前后数据交换
L DBD [AR1,P#0.0]
T #m_temp
L DBD [AR1,P#4.0]
T DBD [AR1,P#0.0]
L #m_temp
T DBD [AR1,P#4.0]
LL2: +AR1 P#4.0 ////指针自动进行加4,因为是浮点数,所以要跳过4个字节
L MB 2
LOOP LL1 ///这个指令自动的将A寄存器里的值减1
L MB 0
LOOP LL0
西门子官方提供有此样例程序。下载链接地址:http://support.automation.siemens.com/CN/view/zh/28027081 |
|