📄 xuliang.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 + -