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

📄 protocol.c

📁 NEC527多功能电表完整源代码,包括LCD驱动,显示,计量,存储,整个527驱动程序!
💻 C
📖 第 1 页 / 共 5 页
字号:
        FrameBuffer[FRM_DATA+3] = SystemTime[SPACE_OF_DAY];
        FrameBuffer[FRM_DATA+4] = SystemTime[SPACE_OF_MONTH];
        FrameBuffer[FRM_DATA+5] = SystemTime[SPACE_OF_YEAR];
        FrameBuffer[FRM_DATA+6] = SystemTime[SPACE_OF_SECOND];
        FrameBuffer[FRM_DATA+7] = SystemTime[SPACE_OF_MINUTE];
        FrameBuffer[FRM_DATA+8] = SystemTime[SPACE_OF_HOUR];
        FrameBuffer[FRM_DATA+9] = 0xAA;
        FrameBuffer[FRM_DATALEN] = 8;
        return(RET_SEND_RIGHT_RESPONSION);
    }
	
    FrameBuffer[FRM_DATA] = RET_ERR_ID;	
    return RET_SEND_ERROR_RESPONSION;
}

static unsigned char __SlvsReadProcC02x(void)
{
    FrameBuffer[FRM_DATALEN]=1;
    if(DI0_L==0)
    {
        FrameBuffer[FRM_DATA+2]=MeterRunningStateWord;
        return(RET_SEND_RIGHT_RESPONSION);
    }
    else if(DI0_L==1)
    {
        FrameBuffer[FRM_DATA+2]=PowerNetStateWord;
        return(RET_SEND_RIGHT_RESPONSION);
    }
    else if(DI0_L==2)
    {
        DI1DI0=ADDR_OF_WEEKEND_STATUS;
        return(RET_READ_E2PROM_A|RET_SEND_RIGHT_RESPONSION);
    }
    else if( DI0_L == 0x0F )
    {
        FrameBuffer[FRM_DATA+2]=MeterRunningStateWord;
        FrameBuffer[FRM_DATA+3]=PowerNetStateWord;
        FramRead( ADDR_OF_WEEKEND_STATUS, &FrameBuffer[FRM_DATA+4], 1 );
        FrameBuffer[FRM_DATA+5] = 0xAA;
        FrameBuffer[FRM_DATALEN]=4;
        return(RET_SEND_RIGHT_RESPONSION);		
    }
	
    FrameBuffer[FRM_DATA] = RET_ERR_ID;	
    return RET_SEND_ERROR_RESPONSION;
}

static unsigned char __SlvsReadProcC03x(void)
{
    if(DI0_L<2)
    {
        DI1DI0=ADDR_OF_METER_CONSTANT_A+DI0_L*3;
        FrameBuffer[FRM_DATALEN]=3;
    }
    else if(DI0_L<5)
    {
        DI1DI0=ADDR_OF_METER_NUM+(DI0_L-2)*6;
        FrameBuffer[FRM_DATALEN]=6;	
    }
    else if( DI0_L == 0x0F )
    {
        FramRead( ADDR_OF_METER_CONSTANT_A, &FrameBuffer[FRM_DATA+2], 6 );
        FramRead( ADDR_OF_METER_NUM, &FrameBuffer[FRM_DATA+8], 18 );
        FrameBuffer[FRM_DATA+26] = 0xAA;
        FrameBuffer[FRM_DATALEN] = 25;
        return(RET_SEND_RIGHT_RESPONSION);
    }
    else
    {       
        FrameBuffer[FRM_DATA] = RET_ERR_ID;	
        return RET_SEND_ERROR_RESPONSION;
    }
	
    return(RET_READ_E2PROM_A|RET_SEND_RIGHT_RESPONSION);
}

static unsigned char __SlvsWRProcC04x(void)
{
    if( DI0_L <= 0x0D )
    {
        DI1DI0 = ADDR_OF_LI_IVAL+(DI0_L*3);
        FrameBuffer[FRM_DATALEN] = 3;
        return(RET_READ_E2PROM_A|RET_WRITE_E2PROM_A|RET_SEND_RIGHT_RESPONSION);    
    }

    FrameBuffer[FRM_DATA] = RET_ERR_ID;	
    return RET_SEND_ERROR_RESPONSION;
}

static unsigned char __SlvsWRProcC05x(void)
{
    if( DI0_L <= 0x0A )
    {
        DI1DI0 = ADDR_OF_LI_KEEP_LONG+DI0_L;
        FrameBuffer[FRM_DATALEN] = 1;
        return(RET_READ_E2PROM_A|RET_WRITE_E2PROM_A|RET_SEND_RIGHT_RESPONSION);
    }
	
    FrameBuffer[FRM_DATA] = RET_ERR_ID;	
    return RET_SEND_ERROR_RESPONSION;
}

static unsigned char __SlvsWRProcC07x(void)
{
    if( DI0_L == 0x00 )
    { 
        FrameBuffer[FRM_DATALEN] = SIZE_LOAD_CURVE_INTERVAL;
        DI1DI0 = ADDR_OF_LOAD_CURVE_INTERVAL_START;
        return(RET_READ_E2PROM_A|RET_WRITE_E2PROM_A|RET_SEND_RIGHT_RESPONSION);
    }
	
    FrameBuffer[FRM_DATA] = RET_ERR_ID;	
    return RET_SEND_ERROR_RESPONSION;
}

static unsigned char __SlvsWRProcC09x(void)
{
    if( DI0_L <= 0x05 )
    {
        DI1DI0 = ADDR_OF_SUM_APOWER_FORMULA+DI0_L;
        FrameBuffer[FRM_DATALEN] = 1;
        return(RET_READ_E2PROM_A|RET_WRITE_E2PROM_A|RET_SEND_RIGHT_RESPONSION);
    }
	
    FrameBuffer[FRM_DATA] = RET_ERR_ID;	
    return RET_SEND_ERROR_RESPONSION;
}

const unsigned char __slvs_wr_c0xx_di0_h_[]=
{
    0x01,0x02,0x03,0x04,0x05,0x07,0x09,
    ERROR
};

const COMM_PROC_PTR __slvs_rd_proc_c0xx_di0_h_[]=
{
    __SlvsReadProcC01x,
    __SlvsReadProcC02x,
    __SlvsReadProcC03x,
    __SlvsWRProcC04x,
    __SlvsWRProcC05x,
    __SlvsWRProcC07x,
    __SlvsWRProcC09x,
};

static unsigned char _SlvsReadProcC0xx(void)
{
    unsigned char idx;

    idx=FindCmdItem(__slvs_wr_c0xx_di0_h_,DI0_H);
    if(idx!=ERROR)
    {
        return(__slvs_rd_proc_c0xx_di0_h_[idx]());
    }
	
    return RET_NO_RESPONSION;
}

const unsigned char __slvs_wr_c11x_datalen_[]=
{
    1,1,1,1,1,1,2,1,4,4
};

const unsigned short __slvs_wr_c11x_addr_[]=
{
    ADDR_OF_REQ_CYCLE,
    ADDR_OF_SLIP_TIME,
    ADDR_OF_CYCDISP_TIME,
    ADDR_OF_KEEPDISP_TIME,
    ADDR_OF_PWRDISP_DECIMALDIG,
    ADDR_OF_REQDISP_DECIMALDIG,
    ADDR_OF_AUTO_RDDATA_DATE,
    ADDR_OF_LOAD_REPREST_DAY,
    ADDR_OF_STA_RDDATA_AP_S,
    ADDR_OF_STA_RDDATA_RAP_S
};

static unsigned char __SlvsReadProcC11x(void)
{
    unsigned char temp,i;
    
    if( ( DI0_L >= 1 ) && ( DI0_L <= 10 ) )
    {
        temp = DI0_L-1;
        DI1DI0 = __slvs_wr_c11x_addr_[temp];
        FrameBuffer[FRM_DATALEN] = __slvs_wr_c11x_datalen_[temp];
        return(RET_READ_E2PROM_A|RET_SEND_RIGHT_RESPONSION);
    }
    else if( DI0_L == 0x0F )
    {
        temp = 0;    
        for( i = 0; i < 10; i++ )
        {
            FramRead( __slvs_wr_c11x_addr_[i], &FrameBuffer[FRM_DATA+2+temp], __slvs_wr_c11x_datalen_[i] );
            temp += __slvs_wr_c11x_datalen_[i];			
        }
        FrameBuffer[FRM_DATA+2+temp] = 0xAA;
        FrameBuffer[FRM_DATALEN]=temp+1;
        return(RET_SEND_RIGHT_RESPONSION);	
    }

    FrameBuffer[FRM_DATA] = RET_ERR_ID;	
    return RET_SEND_ERROR_RESPONSION;
}

static unsigned char __SlvsReadProcC12x(void)
{
    if(DI0_L<2)
    {
        DI1DI0=ADDR_OF_DISP_TYPE+DI0_L;
        FrameBuffer[FRM_DATALEN]=1;
        return(RET_READ_E2PROM_A|RET_SEND_RIGHT_RESPONSION);
    }
	
    FrameBuffer[FRM_DATA] = RET_ERR_ID;	
    return RET_SEND_ERROR_RESPONSION;
}

static unsigned char __SlvsReadProcC13x(void)
{
    if( DI0_L <= 1 )
    {
        DI1DI0 = DISP_CONTENT1+DI0_L*DISP_MAX_ITEM;
        FrameBuffer[FRM_DATALEN] = 42;
        return(RET_READ_E2PROM_A|RET_SEND_RIGHT_RESPONSION);
    }
	
    FrameBuffer[FRM_DATA] = RET_ERR_ID;	
    return RET_SEND_ERROR_RESPONSION;
}

const unsigned char __slvs_wr_c14x_datalen_[]=
{
    4,2,2,4
};

const unsigned short __slvs_wr_c14x_addr_[]=
{
    ADDR_OF_MANUFACTURER_PAR,
    ADDR_OF_RATED_UB,
    ADDR_OF_RATED_IB,
    ADDR_OF_SECURITY_CHK_IMAX
};

static unsigned char __SlvsWRProcC14x(void)
{
    if( DI0_L <= 3 )
    {
        DI1DI0 = __slvs_wr_c14x_addr_[DI0_L];
        FrameBuffer[FRM_DATALEN] = __slvs_wr_c14x_datalen_[DI0_L];        
    }
    else if( DI0_L == 6 )
    {
        DI1DI0 = ADDR_OF_ALARM_RAYCTL_WORD1;
        FrameBuffer[FRM_DATALEN] = 3;
    }
    else if( DI0_L == 0x0A )
    {
        DI1DI0 = ADDR_OF_ALARM_RAYCTL_WORD2;
        FrameBuffer[FRM_DATALEN] = 3;
    }
    else if( DI0_L == 0x0B )
    {
        DI1DI0 = ADDR_OF_ALARM_RAYCTL_WORD3;
        FrameBuffer[FRM_DATALEN] = 3;    
    }
    else
    {
        FrameBuffer[FRM_DATA] = RET_ERR_ID;	
        return RET_SEND_ERROR_RESPONSION;  
    }
	
    return(RET_READ_E2PROM_A|RET_WRITE_E2PROM_A|RET_SEND_RIGHT_RESPONSION);			
}

const unsigned char __slvs_wr_c1xx_di0_h_[]=
{
    0x01,0x02,0x03,0x04,
    ERROR
};

const COMM_PROC_PTR __slvs_rd_proc_c1xx_di0_h_[]=
{
    __SlvsReadProcC11x,
    __SlvsReadProcC12x,
    __SlvsReadProcC13x,
    __SlvsWRProcC14x
};

static unsigned char _SlvsReadProcC1xx(void)
{
    unsigned char idx;

    idx=FindCmdItem(__slvs_wr_c1xx_di0_h_,DI0_H);
    if(idx!=ERROR)
    {
        return(__slvs_rd_proc_c1xx_di0_h_[idx]());
    }
	
    return RET_NO_RESPONSION;
}

static unsigned char _SlvsWRProcC2xx(void)
{
    if( DI0_H == 0x01 )
    {
        if( DI0_L == 0x01 )
        {
            DI1DI0=ADDR_OF_PULSE_WIDTH;
            FrameBuffer[FRM_DATALEN]=2;
            return(RET_READ_E2PROM_A|RET_WRITE_E2PROM_A|RET_SEND_RIGHT_RESPONSION);
        }
        else if( DI0_L == 0x02 )
        {
            DI1DI0 = ADDR_OF_METER_PASSWORD1;
            FrameBuffer[FRM_DATALEN]=4;
            return(RET_WRITE_E2PROM_A|RET_SEND_RIGHT_RESPONSION);			
        }
    }
    	
    FrameBuffer[FRM_DATA] = RET_ERR_ID;	
    return RET_SEND_ERROR_RESPONSION;
}

static unsigned char _SlvsReadProcC3xx(void)
{
    unsigned char i,cnt,cnt1;
    
    if( DI0_H == 1 )
    {
        if( DI0_L < 5 )
        {
            DI1DI0 = BASE_CNT+DI0_L;
            FrameBuffer[FRM_DATALEN] = 1;
            return(RET_READ_E2PROM_A|RET_SEND_RIGHT_RESPONSION);
        }
        else if( DI0_L == 0x0F )
        {
            FramRead( BASE_CNT, &FrameBuffer[FRM_DATA+2], 5 );
            FrameBuffer[FRM_DATA+7] = 0xAA;
            FrameBuffer[FRM_DATALEN] = 6;
            return(RET_SEND_RIGHT_RESPONSION);			
        }
    }
    else if( DI0_H == 2 )
    {
        FramRead( ADDR_OF_TIMEZONE_COUNT, &cnt, 1 );
        cnt = Bcd2HexChar(cnt);
        if( ( DI0_L <= cnt ) && ( DI0_L > 0 ) )
        {
            DI1DI0 = BASE_ZTSTA+(DI0_L-1)*BASE_ZTSTA_OFFSET;
            FrameBuffer[FRM_DATALEN] = BASE_ZTSTA_OFFSET;
            return(RET_READ_E2PROM_A|RET_SEND_RIGHT_RESPONSION);
        }
        else if( DI0_L == 0x0F )
        {
            for( i = 0; i < cnt; i++ )
            {
                FramRead( BASE_ZTSTA+i*BASE_ZTSTA_OFFSET, &FrameBuffer[FRM_DATA+2+i*BASE_ZTSTA_OFFSET], BASE_ZTSTA_OFFSET );
            }
            for( i = 0; i < ( 14-cnt )*	BASE_ZTSTA_OFFSET; i++ )
            {
                FrameBuffer[FRM_DATA+2+cnt*BASE_ZTSTA_OFFSET+i] = 0xFF;
            }
            FrameBuffer[FRM_DATA+44] = 0xAA;
            FrameBuffer[FRM_DATALEN] = 43;
            return( RET_SEND_RIGHT_RESPONSION );	
        }
        else
        {
            FrameBuffer[FRM_DATA] = RET_ERR_TIME_ZONE_OVER;
            return RET_SEND_ERROR_RESPONSION;
        }
    }
    else if( DI0_H <= 14 )
    {
        FramRead( ADDR_OF_POT_COUNT, &cnt, 1 );
        cnt = Bcd2HexChar( cnt );
        if( DI0_H-3 < cnt )
        {
            FramRead( ADDR_OF_POT_SWITCH_COUNT, &cnt1, 1 );
            cnt1 = Bcd2HexChar( cnt1 );                    
            if( DI0_L == 0x0F )
            {
                DI1DI0=BASE_POT_T+(ushort)(DI0_H-3)*BASE_POT_T_OFFSET;
                for( i = 0; i < cnt1; i++ )
                {
                    FramRead((ushort)(DI1DI0+i*BASE_POT_OFFSET), &FrameBuffer[FRM_DATA+2+i*BASE_POT_OFFSET], BASE_POT_OFFSET );
                }
                for( i = 0; i < ( 14-cnt1 )*BASE_POT_OFFSET; i++ )
                {
                    FrameBuffer[FRM_DATA+2+cnt1*BASE_POT_OFFSET+i] = 0xFF;
                }                
                FrameBuffer[FRM_DATA+44]=0xAA;
                FrameBuffer[FRM_DATALEN] = 43;
                return( RET_SEND_RIGHT_RESPONSION );
            }				        
            else if( ( DI0_L <= cnt1 ) && ( DI0_L > 0 ) )
            {
                DI1DI0=BASE_POT_T+(ushort)(DI0_H-3)*BASE_POT_T_OFFSET+(DI0_L-1)*BASE_POT_OFFSET;
                FrameBuffer[FRM_DATALEN]=BASE_POT_OFFSET;
                return(RET_READ_E2PROM_A|RET_SEND_RIGHT_RESPONSION);
            }				
            else
            {
                FrameBuffer[FRM_DATA] = RET_ERR_POT_SWITCH_OVER;
                return RET_SEND_ERROR_RESPONSION;
            }
        }
        else
        {
            FrameBuffer[FRM_DATA] = RET_ERR_POT_SWITCH_OVER;
            return RET_SEND_ERROR_RESPONSION;        
        }
    }
	
    FrameBuffer[FRM_DATA] = RET_ERR_ID;	
    return RET_SEND_ERROR_RESPONSION;
}

static unsigned char _SlvsWRProcC4xx(void)
{
    unsigned char count,i;
	
    if( DI0_H == 1 )
    {
        if( DI0_L == 0x00 )
        {
            DI1DI0 = ADDR_OF_SPRING_FEST;
            FrameBuffer[FRM_DATALEN] = 1;	

⌨️ 快捷键说明

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