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

📄 biaogai_duanliu.c

📁 电能表源码
💻 C
字号:
/*************************************************************************************

	文件类型:防窃电和启动潜动模块
	文件作用:
	修改权限:
	文件相关:
	
	创 建 人:chenbo
	创建日期:2007.11.21
	当前版本:Ver1.0

**************************************************************************************/
#include "Tiger.h"
#include "typemeter.h"


/*
//================================================
//函数功能:初始化端钮盖、表盖停电期间报警模块
//
//================================================
void ini_tindianBGDN(void)
{ unsigned char i;
  flag_BGsta。byte=0;
  flag_BGsta。byte=0;
  for(i=0;i<64;i++)
     {ram_BGDN[i]=IAP_FLASH_ByteRead(FL_lasteng+420+i);
     }
}
*/

//==================================================
//函数功能:初始化防窃电和潜动模块
//==================================================
void int_kaiqi(void)
{ sta_biaogai=0;
  sta_checkbiaogai=0;
  sta_duanliu=0;
  sta_checkduanliu=0;
  
  time_biaogai=0;
  time_duanliu=0;

  type_kaiqi=0xff;
  type_kaiqievent=idle_qiedian;

  F_askerashistdata=0;
  flag_biaogai_duanliu=0;


  time_qiandong=0;
  flag_losetenvt_sec=0;
  flag_type=0;

//  Disenable_BGkeyout                 //表盖,端钮盖检测IO口输出禁止
 // Disenable_DNkeyout

//  Enable_BGkeyin                      //输入使能
 // Enable_DNkeyin

}



//=====================================================================
//函数功能:恢复数据,并保存事件开始时间及事件总次数
//
//=====================================================================
void recover_biaogaiduanliu_eng(void)
{ 
  unsigned char i;
  //===========================================================================开启事件数据恢复
  if(type_kaiqi==1)                                                             //端钮盖开启
      {if(copy_flash(FL_wrbuffer+420,FL_lasteng+420,30)==0)                     //拷贝出错
	      { if(Ferr_histdata==flash_ok)                                         //页没有损坏
		       copy_flash(FL_wrbuffer+420,FL_lasteng+420,30);                   //再存一次
		  }
      }
  else                                                                        //表盖开启
     { if(copy_flash(FL_wrbuffer+450,FL_lasteng+450,30)==0)                   //拷贝出错
	     {if(Ferr_histdata==flash_ok)                                          //页没有损坏
		    copy_flash(FL_wrbuffer+450,FL_lasteng+450,30);
		 }
	 }
//---------------------------------------------------------------------------结束

//========================================================保存窃电事件的开始时间
  wr_buff[0]=RTCTIME.rYear;                //窃电开始时间
  wr_buff[1]=RTCTIME.rMonth;
  wr_buff[2]=RTCTIME.rDate;
  wr_buff[3]=RTCTIME.rHour;
  wr_buff[4]=RTCTIME.rMinute;
  data_addr.word[1]=FL_lasteng+420+type_kaiqi*30;
  Write_data(FLASH,5);                      //保存开始时间
//--------------------------------------------------------------------结束


//========================================================相应开启次数累加
  data_addr.word[1]=FL_wrbuffer+480;
  Read_data(FLASH,4);
  for(i=0;i<4;i++)
     { if(wr_buff[i]==0xff)
	        wr_buff[i]=0;
	 }
  byte_x_bcd_addone(&wr_buff[2*type_qiedian],2);            //开启次数加1
  data_addr.word[1]=FL_lasteng+480;
  Write_data(FLASH,4);
//----------------------------------------------------------结束

}

//======================================================================
//函数功能:保存结束事件
//
//======================================================================
void deel_endkaiqi(unsigned char type)
{
  wr_buff[0]=RTCTIME.rYear;                //窃电结束时间
  wr_buff[1]=RTCTIME.rMonth;
  wr_buff[2]=RTCTIME.rDate;
  wr_buff[3]=RTCTIME.rHour;
  wr_buff[4]=RTCTIME.rMinute;
  data_addr.word[1]=FL_lasteng+420+type*30+5;
  Write_data(FLASH,5);                      //保存结束时间
}


//==========================================================================
//函数功能:判端钮盖状态
//
//==========================================================================
void pan_duanliu(void)
{ /*
  Enable_DNkeyin
  if(Sta_DNkeyinput==OPEN_DN)
     {  sta_checkduanliu=start_qiedian;           //端钮盖开启
	 }
  else
     { if(sta_duanliu!=idle_qiedian) 
	      { sta_checkduanliu=end_qiedian;
		  }
	   else
	      { sta_checkduanliu=idle_qiedian;
		  }
	 }
	 */
}

//==========================================================================
//函数功能:判表盖状态
//
//==========================================================================
void pan_biaogai(void)
{/* Enable_BGkeyin
  if(Sta_BGkeyinput==OPEN_BG)
     {  sta_checkbiaogai=start_qiedian;           //表盖开启
	 }
  else
     { if(sta_biaogai!=idle_qiedian) 
	      { sta_checkbiaogai=end_qiedian;
		  }
	   else
	      { sta_checkbiaogai=idle_qiedian;
		  }
	 }
	 */
}
//==========================================================================
//函数功能:表盖、端钮盖防开启模块
//备注:两个事件不能同事检测,必须等到一个事件检测完毕,再渐次另外事件
//==========================================================================
void biaogai_duanliu_mode(void)
{ //unsigned char tempdata;
  if(flag_biaogai_duanliu==1)
      { if(type_kaiqi==0xff)                        //如果无窃电事件需要处理
           { if(busy_buffflash==0)                  //如果缓存flash空闲
              { if(flag_type>2)
                    { flag_type=0;                   //一轮事件判断结束
                      flag_losetenvt_sec=0;
                    }
                else
                    flag_type++;
                switch(flag_type) 
                   { case 0:                                                 //表盖开启
				          pan_biaogai();
                          type_shijian=pan_lostshijian(&sta_biaogai,&sta_checkbiaogai,&time_biaogai,5);
						  break;
                     case 1:                                                 //端钮盖开启
                       
						  break;
 				     default:
					      flag_type=0;
					      break;
                   }  
             
                if(type_shijian!=idle_qiedian)                             //窃电事件开始
				     type_qiedian=flag_type;                               //表示窃电事件处理开始
			  }

		   }
        if(type_qiedian!=0xff)                                             //如果有窃电事件进行处理  
 	      { if(type_shijian==start_qiedian)                                //如果事件开始状态还没处理
			    {  busy_buffflash=1;                                       //置位buff忙标志位
			       if(copy_flash(FL_lasteng,FL_wrbuffer,512)==1)           //如果保存数据到缓存成功
                       { F_askerashistdata=1;                              //事件页擦除
				         type_shijian=ok_copybuff;                         //状态切换到准备保存数据
                       }
                   else                                                    //如果拷贝失败
                       { if(Ferr_buff==flash_err)                          //如果本来该页已经错误
				            { F_askerashistdata=1;                         //事件页擦除
				              type_shijian=ok_copybuff;                    //状态切换到准备保存数据
						    }
					     else
				              F_askerasbuffer=1;                            //存数据失败,对缓存进行擦除
                       } 
			    }
		   else if((type_shijian==ok_copybuff)&&(F_askerashistdata==0))     //如果缓存数据完毕且页擦除完毕
			    { recover_biaogaiduanliu_eng();                             //恢复数据并保存开始事件
			      type_qiedian=0xff;                                        //处理结束,继续处理下一事件
			      F_askerasbuffer=1;                                        //擦buffer页
			    }
		   else if(type_shijian==end_qiedian)                           //事件结束
			    { deel_endkaiqi(type_qiedian);                          //处理结束事件
			      type_qiedian=0xff;                                    //处理结束,继续处理下一事件
			    }
	     } 

    }
}                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 

⌨️ 快捷键说明

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