📄 gaojin.c
字号:
temp=0;
j=k=0;
if(maxValLoca+Offset90DegLocal<(SAMPLENUM-SERCHRANGE))//往右侧搜索,如果存在削顶相象那么过零点肯定在
{ //maxValLoca+Offset90DegLocal位置的右边所以留4个点的裕量
for(i=0;i<SERCHRANGE;i++) //这样可以更加准确的得到判断
{
if(adBuff.buff[maxValLoca+Offset90DegLocal+i]<adAverage)
j++;
if(adBuff.buff[maxValLoca+Offset90DegLocal-i]>adAverage)
k++;
}
if(j>=2 && k>=2)//确实在过零点附近
temp=0;
else
temp=1;
}
else if(maxValLoca-Offset90DegLocal>=SERCHRANGE)//往左边查找
{
for(i=0;i<SERCHRANGE;i++) //这样可以更加准确的得到判断
{
if(adBuff.buff[maxValLoca-Offset90DegLocal+i]>adAverage)
j++;
if(adBuff.buff[maxValLoca-Offset90DegLocal-i]<adAverage)
k++;
}
if(j>=2 && k>=2)//确实在过零点附近
temp=0;
else
temp=1;
}
}
//if(sameMaxValNum>GJsameValNum || sameMinValNum>GJsameValNum || subMaxValNum>(GJsameValNum*2) || subMinValNum>(GJsameValNum*2)|| temp) //削顶了
if(sameMaxValNum>GJsameValNum || sameMinValNum>GJsameValNum || temp) //削顶了
{
if(count1++>=2)
{
if(OSTimeGet()-time1<500)
{
switch(Channel)
{
case UA:
GJSta.ua=1;
break;
case UB:
GJSta.ub=1;
break;
case UC:
GJSta.uc=1;
break;
case IA:
GJSta.ia=1;
break;
case IB:
GJSta.ib=1;
break;
case IC:
GJSta.ic=1;
break;
}
}
time1=OSTimeGet();
count1=0;
}
}
else
{
switch(Channel)
{
case UA:
GJSta.ua=0;
break;
case UB:
GJSta.ub=0;
break;
case UC:
GJSta.uc=0;
break;
case IA:
GJSta.ia=0;
break;
case IB:
GJSta.ib=0;
break;
case IC:
GJSta.ic=0;
break;
}
}
}
else if(Channel==6) //电源通道
{
if(abs(val[Channel].Value/1000-POWERVOLT)>=POWERDROPVAL) //电源差异达到5v
{
if(count++>3)//滤波
{
if((OSTimeGet()-time)<300)
{
GJSta.pwr=1;
}
time=OSTimeGet();
count=0;
}
}
else
GJSta.pwr=0;
}
}
*/
char count=0;
char count1=0;
long gjtime=0;
long gjtime1=0;
//综合以上两个方法的告警检测函数,更可靠更灵敏,更加可以信赖
void GJCheckExtra(char Channel)
{
int max,min;
char sameMaxValNum,sameMinValNum;
char maxValLoca,minValLoca;
int i;
/*
char subMaxValNum,subMinValNum;
char subMaxValLoca,subMinValLoca;
int temp1;
*/
int temp;
long adAverage;
int Offset90DegLocal;
signed char j,k;
sameMaxValNum=sameMinValNum=0;
temp=0;
adAverage=0;
maxValLoca=0;
minValLoca=0;
//subMaxValLoca=subMinValLoca=0;
if(Channel<6)
{
if(val[Channel].Value>POWERLIMIT) //有效值大于12.5v才判断是否有削顶的值存在
{
//寻找最大值和最小值
adAverage=max=min=adBuff.buff[0];
if((max-adBuff.buff[1])>1000)
{
max=adBuff.buff[1];
maxValLoca=1;
}
if(adBuff.buff[1]-min>1000)
{
min=adBuff.buff[1];
minValLoca=1;
}
for(i=1;i<SAMPLENUM;i++)
{
if((adBuff.buff[i]>max))
{
if((abs(adBuff.buff[i]-adBuff.buff[i-1])<1000) && (abs(adBuff.buff[i]-adBuff.buff[i+1])<1000)) //变化太大为干扰或误采样
{
max=adBuff.buff[i];
maxValLoca=i; //记录最大值的位置
}
}
else if(adBuff.buff[i]<min)
{
if((adBuff.buff[i-1]-adBuff.buff[i]<1000) && (adBuff.buff[i+1]-adBuff.buff[i]<1000)) //变化太大为干扰或误采样
{
min=adBuff.buff[i];
minValLoca=i; //记录最小值的位置
}
}
adAverage+=adBuff.buff[i];
}
//在记录的最大和最小值的位置周围搜索是否有一样的采样值存在并记录个数
for(i=maxValLoca-5;i<=maxValLoca+5;i++) //在最大值的左右两边各查找3个点
{
temp=0;
for(j=i-1;j>=0;j--) //往左边查找
{
if(abs(adBuff.buff[i]-adBuff.buff[j])<=sameValRange)
temp++;
else
break;
}
for(j=i+1;j<SAMPLENUM;j++)
{
if(abs(adBuff.buff[i]-adBuff.buff[j])<=sameValRange)
temp++;
else
break;
}
if(temp>sameMaxValNum)
sameMaxValNum=temp;
}
//寻找最小值的个数
for(i=minValLoca-5;i<=minValLoca+5;i++) //在最大值的左右两边各查找3个点
{
temp=0;
for(j=i-1;j>=0;j--) //往左边查找
{
if(abs(adBuff.buff[i]-adBuff.buff[j])<=sameValRange)
temp++;
else
break;
}
for(j=i+1;j<SAMPLENUM;j++)
{
if(abs(adBuff.buff[i]-adBuff.buff[j])<=sameValRange)
temp++;
else
break;
}
if(temp>sameMinValNum)
sameMinValNum=temp;
}
i=0;
temp=SAMPLENUM;
do
{
temp/=2;
i++;
}
while(temp);
adAverage=adAverage>>(i-1); //求得平均值
//寻找过零点,在最大值的两边分别寻找过零点
//如果波形没有削顶那么在最大值的某一侧偏移90度的地方
//肯定可以找到一个过零的位置,如果找不到那么就说明最大值出现的位置
//不是在正弦波的顶点也就是说削顶了
//每周波采样SAMPLENUM个点,两个点之间相差360/(SAMPLENUM-1)度
//90度的位置在maxValLoca+-(90/(360/(SAMPLENUM-1)))的地方
//
Offset90DegLocal=(int)((double)90.0/(360.0/((double)SAMPLENUM-1.0)));
temp=0;
j=k=0;
if(maxValLoca+Offset90DegLocal<(SAMPLENUM-SERCHRANGE))//往右侧搜索,如果存在削顶相象那么过零点肯定在
{ //maxValLoca+Offset90DegLocal位置的右边所以留4个点的裕量
for(i=0;i<SERCHRANGE;i++) //这样可以更加准确的得到判断
{
if(adBuff.buff[maxValLoca+Offset90DegLocal+i]<adAverage)
j++;
if(adBuff.buff[maxValLoca+Offset90DegLocal-i]>adAverage)
k++;
}
if(j>=2 && k>=2)//确实在过零点附近
temp=0;
else
temp=1;
}
else if(maxValLoca-Offset90DegLocal>=SERCHRANGE)//往左边查找
{
for(i=0;i<SERCHRANGE;i++) //这样可以更加准确的得到判断
{
if(adBuff.buff[maxValLoca-Offset90DegLocal+i]>adAverage)
j++;
if(adBuff.buff[maxValLoca-Offset90DegLocal-i]<adAverage)
k++;
}
if(j>=2 && k>=2)//确实在过零点附近
temp=0;
else
temp=1;
}
}
//if(sameMaxValNum>GJsameValNum || sameMinValNum>GJsameValNum || subMaxValNum>(GJsameValNum*2) || subMinValNum>(GJsameValNum*2)|| temp) //削顶了
if(sameMaxValNum>=GJsameValNum || sameMinValNum>=GJsameValNum || temp) //削顶了
{
if(count1++>=2)
{
if(OSTimeGet()-gjtime1<200)
{
switch(Channel)
{
case UA:
GJSta.ua=1;
break;
case UB:
GJSta.ub=1;
break;
case UC:
GJSta.uc=1;
break;
case IA:
GJSta.ia=1;
break;
case IB:
GJSta.ib=1;
break;
case IC:
GJSta.ic=1;
break;
}
}
gjtime1=OSTimeGet();
count1=0;
}
}
else
{
switch(Channel)
{
case UA:
GJSta.ua=0;
break;
case UB:
GJSta.ub=0;
break;
case UC:
GJSta.uc=0;
break;
case IA:
GJSta.ia=0;
break;
case IB:
GJSta.ib=0;
break;
case IC:
GJSta.ic=0;
break;
}
}
}
else if(Channel==6) //电源通道
{
if(abs(val[Channel].Value/1000-POWERVOLT)>=POWERDROPVAL) //电源差异达到5v
{
if(count++>3)//滤波
{
if((OSTimeGet()-gjtime)<300)
{
GJSta.pwr=1;
}
gjtime=OSTimeGet();
count=0;
}
}
else
GJSta.pwr=0;
}
}
void GJCheckSup(void) //采用查找相同采样点个数的方法
{
}
void GJOut(void) //告警输出
{
GJOUTPORT=0xff;
if(GJSta.ua)
{
GJOUTPORT=UAOVERLOAD;
OSTimeDly(GJINTERVAl/OS_SW_PERIOD);
}
if(GJSta.ub)
{
GJOUTPORT=UBOVERLOAD;
OSTimeDly(GJINTERVAl/OS_SW_PERIOD);
}
if(GJSta.uc)
{ GJOUTPORT=UCOVERLOAD;
OSTimeDly(GJINTERVAl/OS_SW_PERIOD);
}
if(GJSta.ia)
{ GJOUTPORT=IAOVERLOAD;
OSTimeDly(GJINTERVAl/OS_SW_PERIOD);
}
if(GJSta.ib)
{
GJOUTPORT=IBOVERLOAD;
OSTimeDly(GJINTERVAl/OS_SW_PERIOD);
}
if(GJSta.ic)
{
GJOUTPORT=ICOVERLOAD;
//GJOUTPORT=0xf9;
OSTimeDly(GJINTERVAl/OS_SW_PERIOD);
}
if(GJSta.pwr)
{
GJOUTPORT=PWROVERLOAD;
OSTimeDly(GJINTERVAl/OS_SW_PERIOD);
}
if(GJSta.freq1)
{
GJOUTPORT=FREQ1OVERLOAD;
OSTimeDly(GJINTERVAl/OS_SW_PERIOD);
}
if(GJSta.freq2)
{
GJOUTPORT=FREQ2OVERLOAD;
OSTimeDly(GJINTERVAl/OS_SW_PERIOD);
}
if(GJSta.urgency)
{
GJOUTPORT=PWROVERLOAD;
OSTimeDly(GJINTERVAl/OS_SW_PERIOD);
GJSta.urgency=0;
}
}
unsigned long time1=0;
unsigned long time2=0;
unsigned int freq1=0,freq2=0;
char freq1ChgNum=0;
char freq2ChgNum=0; //频率改变次数
void CheckFreq(void) //监测频率是否正常
{
GJSta.freq1=GJSta.freq2=0;
if(abs(U1Freq.UFreq-freq1)>10) //频率改变了
{
if(freq1ChgNum++>GJOFREQCHGNUM) //频率改变次数达到上限值
{
if(OSTimeGet()-time1<FREQCHECKPERIOD) //时间在范围内
{
GJSta.freq1=1; //频率通道1告警
freq1ChgNum=0;
}
else
{
time1=OSTimeGet();
freq1ChgNum=0;
}
}
}
freq1=U1Freq.UFreq;
if(abs(U2Freq.UFreq-freq2)>10) //频率改变了
{
if(freq2ChgNum++>GJOFREQCHGNUM) //频率改变次数达到上限值
{
if(OSTimeGet()-time2<FREQCHECKPERIOD) //时间在范围内
{
GJSta.freq2=1; //频率通道1告警
freq1ChgNum=0;
}
else
{
time2=OSTimeGet();
freq2ChgNum=0;
}
}
}
freq2=U2Freq.UFreq;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -