📄 measure.c
字号:
*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 + -