📄 energy.c
字号:
#define ENERGY_GLOBALS
#include "includes.h"
void EnergyDataPowerOnInit(void)
{
INT8U i;
EnergyReverseTest.ReverseRecordCnt=0;
CalculateTatolEnergy();
if(ReadEepromData(LAST_POWERDOWN_TIME_ID,TempBufOfMain))//以下是上电转存处理
{
if((TempBufOfMain[0]==0)&&(TempBufOfMain[1]==0)&&(TempBufOfMain[2]==0)&&(TempBufOfMain[3]==0))//没有停电记录
return;
if(TempBufOfMain[3]!=CurrentTime.Year)//停电跨年
{
if((TempBufOfMain[2]==0x12)&&(CurrentTime.Month==0x01))//停电时间不超过一个月
{
if((TempBufOfMain[1]<MonthStoreDate[1])||((TempBufOfMain[1]==MonthStoreDate[1])&&(TempBufOfMain[0]<MonthStoreDate[0])))
{
EnergyMonthStore();
}
else if((MonthStoreDate[1]<CurrentTime.Day)||((CurrentTime.Day==MonthStoreDate[1])&&(MonthStoreDate[0]<=CurrentTime.Hour)))
{
EnergyMonthStore();
}
}
else//超过一个月
{
EnergyMonthStore();
}
}
else//停电不跨年
{
if(TempBufOfMain[2]==CurrentTime.Month)//停电不跨年不跨月
{
if((TempBufOfMain[1]<MonthStoreDate[1])||((TempBufOfMain[1]==MonthStoreDate[1])&&(TempBufOfMain[0]<MonthStoreDate[0])))
{
if((MonthStoreDate[1]<CurrentTime.Day)||((CurrentTime.Day==MonthStoreDate[1])&&(MonthStoreDate[0]<=CurrentTime.Hour)))
{
EnergyMonthStore();
}
}
}
else//不跨年但跨月
{
TempBufOfMain[2]+=2;
if((TempBufOfMain[2]&0x0f)>=0x0a)
TempBufOfMain[2]+=0x06;//转化成BCD码
if(CurrentTime.Month>=TempBufOfMain[2])//停电跨2个月
EnergyMonthStore();
else//跨月但没有跨2个月
{
if((TempBufOfMain[1]<MonthStoreDate[1])||((TempBufOfMain[1]==MonthStoreDate[1])&&(TempBufOfMain[0]<MonthStoreDate[0])))
{
EnergyMonthStore();
}
else if((MonthStoreDate[1]<CurrentTime.Day)||((CurrentTime.Day==MonthStoreDate[1])&&(MonthStoreDate[0]<=CurrentTime.Hour)))
{
EnergyMonthStore();
}
}
}
}
}
for(i=0;i<4;i++)//清上次停电时间
TempBufOfMain[i]=0;
WriteEepromData(LAST_POWERDOWN_TIME_ID,TempBufOfMain);
}
//有功电能计算
void ActiveEnergyCalculate(void)
{
INT8U CarryCnt;
INT8U *Pnt;
_EnergyAccum=0;
IncBcd(&EnergyData.ActiveTotalEnergy[0],4);
Pnt=&EnergyData.ActiveTotalEnergy[0];
Pnt+=((TimeSliceInfo.CurrentRateID-1)<<2);
IncBcd(Pnt,4);
WriteEepromData(ACTIVE_ENERGY_ID0+EnergyData.EnergyPointer,&EnergyData.ActiveRate1Energy[0]);
}
void ReverseEnergyCalculate(void)
{
_ReverseEnergyAccum=0;
IncBcd(&EnergyData.ActiveReverseEnergy[0],4);
WriteEepromData(REVERSE_TOTAL_ENERGY_ID,&EnergyData.ActiveReverseEnergy[0]);
}
void PowerDownTask(void)
{
TempBufOfMain[0]=PulseSample.PulseNum[0];
TempBufOfMain[1]=PulseSample.PulseNum[1];
TempBufOfMain[2]=PulseSample.PulseNum[2];
TempBufOfMain[3]=PulseSample.PulseNum[3];
WriteEepromData(ENERGY_PULSE_ID,TempBufOfMain);
TempBufOfMain[0]=CurrentTime.Hour;
TempBufOfMain[1]=CurrentTime.Day;
TempBufOfMain[2]=CurrentTime.Month;
TempBufOfMain[3]=CurrentTime.Year;
WriteEepromData(LAST_POWERDOWN_TIME_ID,TempBufOfMain);
while(1);
}
void EnergyMonthStore(void)
{
WriteEepromData(ACTIVE_ENERGY_ID0+EnergyData.EnergyPointer,&EnergyData.ActiveRate1Energy[0]);
EnergyData.EnergyPointer++;
if(EnergyData.EnergyPointer>12)
EnergyData.EnergyPointer=0;
WriteEepromData(ACTIVE_ENERGY_ID0+EnergyData.EnergyPointer,&EnergyData.ActiveRate1Energy[0]);
TempBufOfMain[0]=EnergyData.EnergyPointer;
WriteEepromData(CURRENT_ENERGY_POINTER_ID,TempBufOfMain);
}
void CalculateTatolEnergy(void)
{
BcdAdd(&EnergyData.ActiveRate1Energy[0],&EnergyData.ActiveRate2Energy[0],TempBufOfMain,4);
BcdAdd(TempBufOfMain,&EnergyData.ActiveRate3Energy[0],&EnergyData.ActiveTotalEnergy[0],4);
}
void InitEnergyData(INT8U *DataPnt)
{
INT8U i;
INT8U *Pnt;
/*初始化当前正向电量*/
Pnt=&EnergyData.ActiveRate1Energy[0];
for(i=0;i<12;i++)
{
*Pnt=*DataPnt;
Pnt++;
DataPnt++;
}
CalculateTatolEnergy();
/*初始化当前反向电量*/
Pnt=&EnergyData.ActiveReverseEnergy[0];
for(i=0;i<4;i++)
{
*Pnt=0;
Pnt++;
}
/*清0历史电量*/
for(i=0;i<12;i++)
TempBufOfMain[i]=0;
for(i=ACTIVE_ENERGY_ID1;i<ACTIVE_ENERGY_ID12+1;i++)
WriteEepromData(i,TempBufOfMain);
PulseSample.PulseNum[0]=0;
PulseSample.PulseNum[1]=0;
PulseSample.PulseNum[2]=0;
PulseSample.PulseNum[3]=0;
//保存当前锋平谷电能
WriteEepromData(ACTIVE_ENERGY_ID0,&EnergyData.ActiveRate1Energy[0]);
//保存反向电能
WriteEepromData(REVERSE_TOTAL_ENERGY_ID,&EnergyData.ActiveReverseEnergy[0]);
//保存电能脉冲数
TempBufOfMain[0]=0;
TempBufOfMain[1]=0;
TempBufOfMain[2]=0;
TempBufOfMain[3]=0;
WriteEepromData(ENERGY_PULSE_ID,TempBufOfMain);
EnergyData.EnergyPointer=0;
WriteEepromData(CURRENT_ENERGY_POINTER_ID,&EnergyData.EnergyPointer);
}
void EnergyReverseDeal(void)
{
if(IS_ENERGY_REVERSE_HIGH)
{
EnergyReverseTest.ReverseHighCnt=0;
EnergyReverseTest.ReverseLowCnt++;
if(EnergyReverseTest.ReverseLowCnt>=3)
{
MeterRunningState&=0xef;//正向电能
EnergyReverseTest.ReverseLowCnt=0;
EnergyReverseTest.ReverseState=0;
}
}
else
{
EnergyReverseTest.ReverseLowCnt=0;
EnergyReverseTest.ReverseHighCnt++;
if(EnergyReverseTest.ReverseHighCnt>=3)
{
MeterRunningState|=0x10;//反向电能
EnergyReverseTest.ReverseHighCnt=0;
if(EnergyReverseTest.ReverseState==0)
{
TempBufOfMain[0]=CurrentTime.Minute;
TempBufOfMain[1]=CurrentTime.Hour;
TempBufOfMain[2]=CurrentTime.Day;
TempBufOfMain[3]=CurrentTime.Month;
WriteEepromData(LAST_POWER_REVERSE_TIME_ID,TempBufOfMain);
EnergyReverseTest.ReverseState=1;
}
}
}
if(EnergyReverseTest.ReverseState)
{
EnergyReverseTest.ReverseRecordCnt++;
if(EnergyReverseTest.ReverseRecordCnt>=60)
{
EnergyReverseTest.ReverseRecordCnt=0;
IncBcd(ReverseTotalTime,3);
WriteEepromData(POWER_REVERSE_TOTALTIME_ID,ReverseTotalTime);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -