📄 powersupply.c
字号:
if( temp1 >= temp2 )
{
temp1 = Hex2BcdLong( temp1-temp2 );
}
else
{
temp1 = Hex2BcdLong( temp1 );
}
memcpy( (unsigned char *)&pub_data.pub_data_buff3[EVT_LVI_PA_POWER+i*4], (unsigned char *)&temp1, 4 );
}
// ( 失压) 电流积分
if( lvi == 0 )
{
addr = ADDR_OF_LVI_CURRENT_VI+item*2;
FramRead( addr, (unsigned char *)&page, 2 );
addr = ADDR_OF_LOWV_CURINT_BACKUP+LOWV_CURINT_BACKUP_OFFSET*item;
temp1 = CalcPastTime(addr);
temp1 = Bcd2HexLong( temp1 );
temp2 = temp1*page*10;
memcpy( (unsigned char *)&pub_data.pub_data_buff3[EVT_LVI_CUR_REQ], (unsigned char *)&temp2, 4 );
}
page = _lvi_rec_page[lvi]+item*2+count/5;
if( DataflashMainToBuffer1(page) == OK )
{
addr = (unsigned short)(EVT_LVI_REC_OFFSET*(count%5));
DataflashBuffer1Read( (unsigned short)(addr+EVT_LVI_START_TIME), (unsigned char *)&pub_data.pub_data_buff3[EVT_LVI_START_TIME], 5 );
if( lvi == 1 )
{
DataflashBuffer1Read( (unsigned short)(addr+EVT_LVI_CUR_REQ), (unsigned char *)&pub_data.pub_data_buff3[EVT_LVI_CUR_REQ], 3 );
}
DataflashBuffer1Write( (unsigned short)(addr+EVT_LVI_START_TIME), (unsigned char *)&pub_data.pub_data_buff3[EVT_LVI_START_TIME], EVT_LVI_REC_OFFSET );
DataflashBuffer1ToMain(page);
}
}
void SaveVoltageInfo(unsigned char item,unsigned char flag)
{
unsigned short addr,t_addr;
unsigned char tvsw = VStateWord;
// 如果当前电压超下限
if( flag & ( PS_LVDO_PHA << item ) )
{
// 如果先前电压没有超下限
if( !( tvsw & ( PS_LVDO_PHA << item ) ) )
{
// 保存电压超下限的时间( 当前时刻)
addr = TMPT_BASE+TMPT_LVDO_PHA+TMPT_OFFSET*item;
SaveTmpTime( addr );
}
// 如果先前电压超上限,则计算电压超上限总时间
if( tvsw & ( PS_OVUP_PHA << item ) )
{
t_addr = TMPT_OVUP_PHA+TMPT_OFFSET*item;
addr = ADDR_OF_VOLTAGE_INFO;
SavePastTime( addr, t_addr, 3 );
addr = ADDR_OF_VOLTAGE_INFO+3+item*3;
SavePastTime( addr, t_addr, 3 );
}
else
{
// 如果先前电压合格,则计算合格电压总时间
if( !( tvsw & ( PS_LVDO_PHA << item ) ) )
{
t_addr = TMPT_VOK_PHA+TMPT_OFFSET*item;
addr = ADDR_OF_VOLTAGE_INFO+VOLTAGE_VOK_POSITION+item*3;
SavePastTime( addr, t_addr, 3 );
}
}
}
// 如果当前电压超上限
else if( flag & ( PS_OVUP_PHA << item ) )
{
// 如果先前电压没有超上限
if( !( tvsw & ( PS_OVUP_PHA << item ) ) )
{
// 保存电压超上限的时间( 当前时刻)
addr = TMPT_BASE+TMPT_OVUP_PHA+TMPT_OFFSET*item;
SaveTmpTime( addr );
}
// 如果先前电压超下限,则计算电压超下限总时间
if( tvsw & ( PS_LVDO_PHA << item ) )
{
t_addr = TMPT_LVDO_PHA+TMPT_OFFSET*item;
addr = ADDR_OF_VOLTAGE_INFO+VOLTAGE_LVDO_POSITION;
SavePastTime( addr, t_addr, 3 );
addr = ADDR_OF_VOLTAGE_INFO+VOLTAGE_LVDO_POSITION+3+item*3;
SavePastTime( addr, t_addr, 3 );
}
else
{
// 如果先前电压合格,则计算合格电压总时间
if( !( tvsw & ( PS_OVUP_PHA << item ) ) )
{
t_addr = TMPT_VOK_PHA+TMPT_OFFSET*item;
addr = ADDR_OF_VOLTAGE_INFO+VOLTAGE_VOK_POSITION+item*3;
SavePastTime( addr, t_addr, 3 );
}
}
}
// 如果当前电压和格
else
{
// 如果先前电压超上限
if( tvsw & ( PS_OVUP_PHA << item ) )
{
// 保存电压合格时的时刻
addr = TMPT_BASE+TMPT_VOK_PHA+TMPT_OFFSET*item;
SaveTmpTime( addr );
// 计算电压超上限时的总时间
t_addr = TMPT_OVUP_PHA+TMPT_OFFSET*item;
addr = ADDR_OF_VOLTAGE_INFO;
SavePastTime( addr, t_addr, 3 );
addr = ADDR_OF_VOLTAGE_INFO+3+item*3;
SavePastTime( addr, t_addr, 3 );
}
// 如果先前电压超下限
else if( tvsw & ( PS_LVA_PHA << item ) )
{
// 保存电压合格时的时刻
addr = TMPT_BASE+TMPT_VOK_PHA+TMPT_OFFSET*item;
SaveTmpTime( addr );
// 计算电压超下限时的总时间
t_addr = TMPT_LVDO_PHA+TMPT_OFFSET*item;
addr = ADDR_OF_VOLTAGE_INFO+VOLTAGE_LVDO_POSITION;
SavePastTime( addr, t_addr, 3 );
addr = ADDR_OF_VOLTAGE_INFO+VOLTAGE_LVDO_POSITION+3+item*3;
SavePastTime( addr, t_addr, 3 );
}
}
}
void SaveEvtRecTime(unsigned short addr1, unsigned short addr2, unsigned char item)
{
unsigned long temp1 = 0;
temp1 = CalcPastTime(addr1);
SaveTmpTime(addr1);
if( item )
{
addr2 += ( item*3 );
}
CalcTotalTime( addr2, temp1 );
}
// 计算总时间
void CalcSumLastTime( unsigned short addr, unsigned char item, unsigned char flag )
{
unsigned long tempT;
unsigned short tempA;
tempA = ADDR_OF_SUM_LONG_BACKUP + SUM_LONG_BACKUP_OFFSET * item;
tempT = CalcPastTime( tempA );
CalcTotalTime( addr, tempT );
if( ( item == 1 ) && ( flag == 1 ) )
{
addr = ADDR_OF_LOST_LONG;
CalcTotalTime( addr, tempT );
}
if( flag )
{
SaveTmpTime( tempA );
}
}
void SaveEvtOnBalance(void)
{
unsigned long tempLong = 0;
unsigned short addr1,addr2,addr3;
unsigned char i,temp=1;
// 断相时过结算
if( MeterRunningState & 0x07 )
{
addr2 = ADDR_OF_LOST_REC+LOST_REC_LONG;
CalcSumLastTime( addr2, 1, 1 );
for( i = 0; i < 3; i++ )
{
if( MeterRunningState & ( BIT0 << i ) )
{
addr1 = ADDR_OF_LOST_BACKUP+LOST_BACKUP_OFFSET*i;
tempLong = CalcPastTime( addr1 );
addr3 = ADDR_OF_LOST_LONG+3+i*3;
CalcTotalTime( addr3, tempLong );
addr3 = ADDR_OF_LOST_LONG+12+i*6;
WriteTimeToFram( addr3, 6 );
SaveEvtRecTime( addr1, addr2, i+1 );
FramWrite( ADDR_OF_EVT_FLAG_ON_BALANCE+FLAG_LOST_OFFSET+i, &temp, 1 );
}
}
}
// 过压时过结算
if( OverVIStateWord & 0x07 )
{
addr2 = ADDR_OF_VOLTAGE_OVER+VOLTAGE_OVER_LONG;
CalcSumLastTime( addr2, 0, 1 );
for( i = 0; i < 3; i++ )
{
if( OverVIStateWord & ( BIT0 << i ) )
{
addr1 = ADDR_OF_VOLTAGE_OVER_BACKUP+VOLTAGE_OVER_BACKUP_OFFSET*i;
SaveEvtRecTime( addr1, addr2, i+1 );
FramWrite( ADDR_OF_EVT_FLAG_ON_BALANCE+FLAG_OV_OFFSET+i, &temp, 1 );
}
}
}
// 过流时过结算
if( OverVIStateWord & 0x70 )
{
addr2 = ADDR_OF_CURRENT_OVER+CURRENT_OVER_LONG;
CalcSumLastTime( addr2, 2, 1 );
for( i = 0; i < 3; i++ )
{
if( OverVIStateWord & ( BIT4 << i ) )
{
addr1 = ADDR_OF_CURRENT_OVER_BACKUP+CURRENT_OVER_BACKUP_OFFSET*i;
SaveEvtRecTime( addr1, addr2, i+1 );
FramWrite( ADDR_OF_EVT_FLAG_ON_BALANCE+FLAG_OI_OFFSET+i, &temp, 1 );
}
}
}
// 各相失压时过结算
if( LowVIStateWord & 0x07 )
{
addr2 = ADDR_OF_LOWV_REC+LVI_REC_LONG;
CalcSumLastTime( addr2, 3, 1 );
for( i = 0; i < 3; i++ )
{
if( LowVIStateWord & ( BIT0 << i ) )
{
addr1 = ADDR_OF_LOWV_BACKUP+LVI_BACKUP_OFFSET*i+LVI_BACKUP_TIME;
tempLong = CalcPastTime( addr1 );
addr3 = ADDR_OF_LOWV_TOTAL_LONG+i*3;
CalcTotalTime( addr3, tempLong );
SaveEvtRecTime( addr1, addr2, i+1 );
FramWrite( ADDR_OF_EVT_FLAG_ON_BALANCE+FLAG_LOWV_OFFSET+i, &temp, 1 );
}
}
}
// 失流时过结算
if( LowVIStateWord & 0x70 )
{
addr2 = ADDR_OF_LOWI_REC+LVI_REC_LONG;
CalcSumLastTime( addr2, 4, 1 );
for( i = 0; i < 3; i++ )
{
if( LowVIStateWord & ( BIT4 << i ) )
{
addr1 = ADDR_OF_LOWI_BACKUP+LVI_BACKUP_OFFSET*i+LVI_BACKUP_TIME;
tempLong = CalcPastTime( addr1 );
addr3 = ADDR_OF_LOWI_TOTAL_LONG+i*3;
CalcTotalTime( addr3, tempLong );
SaveEvtRecTime( addr1, addr2, i+1 );
FramWrite( ADDR_OF_EVT_FLAG_ON_BALANCE+FLAG_LOWI_OFFSET+i, &temp, 1 );
}
}
}
// 电流不平衡过结算
if( AlarmCtlWord2 & ALARM_OF_CURIMBA )
{
addr1 = ADDR_OF_CURRENT_IMBA_TIME_BACKUP;
addr2 = ADDR_OF_CURRENT_IMBA_REC + CURRENT_IMBA_REC_LONG_POS;
SaveEvtRecTime( addr1, addr2, 0 );
FramWrite( ADDR_OF_EVT_FLAG_ON_BALANCE+FLAG_CUR_IMBA, &temp, 1 );
}
// 电压逆相序过结算
if( AlarmCtlWord2 & ALARM_OF_VSEQERR )
{
addr1 = ADDR_OF_VOL_SEQERR_TIME_BACKUP;
addr2 = ADDR_OF_VOL_SEQERR_REC + VOL_SEQERR_REC_LONG_POS;
SaveEvtRecTime( addr1, addr2, 0 );
FramWrite( ADDR_OF_EVT_FLAG_ON_BALANCE+FLAG_VOL_SEQERR, &temp, 1 );
}
#if 0
// 电流逆相序过结算
if( AlarmCtlWord1 & ALARM_OF_ISEQERR )
{
addr1 = ADDR_OF_CUR_SEQERR_TIME_BACKUP;
addr2 = ADDR_OF_CUR_SEQERR_REC + CUR_SEQERR_REC_LONG_POS;
SaveEvtRecTime( addr1, addr2, 0 );
FramWrite( ADDR_OF_EVT_FLAG_ON_BALANCE+FLAG_CUR_SEQERR, &temp, 1 );
}
#endif
// 功率反向过结算
if( PhaseActive & BIT4 )
{
addr1 = ADDR_OF_WATT_REVERSE_TIME_BACKUP;
addr2 = ADDR_OF_WATT_REVERSE_REC + WATT_REVERSE_REC_LONG_POS;
SaveEvtRecTime( addr1, addr2, 0 );
FramWrite( ADDR_OF_EVT_FLAG_ON_BALANCE + FLAG_WATT_INVERSE, &temp, 1 );
}
// 超功率时过结算
if( AlarmCtlWord2 & ALARM_OF_OV_LOAD )
{
addr1 = ADDR_OF_WATT_OVER_TIME_BACKUP;
addr2 = ADDR_OF_WATT_OVER_REC + WATT_OVER_REC_LONG_POS;
SaveEvtRecTime( addr1, addr2, 0 );
FramWrite( ADDR_OF_EVT_FLAG_ON_BALANCE+FLAG_WATT_OVER, &temp, 1 );
}
// 超需量时过结算
if( AlarmCtlWord2 & ALARM_OF_OV_REQ )
{
addr1 = ADDR_OF_REQ_OVER_TIME_BACKUP;
addr2 = ADDR_OF_REQ_OVER_REC + REQ_OVER_REC_LONG_POS;
SaveEvtRecTime( addr1, addr2, 0 );
FramWrite( ADDR_OF_EVT_FLAG_ON_BALANCE+FLAG_REQ_OVER, &temp, 1 );
}
}
void PowerSupplierDetect(void)
{
unsigned char flag = PowerStateFlag,ii;
if( !IsPowerOn() )
{
if( !( flag & PS_BREAKPOWER_FLAG ) )
{
McuIoInit();
TM50Stop();
FramWrite(ADDR_OF_TODAY_PWR_START, (unsigned char*)(&_energy.csum), sizeof(_energy));
FramWrite(ADDR_OF_RAM,(unsigned char *)&PwrData.chksum,sizeof(_sys_wat_data));
FramWrite(ADDR_OF_LINEPWR_START,(unsigned char *)(&TempLinePower[0]),36);
FramWrite(ADDR_OF_PHASEINSTPWR_START,(unsigned char *)&CurrentPhaseInstPower[0],52);
FramWrite(ADDR_OF_PHASEPWR_START,(unsigned char *)&CurrentPhasePower[0],52);
SaveEvtPowerDownUp(1);
SaveTmpTime(TMPT_BASE+TMPT_POWER_DOWN);
MemSetZero((unsigned char *)&CurrentVI[0],12);
FramRead( DISP_CONTENT2, (unsigned char *)&_SysPotInfo.dispcontent[0], DISPLAY_ITEM_BYTE );
if( IsEqualSpecialData((unsigned char *)&_SysPotInfo.dispcontent[0], 0, DISPLAY_ITEM_BYTE ) == OK )
{
_SysPotInfo.dispcontent[0] = 0x03;
}
for( ii = 0; ii < 4; ii++ )
{
LoadEnergy( (unsigned char *)&_SysDisplayRam.ActivePosPwr[ii], 0xFF, _disp_power_item[ii] );
}
LoadEnergy( (unsigned char *)&_SysDisplayRam.ReActivePhase1Pwr, 0xFF, 30 );
LoadEnergy( (unsigned char *)&_SysDisplayRam.ReActivePhase4Pwr, 0xFF, 35 );
LoadMaxDemandInfo( (unsigned char *)&_SysDisplayRam.ActivePosSumReq, 0x01, 55 );
_SysDisplayRam.Csum = SysDoCheckSum( (unsigned char *)&_SysDisplayRam.ActivePosPwr[0], sizeof(_disp_ram)-4 );
DisplayReinit();
LowVIStateWord&=0x77;
PowerNetStateWord&=0x77;
AlarmCtlWord1|=ALARM_OF_POWERUP;
flag|=PS_BREAKPOWER_FLAG;
}
LCDMEM[LCD_CN_INFO_ADDR_PWRCUT]|=LCD_CN_INFO_PWRCUT;
LCDMEM[LCD_CN_INFO_ADDR_LOSTPHASE]&=~LCD_CN_INFO_LOSTPHASE;
}
else
{
if( flag & PS_BREAKPOWER_FLAG )
{
for(ii=0; ii<10; ii++) Delay(0x1FFF);
ResetRelayerState();
McuIoInit();
TM50Init();
TickEventStart();
IR_OFF();
_sys_evt_add(EVT_INIT_ATT702X);
SaveEvtPowerDownUp(0);
SaveTmpTime( TMPT_BASE+TMPT_POWER_UP );
SavePastTime( ADDR_OF_BATTERY_RUNTIME, TMPT_POWER_DOWN, 3 );
FramRead( DISP_CONTENT1, (unsigned char *)&_SysPotInfo.dispcontent[0], DISPLAY_ITEM_BYTE );
if( IsEqualSpecialData( (unsigned char *)&_SysPotInfo.dispcontent[0], 0, DISPLAY_ITEM_BYTE ) == OK )
{
_SysPotInfo.dispcontent[0] = 0x03;
}
DisplayReinit();
PowerNetStateWord = 0;
AlarmCtlWord1&=~ALARM_OF_POWERUP;
flag&=~(PS_BREAKPOWER_FLAG);
_sys_evt_add(EVT_TIMER_MIN);
}
LCDMEM[LCD_CN_INFO_ADDR_PWRCUT]&=~LCD_CN_INFO_PWRCUT;
}
if( flag != PowerStateFlag )
{
FramWrite( ADDR_OF_BREAK_POWER_FLAG, (unsigned char *)&flag, 1 );
PowerStateFlag = flag;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -