⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 powersupply.c

📁 NEC527多功能电表完整源代码,包括LCD驱动,显示,计量,存储,整个527驱动程序!
💻 C
📖 第 1 页 / 共 4 页
字号:
		 
        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 + -