⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 measure.c

📁 著名的CS5463抄表模块
💻 C
📖 第 1 页 / 共 4 页
字号:
	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 + -