📄 energadd.c
字号:
/*************************************************************************************
文件类型:
文件作用:能量计量
修改权限:
文件相关:
创 建 人:chenbo
创建日期:2007.06.04
当前版本:Ver0.1
版本信息:Ver0.1
**************************************************************************************/
#include "Tiger.h"
#include "typemeter.h"
extern void byte_x_bcd_addone(unsigned char *point,unsigned char num);
//=====================================================
//函数功能:初始化能量累加模块
//=====================================================
void int_energeadd(void)
{ buffer_energ[0]=0;
buffer_energ[1]=0;
F_energeadd=0;
}
//===========================================
//函数功能:3备份电量整数部分到EEPROM中
//
//===========================================
void stor_engthr(unsigned int stor_id)
{ unsigned char i,num,datanum;
num=addr_from_coreID(1,stor_id);
for(i=0;i<num;i++)
{ if((*ID_coretalbpoint[i]).stortype==EEPROM)
{ data_addr.word[1]=(*ID_coretalbpoint[i]).dataaddr;
datanum=(*ID_coretalbpoint[i]).datalong;
Write_data(EEPROM,datanum);
}
}
}
//=================================================
//函数功能:在电量累加前对电量整数部分进行检测
//
//==================================================
void check_engint(unsigned int chk_id)
{ unsigned char i,j,k,num,value,datanum;
Word32 recover_buff;
uint32 recoverdata[3];
value=0;
k=0;
num=addr_from_coreID(1,chk_id);
for(i=0;i<num;i++)
{ if((*ID_coretalbpoint[i]).stortype==EEPROM)
{ data_addr.word[1]=(*ID_coretalbpoint[i]).dataaddr;
datanum=(*ID_coretalbpoint[i]).datalong;
Read_data(EEPROM,datanum);
wr_buff[datanum]=0;
recover_buff.lword=0;
for(j=0;j<datanum-1;j++) //校验和判断
{ wr_buff[datanum]+=wr_buff[j];
recover_buff.byte[j]=wr_buff[j]; //保存读出来的数据
}
recoverdata[k++]=recover_buff.lword;
if(wr_buff[datanum]==(wr_buff[datanum-1]-0x33)) //如果校验和正确
{ if(check_X_bcd((datanum-1),wr_buff)==1) //BCD嘛校验
{ value=1; //检测到合法数据,放在wr_buff中
break;
}
}
}
}
if(value==0) //EEPROM中恢复数据错误
{ if(one_from_three(recoverdata)==1) //三中取二成功
{ recover_buff.lword=recoverdata[0];
if(check_X_bcd(4,recover_buff.byte)==1) //BCD码校验正确
{ for(j=0;j<datanum-1;j++)
{ wr_buff[j]=recover_buff.byte[j]; //恢复合法数据
value=1;
}
}
}
if(value==0) //如果没有恢复合法数据,从零开始计量
{ for(j=0;j<datanum-1;j++)
wr_buff[j]=0;
}
}
for(i=0;i<num;i++)
{ if((*ID_coretalbpoint[i]).stortype==RAM)
{ data_addr.word[1]=(*ID_coretalbpoint[i]).dataaddr;
datanum=(*ID_coretalbpoint[i]).datalong-1;
Write_data(RAM,datanum);
}
}
}
//====================================================
//函数功能:电量累加
//
//====================================================
void add_energe(unsigned int ID_code,unsigned char *point_cf,unsigned int chshu)
{ unsigned char buff_check,i,num;
unsigned int temp_addr;
chshu=chshu/100;
if(*point_cf>=chshu) //能量累加
{ num=(*point_cf)/chshu;
*point_cf=(*point_cf)%chshu;
check_engint(ID_code); //累加前对电量整数部分进行监测
addr_baseonIDandtype(RAM,ID_code);
temp_addr=(*ID_coretalbpoint[0]).dataaddr;
buff_check=ram[temp_addr+2];// +2
byte_x_bcd_addX(&ram[temp_addr],4,num); // 能量累加
// stor_doteng(temp_addr); //保存电量小数部分
// tt=ram[temp_addr+3];
if(ram[temp_addr+2]!=buff_check) //保存整数部分
{ wr_buff[3]=0;
for(i=0;i<3;i++)
{ wr_buff[i]=ram[temp_addr+i];
wr_buff[3]+=wr_buff[i];
}
stor_engthr(ID_code);
}
}
}
//======================================================
//函数功能:电量累加模块,完成对总电量、费率电量、失压失流电量的累加
//
//======================================================
void energ_addmode(void)
{ unsigned int temp_int;
if(F_energeadd==1)
{ F_energeadd=0;
//--------------------------获取脉冲常数
addr_baseonIDandtype(RAM,ID_CHANGSHU); //获取脉冲常数指针
data_addr.word[1]=(*ID_coretalbpoint[0]).dataaddr;
Read_data((*ID_coretalbpoint[0]).stortype,(*ID_coretalbpoint[0]).datalong);
temp_int=value_hex_from_2bcd(&wr_buff[1]);
if((temp_int>12800)||(temp_int<400)) //脉冲常数是否异常
temp_int=400; //按默认参数计算
//============================正向有功
add_energe(ID_POSENGSUM,&sumCF_Z,temp_int); //正向有功总能量累加
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -