price_switch.h
来自「嵌入式单片机开发,嵌入式单片机开发,嵌入式单片机开发」· C头文件 代码 · 共 475 行
H
475 行
// price_switch wan cheng le lv de tou qi 非费率的投切
// gen ju gui yue ,minute, hour ,day month
// note;; changed da yu fe lv shu,tao shu fuhequ shu jun mo ren,,,,,,
unsigned char RPRICE_SWITCHUSE_MINUTE;
unsigned char rpriceswitch_use_day;
//#define yuyue_chufeng 0xcc9
// return 0---29 true return 30 wu bu shi jie jia ri
unsigned char fuhe_changed;
void init_priceswitch()
{
fuhe_changed=0;
rqingqiu_yuyue_cun=0;
ryuyuedisplay_use=0;
status_cuofeng_price=0;
RPRICE_SWITCHUSE_MINUTE=RSOFT_RTC_MINUTE+3; // RESET RUN ONE TIME
rpriceswitch_use_day=RSOFT_RTC_DAY;// yu yue (n day)
}
// add 2003-5-28
unsigned char value_num_meiriqiehua(unsigned char*point)
// cal 1---5 tao shi duan de shi duan shu
// you xiao de
{unsigned char l,n,m,*fp;
n=0;
for(l=0;l<12;l++)
{
m=0;
fp=point+3*l;
if(l!=0)
if(*point==(*fp))// minute
if(*(point+1)==(*(fp+1)))// hour
m=1;
if((1==testminutehour(fp))&&(*(fp+2)<4)&&(m==0))// time ok and price ok and no loop
n=n+1;
else
l=12;
}
return one_byte_hex_to_bcd(n);//((n/10)<<4)+(n%10);
}
void num_nianshiqu_rishiduan_jiari()
{// nian shi qu shu
unsigned char l,n,m,*fp,*fp1;
n=0;
for(l=0;l<12;l++)
{
m=0;
fp=&RAM[R_ONUS_1];
fp1=&RAM[R_ONUS_1+3*l];
if(l!=0)
if(*fp==*fp1)
if(*(fp+1)==*(fp1+1))
m=1;
if((2==testday(*fp1)+testmonth(*(fp1+1)))&&(*(fp1+2)<6)&&(0!=*(fp1+2))&&(0==m))
n=n+1;
else
l=12;
}
RAM[R_NUM_NIANSHIQU]=one_byte_hex_to_bcd(n);//((n/10)<<4)+(n%10);
// shi duan biao shu
n=0;
for(l=0;l<5;l++)
{
fp=&RAM[R_PRICE_NO1_1+36*l];
if((1==testminutehour(fp))&&(*(fp+2)<4))
n=n+1;
}
RAM[R_NUM_TAOSHIDUAN]=n;
//mei ri qie huan shu
// shi tao 0----4
RAM[R_NUM_SWICTH_PERDAY1]=value_num_meiriqiehua(&RAM[R_PRICE_NO1_1]);
RAM[R_NUM_SWICTH_PERDAY2]=value_num_meiriqiehua(&RAM[R_PRICE_NO2_1]);
RAM[R_NUM_SWICTH_PERDAY3]=value_num_meiriqiehua(&RAM[R_PRICE_NO3_1]);
RAM[R_NUM_SWICTH_PERDAY4]=value_num_meiriqiehua(&RAM[R_PRICE_NO4_1]);
RAM[R_NUM_SWICTH_PERDAY5]=value_num_meiriqiehua(&RAM[R_PRICE_NO5_1]);
// FE LV SHU
RAM[R_NUM_PRICE]=4;
// JIE JIA RI SHU
n=0;
for(l=0;l<30;l++)
{
fp=&RAM[R_HOLIDAY1+3*l];
if((2==testday(*fp)+testmonth(*(fp+1)))
&&(*(fp+2)<6)&&(*(fp+2)!=0))
n=n+1;
else
l=30;
}
RAM[R_NUM_HOLIDAY]=one_byte_hex_to_bcd(n);//((n/10)<<4)+(n%10);
}
unsigned char price_switch_holiday()
// today is holiday yes or no
{unsigned char a1,a2,a3,a4,a5;
a2=RAM[R_NUM_HOLIDAY];
a2=value_hex_from_bcd(a2);// bcd----->hex
if((a2==0)||(a2>30))
return 30;// ==30---------->no
else
{
a4=0;
for(a3=0;a3<a2;a3++)
{
if((RAM[R_HOLIDAY1+3*a3]==RSOFT_RTC_DAY)&&(RAM[R_HOLIDAY1+3*a3+1]==RSOFT_RTC_MONTH))
{
a5=a3;
a3=a2;
a4=1;
}
}
if(a4==1)
return a5;
else
return 30;
}
}
// gong xiu ri pan duan 1 gong xiu 0 no gong xiu
const unsigned char price_switch_table[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x00};
unsigned char price_switch_gongxiuri()
// today is workoffday yesorno
{
if((RAM[R_WORKOFFDAY]& price_switch_table[RSOFT_RTC_WEEK])==0)
return 1;// chang
else
return 0;
}
// que ding fe hu qi dui ying tao shi duan 确定负荷对应套时段ppp
// di zhong gao geng ju gui yue gai
// return 0--4 true
// return hex value
unsigned char price_switch_fuhe()
//
{unsigned char a1,a2;
unsigned char use_num;
unsigned int y0,y1,y,yuse;
use_num=value_hex_from_bcd(RAM[R_NUM_NIANSHIQU]);// bcd------>hex
if((use_num==0)||(use_num>12))
return 0;// l1
else
{
if(use_num==1)
return 0;
else
{
a2=use_num-1;
for(a1=0;a1<(use_num-1);a1++)
{
yuse=R_ONUS_1+3*a1;// compare addr
y0=RAM[yuse+1]*256+RAM[yuse];// x x+1
y1=RAM[yuse+1+3]*256+RAM[yuse+3];
y=RSOFT_RTC_MONTH*256+RSOFT_RTC_DAY;// current time
if(y0<=y1)//
{
if((y>=y0)&&(y<y1))
{
a2=a1;
break;
}
}
else//
{
if((y>=y0)||(y<y1))
{
a2=a1;
break;
}
}
}
return a2;
}
}
}
unsigned char come_in_fm(fm_switch_date_addr,fm_current_addr)
unsigned int fm_switch_date_addr,fm_current_addr;
//fm_switch_date_addr----------------->date changed date
//fm_current_addr -------------------->current status addr
{unsigned char l;
if(1==come_setdate_yesno_byfm(fm_switch_date_addr))
{
for(l=0;l<5;l++)
wr_data[l]=0;
data_addr.addri=fm_switch_date_addr;
write(FM,5);
write(RRAM,5);
data_addr.addri=fm_switch_date_addr+5;
read(FM,1);
wr_data[0]=0x1&wr_data[0];
data_addr.addri=fm_current_addr;
write(FM,1);
return 1;
}
else
return 0;
}
void price_switch_mode()
{unsigned char a1,a2,a3,a4,a5,l;
unsigned int l1,l2;
unsigned int y0,y1,y,yuse;
unsigned char use_meiriqihuanshu;
// ADD
num_nianshiqu_rishiduan_jiari();
//ADD END
// DAY CHANGED----YUYUE CUO FENG CLOSE DAY SUB
if(rpriceswitch_use_day!=RSOFT_RTC_DAY)
{
rpriceswitch_use_day=RSOFT_RTC_DAY;
data_addr.addri=FM_LOCK_CUOFENGSHIDUAN;
read(FM,5);
for(l=0;l<5;l++)
if(wr_data[l]!=0)
wr_data[l]=wr_data[l]-1;
write(FM,5);
}
// qiu nian shi qu shu-------
if(RPRICE_SWITCHUSE_MINUTE!=RSOFT_RTC_MINUTE)
{
RPRICE_SWITCHUSE_MINUTE=RSOFT_RTC_MINUTE;
// cuo feng star
if(progfunction_cuofeng==yes)
{
// ding zhi------->
come_in_fm(FM_CUOFENG_VALUE_SWITCH, FM_CURRENT_CUOFENGDINGZHI);
//if(1==come_setdate_yesno_byfm(FM_CUOFENG_VALUE_SWITCH))
//{
// for(l=0;l<5;l++)
// wr_data[l]=0;
//data_addr.addri=FM_CUOFENG_VALUE_SWITCH;
//write(FM,5);
//write(RRAM,5);
//data_addr.addri=FM_CUOFENG_VALUE_SWITCH+5;
//read(FM,1);
//wr_data[0]=0x1&wr_data[0];
//data_addr.addri=FM_CURRENT_CUOFENGDINGZHI;
//write(FM,1);
//}
//if(1==come_setdate_yesno_byfm(FM_CUOFENG_SWITCH))
// come
// {
//for(l=0;l<5;l++)
// wr_data[l]=0;
//data_addr.addri=FM_CUOFENG_SWITCH;
//write(FM,5);
//write(RRAM,5);
//data_addr.addri=FM_CUOFENG_SWITCH+5;
//read(FM,1);
//wr_data[0]=0x1&wr_data[0];
//data_addr.addri=FM_CURRENT_CUOFENGSHIDUAN;
//write(FM,1);
if(1==come_in_fm(FM_CUOFENG_SWITCH, FM_CURRENT_CUOFENGSHIDUAN))
{
// switch dongjie----------------->add
//for(l1=0;l1<45;l1++)
//wr_data[l1]=RAM[R_CUOFENG_KWH_F+l1];
//data_addr.addri=FM_CUOFENG_BUFFER;
//write(FM,45);
copy_ram_to_fm(R_CUOFENG_KWH_F,45, FM_CUOFENG_BUFFER);
// switch dongjie----------------->add END
}
data_addr.addri=FM_CURRENT_CUOFENGSHIDUAN;
read(FM,1);
if((0x1&wr_data[0])==0)
data_addr.addri=R_MAIN_CUOFENG_START_1; // zhu
else
data_addr.addri=R_SUB_CUOFENG_START_1; // fu
read(FM,16);
status_cuofeng_price=0;
for(a1=0;a1<4;a1++)
{
a3=0;
l1=RSOFT_RTC_MINUTE+256*RSOFT_RTC_HOUR;
l2=wr_data[4*a1]+256*wr_data[4*a1+1];
if(l1>=l2)
a3=1;
if(1==a3)
{
l2=wr_data[4*a1+2]+256*wr_data[4*a1+3];
if(l1>=l2)
a3=0;
if(1==a3)
status_cuofeng_price=1;
}
}
}
// cuo feng end
// yue yue start(2 copy)
a1=0;
if(progfunction_yuyue==yes)
{
if(1==come_setdate_yesno_byfm(FM_PRICE_SWITCH))
{
for(a2=0;a2<5;a2++)
wr_data[a2]=0;
data_addr.addri=FM_PRICE_SWITCH;
write(FM,5);
write(RRAM,5);
data_addr.addri=FM_PRICE_SWITCH+5;
read(FM,1);
wr_data[0]=0x3&wr_data[0];
data_addr.addri=FM_CURRENT_TYPE_PRICE;
write(FM,1);// write to current run
rqingqiu_yuyue_cun=1;
// QING QIU
data_addr.addri=FM_YUYUE_ZHUANCUNQINGQIU;
wr_data[0]=1;
write(FM,1);
}
data_addr.addri=FM_CURRENT_TYPE_PRICE;
read(FM,1);// current to wr_data[0]
}
else
wr_data[0]=0; // no yuyue---->=0
if((0x1&wr_data[0])==1) // if yuyue yes
{
if((0x2&wr_data[0])==0)
RCURRENT_TAOSHIDUAN=0;//RCURRENT_TAOSHIDUAN-----==0---4
else
RCURRENT_TAOSHIDUAN=1;
ryuyuedisplay_use=1;// display use
}
else
{
ryuyuedisplay_use=0;
// fu he qi
current_fuheqi=price_switch_fuhe();
data_addr.addri=FM_FUHEQIYIZHUANCUN_DATE;// fu he qi qie huan zhuan cun
if(1==read(FM,2))
{
if((wr_data[0]==RAM[R_ONUS_1+0+3*current_fuheqi])&&(wr_data[1]==RAM[R_ONUS_1+1+3*current_fuheqi]))
fuhe_changed=0;
else
fuhe_changed=1;
}
a1=price_switch_holiday();
if(a1<30)
RCURRENT_TAOSHIDUAN=RAM[R_HOLIDAY1+3*a1+2]-1; // jie jia ri 12345---01234
else
{
if(1==price_switch_gongxiuri()) // gong xiu ri yes or no
RCURRENT_TAOSHIDUAN=RAM[R_WORKOFFDAY_PRICE]-1; // gong xiu ri
else
{
RCURRENT_TAOSHIDUAN= RAM[R_ONUS_1+2+3*current_fuheqi]-1;//price_switch_fuhe_shiduan();
if(0==value_hex_from_bcd(RAM[R_NUM_NIANSHIQU]))
RCURRENT_TAOSHIDUAN=0;//add 2003-9-1
}
}
}
// if err mo ren
if(RCURRENT_TAOSHIDUAN>4) RCURRENT_TAOSHIDUAN=0;// check
switch(RCURRENT_TAOSHIDUAN)
{
case 0: // 1 tao
a5=RAM[R_NUM_SWICTH_PERDAY1];
break;
case 1: // 2
a5=RAM[R_NUM_SWICTH_PERDAY2];
break;
case 2: // 3
a5=RAM[R_NUM_SWICTH_PERDAY3];
break;
case 3: // 4
a5=RAM[R_NUM_SWICTH_PERDAY4];
break;
case 4: // 5
a5=RAM[R_NUM_SWICTH_PERDAY5];
break;
default:
a5=0;
break;
}
use_meiriqihuanshu=value_hex_from_bcd(a5);// bcd ---->hex
if(use_meiriqihuanshu>12)
use_meiriqihuanshu=0;
// form current time result STATUS_PRICE 根据已知套时段求费率
if((RAM[R_NUM_PRICE]==0)||(RAM[R_NUM_PRICE]>4)) STATUS_PRICE=1; //feng
else
{
if(use_meiriqihuanshu==0)
STATUS_PRICE=1;// feng price
else
{
if(use_meiriqihuanshu==1) // only one
STATUS_PRICE=RAM[R_PRICE_NO1_1+RCURRENT_TAOSHIDUAN*36+2];
else
{
a2=use_meiriqihuanshu-1;
for(a1=0;a1<(use_meiriqihuanshu-1);a1++)
{
yuse=R_PRICE_NO1_1+RCURRENT_TAOSHIDUAN*36+3*a1;// addr
y0=RAM[yuse+1]*256+RAM[yuse];
y1=RAM[yuse+1+3]*256+RAM[yuse+3];
y=RSOFT_RTC_HOUR*256+RSOFT_RTC_MINUTE;
if(y0<=y1)
{
if((y>=y0)&&(y<y1))
{
a2=a1;
break;
}
}
else
{
if((y>=y0)||(y<y1))
{
a2=a1;
break;
}
}
}
STATUS_PRICE=RAM[R_PRICE_NO1_1+RCURRENT_TAOSHIDUAN*36+2+3*a2];
}
}
}
}
if(STATUS_PRICE>3) // value=0,1,2,3
STATUS_PRICE=1;
// mo chong out
if(RCURRENT_KVA_USE_PRICE!=STATUS_PRICE)// price changed
pulseset_withvaluetime(5,800);
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?