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

📄 measure.c

📁 著名的CS5463抄表模块
💻 C
📖 第 1 页 / 共 4 页
字号:
				   *pdwTime <<=8;
				   *pdwTime |= psMeasureStat->sCurDateTime.byHour;
				   *pdwTime <<=8;
				   *pdwTime |= psMeasureStat->sCurDateTime.byMinute;		
				}
			//	dwTemp = *pDemand;
			//	WriteCom(0,(BYTE*)&dwTemp,4);
                pDemand ++;
				pdwTime ++;
			}
            psMeasureStat->sDaySumSliding.byCurCntStartIndex++;
		    psMeasureStat->sDaySumSliding.byCurCntStartIndex %= MAX_Sliding_NUM;//
			psMeasureStat->byDayCurSumSlidingNum = psMeasureStat->bySlidingNum;
		}
		psMeasureStat->sDaySumSliding.byCurCntEndIndex++;
		psMeasureStat->sDaySumSliding.byCurCntEndIndex %= MAX_Sliding_NUM;//
	}
}
/*整数倍间隔的电量数据保存
月末24点或抄表日时刻数据转存(最大需量清零)
*/
static void SaveMeasureDatas(SMeasureStat *psMeasureStat)
{
   SReadingCycleRec sReadingCycleRec;
   sReadingCycleRec.sTime.byMinute = psMeasureStat->sCurDateTime.byMinute;
   sReadingCycleRec.sTime.byHour = psMeasureStat->sCurDateTime.byHour;
   sReadingCycleRec.sTime.byDay = psMeasureStat->sCurDateTime.byDay;
   sReadingCycleRec.sTime.byMonth = psMeasureStat->sCurDateTime.byMonth;
   memcpy32((DWORD*)&sReadingCycleRec.sEnergy,(DWORD*)&g_sEnergy,sizeof(SEnergy)/4);
   memcpy32((DWORD*)&sReadingCycleRec.sMaxDemand,(DWORD*)&g_sMaxDemand,sizeof(SMaxDemand)/4);
   SaveMeasureData(&psMeasureStat->sLastTime4,&sReadingCycleRec); 
}
//清除各项数据、各项电能、各项需量、能量计数器
void Clear_Init_MeasureData(SMeasureStat *psMeasureStat,SMeterParam *psMeterParam)
{
   DWORD i;
   DWORD *pValue;
    //*************NVRAM 初始化********************
   g_dwEC1 = 0;
   g_dwEC2 = 0;
   g_dwErcStatus[0] = g_dwErcStatus[1] = 0;
   g_dwEventPos = 0;
    for(i=0; i<MAX_TASK_COM; i++)
   {
      g_sEventSendEc1[i].wNum = 0;
      g_sEventSendEc1[i].wReadySendRecPos = 0;
      g_sEventSendEc2[i].wNum = 0;
      g_sEventSendEc2[i].wReadySendRecPos = 0;
   }
   
   pValue = (DWORD*)&g_sVoltStat;
   for(i=0; i<sizeof(SVoltStat)/sizeof(DWORD); i++)
   {
		*pValue = 0;
		pValue ++;
   }
    //memset cannot use in NVRAM  若存储文件不存在,需要判断NVRAM
   pValue = (DWORD*)&g_sEneryCnt;
   for(i=0; i<sizeof(SEnergyCnt)/sizeof(DWORD); i++)
   {
	   *pValue = 0;
	   pValue ++;
   }
   pValue = (DWORD*)&g_sEnergy;
   for(i=0; i<sizeof(SEnergy)/sizeof(DWORD); i++)
   {
	   *pValue = 0;
	   pValue ++;
   }
   //below  del zhw 2007-4-13 
/*	pValue = (DWORD*)&g_sMaxDemand;
   for(i=0; i<sizeof(SMaxDemand)/sizeof(DWORD); i++)
   {
	   *pValue = 0;
	   pValue ++;
   }
   	pValue = (DWORD*)&g_sBreakVoltState;
   for(i=0; i<sizeof(SBreakVoltState)/sizeof(DWORD); i++)
   {
	   *pValue = 0;
	   pValue ++;
   }
   	pValue = (DWORD*)&g_sTransFormerState;
   for(i=0; i<sizeof(STransFormerState)/sizeof(DWORD); i++)
   {
	   *pValue = 0;
	   pValue ++;
   }
   	pValue = (DWORD*)&g_sMeterState;
   for(i=0; i<sizeof(SMeterState)/sizeof(DWORD); i++)
   {
	   *pValue = 0;
	   pValue ++;
   }
   	pValue = (DWORD*)&g_sVoltageCompute;
   for(i=0; i<sizeof(SVoltStat)/sizeof(DWORD); i++)
   {
	   *pValue = 0;
	   pValue ++;
   }
   */
   ///最近一次最大需量清零时间 数据格式17 LSB 分时日月 MSB 4
	g_sMeterState.dwRecentDemandClearT = psMeasureStat->sCurDateTime.byMonth;
	g_sMeterState.dwRecentDemandClearT <<=8;
	g_sMeterState.dwRecentDemandClearT |= psMeasureStat->sCurDateTime.byDay;
	g_sMeterState.dwRecentDemandClearT <<=8;
	g_sMeterState.dwRecentDemandClearT |= psMeasureStat->sCurDateTime.byHour;
	g_sMeterState.dwRecentDemandClearT <<=8;
	g_sMeterState.dwRecentDemandClearT |= psMeasureStat->sCurDateTime.byMinute;	
    g_sMeterState.dwDemandClearNum ++; //最大需量清零次数
    
    InitMeasureStat(1,psMeasureStat,psMeterParam);
 
	RecordProgState();//记录终端的编程时间及次数 当终端的参数被设置和需量被清零时调用此函数
   //while(1);//终端复位
}
//当月最大需量值自动复零
static void ClearMonthMaxDemand(SMeasureStat *psMeasureStat,SMeterParam *psMeterParam)//最大需量清零
{
    BYTE i;
    DWORD *pValue;
	pValue = (DWORD*)&g_sMaxDemand;
	for(i=0; i<sizeof(SMaxDemand)/sizeof(DWORD); i++)
	{
		*pValue = 0;
		pValue ++;
    }
    InitMeasureStat(1,psMeasureStat,psMeterParam);  //
    psMeasureStat->bySaveFlag = 1; //本次最大需量保存标志置位

	///最近一次最大需量清零时间 数据格式17 LSB 分时日月 MSB 4
	g_sMeterState.dwRecentDemandClearT = psMeasureStat->sCurDateTime.byMonth;
	g_sMeterState.dwRecentDemandClearT <<=8;
	g_sMeterState.dwRecentDemandClearT |= psMeasureStat->sCurDateTime.byDay;
	g_sMeterState.dwRecentDemandClearT <<=8;
	g_sMeterState.dwRecentDemandClearT |= psMeasureStat->sCurDateTime.byHour;
	g_sMeterState.dwRecentDemandClearT <<=8;
	g_sMeterState.dwRecentDemandClearT|= psMeasureStat->sCurDateTime.byMinute;	
    g_sMeterState.dwDemandClearNum ++; //最大需量清零次数
}
//当前最大需量清零  包括当前总、 当前费率的最大需量
void ClearCurMaxDemand(SMeasureStat *psMeasureStat,SMeterParam *psMeterParam)
{
    DWORD *pDemand;
	DWORD *pdwTime;
	BYTE i;
    GetCurRateNo(&psMeasureStat->sCurDateTime,&psMeasureStat->byCurRationNo,psMeterParam);
	//当前费率的最大需量清零
	pDemand = &g_sMaxDemand.sEPp.dwSharp;
	pdwTime = &g_sMaxDemand.sEPpTime.dwSharp;
	pDemand  += psMeasureStat->byCurRationNo ;
	pdwTime  += psMeasureStat->byCurRationNo ;
	for(i=0; i<MAX_DEMAND_TYPE_NUM; i++)
	{ 
	   *pDemand = 0;
	   *pdwTime = 0;
	   pDemand += sizeof(STimeConsumption)/sizeof(DWORD);
	   pdwTime += sizeof(SMaxDemandTime)/sizeof(DWORD);
	}
	//当前总的最大需量清零
	pDemand = &g_sMaxDemand.sEPp.dwSum;
	pdwTime = &g_sMaxDemand.sEPpTime.dwSum;
	for(i=0; i<MAX_DEMAND_TYPE_NUM;i++)
	{ 
	   *pDemand = 0;
	   *pdwTime = 0;
	   pDemand += sizeof(STimeConsumption)/sizeof(DWORD);
	   pdwTime += sizeof(SMaxDemandTime)/sizeof(DWORD);
	}
    g_sMeterState.dwRecentDemandClearT = psMeasureStat->sCurDateTime.byMonth;
	g_sMeterState.dwRecentDemandClearT <<=8;
	g_sMeterState.dwRecentDemandClearT |= psMeasureStat->sCurDateTime.byDay;
	g_sMeterState.dwRecentDemandClearT <<=8;
	g_sMeterState.dwRecentDemandClearT |= psMeasureStat->sCurDateTime.byHour;
	g_sMeterState.dwRecentDemandClearT <<=8;
	g_sMeterState.dwRecentDemandClearT|= psMeasureStat->sCurDateTime.byMinute;	
    g_sMeterState.dwDemandClearNum ++; //最大需量清零次数
    RecordProgState();//记录终端的编程时间及次数 当终端的参数被设置和需量被清零时调用此函数
}


/*********LED及脉冲处理*****************/
static void LedPulse(SMeasureStat *psMeasureStat,SMeterParam *psMeterParam)
{
    BYTE i;
	DWORD dwEnergy;
	DWORD dwTempP;
	DWORD dwTempQ;
    DWORD dwTemp;
	for(i=0;  i<6; i++)
    {
		if( IsCurPulseOutEnd(i)) //当前的脉冲输出是否结束
		{
			switch(i)
			{
				case 0: //P+
                    dwEnergy = g_sEneryCnt.dwEPap + g_sEneryCnt.dwEPbp +g_sEneryCnt.dwEPcp;
					dwTemp =  (g_dwEnergyCntRatio * 100) /psMeterParam->sPluse[i].wConstant;
					break;
				case 1://P-
                    dwEnergy = g_sEneryCnt.dwEPan + g_sEneryCnt.dwEPbn +g_sEneryCnt.dwEPcn;//g_sEnergy.sEPn.dwSum;
                    dwTemp =  (g_dwEnergyCntRatio * 100) /psMeterParam->sPluse[i].wConstant;
					break;
				case 2://Q+
				    dwEnergy =  g_sEneryCnt.dwEQ1 + g_sEneryCnt.dwEQ4;
				   // dwEnergy = g_sEneryCnt.dwEQap + g_sEneryCnt.dwEQbp +g_sEneryCnt.dwEQcp;//g_sEnergy.sEQ1.dwSum + g_sEnergy.sEQ2.dwSum;
					dwTemp =   (g_dwEnergyCntRatio * 100) /psMeterParam->sPluse[i].wConstant;
					break;
				case 3://Q-
				    dwEnergy =  g_sEneryCnt.dwEQ2 + g_sEneryCnt.dwEQ3;
				    //dwEnergy = g_sEneryCnt.dwEQan + g_sEneryCnt.dwEQbn +g_sEneryCnt.dwEQcn;//g_sEnergy.sEQ3.dwSum + g_sEnergy.sEQ4.dwSum;// g_sEnergy.sEQ2.dwSum + g_sEnergy.sEQ3.dwSum;
					dwTemp =  (g_dwEnergyCntRatio * 100) /psMeterParam->sPluse[i].wConstant;
					break;
				case 4://(P+) + (P-)
					dwEnergy = (g_sEneryCnt.dwEPap + g_sEneryCnt.dwEPbp +g_sEneryCnt.dwEPcp) +(g_sEneryCnt.dwEPan + g_sEneryCnt.dwEPbn +g_sEneryCnt.dwEPcn) ;//g_sEnergy.sEPp.dwSum + g_sEnergy.sEPn.dwSum ;
					dwTemp = 5; //LED的默认为2000IMP
					break;      // (220*5*3*1.2*1.2)/360 = 13.2
				case 5: //(Q+) + (Q-)
				   dwEnergy  = g_sEneryCnt.dwEQ1 + g_sEneryCnt.dwEQ2 +g_sEneryCnt.dwEQ3 + g_sEneryCnt.dwEQ4;
				//	dwEnergy = g_sEnergy.sEQ1.dwSum + g_sEnergy.sEQ4.dwSum +
				//		       g_sEnergy.sEQ2.dwSum + g_sEnergy.sEQ3.dwSum;
					dwTemp = 5; //LED的默认为2000IMP 
					break;
				default:
				    break;
			}
			if( (dwEnergy - psMeasureStat->dwEnergyOutPut[i]) >=dwTemp)
		    { 
                   psMeasureStat->dwEnergyOutPut[i] += dwTemp;
			       StartOutPut(i);
		    }
		}
	}
	ProPulseOutPut();
}
//判断是否需要自动切换备用时段费率,并切换
void ProAutoSwitch(SMeasureStat *psMeasureStat,SMeterParam *psMeterParam)
{
    BYTE i;
    if(psMeterParam->dwChangeTime)//需要自动切换
    {
        i = (psMeterParam->dwChangeTime & 0xff000000)>>24;
        if( psMeasureStat->sCurDateTime.byMonth == ((psMeterParam->dwChangeTime & 0xff000000)>>24)
         && psMeasureStat->sCurDateTime.byDay == ((psMeterParam->dwChangeTime & 0x00ff0000)>>16)
         && psMeasureStat->sCurDateTime.byHour == ((psMeterParam->dwChangeTime & 0x0000ff00)>>8)
         && psMeasureStat->sCurDateTime.byMinute == (psMeterParam->dwChangeTime & 0x000000ff)
        )
        {
           for(i=0; i<24; i++)
           {
               psMeterParam->byTimeTable[0][i] = psMeterParam->byTimeTable[1][i];
           } 
           psMeterParam->dwChangeTime = 0; //不需要切换
           SaveParam((DWORD)&p_gcSysParam->sMeterParam,(BYTE*)psMeterParam,sizeof(SMeterParam));//装载参数
        }
    }
}
/*********当前是否是抄表时刻************/
static BOOL IsSaveMeasureData(SMeasureStat *psMeasureStat,SMeterParam *psMeterParam)
{

   BYTE i;
   DWORD j;
  extern BYTE byVoltageSaveMonth;
   j =1;
   j <<= (psMeasureStat->sCurDateTime.byDay -1);
   if( j & psMeterParam->dwMeterReadingDay) //当前是抄表日
   {
       
	   if(     psMeasureStat->sCurDateTime.byHour ==((psMeterParam->wMeterReadingTime & 0xff00) >>8)
		    && 
			   psMeasureStat->sCurDateTime.byMinute == (psMeterParam->wMeterReadingTime & 0x00ff)
			&& psMeasureStat->sCurDateTime.bySecond <=30 
	     )
	    {
			   if (psMeasureStat->bySaveFlag == 0)
			   {
                   psMeasureStat->bySaveFlag = 1;
                   g_bSaveVoltageState_m  = 1;//保存月统计的标志
                  
				   byVoltageSaveMonth = psMeasureStat->sLastTime4.byMonth;
                   return TRUE;
			   }
		}
		else
		{
              psMeasureStat->bySaveFlag = 0;
		}
	}
	else  psMeasureStat->bySaveFlag = 0;
    psMeasureStat->sLastTime4.byMonth = psMeasureStat->sCurDateTime.byMonth;
    byVoltageSaveMonth = psMeasureStat->sLastTime4.byMonth;
	return FALSE;
}
void InitCom0(void)
{
	SCommInfo sComm;

	sComm.byCommNo=0;
	sComm.byDataBits=8;
	sComm.byStopBits=1;
	sComm.byParity=UART_PARITY_NONE;
	sComm.dwBaudrate=9600;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -