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 + -
显示快捷键?