📄 baseai.c
字号:
{48,10e6/(Sample_Point*48),48/3.1415926536},{48.5,10e6/(Sample_Point*48.5),48.5/3.1415926536}, //3
{49,10e6/(Sample_Point*49),49/3.1415926536},{49.5,10e6/(Sample_Point*49.5),49.5/3.1415926536}, //4
{50,10e6/(Sample_Point*50),50/3.1415926536},{50.5,10e6/(Sample_Point*50.5),50.5/3.1415926536}, //5
{51,10e6/(Sample_Point*51),51/3.1415926536},{51.5,10e6/(Sample_Point*51.5),51.5/3.1415926536}, //6
{52,10e6/(Sample_Point*52),52/3.1415926536},{52.5,10e6/(Sample_Point*52.5),52.5/3.1415926536}, //7
{53,10e6/(Sample_Point*53),53/3.1415926536},{53.5,10e6/(Sample_Point*53.5),53.5/3.1415926536}, //8
{54,10e6/(Sample_Point*54),54/3.1415926536},{54.5,10e6/(Sample_Point*54.5),54.5/3.1415926536}, //9
{55,10e6/(Sample_Point*55),55/3.1415926536},{55.5,10e6/(Sample_Point*55.5),55.5/3.1415926536}, //10
};
UNSIGNED FreqIndex = 10;
UNSIGNED SampleIntervalChangeFlag,SampleIntervalChangeClock;
UNSIGNED SampleInterval = 8333;
/***********************************************************************************/
/* 滤波,计算频率,调整采样间隔 */
/***********************************************************************************/
extern float FFRENQ();
VOID Calculate(VOID)
{
register FREQSTRU *p = &FreqCtrl[FreqIndex];
register float f1;
fei_calculate(); //滤波
Phase_V_Cal(); //计算线电压
if(SampleIntervalChangeFlag == 2) //是否正在调整采样频率
{
if(TMD_System_Clock - SampleIntervalChangeClock < 50) return; //等待两个周波
SampleIntervalChangeFlag = 0;
}
f1 = FFRENQ(); //计算频率中间间隔
if(f1 == 0) //当线电压全部为零时,f1为0
{
samp_f = 50.0; //当线电压全部为零时,按默认频率
}
else
{
samp_f = p->frequency - p->coeff * f1; //计算频率结果
}
/*
if ((samp_f >= 45) && (samp_f <= 55.5)) //如果频率不为0,执行以下程序,检查是否需要调整采样间隔
{
if (fabs(samp_f - p->frequency) > 0.5)
{
if (samp_f > p->frequency)
{
while (FreqIndex < FreqModifyNumber - 1)
{
p++;
FreqIndex++;
SampleInterval = (UNSIGNED)p->sample_interval;
SampleIntervalChangeFlag = 1;
if (fabs(samp_f - p->frequency) < 0.5)break;
}
}
else
{
while (FreqIndex)
{
p--;
FreqIndex--;
SampleInterval = (UNSIGNED)p->sample_interval;
SampleIntervalChangeFlag = 1;
if (fabs(samp_f - p->frequency) < 0.5)break;
}
}
}
}*/
}
/***********************************************************************************/
/* 遥测量计算 */
/***********************************************************************************/
float fIA,fIC,fUAB,fUBC,fUCA,fP,fQ;
VOID RemoteMeasure(VOID)
{
static UNSIGNED uMEAInterval; //计算测量的间隔
register UNSIGNED iharmous,iSampleIndex;
register float *pf,fuabcos,fuabsin,fucbcos,fucbsin,fiacos,fiasin,ficcos,ficsin,ftmp1,ftmp2;
register MEASTRU *pMeasure;
register PRO_CHANNEL *pChn;
register OPTION old_preempt;
if (TMD_System_Clock - uMEAInterval > 2000) //每2秒计算一次
{
uMEAInterval = TMD_System_Clock; //刷新时间
iSampleIndex = SampleIndex; //取当前采样点位置
for(iharmous = 0; iharmous < HARMOUSMAX; iharmous++) //计算各次谐波
{
pf = HarmousCoeff[iharmous]; //取第iharmous次谐波的滤波系数
pChn = &AIChn[MIa_Chn]; //计算IA的第iharmous次谐波实,虚部
Cal_Harmous(&SampleData[MIa_Chn].value[iSampleIndex], pf, &VIA[iharmous],
pChn->chl_calculate_coefficient * pChn->chl_scale,
cos(pChn->chl_angle_compensate * (iharmous + 1)),
sin(pChn->chl_angle_compensate * (iharmous + 1)));
pChn = &AIChn[MIc_Chn]; //计算IC的第iharmous次谐波实,虚部
Cal_Harmous(&SampleData[MIc_Chn].value[iSampleIndex], pf, &VIC[iharmous],
pChn->chl_calculate_coefficient * pChn->chl_scale,
cos(pChn->chl_angle_compensate * (iharmous + 1)),
sin(pChn->chl_angle_compensate * (iharmous + 1)));
pChn = &AIChn[Ua_Chn]; //计算Ua的第iharmous次谐波实,虚部
Cal_Harmous(&SampleData[Ua_Chn].value[iSampleIndex], pf, &VUa[iharmous],
pChn->chl_calculate_coefficient * pChn->chl_scale,
cos(pChn->chl_angle_compensate * (iharmous + 1)),
sin(pChn->chl_angle_compensate * (iharmous + 1)));
pChn = &AIChn[Ub_Chn]; //计算Ub的第iharmous次谐波实,虚部
Cal_Harmous(&SampleData[Ub_Chn].value[iSampleIndex], pf, &VUb[iharmous],
pChn->chl_calculate_coefficient * pChn->chl_scale,
cos(pChn->chl_angle_compensate * (iharmous + 1)),
sin(pChn->chl_angle_compensate * (iharmous + 1)));
pChn = &AIChn[Uc_Chn]; //计算Uc的第iharmous次谐波实,虚部
ftmp1 = pChn->chl_angle_compensate * (iharmous + 1);
ftmp2 = cos(pChn->chl_angle_compensate * (iharmous + 1));
Cal_Harmous(&SampleData[Uc_Chn].value[iSampleIndex], pf, &VUc[iharmous],
pChn->chl_calculate_coefficient * pChn->chl_scale,
cos(pChn->chl_angle_compensate * (iharmous + 1)),
sin(pChn->chl_angle_compensate * (iharmous + 1)));
fuabcos = VUa[iharmous].real - VUb[iharmous].real; //Uab实部
fuabsin = VUa[iharmous].imag - VUb[iharmous].imag; //Uab虚部
fucbcos = VUc[iharmous].real - VUb[iharmous].real; //Ucb实部
fucbsin = VUc[iharmous].imag - VUb[iharmous].imag; //Ucb虚部
fiacos = VIA[iharmous].real; //IA实部
fiasin = VIA[iharmous].imag; //IA虚部
ficcos = VIC[iharmous].real; //IC实部
ficsin = VIC[iharmous].imag; //IC虚部
VP[iharmous] = fuabcos * fiacos + fuabsin * fiasin //第iharmous次谐波的有功功率
+ fucbcos * ficcos + fucbsin * ficsin;
VQ[iharmous] = fuabsin * fiacos - fuabcos * fiasin //第iharmous次谐波的无功功率
+ fucbsin * ficcos - fucbcos * ficsin;
}
fIA = fIC = fUAB = fUBC = fUCA = fP = fQ = 0; //电压,电流的有效值平方等于各次
//谐波有效值平方的和,功率等于各次谐波
//功率的和
for(iharmous = 0; iharmous < HARMOUSMAX; iharmous++)
{
ftmp1 = VIA[iharmous].real;
ftmp2 = VIA[iharmous].imag;
fIA += ftmp1 * ftmp1 + ftmp2 * ftmp2; //累加IA各次谐波有效值的平方
ftmp1 = VIC[iharmous].real;
ftmp2 = VIC[iharmous].imag;
fIC += ftmp1 * ftmp1 + ftmp2 * ftmp2; //累加IC各次谐波有效值的平方
ftmp1 = VUa[iharmous].real - VUb[iharmous].real;
ftmp2 = VUa[iharmous].imag - VUb[iharmous].imag;
fUAB += ftmp1 * ftmp1 + ftmp2 * ftmp2; //累加Uab各次谐波有效值的平方
ftmp1 = VUb[iharmous].real - VUc[iharmous].real;
ftmp2 = VUb[iharmous].imag - VUc[iharmous].imag;
fUBC += ftmp1 * ftmp1 + ftmp2 * ftmp2; //累加Ubc各次谐波有效值的平方
ftmp1 = VUc[iharmous].real - VUa[iharmous].real;
ftmp2 = VUc[iharmous].imag - VUa[iharmous].imag;
fUCA += ftmp1 * ftmp1 + ftmp2 * ftmp2; //累加Uca各次谐波有效值的平方
fP += VP[iharmous]; //累加各次谐波有功功率
fQ += VQ[iharmous]; //累加各次谐波无功功率
}
fIA = sqrt(fIA); //开方后,得到有效值
fIC = sqrt(fIC); //开方后,得到有效值
fUAB = sqrt(fUAB); //开方后,得到有效值
fUBC = sqrt(fUBC); //开方后,得到有效值
fUCA = sqrt(fUCA); //开方后,得到有效值
pMeasure = measure; //为测量结构体变量赋值
pMeasure++->value = fIA;
pMeasure++->value = fIA;
pMeasure++->value = fIC;
pMeasure++->value = fUAB;
pMeasure++->value = fUBC;
pMeasure++->value = fUCA;
pMeasure++->value = fP;
pMeasure++->value = fQ;
pMeasure++->value = samp_f - 50; //频率取偏离额定值的值
old_preempt = NU_Change_Preemption(NU_NO_PREEMPT); //不再切换任务,避免被其他任务打断,造成误动
pMeasure++->value = AIChn[PI0_Chn].chla_fundamental_real;
pMeasure++->value = AIChn[PI0_Chn].chla_fundamental_imaginary;
pMeasure++->value = AIChn[Ua_Chn].chla_fundamental_real +
AIChn[Ub_Chn].chla_fundamental_real +
AIChn[Uc_Chn].chla_fundamental_real;
pMeasure++->value = AIChn[Ua_Chn].chla_fundamental_imaginary +
AIChn[Ub_Chn].chla_fundamental_imaginary +
AIChn[Uc_Chn].chla_fundamental_imaginary;
NU_Change_Preemption(old_preempt); //可以切换任务
if (ASDU_50_FlagJK1 & _Data_Request) //是否有103请求遥测量标志
{
ASDU_50_FlagJK1 &= ~_Data_Request;
ASDU_50_FlagJK1 |= _Data_RDY; //置数据准备好标志
}
if (ASDU_9_FlagJK1 & _Data_Request9) //是否有103请求遥测量标志
{
ASDU_9_FlagJK1 &= ~_Data_Request9;
ASDU_9_FlagJK1 |= _Data_RDY9; //置数据准备好标志
}
}
}
/**********************************************************/
/* public code for calculate */
/**********************************************************/
void Phase_V_Cal(void) //计算线电压
{
register float fa1,fa2,fb1,fb2,fc1,fc2;
fa1 = AIChn[Ua_Chn].chla_fundamental_real;
fa2 = AIChn[Ua_Chn].chla_fundamental_imaginary;
fb1 = AIChn[Ub_Chn].chla_fundamental_real;
fb2 = AIChn[Ub_Chn].chla_fundamental_imaginary;
fc1 = AIChn[Uc_Chn].chla_fundamental_real;
fc2 = AIChn[Uc_Chn].chla_fundamental_imaginary;
Uab = (fa1 - fb1) * (fa1 - fb1) + (fa2 - fb2) * (fa2 - fb2);
Ubc = (fb1 - fc1) * (fb1 - fc1) + (fb2 - fc2) * (fb2 - fc2);
Uca = (fc1 - fa1) * (fc1 - fa1) + (fc2 - fa2) * (fc2 - fa2);
}
/**********************************************************/
/***********************************************************************************/
/* 模拟量通道结构体初始化 */
/***********************************************************************************/
VOID CHLDEF_Initialize(VOID)
{
register PRO_CHANNEL *p;
/*-------------------直流5V--------------------------*/
p = &AIChn[DC_Chn];
p->chl_Num = DC_Chn;
p->pchl_name = "直流5V";
p->pchl_value_dimension = "V";
p->chl_calculate_coefficient = DDD_FOURIER_VOLTAGE;
p->chl_scale = 1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -