📄 clcom.c
字号:
/**************************************************************************************
**函数名: CLCOM.C
** 功能描述:根据32点采样值计算计算电压、电流有效值;有功功率、无功功率、实在功率和功率因素
** 作 者:李纯
** 日 期:2004年2月27日
*************************************************************************************/
/*****************************************************************
** 函数名: Youxiaozhi()
** 功能描述:根据32点采样值计算测量电压、电流有效值
** 作 者:李纯
** 日 期:2004年2月25日(已完成)
****************************************************************/
void Youxiaozhi()
{ unsigned int j;
unsigned long data,b0,b1,b2,b3;
b0=0; // 求Ua (Uab)的有效值
b1=0;
b2=0;
b3=0;
for(j=0;j<8;j++)
{ b0=b0+(ADUa[j]-0x01FF)*(ADUa[j]-0x01FF);
b1=b1+(ADUa[j+8]-0x01FF)*(ADUa[j+8]-0x01FF);
b2=b2+(ADUa[j+16]-0x01FF)*(ADUa[j+16]-0x01FF);
b3=b3+(ADUa[j+24]-0x01FF)*(ADUa[j+24]-0x01FF);
}
data=((b0>>3)+(b1>>3)+(b2>>3)+(b3>>3))>>2;
data=qsqrt(data);
UaAv=(unsigned int)((data*Uaxzh)>>4);
b0=0; // 求Ub (Ubc)的有效值
b1=0;
b2=0;
b3=0;
for(j=0;j<8;j++)
{ b0=b0+(ADUb[j]-0x01FF)*(ADUb[j]-0x01FF);
b1=b1+(ADUb[j+8]-0x01FF)*(ADUb[j+8]-0x01FF);
b2=b2+(ADUb[j+16]-0x01FF)*(ADUb[j+16]-0x01FF);
b3=b3+(ADUb[j+24]-0x01FF)*(ADUb[j+24]-0x01FF);
}
data=((b0>>3)+(b1>>3)+(b2>>3)+(b3>>3))>>2;
data=qsqrt(data);
UbAv=(unsigned int)((data*Ubxzh)>>4);
b0=0; // 求Uc (Uca)的有效值
b1=0;
b2=0;
b3=0;
for(j=0;j<8;j++)
{
b0=b0+(ADUc[j]-0x01FF)*(ADUc[j]-0x01FF);
b1=b1+(ADUc[j+8]-0x01FF)*(ADUc[j+8]-0x01FF);
b2=b2+(ADUc[j+16]-0x01FF)*(ADUc[j+16]-0x01FF);
b3=b3+(ADUc[j+24]-0x01FF)*(ADUc[j+24]-0x01FF);
}
data=((b0>>2)+(b1>>2)+(b2>>2)+(b3>>2))>>3;
data=qsqrt(data);
UcAv=(unsigned int)((data*Ucxzh)>>4);
b0=0; // 求Ia的有效值
b1=0;
b2=0;
b3=0;
for(j=0;j<8;j++)
{
b0=b0+(ADIa[j]-0x01FF)*(ADIa[j]-0x01FF);
b1=b1+(ADIa[j+8]-0x01FF)*(ADIa[j+8]-0x01FF);
b2=b2+(ADIa[j+16]-0x01FF)*(ADIa[j+16]-0x01FF);
b3=b3+(ADIa[j+24]-0x01FF)*(ADIa[j+24]-0x01FF);
}
data=((b0>>3)+(b1>>3)+(b2>>3)+(b3>>3))>>2;
data=qsqrt(data);
IaAv=(unsigned int)((data*Iaxzh)>>9);
b0=0; // 求Ib的有效值
b1=0;
b2=0;
b3=0;
for(j=0;j<8;j++)
{
b0=b0+(ADIb[j]-0x01FF)*(ADIb[j]-0x01FF);
b1=b1+(ADIb[j+8]-0x01FF)*(ADIb[j+8]-0x01FF);
b2=b2+(ADIb[j+16]-0x01FF)*(ADIb[j+16]-0x01FF);
b3=b3+(ADIb[j+24]-0x01FF)*(ADIb[j+24]-0x01FF);
}
data=((b0>>3)+(b1>>3)+(b2>>3)+(b3>>3))>>2;
data=qsqrt(data);
IbAv=(unsigned int)((data*Ibxzh)>>9);
b0=0; // 求Ic的有效值
b1=0;
b2=0;
b3=0;
for(j=0;j<8;j++)
{
b0=b0+(ADIc[j]-0x01FF)*(ADIc[j]-0x01FF);
b1=b1+(ADIc[j+8]-0x01FF)*(ADIc[j+8]-0x01FF);
b2=b2+(ADIc[j+16]-0x01FF)*(ADIc[j+16]-0x01FF);
b3=b3+(ADIc[j+24]-0x01FF)*(ADIc[j+24]-0x01FF);
}
data=((b0>>3)+(b1>>3)+(b2>>3)+(b3>>3))>>2;
data=qsqrt(data);
IcAv=(unsigned int)((data*Icxzh)>>9);
return;
}
/*****************************************************************
** 函数名: PowerY()
** 功能描述:计算有功功率、无功功率、实在功率和功率因素Y接法(三表法 )
** 作 者:李纯
** 日 期:2004年2月25日(未完成)
****************************************************************/
void PowerY()
{ int i;
int k=32;
long a0,a1,a2,a3,data;
/******计算有功功率***************************/
a0=0; /* 计算Ua*Ia */
a1=0;
a2=0;
a3=0;
for(i=0;i<8;i++)
{
a0=a0+(ADUa[i]-0x01FF)*(ADIa[i]-0x01FF);
a1=a1+(ADUa[i+8]-0x01FF)*(ADIa[i+8]-0x01FF);
a2=a2+(ADUa[i+16]-0x01FF)*(ADIa[i+16]-0x01FF);
a3=a3+(ADUa[i+24]-0x01FF)*(ADIa[i+24]-0x01FF);
}
data=(a0>>5)+(a1>>5)+(a2>>5)+(a3>>5);
data=(data*Iaxzh)>>9;
P=(data*Uaxzh)>>4;
a0=0; /* 计算Ub*Ib */
a1=0;
a2=0;
a3=0;
for(i=0;i<8;i++)
{
a0=a0+(ADUb[i]-0x01FF)*(ADIb[i]-0x01FF);
a1=a1+(ADUb[i+8]-0x01FF)*(ADIb[i+8]-0x01FF);
a2=a2+(ADUb[i+16]-0x01FF)*(ADIb[i+16]-0x01FF);
a3=a3+(ADUb[i+24]-0x01FF)*(ADIb[i+24]-0x01FF);
}
data=(a0>>5)+(a1>>5)+(a2>>5)+(a3>>5);
data=(data*Ibxzh)>>9;
P=P+((data*Ubxzh)>>4);
a0=0; /* 计算Uc*Ic */
a1=0;
a2=0;
a3=0;
for(i=0;i<8;i++)
{
a0=a0+(ADUc[i]-0x01FF)*(ADIc[i]-0x01FF);
a1=a1+(ADUc[i+8]-0x01FF)*(ADIc[i+8]-0x01FF);
a2=a2+(ADUc[i+16]-0x01FF)*(ADIc[i+16]-0x01FF);
a3=a3+(ADUc[i+24]-0x01FF)*(ADIc[i+24]-0x01FF);
}
data=(a0>>5)+(a1>>5)+(a2>>5)+(a3>>5);
data=(data*Icxzh)>>9;
P=P+((data*Ucxzh)>>4);
P=P/100;
/**********计算无功功率************************/
a0=0; /*A相无功功率*/
for(i=0;i<k;i++)
{
if((i+((k+1)>>2))<k)
a0=a0+(ADUa[i]-0x01FF)*(ADIa[i+(k>>2)]);
else
a0=a0+(ADUa[i]-0x01FF)*(ADIa[i-((k*3)>>2)]);
}
data=(a0*Iaxzh)>>7;
Q=(data*Uaxzh)>>10;
a0=0; /*B相无功功率*/
for(i=0;i<k;i++)
{
if((i+((k+1)>>2))<k)
a0=a0+(ADUb[i]-0x01FF)*(ADIb[i+(k>>2)]);
else
a0=a0+(ADUb[i]-0x01FF)*(ADIb[i-((k*3)>>2)]);
}
data=(a0*Ibxzh)>>7;
Q=Q+(data*Ubxzh)>>10;
a0=0; /*C相无功功率*/
for(i=0;i<k;i++)
{
if((i+((k+1)>>2))<k)
a0=a0+(ADUc[i]-0x01FF)*(ADIc[i+(k>>2)]);
else
a0=a0+(ADUc[i]-0x01FF)*(ADIc[i-((k*3)>>2)]);
}
data=(a0*Icxzh)>>7;
Q=Q+(data*Ucxzh)>>10;
S=(qsqrt((P/100)*(P/100)+(Q/100)*(Q/100)))*100;/*视在功率*/
Factor=((P>>8)*100)/(S>>8); /* 功率因素带2位小数,为什么要各右移8位???? */
return;
}
/*****************************************************************
** 函数名: PowerD()
** 功能描述:计算有功功率、无功功率、实在功率和功率因素D接法(两表法UabIa-UbcIc )
** 作 者:李纯
** 日 期:2004年2月25日(未完成)
****************************************************************/
void PowerD()
{ int i;
long a0,a1,a2,a3,data,data2,data1;
long b0,b1,b2,b3;
//P=UabIa-UbcIc
a0=0; // 计算Uab*Ia
a1=0;
a2=0;
a3=0;
for(i=0;i<8;i++)
{
a0=a0+(ADUa[i]-0x01FF)*(ADIa[i]-0x01FF);
a1=a1+(ADUa[i+8]-0x01FF)*(ADIa[i+8]-0x01FF);
a2=a2+(ADUa[i+16]-0x01FF)*(ADIa[i+16]-0x01FF);
a3=a3+(ADUa[i+24]-0x01FF)*(ADIa[i+24]-0x01FF);
}
data=((a0>>3)+(a1>>3)+(a2>>3)+(a3>>3))>>2;
data=data;
data=(data*Iaxzh)>>9;
P=(data*Uaxzh)>>4;
a0=0; // 计算Ubc*Ic
a1=0;
a2=0;
a3=0;
for(i=0;i<4;i++)
{
a0=a0+(ADUb[i]-0x01FF)*(ADIb[i]-0x01FF);
a1=a1+(ADUb[i+4]-0x01FF)*(ADIb[i+4]-0x01FF);
a2=a2+(ADUb[i+8]-0x01FF)*(ADIb[i+8]-0x01FF);
a3=a3+(ADUb[i+12]-0x01FF)*(ADIb[i+12]-0x01FF);
}
data=((a0>>3)+(a1>>3)+(a2>>3)+(a3>>3))>>2;
data=data;
data=(data*Icxzh)>>9;
P=P-((data*Ubxzh)>>4); //UabIa-UbcIc
/*20030327 用瞬时值计算无功功率*/
data = 0;
data2=0;
for(i=0;i<32;i++){
if(i==0){
a0 = ADUa[31] - ADUa[i+1];
a1 = ADUb[31] - ADUb[i+1];
}
else if(i == 31){
a0 = ADUa[i-1] - ADUa[0];
a1 = ADUb[i-1] - ADUb[0];
}
else {
a0 = ADUa[i-1] - ADUa[i+1];
a1 = ADUb[i-1] - ADUb[i+1];
}
data = data +((a0*ADIa[i])>>2); // data = data + (1.0/4.0/Pi)*(a0*ADIa[i]-a1*ADIc[i])
data2=data2+((a1*ADIc[i])>>2);
}
//add by ylp 2003 03 27
data=data>>13;
data2=data2>>13;
data=(data*Iaxzh)>>4;
data2=(a2*Icxzh)>>4;
data=(data*Uaxzh)>>9;
data2=(data2*Ubxzh)>>9;
data=data-data2;
data = (data * 10000)/31416;
// add by ylp 2003 03 27
data1 = data1 /1000; //P*125
data = data*16/10 ; //Q*125
temp=qsqrt(data*data+data1*data1); //S*125
if(data1 < 0) Factor=((-data1)*100)/(temp); //20030328
else Factor=((data1)*100)/(temp); // 功率因素带2为小数
P = data1*10;
Q = data*10;
S = temp*10; // 功率因素带2为小数
/*20030327 以上是用瞬时值计算无功功率*/
return;
}
/*****************************************************************
** 函数名: AVRAGE()
** 功能描述:测量参数平均值计算子程序
** 作 者:严利平
** 日 期:2003年1月22日
****************************************************************/
void AVRAGE()
{ unsigned int i;
unsigned long a0,a1,a2,a3,a4,a5;
AvNo+=1;
if(AvNo>=AVN)
{
AvNo=0;
a0=0;a1=0;a2=0;a3=0;a4=0;a5=0;
for(i=0;i<AVN;i++)
{ a0=a0+Uaa[i];
a1=a1+Ubb[i];
a2=a2+Ucc[i];
a3=a3+Iaa[i];
a4=a4+Ibb[i];
a5=a5+Icc[i];
}
Ua=a0/AVN;
Ub=a1/AVN;
Uc=a2/AVN;
Ia=a3/AVN;
Ib=a4/AVN;
Ic=a5/AVN;
}
return;
}
/*****************************************************************
** 函数名: Clcom()
** 功能描述:测量参数计算子程序
** 作 者:严利平
** 日 期:2003年1月12日
****************************************************************/
void Clcom()
{
Youxiaozhi();
PowerD();
AVRAGE();
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -