最爱SCL 废话不多说直接上菜
实现:若有很多的数需要进行加权求平均数,比如有几十个温度要求加权平均数,对于梯形图来说就太不好实现了。
需要定义两个DB块(这里没有做成一个DB,下次有空了做一个结构变量类型的只用一个DB),两个DB块都是每个变量为REAL,在处理的时候请用STL语言生成DB块。其中一个DB块存放REAL的需要求加权平均数的数值,另一个DB对应存放需要求加权平均数的权数。
简要说明:可设置上下限抛弃不在该范围的数值进行加权平均数计算。
//**************************************************************************************
// 加权平均值计算 并抛弃数据异常的(这里采用区间法)
//EBC-LW 2016-12-20
//数据和权数均采用REAL类型
//**************************************************************************************
FUNCTION FC76: VOID
TITLE = 'Weighted_DATA'
AUTHOR: EBC_LW
NAME: CRDEWWT
VERSION: '0.01'
FAMILY: EBC
KNOW_HOW_PROTECT
VAR_INPUT
DATA:BLOCK_DB; //用于存放数据的DB块
DATA_Weighted:BLOCK_DB;//存放加权数
Num:INT:=14; //多少个仪表
PV_H:REAL:=35.0; //仪表上限
PV_L:REAL:=18.0;//仪表下限
END_VAR
VAR_IN_OUT
END_VAR
VAR_OUTPUT
PV:REAL;//符合要求的仪表的平均值
FAIL_NUM:INT;//不符合要求的仪表数量
END_VAR
VAR_TEMP
I:INT;//循环变量
J:INT;//符合要求的仪表的数量
TEMP1:REAL;//符合要求的仪表的和
TEMP2:REAL;//符合要求的仪表的权和
END_VAR
VAR
//ARRAY_TEMP:ARRAY[1..1000] OF REAL;
END_VAR
// 清零
//
I:=0;
J:=0;
TEMP1:=0;
FOR I:= 1 TO Num BY 1 DO
//读取DB数据块中的数据
IF (PV_L<= DWORD_TO_REAL(DATA.DD[4*(I-1)])) & (DWORD_TO_REAL(DATA.DD[4*(I-1)])<= PV_H) THEN
//符合要求的仪表数量计数
J:=J+1;
TEMP1:=DWORD_TO_REAL(DATA.DD[4*(I-1)])*DWORD_TO_REAL(DATA_Weighted.DD[4*(I-1)])+TEMP1;//加权和
TEMP2:=DWORD_TO_REAL(DATA_Weighted.DD[4*(I-1)])+TEMP2;//权数和
// //ARRAY_TEMP[I]:=DATA.DBD[2^I];
END_IF;
END_FOR;
//计算符合要求仪表的加权平均值
PV:=TEMP1/TEMP2;
FAIL_NUM:=Num-J;
END_FUNCTION
//原创程序请多交流 QQ:275578306