📄 tq.c
字号:
/*无功投切电容器,6星6角*/
#include "public.h"
#include "p_main.H"
/* LF2407.H 的外部变量 */
/*IO端口B数据和方向控制寄存器*/
extern unsigned int *PEDATDIR;
extern unsigned int *PFDATDIR;
/***************************************************************************/
/**************函数功能:判断ABC三相有无故障状态****************************/
/**guzhang[3] 0:无故障 1:过压 2 欠压 4 谐波超限 8 零序超限 16 超前电压*****/
/***************************************************************************/
void Error_State(void)
{
uint i,j;
float temp;
for(i=0;i<3;i++)
{
if((up1_data.avr_u[i]/100-5)>SET_U1)guzhang[i]|=1;
else guzhang[i]&=0x1e;
if((up1_data.avr_u[i]+500)<SET_U2)guzhang[i]|=2;
else guzhang[i]&=0x1d;
if(up2_data.avr_zxb[i]>SET_THD)guzhang[i]|=4;
else guzhang[i]&=0x1b;
temp=up1_data.avr_u[0]/1000;
temp*=SET_LX;
j=temp;
if(up1_data.avr_u[4]>j)guzhang[i]|=8;
else guzhang[i]&=0x17;
if(q_flag[i]==1)guzhang[i]|=0x10;
else guzhang[i]&=0x0f;
}
}
/**************************************************************/
/**************函数功能:计算电容的容值************************/
/**cap[12][2]:分别为电容的有无标志和容值***********************/
/**************************************************************/
void C_Cap(void)
{
uint i;
for(i=0;i<12;i++)
cap[i]=0;
switch(SET_XN)
{
case 1:
for(i=0;i<3;i++)cap[2*i]=SET_XC;
tou_state[0]=0x01;
tou_state[1]=0x04;
tou_state[2]=0x10;
break;
case 2:
if(SET_XBM==0)
{
for(i=0;i<6;i++)
cap[i]=SET_XC;
}
else
{
for(i=0;i<3;i++)
{
cap[2*i]=SET_XC;
cap[2*i+1]=2*SET_XC;
}
}
tou_state[0]=0x03;
tou_state[1]=0x0c;
tou_state[2]=0x30;
break;
default:
for(i=0;i<6;i++)
cap[i]=0;
break;
}
switch(SET_JN)
{
case 1:
cap[6]=SET_JC;
tou_state[3]=0x40;
break;
case 2:
if(SET_JBM==0)
{
cap[6]=SET_JC;
cap[7]=SET_JC;
}
else
{
cap[6]=SET_JC;
cap[7]=2*SET_JC;
}
tou_state[3]=0x0c0;
break;
case 3:
switch(SET_JBM)
{
case 0: /*1:1:1:1*/
for(i=0;i<3;i++)
{
cap[6+i]=SET_JC;
}
break;
case 1: /*1:2:2:2*/
cap[6]=SET_JC;
cap[7]=2*SET_JC;
cap[8]=2*SET_JC;
break;
case 2: /*1:2:3:3*/
cap[6]=SET_JC;
cap[7]=2*SET_JC;
cap[8]=3*SET_JC;
break;
default: /*1:2:4:4*/
cap[6]=SET_JC;
cap[7]=2*SET_JC;
cap[8]=4*SET_JC;
break;
}
tou_state[3]=0x01c0;
break;
case 4:
switch(SET_JBM)
{
case 0: /*1:1:1:1*/
for(i=0;i<4;i++)
{
cap[6+i]=SET_JC;
}
break;
case 1: /*1:2:2:2*/
cap[6]=SET_JC;
cap[7]=2*SET_JC;
cap[8]=2*SET_JC;
cap[9]=2*SET_JC;
break;
case 2: /*1:2:3:3*/
cap[6]=SET_JC;
cap[7]=2*SET_JC;
cap[8]=3*SET_JC;
cap[9]=3*SET_JC;
break;
case 3: /*1:2:4:4*/
cap[6]=SET_JC;
cap[7]=2*SET_JC;
cap[8]=4*SET_JC;
cap[9]=4*SET_JC;
break;
default:
cap[6]=SET_JC;
cap[7]=2*SET_JC;
cap[8]=4*SET_JC;
cap[9]=8*SET_JC;
}
tou_state[3]=0x03c0;
break;
case 5:
switch(SET_JBM)
{
case 0: /*1:1:1:1*/
for(i=0;i<5;i++)
{
cap[6+i]=SET_JC;
}
break;
case 1: /*1:2:2:2*/
cap[6]=SET_JC;
cap[7]=2*SET_JC;
cap[8]=2*SET_JC;
cap[9]=2*SET_JC;
cap[10]=2*SET_JC;
break;
case 2: /*1:2:3:3*/
cap[6]=SET_JC;
cap[7]=2*SET_JC;
cap[8]=3*SET_JC;
cap[9]=3*SET_JC;
cap[10]=3*SET_JC;
break;
case 3: /*1:2:4:4*/
cap[6]=SET_JC;
cap[7]=2*SET_JC;
cap[8]=4*SET_JC;
cap[9]=4*SET_JC;
cap[10]=4*SET_JC;
break;
default:
cap[6]=SET_JC;
cap[7]=2*SET_JC;
cap[8]=4*SET_JC;
cap[9]=8*SET_JC;
cap[10]=8*SET_JC;
}
tou_state[3]=0x7c0;
break;
case 6:
switch(SET_JBM)
{
case 0: /*1:1:1:1*/
for(i=0;i<6;i++)
{
cap[6+i]=SET_JC;
}
break;
case 1: /*1:2:2:2*/
cap[6]=SET_JC;
cap[7]=2*SET_JC;
cap[8]=2*SET_JC;
cap[9]=2*SET_JC;
cap[10]=2*SET_JC;
cap[11]=2*SET_JC;
break;
case 2: /*1:2:3:3*/
cap[6]=SET_JC;
cap[7]=2*SET_JC;
cap[8]=3*SET_JC;
cap[9]=3*SET_JC;
cap[10]=3*SET_JC;
cap[11]=3*SET_JC;
break;
case 3: /*1:2:4:4*/
cap[6]=SET_JC;
cap[7]=2*SET_JC;
cap[9]=4*SET_JC;
cap[8]=4*SET_JC;
cap[10]=4*SET_JC;
cap[11]=4*SET_JC;
break;
default:
cap[6]=SET_JC;
cap[7]=2*SET_JC;
cap[8]=4*SET_JC;
cap[9]=8*SET_JC;
cap[10]=8*SET_JC;
cap[11]=8*SET_JC;
}
tou_state[3]=0x0fc0;
break;
}
}
/****************************************************************/
/*******函数功能:投切完标志*************************************/
/*******t_over[4]为投完标志,q_over[4]为切完标志*****************/
/*******tou_state[4]为投完电容状态*******************************/
/****************************************************************/
void C_Over(void)
{
uint i,j,temp=0;
uint cap_s;
cap_s=up1_data.c_status&0x0fc0;
if(cap_s==tou_state[3]){t_over[3]=1;q_over[3]=0;} /*三角形电容投完标志*/
else t_over[3]=0;
cap_s&=tou_state[3];
if(cap_s==0){q_over[3]=1;t_over[3]=0;qie_flag[3]=0;} /*三角形电容切完标志*/
else q_over[3]=0;
cap_s=up1_data.c_status&0x3f;
cap_s=up1_data.c_status&0x03;
if(cap_s==tou_state[0]){t_over[0]=1;q_over[0]=0;} /*A相电容投完标志*/
else t_over[0]=0;
cap_s&=tou_state[0];
if(cap_s==0){q_over[0]=1;t_over[0]=0;qie_flag[0]=0;} /*A相电容切完标志*/
else q_over[0]=0;
cap_s=up1_data.c_status&0x0c;
if(cap_s==tou_state[1]){t_over[1]=1;q_over[1]=0;} /*B相电容投完标志*/
else t_over[1]=0;
cap_s&=tou_state[1];
if(cap_s==0){q_over[1]=1;t_over[1]=0;qie_flag[1]=0;} /*B相电容切完标志*/
else q_over[1]=0;
cap_s=up1_data.c_status&0x30;
if(cap_s==tou_state[2]){t_over[2]=1;q_over[2]=0;} /*C相电容投完标志*/
else t_over[2]=0;
cap_s&=tou_state[2];
if(cap_s==0){q_over[2]=1;t_over[2]=0;qie_flag[2]=0;} /*C相电容切完标志*/
else q_over[2]=0;
for(i=0;i<4;i++)
{
if(t_over[i]==1)tou_flag[i]=0;
}
for(i=0;i<4;i++)
{
if(q_over[i]==1)qie_flag[i]=0;
}
}
/****************************************************************/
/*******函数功能:电容投入出口动作*************************** *******/
/****************************************************************/
void Kai_Chu(void)
{
uint i,temp;
if(dongzuo[3]==1)
{
switch(t_count[3])
{
case 6:
*PEDATDIR=*PEDATDIR|0X40;
up1_data.c_status|=0x40;
break;
case 7:
*PEDATDIR=*PEDATDIR|0X80;
up1_data.c_status|=0x80;
break;
case 8:
*PFDATDIR=*PFDATDIR|0X01;
up1_data.c_status|=0x100;
break;
case 9:
*PFDATDIR=*PFDATDIR|0X02;
up1_data.c_status|=0x200;
break;
case 10:
*PFDATDIR=*PFDATDIR|0X04;
up1_data.c_status|=0x400;
break;
case 11:
*PFDATDIR=*PFDATDIR|0X08;
up1_data.c_status|=0x800;
break;
default:break;
}
t_count[3]++;
if((t_count[3]-6)>=SET_JN)t_count[3]=6;
temp=up4_data.tj_shuju[137]+up4_data.tj_shuju[138]*256;
tou_flag[3]=0;
if(temp>1000)temp=0;
temp+=1; /*动作次数加一*/
up4_data.tj_shuju[137]=IntToLsb(temp);
up4_data.tj_shuju[138]=IntToMsb(temp);
}
if(dongzuo[0]==1)
{
switch(t_count[0])
{
case 0:
*PEDATDIR=*PEDATDIR|0X01;
up1_data.c_status|=0x01;
break;
case 1:
*PEDATDIR=*PEDATDIR|0X02;
up1_data.c_status|=0x02;
break;
default:break;
}
t_count[0]++;
if(t_count[0]>=SET_XN)t_count[0]=0;
dongzuo[0]=0;
tou_flag[0]=0;
temp=up4_data.tj_shuju[131]+up4_data.tj_shuju[132]*256;
if(temp>1000)temp=0;
temp+=1; /*动作次数加一*/
up4_data.tj_shuju[131]=IntToLsb(temp);
up4_data.tj_shuju[132]=IntToMsb(temp);
}
if(dongzuo[1]==1)
{
switch(t_count[1])
{
case 2:
*PEDATDIR=*PEDATDIR|0X04;
up1_data.c_status|=0x04;
break;
case 3:
*PEDATDIR=*PEDATDIR|0X08;
up1_data.c_status|=0x08;
break;
default:break;
}
t_count[1]++;
if((t_count[1]-2)>=SET_XN)t_count[1]=2;
dongzuo[1]=0;
tou_flag[1]=0;
temp=up4_data.tj_shuju[133]+up4_data.tj_shuju[134]*256;
if(temp>1000)temp=0;
temp+=1; /*动作次数加一*/
up4_data.tj_shuju[133]=IntToLsb(temp);
up4_data.tj_shuju[134]=IntToMsb(temp);
}
if(dongzuo[2]==1)
{
switch(t_count[2])
{
case 4:
*PFDATDIR=*PFDATDIR|0X01;
up1_data.c_status|=0x10;
break;
case 5:
*PFDATDIR=*PFDATDIR|0X02;
up1_data.c_status|=0x20;
break;
default:break;
}
t_count[2]++;
if((t_count[2]-4)>=SET_XN)
t_count[2]=4;
dongzuo[2]=0;
tou_flag[2]=0;
temp=up4_data.tj_shuju[135]+up4_data.tj_shuju[136]*256;
if(temp>1000)temp=0;
temp+=1; /*动作次数加一*/
up4_data.tj_shuju[135]=IntToLsb(temp);
up4_data.tj_shuju[136]=IntToMsb(temp);
}
}
/****************************************************************/
/*******函数功能:电容切除出口动作*************************** *******/
/****************************************************************/
void Kai_Ru(void)
{
uint i;
if(dzuo_q[3]==1)
{
switch(q_count[3])
{
case 6:
*PEDATDIR=*PEDATDIR&0X0ffbf;
up1_data.c_status&=0x0ffbf;
break;
case 7:
*PEDATDIR=*PEDATDIR&0X0ff7f;
up1_data.c_status&=0x0ff7f;
break;
case 8:
*PFDATDIR=*PFDATDIR&0X0fffe;
up1_data.c_status&=0x0feff;
break;
case 9:
*PFDATDIR=*PFDATDIR&0X0fffd;
up1_data.c_status&=0x0fdff;
break;
case 10:
*PFDATDIR=*PFDATDIR&0X0fffb;
up1_data.c_status&=0x0fbff;
break;
case 11:
*PFDATDIR=*PFDATDIR&0X0fff7;
up1_data.c_status&=0x0f7ff;
break;
default:break;
}
q_count[3]++;
if((q_count[3]-6)>=SET_JN)q_count[3]=6;
qie_flag[3]=0;
/*动作次数加一*/
}
if(dzuo_q[0]==1)
{
switch(q_count[0])
{
case 0:
*PEDATDIR=*PEDATDIR&0X0fffe;
up1_data.c_status&=0x0fffe;
break;
case 1:
*PEDATDIR=*PEDATDIR&0X0fffd;
up1_data.c_status&=0x0fffd;
break;
default:break;
}
q_count[0]++;
if(q_count[0]>=SET_XN)q_count[0]=0;
dzuo_q[0]=0;
qie_flag[0]=0;
}
if(dzuo_q[1]==1)
{
switch(q_count[1])
{
case 2:
*PEDATDIR=*PEDATDIR&0X0fffb;
up1_data.c_status&=0x0fffb;
break;
case 3:
*PEDATDIR=*PEDATDIR&0X0fff7;
up1_data.c_status&=0x0fff7;
break;
default:break;
}
q_count[1]++;
if((q_count[1]-2)>=SET_XN)q_count[1]=2;
dzuo_q[1]=0;
qie_flag[1]=0;
}
if(dzuo_q[2]==1)
{
switch(q_count[2])
{
case 4:
*PFDATDIR=*PFDATDIR&0X0fffe;
up1_data.c_status&=0x0ffef;
break;
case 5:
*PFDATDIR=*PFDATDIR&0X0fffd;
up1_data.c_status&=0x0ffdf;
break;
default:break;
}
q_count[2]++;
if((q_count[2]-4)>=SET_XN)q_count[2]=4;
dzuo_q[2]=0;
qie_flag[2]=0;
}
}
/****************************************************************/
/*******函数功能:无功投切,1:1:1:1为循环投切,另外: *******/
/****************************************************************/
void Tq(void)
{
uint i,us;
Error_State();
C_Over();
if(guzhang[0]==0||guzhang[1]==0||guzhang[2]==0) /*投三相电容和分相电容*/
{
if(t_over[3]==0)
{
us=t_count[3];
if(up1_data.avr_q[0]>cap[us]&&up1_data.avr_q[1]>cap[us]&&up1_data.avr_q[2]>cap[us])
{
if(tou_flag[3]==0){tou_flag[3]=1;tq_time[3]=0;}
}
else tou_flag[3]=0;
if(dongzuo[3]==1){Kai_Chu();dongzuo[3]=0;tou_flag[3]=0;/*出口*/}
}
else
{
for(i=0;i<3;i++)
{
if(t_over[i]==0)
{
us=t_count[i];
if(up1_data.avr_q[i]>cap[us])
{
if(tou_flag[i]==0){tou_flag[i]=1;tq_time[i]=0;}
}
else tou_flag[i]=0;
}
}
if(dongzuo[0]==1||dongzuo[1]==1||dongzuo[2]==1){Kai_Chu();tou_flag[i]=0;/*出口*/}
}
}
else /*切三相电容和分相电容,缺相速切,剩下按延时切电容*/
{
if(guzhang[0]==2||guzhang[1]==2||guzhang[2]==2)
{
/*判缺相否,是则速切*/
}
if(guzhang[0]!=0&&guzhang[1]!=0&&guzhang[2]!=0)
{
if(q_over[3]==0)
{
if(qie_flag[3]==0){qie_flag[3]=1;tq_time[3]=0;}
if(dzuo_q[3]==1){Kai_Ru();dzuo_q[3]=0;qie_flag[3]=0;}
}
else
{
for(i=0;i<3;i++)
{
if(guzhang[i]!=0&&q_over[i]==0)
{
if(qie_flag[i]==0){qie_flag[i]=1;tq_time[i]=0;}
}
}
if(dzuo_q[0]==1||dzuo_q[1]==1||dzuo_q[2]==1){Kai_Ru();qie_flag[i]=0;}
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -