当前位置: 代码迷 >> 综合 >> 记录贴----四页定时充放电时间段校验
  详细解决方案

记录贴----四页定时充放电时间段校验

热度:125   发布时间:2023-09-28 04:51:04.0

目的:
目前已经完成的是四页充放电时间及其功率,每一页都是分别由‘充电起始时间,充电结束时间,充电功率,放电起始时间,放电结束时间,放电功率’。由于充电时间段和放电放电时间段之间不能有交叉,因此需要校验设置的时间是否合规。以前代码只是设置了一页,因此只需要对一页的充电时间段和放电时间段校验即可。现在扩展到四页,需要对该页,以及页和页之间的时间段之间相互比较。代码及其注释如下:

UINT8 InitEnergyMode(UINT8 mode)
{#define PAGE_OF_USE_MAX		4       //  定时充放电里页面页数UINT8 err = 0, i,j, index = 0;UINT8 page_bit = 0;UINT8 page_count = 0;UINT16 charge_start_time[PAGE_OF_USE_MAX] = { 0 };UINT16 charge_end_time[PAGE_OF_USE_MAX] = { 0 };UINT16 discharge_start_time[PAGE_OF_USE_MAX] = { 0 };UINT16 discharge_end_time[PAGE_OF_USE_MAX] = { 0 };PAGE_OF_USE_MAX........else if(MANUALMODE == mode){err = 0;page_bit = 0;index = 0;/*判断使能的页位置*/for (i = 0; i < PAGE_OF_USE_MAX; i++){if(PageofUse[i].bit.enable){  if (i==0)  page_bit |= 0x01;else if (i==1)  page_bit |= 0x02;else if (i==2)  page_bit |= 0x04;else if (i==3)  page_bit |= 0x08;charge_start_time[index] =  (PageofUse[i].bit.chgsthour << 8) +                     PageofUse[i].bit.chgstmin;charge_end_time[index] =  (PageofUse[i].bit.chgendhour << 8) + PageofUse[i].bit.chgendmin;discharge_start_time[index]	= (PageofUse[i].bit.dischgsthour << 8) + PageofUse[i].bit.dischgstmin;discharge_end_time[index] =  (PageofUse[i].bit.dischgendhour << 8) + PageofUse[i].bit.dischgendmin;if (index < PAGE_OF_USE_MAX - 1)	index++;        //防止程序跑飞}}/*判断使能的页数*/
//		page_count = 0;
//		while (page_bit)
//		{
//			if(0x01 == (page_bit&0x01))
//			{
//				page_cpunt++;
//				page_bit >>= 1;
//			}
//		}page_count = index;/*比较charge时间*/for (i=0; i < page_count; i++){for(j=i+1; j < page_count; j++){if(!TimePeriodCertificated(charge_start_time[i], charge_end_time[i], charge_start_time[j], charge_end_time[j])){err = 1;}}}/*比较discharge时间*/for (i=0; i < page_count; i++){for(j=i+1; j < page_count; j++){if (!TimePeriodCertificated (discharge_start_time[i], discharge_end_time[i], discharge_start_time[j], discharge_end_time[j])){err = 1;}}}/*比较charge和discharge时间*/for (i = 0; i < page_count; i++){for (j = 0; j < page_count; j++){if (!TimePeriodCertificated (charge_start_time[i], charge_end_time[i], discharge_start_time[j], discharge_end_time[j])){err = 1;}}}/*数据检验无误的情况下,立flag*/if(err == 0 && page_count != 0){Mode3DataCertificateFlag = 1;}/*时间比较通过,并且有使能页的情况下*/if (err == 0){for (i = 0; i < PAGE_OF_USE_MAX; i++){if(PageofUse[i].bit.enable){  EepromWrite((INT8U *)&PageofUse[i], EEPROMADDR_WKM3_DATA+i*MODE3_OF_USE_SIZE*2, MODE3_OF_USE_SIZE*2);EepromWriteBack((INT8U *)&PageofUse[i], EEPROMADDR_WKM3_DATA+i*MODE3_OF_USE_SIZE*2, MODE3_OF_USE_SIZE*2);}}}}}

前面的一个for语句,通过page_bit来保存某几页使能,然后由于没使能的页的数据不需要参与比较,因此需要把使能了的页数据保存到buff里,以便下面进行比较。这里是定义了一个数组来暂存这些数据。index也顺带就是使能的页数,赋值给page_count。

下面的三个for依次检测充电时间段和充电事件单,放电时间段和放电时间段,以及充电时间段和放电时间段,需要注意的时是,由于第0页的充电时间不需要和自己的第0页的充电时间相比较,因此前面两个嵌套for二级循环从i+1开始,这一点需要注意。

由于先前把使能了的页面的数据暂存在四个数组里,因此下面才可以用for循环,这种将不连续的暂存到buffer里,以构成连续,因此可以用for循环来实现,以减小代码量。这种编程思想后面可以多学习。

下面记录的是中间的

bool TimePeriodCertificated(UINT16 TempTimeS1,UINT16 TempTimeE1,UINT16 TempTimeS2,UINT16 TempTimeE2)

bool TimePeriodCertificated(UINT16 TempTimeS1,UINT16 TempTimeE1,UINT16 TempTimeS2,UINT16 TempTimeE2)
{if( \((TempTimeS1 <= TempTimeE1)&&((TempTimeS2>=TempTimeS1)&&(TempTimeS2<=TempTimeE1)))|| \((TempTimeS1 <= TempTimeE1)&&((TempTimeE2>=TempTimeS1)&&(TempTimeE2<=TempTimeE1))))return 0;if( \((TempTimeS1 >= TempTimeE1)&&((TempTimeS2>=TempTimeS1)||(TempTimeS2<=TempTimeE1)))|| \((TempTimeS1 >= TempTimeE1)&&((TempTimeE2>=TempTimeS1)||(TempTimeE2<=TempTimeE1))))return 0;if( \((TempTimeS2 <= TempTimeE2)&&((TempTimeS1>=TempTimeS2)&&(TempTimeS1<=TempTimeE2)))|| \((TempTimeS2 <= TempTimeE2)&&((TempTimeE1>=TempTimeS2)&&(TempTimeE1<=TempTimeE2))))return 0;if( \((TempTimeS2 >= TempTimeE2)&&((TempTimeS1>=TempTimeS2)||(TempTimeS1<=TempTimeE2)))|| \((TempTimeS2 >= TempTimeE2)&&((TempTimeE1>=TempTimeS2)||(TempTimeE1<=TempTimeE2))))return 0;return 1;
}

传入的形参,是四个时间点,分别是第一段时间的起始时间点,结束时间点以及第二段时间的起始时间点和结束时间点。

  相关解决方案