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

📄 zhuancun.c

📁 电能表源码
💻 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 + -