📄 yc.c
字号:
/*------------------------------------------------------------------*/
/*模块名称:yc.c */
/*模块功能:遥测、整定处理模块 */
/*编写者: fengliang */
/*备注1: 2005年10月 dingding对模块重新编写并优化处理 */
/*------------------------------------------------------------------*/
#include "includes.h"
extern u_char TGSH;
extern INT32U NVRAMSIZE;
extern struct SysPort *SysPorts;
extern struct SysConfig SysCfg;
extern struct YCPara_t YCPara;
extern struct MyConfig MyCfg;
//采用原风格,按照最大分配
struct ADData_t ADData[MAXYCFD];
struct YCTempData YCTemp[MAXYCFD];
struct YCParas YCParas[MAXYCFD];
INT16S YcTmpBuf[192]; //按最大分配(32*6 )
INT16U Frequency = 5000 ;
INT8U Frequency_Lose = 0 ;
//计数器
INT8U CurAD = 0;
INT8U CurFast = 0;
INT8U CurSubF = 0;
INT8U SumCount = 0;
INT16U YcReadCounter = 0;
INT16U YcMeanCounter = 0;
//录波
struct LB_t Lb[MAXYCFD];
/*------------------------------------------------------------------*/
/*函数名称:YCTask() */
/*函数功能:遥测任务 */
/*------------------------------------------------------------------*/
void YCTask(void *pdata)
{
memset (ADData, 0, MAXYCFD*sizeof (struct ADData_t));
memset (YCTemp, 0, MAXYCFD*sizeof (struct YCTempData));
YC_Init();
while(1)
{
OSTimeDlyHMSM(0, 0, 0, 10);
Fast_Calculate();
YcReadCounter++;
if (YcReadCounter >= 10)
{
YcReadCounter = 0;
YcMeanCounter++;
UI_Treatment();
AppYcRead();
}
if ((YcReadCounter >= 10 - MAXYCFD) && (YcReadCounter < 10))
{
PQ_Treatment(10 - YcReadCounter);
}
if (YcMeanCounter >= 5) //2; 须>=3
{
YcMeanCounter = 0;
AppYcMean();
}
}
}
/*------------------------------------------------------------------*/
/*函数名称:YC_Init() */
/*函数功能:遥测任务初始化 */
/*------------------------------------------------------------------*/
void YC_Init(void)
{
BOOL rc = FALSE;
INT8U i;
INT32S defycpara[10] = {6900, 6900, 2300, 2300, 2300, 2300 , 476000, 476000, 473000, 473000};
//整定值
if (SysCfg.ParaValid)
{
for (i=0; i<TMPYCNUM*2; i++)
{
if ((TGSH && (i==1)) || (i==0))
{
if((YCPara.Value[i] == 0) || (YCPara.Value[i] == 0xFFFF)) //防止参数非法
{
rc = TRUE;
YCPara.Value[i] = defycpara[i%TMPYCNUM];
}
}
}
}
else
{
rc = TRUE;
for (i=0; i<TMPYCNUM*2; i++)
{
YCPara.Value[i] = defycpara[i%TMPYCNUM];
}
}
//归零值
for (i=0; i<TMPYCNUM; i++)
{
YCParas[0].ToZero[i] = YCPara.Value[i] * MyCfg.Ai[i].ToZero / 1000;
}
if (TGSH)
{
for (i=0; i<TMPYCNUM; i++)
{
YCParas[1].ToZero[i] = YCPara.Value[TMPYCNUM+i] * MyCfg.Ai[DEFYCNUM+i].ToZero / 1000;
}
}
if (rc)
{
ErrorInfo(OSPrioCur, "ycpara.sys有错!");
}
memset (Lb, 0, MAXYCFD * sizeof (struct LB_t));
}
/*------------------------------------------------------------------*/
/*函数名称:FIQ_init_handler() */
/*函数功能:中断处理函数 */
/*------------------------------------------------------------------*/
void FIQ_init_handler(void)
{
INT16U i, no;
if (CurAD >= ADAINUM)
CurAD = 0;
if (TGSH)
{
no = ADAINUM * (ADNUM-1) + CurAD;
for (i=0; i<ADNUM; i++)
{
ADData[1].Data[no] = *ZK2_AD8364;
no = no - ADAINUM;
}
}
no = ADAINUM * (ADNUM-1) + CurAD;
for (i=0; i<ADNUM; i++)
{
// AD_Channel = *ZK1_AD8364; //for new board;
ADData[0].Data[no] = *ZK1_AD8364;
no = no - ADAINUM;
}
CurAD++;
*ZK1_ADRST = 1; // 复位AD1
*ZK2_ADRST = 1; // 复位AD2
AIC_ICCR = 1; // 消除多余的FIQ中断标志
}
/*------------------------------------------------------------------*/
/*函数名称:Fast_Calculate() */
/*函数功能:遥测快速计算,每周波滚动计算四次 */
/*函数说明:计算耗时120uS/两回线路 */
/*------------------------------------------------------------------*/
void Fast_Calculate(void)
{
INT8U i, j, k, num;
INT16U no;
unsigned long long sum;
if (CurFast < CurAD)
num = CurAD - CurFast;
else
num = CurAD + ADAINUM - CurFast;
num = num / 8;
while (num--)
{
for (k=0; k<MAXYCFD; k++)
{
if ((TGSH && (k==1)) || (k==0))
{
for (i=0; i<ADNUM; i++)
{
YCTemp[k].FData[i].Subsum[CurSubF] = 0;
no = i * ADAINUM + CurFast;
for (j=0; j<8; j++)
{
YCTemp[k].FData[i].Subsum[CurSubF] += (int)ADData[k].Data[no+j] * (int)ADData[k].Data[no+j];
}
sum = 0;
for (j=0; j<4; j++)
{
sum += YCTemp[k].FData[i].Subsum[j];
YCTemp[k].FData[i].Rms2 = sum>>5;
}
}
}
}
CurFast = (CurFast + 8) % ADAINUM;
CurSubF = (CurSubF + 1) % 4;
}
//added for FA by dingding
OSFlagPost (SysPorts[0].Event, FYCRDY, OS_FLAG_SET, &k);
/* if (k != OS_NO_ERR)
{
ErrorInfo(OSPrioCur, "发送遥测失败");
}*/
for (no=0; no<MAXYCFD; no++)
{
if (Lb[no].State)
LB(no);
}
}
/*------------------------------------------------------------------*/
/*函数名称:UI_Treatment() */
/*函数功能:计算电流、电压有效值 */
/*函数说明:计算耗时57uS/两回线路 */
/*------------------------------------------------------------------*/
void UI_Treatment(void)
{
INT8U i, k;
k = MAXYCFD;
while (k--)
{
if ((TGSH && (k==1)) || (k==0))
{
for (i=0; i<ADNUM; i++)
{
YCTemp[k].YcData[i] = MySqrtInt(YCTemp[k].FData[i].Rms2);
}
}
}
}
/*------------------------------------------------------------------*/
/*函数名称:PQ_Treatment() */
/*函数功能:计算有功、无功 */
/*函数说明:计算耗时221uS/两回线路 */
/*------------------------------------------------------------------*/
void PQ_Treatment(INT8U No)
{
INT8U i, k;
INT16U str, end, a, b;
long long sum[4];
str = (CurFast + ADAINUM - 32) % ADAINUM;
end = (CurFast + ADAINUM - 1) % ADAINUM;
k = No - 1;
// while (k--)
// {
if ((TGSH && (k==1)) || (k==0))
{
sum[0] = (int)ADData[k].Data[str + ADAINUM*2] * (int)ADData[k].Data[str] + (int)ADData[k].Data[end + ADAINUM*2] * (int)ADData[k].Data[end];
sum[2] = (int)ADData[k].Data[str + ADAINUM*2] * (int)(ADData[k].Data[end] - ADData[k].Data[str+1])
+ (int)ADData[k].Data[end + ADAINUM*2] * (int)(ADData[k].Data[end-1] - ADData[k].Data[str]);
sum[1] = (int)ADData[k].Data[str + ADAINUM*4] * (int)ADData[k].Data[str + ADAINUM] + (int)ADData[k].Data[end + ADAINUM*4] * (int)ADData[k].Data[end + ADAINUM];
sum[3] = (int)ADData[k].Data[str + ADAINUM*4] * (int)(ADData[k].Data[end + ADAINUM] - ADData[k].Data[str + ADAINUM + 1])
+ (int)ADData[k].Data[end + ADAINUM*4] * (int)(ADData[k].Data[end + ADAINUM - 1] - ADData[k].Data[str + ADAINUM]);
for (i=1; i<31; i++)
{
end = (str + i) % ADAINUM;
a = (end + ADAINUM - 1) % ADAINUM;
b = (end + ADAINUM + 1) % ADAINUM;
sum[0] += (int)ADData[k].Data[end + ADAINUM*2] * (int)ADData[k].Data[end];
sum[2] += (int)ADData[k].Data[end + ADAINUM*2] * (int)(ADData[k].Data[a] - ADData[k].Data[b]);
sum[1] += (int)ADData[k].Data[end + ADAINUM*4] * (int)ADData[k].Data[end + ADAINUM];
sum[3] += (int)ADData[k].Data[end + ADAINUM*4] * (int)(ADData[k].Data[a + ADAINUM] - ADData[k].Data[b + ADAINUM]);
}
//将功率降低100倍
for (i=0; i<4; i++)
{
if (i < 2) //P
{
YCTemp[k].YcData[i+6] = sum[i] / 3200; //32* 100
}
else //Q
{
YCTemp[k].YcData[i+6] = sum[i] * 10 / 12566; //1000 / 12566 /100
}
}
}
// }
}
/*------------------------------------------------------------------*/
/*函数名称:AppYcRead() */
/*函数功能:读取有效值,并找出MEANNUM次中最大值,最小值,及和 */
/*------------------------------------------------------------------*/
void AppYcRead(void)
{
INT8U i, k;
for (k=0; k<MAXYCFD; k++)
{
if ((TGSH && (k==1)) || (k==0))
{
for (i=0; i<TMPYCNUM; i++)
{
if (SumCount == 0)
{
YCTemp[k].YcDataMax[i] = YCTemp[k].YcData[i];
YCTemp[k].YcDataMin[i] = YCTemp[k].YcData[i];
YCTemp[k].YcDataSum[i] = YCTemp[k].YcData[i];
}
else
{
YCTemp[k].YcDataSum[i] += YCTemp[k].YcData[i];
if (YCTemp[k].YcData[i] > YCTemp[k].YcDataMax[i])
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -