void RestoreModePowerOn(void) { ST_BALANCEDAY_POWERON_BUFFER_PARAM stBanlancePower[CON_HISTORY_POWER_COUNT_MAX+1]; UN_BALANCEDAY_TYPE_PARAM ucBanlanceDayBuffer[CON_BALANCE_DAY_NUM_MAX+1]; // uchar ucBanlanceEnable[CON_BALANCE_DAY_NUM_MAX]; uchar ucBalanceDayNum,ucBalanceDayNumEveryMonth; uchar ucTemp,ucDay,ucHour,ucTempMove,ucTempAdd; uchar ucCanWhile; uchar ucBalanceDayPoint,ucBalanceDayCount; u16 uiTempData; ulong ulStart,ulEnd,ulTem; uchar ucTimeBuffer[3]; uchar ucRestorLastSave[8]; ucBalanceDayNum = PROGFUNCTION_COEF_BALANCE_DAY_NUM; if(ucBalanceDayNum>CON_BALANCE_DAY_NUM_MAX) ucBalanceDayNum=3; memset(&(ucBanlanceDayBuffer[0].ucStart), 0x00, 31*2); ucBalanceDayNumEveryMonth=0; if(0==ReadDataDirect(EPL_RESTOREPOWER_LASTTIME, sizeof(ucRestorLastSave), &Wr_data[0])) { memcpy(&ucRestorLastSave[0], &ucTimeLastSave[0], sizeof(ucRestorLastSave)); } else { ucRestorLastSave[0]=0x30; // second ucRestorLastSave[1]=Wr_data[0]; // minute ucRestorLastSave[2]=Wr_data[1]; // hour ucRestorLastSave[3]=0; // week ucRestorLastSave[4]=Wr_data[2]; // day ucRestorLastSave[5]=Wr_data[3]; // month ucRestorLastSave[6]=Wr_data[4]; // year } // AA 下面内容重新排序抄表日以及统计总的抄表日数目 AA if(0!=ucBalanceDayNum) { // AA 结算日数据按照时间从大到小排序 AA // AA 如果是同一日的数据,则按照小时排序 AA // AA 如果有相同的结算日数据,则只取其中的一个 AA // AA 如果时间日期时间不合法,则不统计这个数据 AA for(ucTemp=0; ucTemp<ucBalanceDayNum; ucTemp++) { ucDay=RAM[RAM_BALANCE_DAY_01+ucTemp*2+1]; ucHour=RAM[RAM_BALANCE_DAY_01+ucTemp*2+0]; if(2==TestDay(ucDay)+TestHour(ucHour)) // AA 数据判断条件,满足条件才处理 AA { if(0 != ucBalanceDayNumEveryMonth) { for(ucTempAdd=0; ucTempAdd<ucBalanceDayNum; ucTempAdd++) { uiTempData=ucDay; uiTempData=(uiTempData<<8)+ucHour; // AA 如果相等---> 则不需要增加----AA if(uiTempData == ucBanlanceDayBuffer[ucTempAdd].uiDataCode) { ucTempAdd=ucBalanceDayNum; } else { // AA 数据小,则增加 AA if(uiTempData > ucBanlanceDayBuffer[ucTempAdd].uiDataCode) { // AA 移动数据 AA for(ucTempMove=(ucBalanceDayNum); ucTempMove>ucTempAdd; ucTempMove--) { ucBanlanceDayBuffer[ucTempMove].uiDataCode = ucBanlanceDayBuffer[ucTempMove-1].uiDataCode; } // AA 添加数据 AA ucBanlanceDayBuffer[ucTempAdd].uiDataCode=uiTempData; ucBalanceDayNumEveryMonth++; ucBanlanceDayBuffer[ucBalanceDayNumEveryMonth].uiDataCode=0x0000; ucTempAdd=ucBalanceDayNum; // break; } // AA 数据大,则跳过 AA else { ;// no do } } } } else { ucBanlanceDayBuffer[0].uInChar.ucDay=ucDay; ucBanlanceDayBuffer[0].uInChar.ucHour=ucHour; ucBalanceDayNumEveryMonth++; } } } } ucCanWhile=GAL_NO; if(ucBalanceDayNumEveryMonth>0) { ucCanWhile=GAL_YES; } // AA 停电时间读取正确 AA // if(0==ReadDataDirect(EPL_SOFT_SECOND, 7, &ucRestorLastSave[0])) // { // ucCanWhile=GAL_NO; // } // AA 停电时间数据格式正确 AA // if(0==TestSecondMinuteHourDayMonthYear(&ucRestorLastSave[0], &ucRestorLastSave[4])) // { // ucCanWhile=GAL_NO; // } // AA 当前时间和停电时间差正确---当前时间应该大于停电时间 AA ulEnd=RSOFT_RTC_YEAR; ulEnd=(ulEnd<<8) + RSOFT_RTC_MONTH; ulEnd=(ulEnd<<8) + RSOFT_RTC_DAY; // ulEnd=(ulEnd<<8) + RSOFT_RTC_HOUR; ulStart=ucRestorLastSave[6]; // year ulStart=(ulStart<<8) + ucRestorLastSave[5];// month ulStart=(ulStart<<8) + ucRestorLastSave[4];// day // ulStart=(ulStart<<8) + ucRestorLastSave[2];// hour if(ulEnd<ulStart) { ucCanWhile=GAL_NO; } else { if(ulEnd==ulStart) { if(RSOFT_RTC_HOUR<=ucRestorLastSave[2]) { ucCanWhile=GAL_NO; } } } ucBalanceDayCount=0; if(GAL_YES == ucCanWhile) { ucBalanceDayPoint=CON_HISTORY_POWER_COUNT_MAX-1; ucTimeBuffer[0]=RSOFT_RTC_DAY; ucTimeBuffer[1]=RSOFT_RTC_MONTH; ucTimeBuffer[2]=RSOFT_RTC_YEAR; // AA 开始追溯最近的结算时间 AA // AA 追溯的长度由 CON_HISTORY_POWER_COUNT_MAX 决定,基本上为12次 AA // AA 追溯的结果数据保存在stBanlancePower 中,这样方便后续处理 AA // AA 追溯过程分成当前日,之前日等处理。 AA // AA 查找今天是否有计算数据 AA for(ucTemp=0; ucTemp<ucBalanceDayNumEveryMonth; ucTemp++) { ucHour=ucBanlanceDayBuffer[ucTemp].uInChar.ucHour; if((ucBanlanceDayBuffer[ucTemp].uInChar.ucDay==ucTimeBuffer[0]) &&(ucHour<=RSOFT_RTC_HOUR)) { // AA 增加一条记录 AA---------->Start if(ucBalanceDayCount<CON_HISTORY_POWER_COUNT_MAX) { stBanlancePower[ucBalanceDayPoint].ucHour=ucHour; stBanlancePower[ucBalanceDayPoint].ucDay=ucTimeBuffer[0]; stBanlancePower[ucBalanceDayPoint].ucMonth=ucTimeBuffer[1]; stBanlancePower[ucBalanceDayPoint].ucYear=ucTimeBuffer[2]; ucBalanceDayCount++; if(ucBalanceDayPoint>0) { ucBalanceDayPoint--; } } if(ucBalanceDayCount>=CON_HISTORY_POWER_COUNT_MAX) { ucTemp=ucBalanceDayNumEveryMonth; ucCanWhile=GAL_NO; } // AA 增加一条记录 AA---------->end } } while(GAL_YES==ucCanWhile) { PerDayFromPoint(&ucTimeBuffer[0]); ulEnd=ucTimeBuffer[2]; ulEnd=(ulEnd<<8) + ucTimeBuffer[1]; ulEnd=(ulEnd<<8) + ucTimeBuffer[0]; if(ulStart<ulEnd) //AA 查找之前的日子是否有计算数据 AA { for(ucTemp=0; ucTemp<ucBalanceDayNumEveryMonth; ucTemp++) { ucHour=ucBanlanceDayBuffer[ucTemp].uInChar.ucHour; if((ucBanlanceDayBuffer[ucTemp].uInChar.ucDay==ucTimeBuffer[0])) { // AA 增加一条记录 AA---------->Start if(ucBalanceDayCount<CON_HISTORY_POWER_COUNT_MAX) { stBanlancePower[ucBalanceDayPoint].ucHour=ucHour; stBanlancePower[ucBalanceDayPoint].ucDay=ucTimeBuffer[0]; stBanlancePower[ucBalanceDayPoint].ucMonth=ucTimeBuffer[1]; stBanlancePower[ucBalanceDayPoint].ucYear=ucTimeBuffer[2]; ucBalanceDayCount++; if(ucBalanceDayPoint>0) { ucBalanceDayPoint--; } } else { ucTemp=ucBalanceDayNumEveryMonth; ucCanWhile=GAL_NO; } // AA 增加一条记录 AA---------->end } } } else { if(ulStart==ulEnd) // AA 超找停电日是否有计算数据 AA { for(ucTemp=0; ucTemp<ucBalanceDayNumEveryMonth; ucTemp++) { ucHour=ucBanlanceDayBuffer[ucTemp].uInChar.ucHour; if((ucBanlanceDayBuffer[ucTemp].uInChar.ucDay==ucTimeBuffer[0]) &&(ucHour > ucRestorLastSave[2])) { // AA 增加一条记录 AA---------->Start if(ucBalanceDayCount<CON_HISTORY_POWER_COUNT_MAX) { stBanlancePower[ucBalanceDayPoint].ucHour=ucHour; stBanlancePower[ucBalanceDayPoint].ucDay=ucTimeBuffer[0]; stBanlancePower[ucBalanceDayPoint].ucMonth=ucTimeBuffer[1]; stBanlancePower[ucBalanceDayPoint].ucYear=ucTimeBuffer[2]; ucBalanceDayCount++; if(ucBalanceDayPoint>0) { ucBalanceDayPoint--; } } else { ucTemp=ucBalanceDayNumEveryMonth; ucCanWhile=GAL_NO; } // AA 增加一条记录 AA---------->end } } } else { ucCanWhile=GAL_NO; } } } } if(ucBalanceDayCount>0) { // AA 发现需要结算数据 AA // AA 开始转存数据AA ucBalanceDayPoint=CON_HISTORY_POWER_COUNT_MAX-1; for(ucTemp=0; ucTemp<ucBalanceDayCount; ucTemp++) { if(ucBalanceDayPoint>=CON_HISTORY_POWER_COUNT_MAX) // AA 防止异常错误 AA { ucBalanceDayPoint=CON_HISTORY_POWER_COUNT_MAX-1; } // AA 结算需量数据 AA memcpy(&Wr_data[1], &stBanlancePower[ucBalanceDayPoint].ucHour, 4); Wr_data[0]=0x00; RestoreDemand(&Wr_data[0]); if(0==ucTemp) { // AA 只有在第一次的时候,才清除当前需量 AA DemandDataClrAllCurrent(); } // AA 结算电量数据 AA memcpy(&Wr_data[1], &stBanlancePower[ucBalanceDayPoint].ucHour, 4); Wr_data[0]=0x00; RestorePower(&Wr_data[0]); // AA 结算用电量数据 AA memcpy(&Wr_data[1], &stBanlancePower[ucBalanceDayPoint].ucHour, 4); Wr_data[0]=0x00; RestorePowerUse(&Wr_data[0]); ucBalanceDayPoint--; } ucBalanceDayPoint=CON_HISTORY_POWER_COUNT_MAX-1; memcpy(&Wr_data[1], &stBanlancePower[ucBalanceDayPoint].ucHour, 4); Wr_data[0]=0x00; WriteDataDirect(&Wr_data[0], EPL_RESTOREDEMAND_LASTTIME, 5); WriteDataDirect(&Wr_data[0], EPL_RESTOREPOWER_LASTTIME, 5); WriteDataDirect(&Wr_data[0], EPL_RESTOREPOWERUSE_LASTTIME, 5); } // 电压监控数据的补结算 if(0==ReadDataDirect(EPL_RESTOREMONITER_LASTTIME, sizeof(ucRestorLastSave), &Wr_data[0])) { memcpy(&ucRestorLastSave[0], &ucTimeLastSave[0], sizeof(ucRestorLastSave)); } else { ucRestorLastSave[0]=0x30; // second ucRestorLastSave[1]=Wr_data[0]; // minute ucRestorLastSave[2]=Wr_data[1]; // hour ucRestorLastSave[3]=0; // week ucRestorLastSave[4]=Wr_data[2]; // day ucRestorLastSave[5]=Wr_data[3]; // month ucRestorLastSave[6]=Wr_data[4]; // year } ulEnd=ValueHexFromBcd(RSOFT_RTC_YEAR); ulEnd=ulEnd*12 + ValueHexFromBcd(RSOFT_RTC_MONTH); ulStart=ValueHexFromBcd(ucRestorLastSave[6]); ulStart=ulStart*12 + ValueHexFromBcd(ucRestorLastSave[5]); if(ulStart<ulEnd) { ulTem=ulEnd-ulStart; if(ulTem>=CON_HISTORY_MONITER_COUNT_MAX) { ulStart=ulEnd-CON_HISTORY_MONITER_COUNT_MAX; } for(ucTemp=0; ucTemp<CON_HISTORY_MONITER_COUNT_MAX; ucTemp++) { ulStart++; if(ulStart>ulEnd) { ucTemp=CON_HISTORY_MONITER_COUNT_MAX; } else { Wr_data[0]=0x00; Wr_data[1]=0x00; Wr_data[2]=0x01; Wr_data[3]=ValueBcdFromHex(ulStart%12); if(0==Wr_data[3]) { Wr_data[3]=0x12; // AA 前面ulStart 已经增加过了,保证是一个大于0 的数字 AA AA Wr_data[4]=ValueBcdFromHex((ulStart-1)/12); } else { Wr_data[4]=ValueBcdFromHex(ulStart/12); } RestoreMoniter(&Wr_data[0]); if(0==ucTemp) { RestoreMoniterClr(); } } } } }
bool FDateTimeTest::RunTest( const FString& Parameters ) { const int32 UnixEpochTimestamp = 0; const int32 UnixBillenniumTimestamp = 1000000000; const int32 UnixOnesTimestamp = 1111111111; const int32 UnixDecimalSequenceTimestamp = 1234567890; const FDateTime UnixEpoch = FDateTime::FromUnixTimestamp(UnixEpochTimestamp); const FDateTime UnixBillennium = FDateTime::FromUnixTimestamp(UnixBillenniumTimestamp); const FDateTime UnixOnes = FDateTime::FromUnixTimestamp(UnixOnesTimestamp); const FDateTime UnixDecimalSequence = FDateTime::FromUnixTimestamp(UnixDecimalSequenceTimestamp); const FDateTime TestDateTime(2013, 8, 14, 12, 34, 56, 789); #define TestUnixEquivalent( Desc, A, B ) if( (A).ToUnixTimestamp() != (B) ) AddError(FString::Printf(TEXT("%s - A=%d B=%d"),Desc,(A).ToUnixTimestamp(),(B))); TestUnixEquivalent( TEXT("Testing Unix Epoch Ticks"), UnixEpoch, UnixEpochTimestamp); TestUnixEquivalent( TEXT("Testing Unix Billennium Ticks"), UnixBillennium, UnixBillenniumTimestamp); TestUnixEquivalent( TEXT("Testing Unix Ones Ticks"), UnixOnes, UnixOnesTimestamp); TestUnixEquivalent( TEXT("Testing Unix Decimal Sequence Ticks"), UnixDecimalSequence, UnixDecimalSequenceTimestamp); #undef TestUnixEquivalent #define TestYear( Desc, A, B ) if( (A.GetYear()) != (B) ) AddError(FString::Printf(TEXT("%s - A=%d B=%d"),Desc,(A.GetYear()),(B))); #define TestMonth( Desc, A, B ) if( (A.GetMonth()) != (B) ) AddError(FString::Printf(TEXT("%s - A=%d B=%d"),Desc,(A.GetMonth()),static_cast<int32>(B))); #define TestDay( Desc, A, B ) if( (A.GetDay()) != (B) ) AddError(FString::Printf(TEXT("%s - A=%d B=%d"),Desc,(A.GetDay()),(B))); #define TestHour( Desc, A, B ) if( (A.GetHour()) != (B) ) AddError(FString::Printf(TEXT("%s - A=%d B=%d"),Desc,(A.GetHour()),(B))); #define TestMinute( Desc, A, B ) if( (A.GetMinute()) != (B) ) AddError(FString::Printf(TEXT("%s - A=%d B=%d"),Desc,(A.GetMinute()),(B))); #define TestSecond( Desc, A, B ) if( (A.GetSecond()) != (B) ) AddError(FString::Printf(TEXT("%s - A=%d B=%d"),Desc,(A.GetSecond()),(B))); #define TestMillisecond( Desc, A, B ) if( (A.GetMillisecond()) != (B) ) AddError(FString::Printf(TEXT("%s - A=%d B=%d"),Desc,(A.GetMillisecond()),(B))); TestYear( TEXT("Testing Unix Epoch Year"), UnixEpoch, 1970 ); TestMonth( TEXT("Testing Unix Epoch Month"), UnixEpoch, EMonthOfYear::January ); TestDay( TEXT("Testing Unix Epoch Day"), UnixEpoch, 1 ); TestHour( TEXT("Testing Unix Epoch Hour"), UnixEpoch, 0 ); TestMinute( TEXT("Testing Unix Epoch Minute"), UnixEpoch, 0 ); TestSecond( TEXT("Testing Unix Epoch Second"), UnixEpoch, 0 ); TestMillisecond( TEXT("Testing Unix Epoch Millisecond"), UnixEpoch, 0 ); TestYear( TEXT("Testing Unix Billennium Year"), UnixBillennium, 2001 ); TestMonth( TEXT("Testing Unix Billennium Month"), UnixBillennium, EMonthOfYear::September ); TestDay( TEXT("Testing Unix Billennium Day"), UnixBillennium, 9 ); TestHour( TEXT("Testing Unix Billennium Hour"), UnixBillennium, 1 ); TestMinute( TEXT("Testing Unix Billennium Minute"), UnixBillennium, 46 ); TestSecond( TEXT("Testing Unix Billennium Second"), UnixBillennium, 40 ); TestMillisecond( TEXT("Testing Unix Billennium Millisecond"), UnixBillennium, 0 ); TestYear( TEXT("Testing Unix Ones Year"), UnixOnes, 2005 ); TestMonth( TEXT("Testing Unix Ones Month"), UnixOnes, EMonthOfYear::March ); TestDay( TEXT("Testing Unix Ones Day"), UnixOnes, 18 ); TestHour( TEXT("Testing Unix Ones Hour"), UnixOnes, 1 ); TestMinute( TEXT("Testing Unix Ones Minute"), UnixOnes, 58 ); TestSecond( TEXT("Testing Unix Ones Second"), UnixOnes, 31 ); TestMillisecond( TEXT("Testing Unix Ones Millisecond"), UnixOnes, 0 ); TestYear( TEXT("Testing Unix Decimal Sequence Year"), UnixDecimalSequence, 2009 ); TestMonth( TEXT("Testing Unix Decimal Sequence Month"), UnixDecimalSequence, EMonthOfYear::February ); TestDay( TEXT("Testing Unix Decimal Sequence Day"), UnixDecimalSequence, 13 ); TestHour( TEXT("Testing Unix Decimal Sequence Hour"), UnixDecimalSequence, 23 ); TestMinute( TEXT("Testing Unix Decimal Sequence Minute"), UnixDecimalSequence, 31 ); TestSecond( TEXT("Testing Unix Decimal Sequence Second"), UnixDecimalSequence, 30 ); TestMillisecond( TEXT("Testing Unix Decimal Sequence Millisecond"), UnixDecimalSequence, 0 ); TestYear( TEXT("Testing Test Date Time Year"), TestDateTime, 2013 ); TestMonth( TEXT("Testing Test Date Time Month"), TestDateTime, 8 ); TestDay( TEXT("Testing Test Date Time Day"), TestDateTime, 14 ); TestHour( TEXT("Testing Test Date Time Hour"), TestDateTime, 12 ); TestMinute( TEXT("Testing Test Date Time Minute"), TestDateTime, 34 ); TestSecond( TEXT("Testing Test Date Time Second"), TestDateTime, 56 ); TestMillisecond( TEXT("Testing Test Date Time Millisecond"), TestDateTime, 789 ); #undef TestYear #undef TestMonth #undef TestDay #undef TestHour #undef TestMinute #undef TestSecond #undef TestMillisecond return true; }