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

📄 powermeasure.c

📁 NEC527多功能电表完整源代码,包括LCD驱动,显示,计量,存储,整个527驱动程序!
💻 C
📖 第 1 页 / 共 4 页
字号:
        sum = SysDoCheckSum( (unsigned char*)&pTodayPower[1], sizeof(_energy_s)-4 );
        DataflashBuffer1Write( 0, (unsigned char *)&sum, 4 );
        DataflashBuffer1ToMain( (ushort)addr );
    }
}

void LoadEnergy(unsigned char *data,unsigned char flag,unsigned char item)
{
    unsigned long addr,temp,temp1;
    unsigned long *pTodayPower = (unsigned long*)(&_energy);
    
    addr = GetPrevMonAddr( flag );
    if( ( flag == 0 ) || ( flag == 0xFF ) )
    {
        temp = pTodayPower[item+1];
    }
    else
    {
        temp=0;
    }
	
    DataflashReadByBuffer1( addr+item*4, (unsigned char *)&temp1, 4 );
    temp1 = __bcd_add_long( temp1, temp );
    memcpy( data, (unsigned char *)&temp1, 4 );
}

void LoadMaxDemandInfo(unsigned char *data,unsigned char flag,unsigned char item)
{
    unsigned long addr;
    unsigned char temp = item % 50;

    item /= 50;
    item--;

    if( ( 0 == flag ) || ( 0xFF == flag ) )
    {
        addr = ADDR_OF_CUR_MD_START + MON_MD_REC_OFFSET * temp;
        FramRead( (ushort)(addr+(unsigned short)item*4), data, 4 );
    }
    else
    {
        addr = GetPrevMonAddr(flag)+MON_MD_REC-4;
        addr = addr+(ushort)temp*MON_MD_REC_OFFSET;
        DataflashReadByBuffer1( addr+(unsigned short)item*4, data, 4 );
    }
}

void LoadPhasePowerData(unsigned char *data, unsigned char mon, unsigned char item)
{
    unsigned long addr,temp,temp1;
    unsigned long *pPhasePower = (unsigned long*)(&CurrentPhasePower);
    
    addr = GetPrevMonAddr( mon );
    if( ( mon == 0 ) || ( mon == 0xFF ) )
    {
        temp = pPhasePower[item+1];
    }
    else
    {
        temp=0;
    }
	
    DataflashReadByBuffer1( addr+MON_ENERGY_PHASE-4+(ushort)item*4, (unsigned char *)&temp1, 4 );
    temp1 = __bcd_add_long( temp1, temp );
    memcpy( data, (unsigned char *)&temp1, 4 );
}

void PowerDataStoreRuleDay(void)
{
    StoreTodayEnergy(BASE_CURS);
    StoreTodayEnergy(BASE_CUR);
}

void PowerDataShift(unsigned char year,unsigned char month)
{
    unsigned long addr;
    unsigned char ii;

    // 转存电量    
    year %= 10;
    for( ii = 0; ii < 2; ii++ )
    {
        if( DataflashMainToBuffer1( ( BASE_CUR/DF_PAGE_LEN )+ii ) == OK )
        {
            DataflashBuffer1ToMain( ( YEAR_BASE/DF_PAGE_LEN )+( ( year*12 )+month )*2+ii );
        }
    }	
}

void MonthDataShift(unsigned char year,unsigned char month)
{
    unsigned long addr;
    unsigned short temp = 0;	

    // 转存每月最大( 小) 值及及平均值
    addr = YEAR_BASE + (unsigned long)( ( (year*12) + month ) * 2 ) * DF_PAGE_LEN;
    FramRead( ADDR_OF_MON_DATA_START, (unsigned char *)&pub_data.pub_data_buff3[0], MON_DATA_SIZE );
    DataflashWriteByBuffer1( addr+MON_PH_DATA_INFO, (unsigned char *)&pub_data.pub_data_buff3[0], MON_DATA_SIZE );

    // 清零月平均值保存
    FramWrite( ADDR_OF_MON_AVERAGE_PTR, (unsigned char *)&temp, 2 );
    MemSetoWriteE2prom( ADDR_OF_MON_AVERAGE_INFO, MON_AVERAGE_INFO_SIZE );
}

void ClearTodayData(void)
{
    // 清日电量    
    MemSetZero( (unsigned char *)&_energy.csum, sizeof(_energy_s) );
    FramWrite( ADDR_OF_TODAY_PWR_START, (unsigned char*)(&_energy.csum), sizeof(_energy_s) );
    MemSetZero( (unsigned char *)&CurrentPhasePower[0], sizeof( CurrentPhasePower ) );
    FramWrite( ADDR_OF_PHASEPWR_START, (unsigned char *)&CurrentPhasePower[0], sizeof( CurrentPhasePower ) );
    // 清日数据
    MemSetZero( (unsigned char *)&pub_data.pub_data_buff3[0], 151 );
    FramWrite( ADDR_OF_DAY_DATA_START+4, (unsigned char *)&pub_data.pub_data_buff3[0], 151 );
    FramWrite( ADDR_OF_DAY_DATA_START+155, (unsigned char *)&pub_data.pub_data_buff3[0], 151 );
}

void ClearCurrentMonthData(unsigned long addr)
{
    DataflashClearPages(addr,0,DF_PAGE_LEN,4);

    ClearCurrMd();
}

void ClearPowerDataInRam(void)
{
    MemSetZero( (unsigned char *)&_energy.csum, sizeof(_energy_s) );
    FramWrite( ADDR_OF_TODAY_PWR_START, (unsigned char*)(&_energy.csum), sizeof(_energy_s) ); 
	
    MemSetZero( (unsigned char *)&PwrData.chksum, sizeof(_sys_wat_data) );    
    FramWrite( ADDR_OF_RAM, (unsigned char *)&PwrData.chksum, sizeof(_sys_wat_data) );
    
    MemSetZero( (unsigned char *)&TempLinePower[0], 36 );
    FramWrite( ADDR_OF_LINEPWR_START, (unsigned char*)&(TempLinePower[0]), 36 );
    MemSetZero( (unsigned char *)&CurrentPhaseInstPower[0], 52 );
    FramWrite( ADDR_OF_PHASEPWR_START, (unsigned char *)&CurrentPhaseInstPower[0], 52 );
	
    MemSetZero( (unsigned char *)&CurrentPhasePower[0], 52 );
    FramWrite( ADDR_OF_PHASEINSTPWR_START, (unsigned char *)&CurrentPhasePower[0], 52 );
}

void CalcEnergyData(void)
{
    unsigned short instp;	
    unsigned char temp=0,i,pa,flg=0,j;	
    unsigned long *pTodayPower = (unsigned long*)(&_energy);

    if( PwrData.chksum != (SysDoCheckSum((unsigned char *)&PwrData.WattHourLeft[0],sizeof(_sys_wat_data)-4 ) ) )
    {
        MemSetZero( ( unsigned char * )&PwrData.chksum, sizeof(_sys_wat_data) );
        FramWrite( ADDR_OF_RAM, (unsigned char *)&PwrData.chksum, sizeof(_sys_wat_data) );
    }		

    if( CurrentPhaseInstPower[0] != ( SysDoCheckSum( (unsigned char *)&CurrentPhaseInstPower[1], 48 ) ) )
    {
        MemSetZero( (unsigned char *)&CurrentPhaseInstPower[0], 52 );
        FramWrite( ADDR_OF_PHASEINSTPWR_START,(unsigned char *)&CurrentPhaseInstPower[0], 52 );
    }
	
    MemSetZero( (unsigned char *)&pub_data.pub_data_buff1[0], 64 );
    _disable_interrupt();
    RemotePulseCount[0] += DeltaWattActiveZ[3];
    RemotePulseCount[1] += DeltaWattActiveF[3];
    RemotePulseCount[2] += DeltaWattReactiveZ[3];
    RemotePulseCount[3] += DeltaWattReactiveF[3];
    for( i = 0; i < 4; i++ )
    {
        if( DeltaWattActiveZ[i] <= PER_50WH )
        {           
            pub_data.pub_data_buff1[i] = DeltaWattActiveZ[i];
        }
        DeltaWattActiveZ[i]=0;

        if( DeltaWattActiveF[i] <= PER_50WH )
        {
            pub_data.pub_data_buff1[4+i] = DeltaWattActiveF[i];
        }
        DeltaWattActiveF[i] = 0;

        if( DeltaWattReactiveZ[i] <= PER_50WH )
        {
            pub_data.pub_data_buff1[8+i] = DeltaWattReactiveZ[i];
        }
        DeltaWattReactiveZ[i] = 0;

        if( DeltaWattReactiveF[i] <= PER_50WH )
        {
            pub_data.pub_data_buff1[12+i] = DeltaWattReactiveF[i];
        }
        DeltaWattReactiveF[i] = 0;

        if(DeltaWattLActive[i]<=PER_50WH)
        {
            pub_data.pub_data_buff1[16+i] = DeltaWattLActive[i]*100;
        }
        DeltaWattLActive[i] = 0;
        
        if(DeltaWattLReactive[i]<=PER_50WH)
        {
            pub_data.pub_data_buff1[20+i] = DeltaWattLReactive[i]*100;
        }
        DeltaWattLReactive[i] = 0;
        
        if( pub_data.pub_data_buff1[i] > pub_data.pub_data_buff1[4+i] )
        {
            PhaseActive &=~ (unsigned char)( ( 0x01 << i ) );
        }
        else if( pub_data.pub_data_buff1[i] < pub_data.pub_data_buff1[4+i] )
        {    
            PhaseActive |= (unsigned char)( ( 0x01 << i ) );
        }            

        if( pub_data.pub_data_buff1[8+i] > pub_data.pub_data_buff1[12+i] )
        {
            PhaseReactive &=~ (unsigned char)( ( 0x01 << i ) );
        }
        else if( pub_data.pub_data_buff1[8+i] < pub_data.pub_data_buff1[12+i] )
        {
            PhaseReactive |= (unsigned char)( ( 0x01 << i ) );
        }		
    }
    _enable_interrupt();
    
    if( pub_data.pub_data_buff1[3] > pub_data.pub_data_buff1[7] )
    {
        PhaseActive &=~ BIT4;
    }
    else if( pub_data.pub_data_buff1[3] < pub_data.pub_data_buff1[7] )
    {
        PhaseActive |= BIT4;
    }
	
    if( pub_data.pub_data_buff1[11] > pub_data.pub_data_buff1[15] )
    {
        PhaseReactive &=~ BIT4;
    }
    else if( pub_data.pub_data_buff1[11] < pub_data.pub_data_buff1[15] )
    {
        PhaseReactive |= BIT4;
    }	

    //  谐波电能		
    PwrData.LinePower[0] += pub_data.pub_data_buff1[19];
    PwrData.LinePower[1] += pub_data.pub_data_buff1[16];
    PwrData.LinePower[2] += pub_data.pub_data_buff1[17];
    PwrData.LinePower[3] += pub_data.pub_data_buff1[18];
    PwrData.LinePower[4] += pub_data.pub_data_buff1[23];
    PwrData.LinePower[5] += pub_data.pub_data_buff1[20];
    PwrData.LinePower[6] += pub_data.pub_data_buff1[21];
    PwrData.LinePower[7] += pub_data.pub_data_buff1[22];

    // A 相正向有功电量
    CurrentPhaseInstPower[1] += pub_data.pub_data_buff1[0];
    // A 相反向有功电量
    CurrentPhaseInstPower[2] += pub_data.pub_data_buff1[4];
    // A 相正向无功电量	
    CurrentPhaseInstPower[3] += pub_data.pub_data_buff1[8];
    // A 相反向无功电量	    
    CurrentPhaseInstPower[4] += pub_data.pub_data_buff1[12];

    // B 相正向有功电量
    CurrentPhaseInstPower[5] += pub_data.pub_data_buff1[1];
    // B 相反向有功电量
    CurrentPhaseInstPower[6] += pub_data.pub_data_buff1[5];
    // B 相正向无功电量	
    CurrentPhaseInstPower[7] += pub_data.pub_data_buff1[9];
    // B 相反向无功电量	    
    CurrentPhaseInstPower[8] += pub_data.pub_data_buff1[13];

    // C 相正向有功电量
    CurrentPhaseInstPower[9] += pub_data.pub_data_buff1[2];
    // C 相反向有功电量
    CurrentPhaseInstPower[10] += pub_data.pub_data_buff1[6];
    // C 相正向无功电量	
    CurrentPhaseInstPower[11] += pub_data.pub_data_buff1[10];
    // C 相反向无功电量	    
    CurrentPhaseInstPower[12] += pub_data.pub_data_buff1[14];

    LCDMEM[15]=(LCD_SY_INFO_N1|LCD_SY_INFO_N2|LCD_SY_INFO_N3|LCD_SY_INFO_N4);
    LCDMEM[16]|=LCD_EN_INFO_VAR|LCD_EN_INFO_WATT;

    if( pub_data.pub_data_buff1[3] > pub_data.pub_data_buff1[7] )
    {
        if( pub_data.pub_data_buff1[11] > pub_data.pub_data_buff1[15] )
        {
            //第一象限        
            LCDMEM[15] |= LCD_SY_INFO_M2;
            DisplayQuadrantFlag = LCD_SY_INFO_M2;
            flg = 1;        
        }
        else if( pub_data.pub_data_buff1[11] < pub_data.pub_data_buff1[15] )
        {
            //第四象限        
            LCDMEM[15] |= LCD_SY_INFO_M3;
            flg = 1;
            DisplayQuadrantFlag = LCD_SY_INFO_M3;        
        }
    }
    else if( pub_data.pub_data_buff1[3] < pub_data.pub_data_buff1[7] )
    {
        if( pub_data.pub_data_buff1[11] > pub_data.pub_data_buff1[15] )
        {
            //第二象限                
            LCDMEM[15] |= LCD_SY_INFO_M1;
            flg = 1;
            DisplayQuadrantFlag = LCD_SY_INFO_M1;        
        }
        else if( pub_data.pub_data_buff1[11] < pub_data.pub_data_buff1[15] )
        {
            //第三象限        
            LCDMEM[15] |= LCD_SY_INFO_M4;
            flg = 1;
            DisplayQuadrantFlag = LCD_SY_INFO_M4;        
        }    
    }

    if( flg == 0 )
    {
        LCDMEM[15] |= DisplayQuadrantFlag;
    }    

    //有功功率方向为正	
    if( pub_data.pub_data_buff1[3] >= pub_data.pub_data_buff1[7] )
    {
        //无功功率方向为正    
        if( pub_data.pub_data_buff1[11] >= pub_data.pub_data_buff1[15] )
        {
            //第一象限        
            PwrData.WattHourLeft[6] += ( pub_data.pub_data_buff1[11] + pub_data.pub_data_buff1[15] );
            PwrData.req_pwr[6] += ( pub_data.pub_data_buff1[11] + pub_data.pub_data_buff1[15] );
            pub_data.pub_data_buff1[24] = pub_data.pub_data_buff1[11] + pub_data.pub_data_buff1[15];
            pub_data.pub_data_buff1[28] = pub_data.pub_data_buff1[3] + pub_data.pub_data_buff1[7];
        }
        else 
        {
            //第四象限        
            PwrData.WattHourLeft[7] += ( pub_data.pub_data_buff1[11] + pub_data.pub_data_buff1[15] );
            PwrData.req_pwr[7] += ( pub_data.pub_data_buff1[11] + pub_data.pub_data_buff1[15] );
            pub_data.pub_data_buff1[26] = pub_data.pub_data_buff1[11] + pub_data.pub_data_buff1[15];
            pub_data.pub_data_buff1[30] = pub_data.pub_data_buff1[3] + pub_data.pub_data_buff1[7];
        }
    }
    else
    {
        if( pub_data.pub_data_buff1[11] >= pub_data.pub_data_buff1[15] )
        {
            //第二象限            
            PwrData.WattHourLeft[8] += ( pub_data.pub_data_buff1[11] + pub_data.pub_data_buff1[15] );
            PwrData.req_pwr[8] += ( pub_data.pub_data_buff1[11] + pub_data.pub_data_buff1[15] );
            pub_data.pub_data_buff1[25] = pub_data.pub_data_buff1[11] + pub_data.pub_data_buff1[15];
            pub_data.pub_data_buff1[29] = pub_data.pub_data_buff1[3] + pub_data.pub_data_buff1[7];
        }
        else
        {
            //第三象限        
            PwrData.WattHourLeft[9] += ( pub_data.pub_data_buff1[11] + pub_data.pub_data_buff1[15] );
            PwrData.req_pwr[9] += ( pub_data.pub_data_buff1[11] + pub_data.pub_data_buff1[15] );
            pub_data.pub_data_buff1[27] = pub_data.pub_data_buff1[11] + pub_data.pub_data_buff1[15];
            pub_data.pub_data_buff1[31] = pub_data.pub_data_buff1[3] + pub_data.pub_data_buff1[7];
        }
    }
    
    for( temp = 0; temp < 6; temp++ )
    {
        flg = 0x02; pa = 0x01; instp = 0x8000;
        for( i = 0; i < 4; i++ )
        {
            if( _SysPotInfo.measure_type[temp] & flg )
            {
                if( _SysPotInfo.measure_type[temp] & pa )
                {
                    if( temp < 3 )
                    {
                        instp += pub_data.pub_data_buff1[28+i];
                    }
                    else
                    {

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -