用PLC编写《中位值滤波法》;要能体现不同PLC为实现两层循环控制和间接寻址。
工控PLC擂台每周一期,本期待80期结束一周后结贴。奖项设置:一等奖1名:20~50MP,二等奖5名:10MP,三等奖10名:100积分。
MP介绍:gongkongMP即工控币,是中国工控网的用户积分与回馈系统的一个网络虚拟计价单位,类似于大家熟悉的QB,1个MP=1元人民币。
MP有什么用?兑换服务:以1个MP=1元来置换中国工控网的相关服务。 兑换现金:非积分获得的MP可兑换等值现金(满100MP后、用户可通过用户管理后台申请兑换)。
楼主最近还看过
·以OB1循环周期作为1s计时器,每1s采集一次数据,采集N(可设置)次数据后,中值滤波输出;
·以系统时间毫秒的百位与前两位相加产生200内的伪随机数;
程序结构:
0B100:系统数据初始化
0B1: ·判断设置滤波次数是否合法(正奇数);
·数据采集;
·滤波输出;
DB1: +0.0 SampIn 采样
+4.0 Outp 输出
+8.0 ActualSampNum 实际采样次数
+10.0 SetSampNum 设定采样次数
+12.0..+4*19 SampBuf【20】 采样数据缓冲区
程序:
0B100--------------------------------------------------------------------------------------------------
OPN "SampleData"
L 0.000000e+000
T DBD 0
T DBD 4
L 0
T DBW 8
OB1------------------------------------------------------------------------------------------------------
NW1------------------------------------------------------
L "SampleData".SetSampNum
ITD
L 2
MOD
T #ValueD
O(
L "SampleData".SetSampNum
L 0
<=I
)
O(
L #ValueD
L 0
==D
)
JCN Run
= #SystemFault
BEC
NW2---------------------------------------------------------------
Run: L LD 6
ITD
DTR
T MD 100 //OB1循环周期累加作为1s定时器;
L MD 104
L MD 100
+R
T MD 104
L 1.000000e+003
<R
BEC
L 0.000000e+000
T MD 104
L LB 18 //利用系统时间毫秒的百位和前两位相加产生200内随机数
BTD //随机数仅用于测试,生成方法不科学;
L LB 19
BTD
+D
T #ValueD
DTR
T "SampleData".SampIn //DB1.DBD0
NW3---------------------------------------------------------------------
L "SampleData".ActualSampNum //DB1.DBW8
L 0
<>I
JC GetD
L P#12.0
T #EntryOfPointer
GetD: L "SampleData".SampIn
T DBD 【#EntryOfPointer】
L P#4.0 //每1s采集一次数据,并依此放入数组;
L #EntryOfPointer
+D
T #EntryOfPointer
L "SampleData".ActualSampNum
L 1
+I
T "SampleData".ActualSampNum
L "SampleData".SetSampNum
==I //完成设定次数的数据采集,进行中位值滤波输出;
JC Filt
BEC
NW4------------------------------------------------------------
Filt: L 0
T "SampleData".ActualSampNum
L 1
T #N
L "SampleData".SetSampNum
L 1
-I
Lwai: T #LoopCounterA //冒泡程序
L P#12.0 //从小到大进行排序
T #EntryOfPointer
L "SampleData".SetSampNum
L #N
-I
Lnei: T #LoopCounterB
L #EntryOfPointer
LAR1
L DBD 【AR1,P#0.0】
L DBD 【AR1,P#4.0】
>R
JCN _003
TAK
T #ValueReal
L DBD 【AR1,P#4.0】
T DBD 【AR1,P#0.0】
L #ValueReal
T DBD 【AR1,P#4.0】
_003: L #EntryOfPointer
L P#4.0
+D
T #EntryOfPointer
L #LoopCounterB
LOOP Lnei
L #N
L 1
+I
T #N
L #LoopCounterA
LOOP Lwai
//排序完成后取中间值输出
L DBW 10
L 1
-I
T #ValueI
L #ValueI
L 2
*I
T #ValueI
L #ValueI
SLD 3
LAR1
L DBD 【AR1,P#12.0】
T DBD 4