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

📄 xuliang.c

📁 电能表源码
💻 C
字号:
/*************************************************************************************

	文件类型:
	文件作用:需量量计量
	修改权限:
	文件相关:
	
	创 建 人:chenbo
	创建日期:2007.11.24
	当前版本:Ver0.1
	
	版本信息:Ver0.1					

**************************************************************************************/
#include "Tiger.h"
#include "typemeter.h"

//==========================================================
//函数功能:开始需量计量
//
//==========================================================
void Start_xuliang(void)
{
  time_xuliangcount=0;			// 需量周期计数器
  time_count_z=0;				// 时间计数器
  time_count_f=0;
  num_xuliangCF_z=0;			// 在需量周期内CF个数
  num_xuliangCF_f=0;
}

//===========================================================
//函数功能:初始化需量模块
//
//==========================================================
void Init_xuliangmode(void)
 {uint8 i;
  addr_baseonIDandtype(RAM,ID_XULPOSENGCURT);
  for(i=0;i<6;i++)
    {ram[(*ID_coretalbpoint[0]).dataaddr+i]=0;                 //清当前需量数据
	}
  F_refreshxuliang=0;                              //清最大需量保存标志位
  flag_xuliangminut=RTCTIME.rMinute;               //当前分钟不执行
  flag_xuliangmode=0;
  Start_xuliang();                                 
 }

//=============================================================
//函数功能:根据脉冲个数和时间计算平均功率
//入口参数:脉冲个数,时间,需量地址
//返回值:
//=============================================================
void jisuanxuliang(unsigned int num_CF,unsigned int time_CF,unsigned int addr)
 { Word32 temp_data;
   uint8 i;
   temp_data.lword=3600;
   temp_data.lword=temp_data.lword*10000;
   temp_data.lword=temp_data.lword/time_CF;
   temp_data.lword=temp_data.lword*(num_CF-1);
   temp_data.lword=temp_data.lword/changshu;
   temp_data.lword=long_to_4bcd(temp_data.lword);
   for(i=0;i<3;i++)
      {wr_buff[i]=temp_data.byte[i+1];
	  }
   data_addr.word[1]=addr;                          //保存当前需量到ram
   Write_data(RAM,3);
 }

//==========================================================
//函数功能:比较最大需量
//入口参数:当前需量和最大需量地址
//返回参数:1,表示有最大需量更新,0,表示没有更新
//==========================================================
unsigned char max_xuliangchuli(unsigned int addr_currnt,unsigned int addr)
{ Word32 temp_max; 
  unsigned long curr_xuliang;
  unsigned char i,value;
  value=0;
  data_addr.word[1]=addr;                        //读取最大需量值
  Read_data(RAM,3);
  temp_max.lword=Longdate_from_xbcd(wr_buff,3);
  data_addr.word[1]=addr_currnt;                 //读取当前需量值
  Read_data(RAM,3);
  curr_xuliang=Longdate_from_xbcd(wr_buff,3);
  if(curr_xuliang>temp_max.lword)                //如果当前需量比最大需量大,则保存
    { temp_max.lword=curr_xuliang;               //保存最大需量
      for(i=0;i<3;i++)
	    wr_buff[i]=temp_max.byte[i+1];
	  wr_buff[3]=RTCTIME.rYear;                //最大需量时间
      wr_buff[4]=RTCTIME.rMonth;
	  wr_buff[5]=RTCTIME.rDate;
      wr_buff[6]=RTCTIME.rHour;
	  wr_buff[7]=RTCTIME.rMinute;
      data_addr.word[1]=addr;
	  Write_data(RAM,8);
	  value=1;
 	 }
 return value;
}
//==============================================================
//函数功能:需量处理模块
//
//==============================================================
void xuliangmode(void)
{ uint8 i;
  struct coredata_tablestruct *p;
  if(flag_xuliangmode==1)                            // 需量1秒运行一次
     { flag_xuliangmode=0;
	   if(num_xuliangCF_z!=0)                        // 如果正向有功有脉冲,计数器累加
 	       time_count_z++;
//	   if(num_xuliangCF_f!=0)                        // 如果反向有功有脉冲,计数器累加
// 	       time_count_f++;
       if(flag_xuliangminut!=RTCTIME.rMinute)        // 每分钟做一次需量计算 
 	      { flag_xuliangminut=RTCTIME.rMinute;
            time_xuliangcount++;
			Read_datafromID(ID_PRIOXUL);
			xuliang_zhouqi=value_hex_from_bcd(wr_buff[1]);
			if(time_xuliangcount>=xuliang_zhouqi)                    //如果到需量周期
			    { time_xuliangcount=0;
				  if(num_xuliangCF_z>1)                              //正向有功需量计算
				     { addr_baseonIDandtype(RAM,ID_XULPOSENGCURT);   //读取当前需量地址
					   jisuanxuliang(num_xuliangCF_z,time_maichong_z,(*ID_coretalbpoint[0]).dataaddr);
                       p=ID_coretalbpoint[0];
                       addr_baseonIDandtype(RAM,ID_XULENGPOSSUM);        //读取当前月最大需量地址
                       if(max_xuliangchuli((*p).dataaddr,(*ID_coretalbpoint[0]).dataaddr)==1)
					      F_refreshxuliang=1;              //如果最大需量有更新,则置位保存标志位
                     }
                  /*
                  if(num_xuliangCF_f>1)                    //正向有功需量计算
				     { jisuanxuliang(num_xuliangCF_f,time_maichong_f,RAM_currntxuliang_f);
                       if(max_xuliangchuli(RAM_currntxuliang_f,RAM_maxxuliang_f)==1)
					      F_refreshxuliang=1;              //如果最大需量有更新,则置位保存标志位
                     }
                  */
                 Start_xuliang();                           //初始化需量计量,重新开始计量 
				}
		  }
	 }
/*  if(F_refreshxuliang==1)                    //如果需要保存最大需量
    { if(F_askerasxuliang!=1)
        { if(offset_xuliangaddr==55)               //存贮空间以满
            { F_askerasxuliang=1;
              offset_xuliangaddr=0xff;
            }         
          else if(offset_xuliangaddr==0xff)
            { offset_xuliangaddr=0;
            }
          else
              offset_xuliangaddr++;
          if(offset_xuliangaddr<56)              //保存数据
            { F_refreshxuliang=0; 
              addr_baseonIDandtype(RAM,ID_XULENGPOSSUM);        //读取当前月最大需量地址
			  wr_buff[8]=0;
			  for(i=0;i<8;i++)
                { wr_buff[i]=ram[i+(*ID_coretalbpoint[0]).dataaddr];
                  wr_buff[8]+=wr_buff[i];
                }
              data_addr.word[1]=FL_maxxuliang+offset_xuliangaddr*9;
              Write_data(FLASH,9);
            }
        }
      
    }*/
}

⌨️ 快捷键说明

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