📄 zhuancun.c
字号:
/*************************************************************************************
文件类型:
文件作用:转存历史数据
修改权限:
文件相关:
创 建 人:chenbo
创建日期:2007.11.24
当前版本:Ver0.1
版本信息:Ver0.1
**************************************************************************************/
#include "Tiger.h"
#include "typemeter.h"
struct flzandstrstruct
{ unsigned int lasttimeaddr; //上次冻结电量时间存放地址
unsigned int poinadd; //存放指针地址
unsigned int DATAID; //存放数据id号
unsigned char acttims; //最大存放次数
};
const struct flzandstrstruct code flzandstrtable[]=
{{EEP_lastflzengtime,EEP_point_dong,0xc160,8}, //冻结数据
{EEP_laststrengtime,EEP_point_zhun,0x0110,11} //转存
};
//===================================================
//函数功能:初始化转存模块
//
//====================================================
void int_zhuancun(void)
{ flag_zhuancun_run=0;
sta_zhuancun=no_zhuncun;
// F_askerashistdata=0;
// bufftime=(ram[RAM_rtcmin]&0xf0);
}
//====================================================
//完成夸月停电时的转存
//====================================================
void complet_zhuncun(void)
{
}
//========================================================
//函数功能:判断上月电量是否已经转存
//入口参数:当前时间,判断类型 0冻结,1转存
//出口参数:1:尚未转存,0:已经转存
//========================================================
unsigned char check_laststortime(unsigned char * pointtime,unsigned char type)
{ unsigned char value;
data_addr.word[1]=flzandstrtable[type].lasttimeaddr;
Read_data(EEPROM,3); //读取上次转存时间
value=0;
if(pointtime[0]>=wr_buff[0]) //年判断
{ if(pointtime[0]>wr_buff[0]) //如果已经夸年,则表示未保存
value=1;
else
{ if(pointtime[1]>wr_buff[1]) //未夸年,判断月份
{ value=1;
}
else if(pointtime[1]==wr_buff[1]) //未夸月
{ if(type==0) //如果时冻结,继续日判断
{ if(pointtime[2]>wr_buff[2]) //夸日
value=1;
}
}
}
}
return value;
}
//=======================================================
//函数功能:保存电量
//入口参数:存贮类型,当前时间
//=======================================================
void cun_energe(unsigned char type,unsigned char *pointime)
{ unsigned char point,len;
data_addr.word[1]=flzandstrtable[type].poinadd; //获取指针
Read_data(EEPROM,1);
point=wr_buff[0];
if(point<flzandstrtable[type].acttims-2) //指针累加
{ point+=1;
}
else
point=0;
wr_buff[0]=point; //保存新指针
Write_data(EEPROM,1);
addr_baseonIDandtype(RAM,ID_POSENGSUM); //读取存放电量
data_addr.word[1]= (*ID_coretalbpoint[0]).dataaddr;
len=(*ID_coretalbpoint[0]).datalong;
Read_data(RAM,len);
if(type==0) //如果是冻结,则保存冻结日
wr_buff[4]=pointime[2];
addr_baseonIDandtype(0,flzandstrtable[type].DATAID); //获取存放电量德首地址
len=(*ID_coretalbpoint[0]).datalong;
data_addr.word[1]= (*ID_coretalbpoint[0]).dataaddr;
data_addr.word[1]+=point*len;
Write_data((*ID_coretalbpoint[0]).stortype,len); //存贮地址
wr_buff[0]=pointime[0]; //保存时间 年 月 日
wr_buff[1]=pointime[1];
wr_buff[2]=pointime[2];
data_addr.word[1]=flzandstrtable[type].lasttimeaddr;
Write_data(EEPROM,3);
}
//=======================================================
//函数功能:转存历史数据模块
//
//=========================================================
void zhuncun_mode(void)
{ unsigned char timebuff[4];
if(flag_zhuancun_run==1) //1秒运行一次
{ flag_zhuancun_run=0;
addr_baseonIDandtype(RAM,ID_DATAMETER); //获取当前时间
data_addr.word[1]=(*ID_coretalbpoint[0]).dataaddr;
Read_data((*ID_coretalbpoint[0]).stortype,7);
timebuff[0]=wr_buff[0]; //年
timebuff[1]=wr_buff[1]; //月
timebuff[2]=wr_buff[2]; //日
timebuff[3]=wr_buff[3]; //时
if(timebuff[3]==0) //零时操作
{ if(1==check_laststortime(timebuff,0)) //判断是否已经冻结
{ cun_energe(0,timebuff); //0 表示电量日冻结
}
if(timebuff[2]==1) //1日,电量转存
{ if(1==check_laststortime(timebuff,1)) //判断是否已经转存
{ cun_energe(1,timebuff); //1 表示电量转存
}
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -