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

📄 lostevent.c

📁 电能表源码
💻 C
📖 第 1 页 / 共 2 页
字号:
  data_addr.word[1]=FL_wrbuffer+450;
  Read_data(FLASH,15);
  for(i=0;i<15;i++)
     { if(wr_buff[i]==0xff)
	        wr_buff[i]=0;
	 }
  byte_x_bcd_addone(&wr_buff[2*type_qiedian],2);            //某个窃电事件次数加1
  byte_x_bcd_addone(&wr_buff[10],2);                        //窃电事件总次数加1
  wr_buff[12]=qiedian_code[type_qiedian][0];                 //窃电代码
  wr_buff[13]=qiedian_code[type_qiedian][1];
  wr_buff[14]=qiedian_code[type_qiedian][2];

  data_addr.word[1]=FL_dianliufanxiang+450;
  Write_data(FLASH,15);
//----------------------------------------------------------结束

}

//======================================================================
//函数功能:保存结束事件
//
//======================================================================
void deel_endenvent(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_dianliufanxiang+type*100+5;
  Write_data(FLASH,5);                      //保存结束时间
}



//=========================================================================
//函数功能:根据电流不平衡情况,切换计量通道
//入口参数:不平衡状态
//=========================================================================
void change_channlmeter(unsigned char type_shijian)
{ unsigned long  A_dianliu,B_dianliu;
  unsigned char tempdata;
   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;
   if(type_shijian==start_qiedian)                              //电流不平衡时切换计量通道
 	 {  if(A_dianliu<B_dianliu)                              //A不平衡
			{ if(cuurnt_channl==0)
			     { cuurnt_channl=1;                          //当前计量通道改为B 
				   tempdata=ReadMeterFunc();
				   tempdata|=0x20;                           //切换到B通道
		           SetMeterFunc(tempdata);
      		     }
			}
		 else                                                //B不平衡
		    { if(cuurnt_channl==1)
			     { cuurnt_channl=0;
				   tempdata=ReadMeterFunc();
				   tempdata&=0xdf;                           //切换到A通道
		           SetMeterFunc(tempdata);
      		     }
			}
	}
 else if(type_shijian==end_qiedian)                          //结束则切换回A通道计量
   { if(cuurnt_channl==1)
        { cuurnt_channl=0;
		  tempdata=ReadMeterFunc();
		  tempdata&=0xdf;                           //切换到A通道
		  SetMeterFunc(tempdata);
      	}
   }

}

//=====================================================================
//函数功能:失压事件下切换计量通道,有效值和能量
//入口参数:失压状态
//=====================================================================
void chang_channlrms(unsigned char type_shijian)
{ unsigned char value;
  if(type_shijian==start_qiedian)                      //如果是停电事件发生
      { value=ReadMeterFunc();
	    value|=0x40;                                   //选择有效值计量
        SetMeterFunc(value);
	  }
  else
     { value=ReadMeterFunc();
	   value&=0xbf;                                   //选择能量计量
       SetMeterFunc(value);
	 }

}

//================================================================
//函数功能:停电时结束所有窃电事件
//
//================================================================
void Ene_lostenvent(void)
{ if(sta_dianliufan==start_qiedian)
    deel_endenvent(0);
  if(sta_bupingheng==start_qiedian)
     deel_endenvent(1);
  if(sta_shiya==start_qiedian)
    deel_endenvent(2);
}

//==========================================================================
//函数功能:防窃电和防潜功能
//备注:两个事件不能同事检测,必须等到一个事件检测完毕,再渐次另外事件
//==========================================================================
void lost_qiandongmode(void)
{ unsigned char tempdata;
  if(flag_losetenvt_sec==1)
      { if(time_qiandong>=qidong_time)              //如果潜动时间到,
           { time_qiandong=0;
	         lcr_dianliangsum();                   //清除电量累加器
	       }
        if(type_qiedian==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_dianliufan();                                  //判电流当前状态
                          type_shijian=pan_lostshijian(&sta_dianliufan,&sta_checkdialiufan,&time_checkdianliufan,10);
					      if(type_shijian==start_qiedian)
						      F_fanxiangbaojin=1;                      //电流反向报警灯打开
                          else if(type_shijian==end_qiedian)
						      F_fanxiangbaojin=0;                      //电流反向报警灯关
						  break;
                     case 1:
                          pan_bupingheng();                                  //判电不平衡
                          Read_datafromID(ID_GATLOSTCUR);
                          tempdata=value_hex_from_bcd(wr_buff[2]); //时间  
                          type_shijian=pan_lostshijian(&sta_bupingheng,&sta_checkbupingheng,&time_checkbupinheng,tempdata);
					      if(type_shijian!=idle_qiedian)                              
						      { change_channlmeter(type_shijian);                 //电流不平衡时切换计量通道
                                if(type_shijian==start_qiedian)
								    F_bupinhenbaojin=1;                           //不平衡报警灯打开
								else
								    F_bupinhenbaojin=0;                           //不平衡报警灯关闭 
							  }
						  break;
 				     case 2:
					      pan_shiya();                                //判失压事件
						  Read_datafromID(ID_GATCUTPOW); 
                          tempdata=value_hex_from_bcd(wr_buff[2]); //时间  
						  type_shijian=pan_lostshijian(&sta_shiya,&sta_checkshiya,&time_checkshiya,tempdata);
                          if(type_shijian!=idle_qiedian)             //如果有失压事件发生
                               { chang_channlrms(type_shijian);      //切换计量通道 
                                 if(type_shijian==start_qiedian)
                                       F_shiyabaojin=1;              //开失压报警灯
                                 else
                                       F_shiyabaojin=0;              //关失压报警灯   
                               }    
						  break;
					 case 3:
                          type_shijian=idle_qiedian;
 				          //pan_qiangci();                             //判强磁事件
 						  //type_shijian=pan_lostshijian(&sta_shiya,&sta_checkshiya,&time_checkqiangci,5);
  						  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_dianliufanxiang,FL_wrbuffer,512)==1)   //如果保存数据到缓存成功
                           { F_askerasenvernt=1;                                //事件页擦除
				   	         type_shijian=ok_copybuff;                           //状态切换到准备保存数据
                           }
                        else                                                   //如果拷贝失败
                           { if(Ferr_buff==flash_err)                          //如果本来该页已经错误
						        { F_askerasenvernt=1;                           //事件页擦除
				   	              type_shijian=ok_copybuff;                     //状态切换到准备保存数据
							    }
						     else
					              F_askerasbuffer=1;                            //存数据失败,对缓存进行擦除
                           } 
				      }
				  else if((type_shijian==ok_copybuff)&&(F_askerasenvernt==0))   //如果缓存数据完毕且页擦除完毕
				      { deel_recoverdata();                                     //恢复数据并保存开始事件
					    type_qiedian=0xff;                                     //处理结束,继续处理下一事件
					    F_askerasbuffer=1;                                     //擦buffer页
				      }
				  else if(type_shijian==end_qiedian)                           //事件结束
				      { deel_endenvent(type_qiedian);                          //处理结束事件
					    type_qiedian=0xff;                                     //处理结束,继续处理下一事件
					  }
			   } 
	  
    }
}                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 

⌨️ 快捷键说明

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