📄 measure.c
字号:
psMeasureStat->sRatioSliding.byCurCntEndIndex = 1;
// GetTime(&psMeasureStat->sDaySumSlidingTime);
psMeasureStat->byDemandStateEnd = 0; //需量周期结束指示
psMeasureStat->bySaveFlag = 0;
psMeasureStat->bySlidingNum = BCD2BIN(psMeterParam->byDemandInterval) / BCD2BIN(psMeterParam->bySlidingTime);
memcpy32((DWORD*)&psMeasureStat->sLastEneryCnt,(DWORD*)&g_sEneryCnt,sizeof(SEnergyCnt)/4);
memcpy32((DWORD*)&psMeasureStat->sLastEnergy,(DWORD*)&g_sEnergy,sizeof(SEnergy)/4);
//初始化脉冲
if(byFlag==0)return;
psMeasureStat->dwEnergyOutPut[0] = g_sEneryCnt.dwEPap + g_sEneryCnt.dwEPbp +g_sEneryCnt.dwEPcp;//g_sEnergy.sEPp.dwSum; //P+
psMeasureStat->dwEnergyOutPut[1] = g_sEneryCnt.dwEPan + g_sEneryCnt.dwEPbn +g_sEneryCnt.dwEPcn;//g_sEnergy.sEPn.dwSum; //P-
psMeasureStat->dwEnergyOutPut[2] = g_sEneryCnt.dwEQ1 + g_sEneryCnt.dwEQ4; //Q+
psMeasureStat->dwEnergyOutPut[3] = g_sEneryCnt.dwEQ2 + g_sEneryCnt.dwEQ3;//g_sEnergy.sEQ3.dwSum + g_sEnergy.sEQ4.dwSum; //Q-
psMeasureStat->dwEnergyOutPut[4] = psMeasureStat->dwEnergyOutPut[0] + psMeasureStat->dwEnergyOutPut[1];//g_sEnergy.sEPp.dwSum + g_sEnergy.sEPn.dwSum; //P
psMeasureStat->dwEnergyOutPut[5] = psMeasureStat->dwEnergyOutPut[2] + psMeasureStat->dwEnergyOutPut[3]; //Q
}
void InitDayMeasureState(SMeasureStat *psMeasureStat,SMeterParam *psMeterParam)
{
//用来计算日统计的有功最大需量 无功最大需量
psMeasureStat->byDayCurSumSlidingNum = 0;//
psMeasureStat->sDaySumSliding.dwSlidingCnt[0][0] = (g_sEneryCnt.dwEPap + g_sEneryCnt.dwEPbp +g_sEneryCnt.dwEPcp) + (g_sEneryCnt.dwEPan + g_sEneryCnt.dwEPbn +g_sEneryCnt.dwEPcn);
psMeasureStat->sDaySumSliding.dwSlidingCnt[1][0] = g_sEneryCnt.dwEQ1 + g_sEneryCnt.dwEQ4 +g_sEneryCnt.dwEQ2 + g_sEneryCnt.dwEQ3;
psMeasureStat->sDaySumSliding.byCurCntStartIndex = 0;
psMeasureStat->sDaySumSliding.byCurCntEndIndex = 1;
psMeasureStat->dwDaySumSlidingTick = OSTimeGet();
}
/**********根据能量计数脉冲来计算能量*****/
void GetEnergybyCount(DWORD *pdwEnergy, DWORD dwEnerygCurCnt, DWORD dwEnergyLastCnt)
{
DWORD dwTemp;
DWORD dwEnergy; // g_dwEnergyCntRatio = 100;
DWORD dwRatio = 42949673;// 4294967296 /g_dwEnergyCntRatio; //4294967296 = 2^32;
static int i=0;
if(dwEnerygCurCnt == dwEnergyLastCnt)
return;//当前计数脉冲与上次相等,则不需更新
if(dwEnerygCurCnt > dwEnergyLastCnt)//当前的计数脉冲数,大于上次更新时的脉冲数
{
*pdwEnergy = ( (*pdwEnergy / dwRatio) * dwRatio) + (dwEnerygCurCnt/g_dwEnergyCntRatio) ;//4294967296 /100
}
else //当前的计数脉冲数,小于上次更新时的脉冲数
{
// *pdwEnergy = dwRatio + (*pdwEnergy/dwRatio)*dwRatio + (dwEnergyLastCnt/g_dwEnergyCntRatio);
*pdwEnergy = dwRatio + (*pdwEnergy/dwRatio)*dwRatio + (dwEnerygCurCnt/g_dwEnergyCntRatio);
}
}
/****************计算各项总电能*********/
static void CalSumEnergy(SMeasureStat *psMeasureStat)
{
BYTE i;
DWORD *pEnergy;
DWORD *pCountCur;
DWORD *pCountLast;
DWORD dwTempCur;
DWORD dwTempLast;
/* pEnergy = &g_sEnergy.sEPap.dwSum;
pCountCur = &g_sEneryCnt.dwEPap;
pCountLast = &psMeasureStat->sLastEneryCnt.dwEPap;
for(i=0; i<3; i++)//正向A 、B、 C相有功总电能
{
GetEnergybyCount(pEnergy,*pCountCur,*pCountLast);
pEnergy += sizeof(STimeConsumption)/sizeof(DWORD);
pCountCur++;
pCountLast++;
}
*/
//暂时不计算反向A、 B、 C相有功总电能 正向A、 B、 C相无功总电能 反向A、 B、 C相无功总电能
pEnergy = &g_sEnergy.sEQ1.dwSum;
pCountCur = &g_sEneryCnt.dwEQ1;
pCountLast = &psMeasureStat->sLastEneryCnt.dwEQ1;
for(i=0; i<4; i++)//一、二、三、四象限无功总电能
{
GetEnergybyCount(pEnergy,*pCountCur,*pCountLast);
pEnergy += ( sizeof(STimeConsumption)/sizeof(DWORD) );
pCountCur++;
pCountLast++;
}
pEnergy = &g_sEnergy.sEPp.dwSum; //正向有功总电能
dwTempCur = g_sEneryCnt.dwEPap + g_sEneryCnt.dwEPbp + g_sEneryCnt.dwEPcp;
dwTempLast = psMeasureStat->sLastEneryCnt.dwEPap +
psMeasureStat->sLastEneryCnt.dwEPbp +
psMeasureStat->sLastEneryCnt.dwEPcp ;
GetEnergybyCount(pEnergy,dwTempCur,dwTempLast);
pEnergy = &g_sEnergy.sEPn.dwSum; //反向有功总电能
dwTempCur = g_sEneryCnt.dwEPan + g_sEneryCnt.dwEPbn + g_sEneryCnt.dwEPcn;
dwTempLast = psMeasureStat->sLastEneryCnt.dwEPan +
psMeasureStat->sLastEneryCnt.dwEPbn +
psMeasureStat->sLastEneryCnt.dwEPcn ;
GetEnergybyCount(pEnergy,dwTempCur,dwTempLast);
}
/******计算当前费率的各项电能***********/
static void CalRateEnergy(SMeasureStat *psMeasureStat,SMeterParam *psMeterParam)
{
DWORD dwTemp;
BYTE i;
DWORD *pCurRatioEnergy;
DWORD *pCurSumEnergy;
DWORD *pLastSumEnergy;
DWORD *pSumEnergy;
//获得本时刻对应的费率
GetCurRateNo(&psMeasureStat->sCurDateTime,&psMeasureStat->byCurRationNo,psMeterParam);
pSumEnergy = &g_sEnergy.sEPp.dwSum;//当前总电能
pLastSumEnergy = &psMeasureStat->sLastEnergy.sEPp.dwSum;//上次更新时的总电能
pCurRatioEnergy = &g_sEnergy.sEPp.dwSharp;
pCurRatioEnergy += psMeasureStat->byCurRationNo ;
for(i=0; i<6; i++)
{ //正向总 当前费率的总电能
(*pCurRatioEnergy) += (*pSumEnergy - *pLastSumEnergy);
if( i == 1 )
{
#ifdef DEBUG_RATE_ENERGY
if(*pSumEnergy != *pLastSumEnergy)
{
dwTemp = *pSumEnergy;
PrintHex((BYTE*)&dwTemp,4);
dwTemp = *pLastSumEnergy;
PrintHex((BYTE*)&dwTemp,4);
dwTemp = *pCurRatioEnergy ;
PrintHex((BYTE*)&dwTemp,4);
}
#endif
}
pCurRatioEnergy += sizeof(STimeConsumption)/sizeof(DWORD);
pSumEnergy += sizeof(STimeConsumption)/sizeof(DWORD) ;
pLastSumEnergy += sizeof(STimeConsumption)/sizeof(DWORD);
}
}
/*********计算总的各项最大需量、 当前费率的各项最大需量**********/
static void CalMaxDemand(SMeasureStat *psMeasureStat,SMeterParam *psMeterParam)
{
static int j=0;
DWORD dwTemp;
BYTE i;
DWORD dwNeedSlidingTicks; //滑差时间对应的TICK
DWORD dwTempDemand;
DWORD *pDemand;
DWORD *pdwTime;
dwNeedSlidingTicks = BCD2BIN(psMeterParam->bySlidingTime) * 60 *OS_TICKS_PER_SEC;
/*********计算总的各项最大需量**********/
psMeasureStat->dwCurTick =OSTimeGet(); //add zhw 2007-3-7
if((psMeasureStat->dwCurTick - psMeasureStat->dwSumSlidingTick) >= dwNeedSlidingTicks)
{ //间隔大于等于一个滑差时间
//为下次判断准备
psMeasureStat->dwSumSlidingTick = psMeasureStat->dwCurTick;
i = psMeasureStat->sSumSliding.byCurCntEndIndex;
psMeasureStat->sSumSliding.dwSlidingCnt[0][i] = g_sEneryCnt.dwEPap + g_sEneryCnt.dwEPbp +g_sEneryCnt.dwEPcp;
psMeasureStat->sSumSliding.dwSlidingCnt[1][i] = g_sEneryCnt.dwEPan + g_sEneryCnt.dwEPbn +g_sEneryCnt.dwEPcn;
psMeasureStat->sSumSliding.dwSlidingCnt[2][i] = g_sEneryCnt.dwEQ1 + g_sEneryCnt.dwEQ4;
psMeasureStat->sSumSliding.dwSlidingCnt[3][i] = g_sEneryCnt.dwEQ2 + g_sEneryCnt.dwEQ3;
psMeasureStat->sSumSliding.dwSlidingCnt[4][i] = g_sEneryCnt.dwEQ1;
psMeasureStat->sSumSliding.dwSlidingCnt[5][i] = g_sEneryCnt.dwEQ2;
psMeasureStat->sSumSliding.dwSlidingCnt[6][i] = g_sEneryCnt.dwEQ3;
psMeasureStat->sSumSliding.dwSlidingCnt[7][i] = g_sEneryCnt.dwEQ4;
psMeasureStat->byCurSumSlidingNum ++;
if( psMeasureStat->byCurSumSlidingNum >= psMeasureStat->bySlidingNum )
{
//则根据byCurCntStartIndex, byCurCntEndIndex,dwSlidingEntergy[][],
//循环 计算各项最大需量,并与当前的最大需量比较获得最新的最大需量;
pDemand = &g_sMaxDemand.sEPp.dwSum;
pdwTime = &g_sMaxDemand.sEPpTime.dwSum;
for(i=0; i<MAX_DEMAND_TYPE_NUM; i++)
{
dwTempDemand = psMeasureStat->sSumSliding.dwSlidingCnt[i][psMeasureStat->sSumSliding.byCurCntEndIndex] -
psMeasureStat->sSumSliding.dwSlidingCnt[i][psMeasureStat->sSumSliding.byCurCntStartIndex];
dwTempDemand *= (36000000/(g_dwEnergyCntRatio*100)); //3600000*10 = 36000000 单位为瓦*10 也就是
dwTemp = BCD2BIN(psMeterParam->byDemandInterval);
dwTemp = dwTemp *60;
dwTempDemand = dwTempDemand / dwTemp;//(BCD2BIN(psMeterParam->byDemandInterval) * 60);
if( dwTempDemand > *pDemand)
{
*pDemand = dwTempDemand;
*pdwTime = psMeasureStat->sCurDateTime.byMonth;
*pdwTime <<=8;
*pdwTime |= psMeasureStat->sCurDateTime.byDay;
*pdwTime <<=8;
*pdwTime |= psMeasureStat->sCurDateTime.byHour;
*pdwTime <<=8;
*pdwTime |= psMeasureStat->sCurDateTime.byMinute;
}
pDemand += sizeof(STimeConsumption)/sizeof(DWORD);
pdwTime += sizeof(SMaxDemandTime)/sizeof(DWORD);
}
psMeasureStat->sSumSliding.byCurCntStartIndex++;
psMeasureStat->sSumSliding.byCurCntStartIndex %= MAX_Sliding_NUM;//
psMeasureStat->byCurSumSlidingNum = psMeasureStat->bySlidingNum;
}
psMeasureStat->sSumSliding.byCurCntEndIndex++;
psMeasureStat->sSumSliding.byCurCntEndIndex %= MAX_Sliding_NUM;//
}
/*******计算当前费率的各项最大需量*****/
//获得本时刻对应的费率
GetCurRateNo(&psMeasureStat->sCurDateTime,&psMeasureStat->byCurRationNo,psMeterParam);
//获得滑差开始时刻对应的费率号
GetCurRateNo(&psMeasureStat->sCurSlidingTime,&psMeasureStat->byCurSlidingRatioNo,psMeterParam);
// psMeasureStat->dwCurTick =OSTimeGet(); //add zhw 2007-3-7
if((psMeasureStat->dwCurTick - psMeasureStat->dwCurSlidingTick) >= dwNeedSlidingTicks)
{ //间隔大于等于一个滑差时间
//为下次判断准备
psMeasureStat->dwCurSlidingTick = psMeasureStat->dwCurTick;
i = psMeasureStat->sRatioSliding.byCurCntEndIndex;
psMeasureStat->sRatioSliding.dwSlidingCnt[0][i] = g_sEneryCnt.dwEPap + g_sEneryCnt.dwEPbp +g_sEneryCnt.dwEPcp;
psMeasureStat->sRatioSliding.dwSlidingCnt[1][i] = g_sEneryCnt.dwEPan + g_sEneryCnt.dwEPbn +g_sEneryCnt.dwEPcn;
psMeasureStat->sRatioSliding.dwSlidingCnt[2][i] = g_sEneryCnt.dwEQ1 + g_sEneryCnt.dwEQ4;
psMeasureStat->sRatioSliding.dwSlidingCnt[3][i] = g_sEneryCnt.dwEQ2 + g_sEneryCnt.dwEQ3;
psMeasureStat->sRatioSliding.dwSlidingCnt[4][i] = g_sEneryCnt.dwEQ1;
psMeasureStat->sRatioSliding.dwSlidingCnt[5][i] = g_sEneryCnt.dwEQ2;
psMeasureStat->sRatioSliding.dwSlidingCnt[6][i] = g_sEneryCnt.dwEQ3;
psMeasureStat->sRatioSliding.dwSlidingCnt[7][i] = g_sEneryCnt.dwEQ4;
psMeasureStat->byCurRatioSlidingNum ++;
if( psMeasureStat->byCurRatioSlidingNum >= psMeasureStat->bySlidingNum )
{
//,则根据byCurCntStartIndex, byCurCntEndIndex,dwSlidingEntergy[][],
// 循环 计算各项最大需量,并与当前的最大需量比较获得最新的最大需量;
pDemand = &g_sMaxDemand.sEPp.dwSharp;
pdwTime = &g_sMaxDemand.sEPpTime.dwSharp;
pDemand += psMeasureStat->byCurSlidingRatioNo ;
pdwTime += psMeasureStat->byCurSlidingRatioNo ;
// WriteCom(0,&psMeasureStat->byCurSlidingRatioNo,1);
for(i=0; i<MAX_DEMAND_TYPE_NUM; i++)
{
dwTempDemand = psMeasureStat->sRatioSliding.dwSlidingCnt[i][psMeasureStat->sRatioSliding.byCurCntEndIndex] -
psMeasureStat->sRatioSliding.dwSlidingCnt[i][psMeasureStat->sRatioSliding.byCurCntStartIndex];
dwTempDemand *= (36000000/(g_dwEnergyCntRatio*100)); //3600000*10 = 36000000 单位为瓦*10 也就是
dwTemp = BCD2BIN(psMeterParam->byDemandInterval);
dwTemp = dwTemp *60;
dwTempDemand = dwTempDemand /dwTemp;
if( dwTempDemand > *pDemand)
{
*pDemand = dwTempDemand;
// memcpy(pdwTime, (BYTE*)&psMeasureStat->sCurDateTime.byMonth,4);
*pdwTime = psMeasureStat->sCurDateTime.byMonth;
*pdwTime <<=8;
*pdwTime |= psMeasureStat->sCurDateTime.byDay;
*pdwTime <<=8;
*pdwTime |= psMeasureStat->sCurDateTime.byHour;
*pdwTime <<=8;
*pdwTime |= psMeasureStat->sCurDateTime.byMinute;
}
pDemand += sizeof(STimeConsumption)/sizeof(DWORD);
pdwTime += sizeof(SMaxDemandTime)/sizeof(DWORD);
}
psMeasureStat->sRatioSliding.byCurCntStartIndex++;
psMeasureStat->sRatioSliding.byCurCntStartIndex %= MAX_Sliding_NUM;//
psMeasureStat->byCurRatioSlidingNum = psMeasureStat->bySlidingNum;
}
psMeasureStat->sRatioSliding.byCurCntEndIndex++;
psMeasureStat->sRatioSliding.byCurCntEndIndex %= MAX_Sliding_NUM;//
}//if
if(psMeasureStat->byCurRationNo !=psMeasureStat->byCurSlidingRatioNo)
{
psMeasureStat->byCurRatioSlidingNum = 0; //已经进行的滑差次数清零,重新滑差
psMeasureStat->dwCurSlidingTick = psMeasureStat->dwCurTick;
psMeasureStat->byCurSlidingRatioNo = psMeasureStat->byCurRationNo;
psMeasureStat->sRatioSliding.byCurCntStartIndex = (psMeasureStat->sRatioSliding.byCurCntEndIndex + MAX_Sliding_NUM -1) % MAX_Sliding_NUM;
memcpy(&psMeasureStat->sCurSlidingTime, &psMeasureStat->sCurDateTime, sizeof(SDateTime));
}//if
//以天为单位 计算有功最大需量 无功最大需量及其发生时间
if((psMeasureStat->dwCurTick - psMeasureStat->dwDaySumSlidingTick) >= dwNeedSlidingTicks)
{ //间隔大于等于一个滑差时间
//为下次判断准备
psMeasureStat->dwDaySumSlidingTick = psMeasureStat->dwCurTick;
i = psMeasureStat->sDaySumSliding.byCurCntEndIndex;
psMeasureStat->sDaySumSliding.dwSlidingCnt[0][i] = (g_sEneryCnt.dwEPap + g_sEneryCnt.dwEPbp +g_sEneryCnt.dwEPcp) + (g_sEneryCnt.dwEPan + g_sEneryCnt.dwEPbn +g_sEneryCnt.dwEPcn);
psMeasureStat->sDaySumSliding.dwSlidingCnt[1][i] = g_sEneryCnt.dwEQ1 + g_sEneryCnt.dwEQ4 +g_sEneryCnt.dwEQ2 + g_sEneryCnt.dwEQ3;
psMeasureStat->byDayCurSumSlidingNum ++;
if( psMeasureStat->byDayCurSumSlidingNum >= psMeasureStat->bySlidingNum )
{
//则根据byCurCntStartIndex, byCurCntEndIndex,dwSlidingEntergy[][],
//循环 计算各项最大需量,并与当前的最大需量比较获得最新的最大需量;
pDemand = &g_sTransFormerState.dwEPpMaxDemand;
pdwTime = &g_sTransFormerState.dwEPpMaxDemandTime;
for(i=0; i<2; i++)
{
dwTempDemand = psMeasureStat->sDaySumSliding.dwSlidingCnt[i][psMeasureStat->sDaySumSliding.byCurCntEndIndex] -
psMeasureStat->sDaySumSliding.dwSlidingCnt[i][psMeasureStat->sDaySumSliding.byCurCntStartIndex];
dwTempDemand *= (36000000/(g_dwEnergyCntRatio*100)); //3600000*10 = 36000000 单位为瓦*10 也就是
dwTemp = BCD2BIN(psMeterParam->byDemandInterval);
dwTemp = dwTemp *60;
dwTempDemand = dwTempDemand /dwTemp;
if( dwTempDemand > *pDemand)
{
*pDemand = dwTempDemand;
*pdwTime = psMeasureStat->sCurDateTime.byMonth;
*pdwTime <<=8;
*pdwTime |= psMeasureStat->sCurDateTime.byDay;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -