📄 lostevent.c
字号:
/*************************************************************************************
文件类型:防窃电和启动潜动模块
文件作用:
修改权限:
文件相关:
创 建 人: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 + -