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

📄 lostevent.c

📁 电能表源码
💻 C
📖 第 1 页 / 共 2 页
字号:
/*************************************************************************************

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

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

static unsigned char code qiedian_code[4][3]=                //窃电事件代码
{{0,0,0},                                               //电流反向
 {0,0,1},                                                //电流不平衡
 {0,0,2},                                                //失压
 {0,0,3}                                                //强磁干扰
};
 

//==================================================
//函数功能:初始化防窃电和潜动模块
//==================================================
void int_lostqiandong(void)
{ time_qiandong=0;
  flag_losetenvt_sec=0;
  flag_type=0;

  sta_dianliufan=0;                                      //电流反向初始化
  sta_checkdialiufan=0;
  sta_bupingheng=0;
  sta_checkbupingheng=0;
  sta_shiya=0;
  sta_checkshiya=0;
  sta_qiangci=0;
  sta_checkqiangci=0;
  time_checkdianliufan=0;                                 //检测到电流反向状态维持时间
  time_checkbupinheng=0;                                  //检测到电流不平衡状态维持时间
  time_checkshiya=0;                                      //检测到失压状态维持时间
  time_checkqiangci=0;                                    //检测到强磁状态维持时间

  type_qiedian=0xff;                                     //无窃电事件需要处理
  type_shijian=idle_qiedian;                             //无窃电事件发生 
  F_askerasenvernt=0;

  cuurnt_channl=0;                                       //默认A通道进行计量
}

//============================================================
//函数功能:判电流反向事件有没有发生
//
//============================================================
void pan_dianliufan(void)
{ if(Flg_kwhfangxiang==1)                     //功率反向
      sta_checkdialiufan=start_qiedian;       //检测到电流反向
  else
     { if(sta_dianliufan!=idle_qiedian)
          sta_checkdialiufan=end_qiedian;          //没有电流反向事件发生
       else
          sta_checkdialiufan=idle_qiedian;
     }
}

//=========================================================
//函数功能:判电流不平衡事件
//
//========================================================
void pan_bupingheng(void)
{ unsigned long A_dianliu,B_dianliu,AB_cha;
  Read_datafromID(ID_RMSCURNTA);
  A_dianliu=value_hex_from_4bcd(wr_buff)/100;
  Read_datafromID(ID_RMSCURNTB);
  B_dianliu=value_hex_from_4bcd(wr_buff)/100;
  AB_cha=0;
  if(A_dianliu>B_dianliu)                          //计算不平衡率
     { if(A_dianliu!=0)
	     { AB_cha=(A_dianliu-B_dianliu);
           AB_cha=(10000*AB_cha)/A_dianliu;
	  	 }
     }
  else
    { if(B_dianliu!=0)
        { AB_cha=(B_dianliu-A_dianliu);
          AB_cha=(10000*AB_cha)/B_dianliu;
        }
	}
  Read_datafromID(ID_GATLOSTCUR); 
  A_dianliu=value_hex_from_2bcd(wr_buff);     //读取失流门限值 xx.xx%
  if(AB_cha>A_dianliu)
      sta_checkbupingheng=start_qiedian;                //电流不平衡事件开始
  else
     { if(sta_bupingheng!=idle_qiedian)
          sta_checkbupingheng=end_qiedian;                  //电流不平衡事件结束
       else
          sta_checkbupingheng=idle_qiedian;
     } 
   
}

//=============================================================
//函数功能:判电压失压事件
//
//==============================================================
void pan_shiya(void)
{ unsigned long temp_data1,temp_data2; 
  Read_datafromID(ID_RMSVOLT);
  temp_data1=value_hex_from_4bcd(wr_buff);         //读取电压值 xxxx。xxxx
  temp_data1=temp_data1/1000;                              //xxxx.x
  Read_datafromID(ID_GATCUTPOW);
  temp_data2=value_hex_from_2bcd(wr_buff);    //读取门限值
  if(temp_data2>temp_data1)
      sta_checkshiya=start_qiedian;                        //失压开始
  else
     { if(sta_shiya!=idle_qiedian)
          sta_checkshiya=end_qiedian;                          //失压结束  
       else
          sta_checkshiya=idle_qiedian; 
     }                
}

//==============================================================
//函数功能:判强磁干扰事件
//
//===============================================================
void pan_qiangci(void)
{
}



//==============================================================
//函数功能:防潜清能量桶
//
//===============================================================
void lcr_dianliangsum(void)                   //清除电量累加器
{ uint8 i;  
       i=ReadMeterFunc();            //禁止CF输出
	   SetMeterFunc(i&0xef);
//       PmPwd = 0xcd;
//	   W_Byte(0x28a1,0x01);
//	   W_Buff(0);
//	   W_Byte(0x1072,0);
//	   W_Byte(0x1073,0);
//	   W_Byte(0x1075,0);
//	   W_Byte(0x1076,0);
//	   W_Byte(0x28a1,0);
//	   PmPwd = 0xcc;
	   i=ReadMeterFunc();
	   SetMeterFunc(i|0x10);            //开CF输出

}

//===================================================
//函数功能:停电防窃电功能
//
//===================================================
void fanqiedian_tindian(void)
{
}

//=====================================================================
//函数功能:恢复数据,并保存事件开始时间及事件总次数
//
//=====================================================================
void deel_recoverdata(void)
{ unsigned int temp_int;
  unsigned char i;
  //===========================================================================事件记录区存贮恢复数据
  if(type_qiedian>0)
      {if(copy_flash(FL_wrbuffer,FL_dianliufanxiang,type_qiedian*100)==0)      //拷贝出错
	      { if(Ferr_envent==flash_ok)                                          //页没有损坏
		       copy_flash(FL_wrbuffer,FL_dianliufanxiang,type_qiedian*100);     //再存一次
		  }
	   else
	      { temp_int=(type_qiedian+1)*100; 
		    if(copy_flash(FL_wrbuffer+temp_int,FL_dianliufanxiang+temp_int,450-temp_int)==0) //拷贝出错
			  if(Ferr_envent==flash_ok)                                                      //页没有损坏
			     copy_flash(FL_wrbuffer+temp_int,FL_dianliufanxiang+temp_int,450-temp_int);
		  }
      }
  else
     { if(copy_flash(FL_wrbuffer+100,FL_dianliufanxiang+100,350)==0)        //拷贝出错
	     if(Ferr_envent==flash_ok)                                          //页没有损坏
		    copy_flash(FL_wrbuffer+100,FL_dianliufanxiang+100,350);
	 }
//---------------------------------------------------------------------------结束


  temp_int=type_qiedian*100;
  copy_flash(FL_wrbuffer+temp_int,FL_dianliufanxiang+temp_int+10,90);    //保存前9次窃电事件

//========================================================保存窃电事件的开始时间
  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_dianliufanxiang+type_qiedian*100;
  Write_data(FLASH,5);                      //保存开始时间
//--------------------------------------------------------------------结束


//========================================================事件总次数累加并保存

⌨️ 快捷键说明

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