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

📄 energadd.c

📁 电能表源码
💻 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 + -