📄 lostevent.c
字号:
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 + -