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

📄 protocol.c

📁 NEC527多功能电表完整源代码,包括LCD驱动,显示,计量,存储,整个527驱动程序!
💻 C
📖 第 1 页 / 共 5 页
字号:
            DI1DI0 = _SlvsReadProcB3xx_addr[di0_h];
            FrameBuffer[FRM_DATALEN] = 4*_SlvsReadProcB3xx_len[di0_h];
            return(RET_SEND_RIGHT_RESPONSION|RET_READ_E2PROM_A);			
        }
    }
    else if( di0_h <= 0x03 )
    {
        if( di0_l <= 0x03 )
        {
            DI1DI0 = _SlvsReadProcB3xx_addr[di0_h]+di0_l*4;
            FrameBuffer[FRM_DATALEN] = _SlvsReadProcB3xx_len[di0_h];
            return(RET_SEND_RIGHT_RESPONSION|RET_READ_E2PROM_A);			
        }
        else if( di0_l == 0x0F )
        {
            FramRead( _SlvsReadProcB3xx_addr[di0_h], &FrameBuffer[FRM_DATA+2], 16 );
            FrameBuffer[FRM_DATA+18] = 0xAA;
            FrameBuffer[FRM_DATALEN] = 17;
            return(RET_SEND_RIGHT_RESPONSION);                    
        }
    }
	
    FrameBuffer[FRM_DATA] = RET_ERR_ID;	
    return RET_SEND_ERROR_RESPONSION;
}

static unsigned char __SlvsReadProcB6_12_x(void)
{
    unsigned short temp;
    unsigned char di0_h=DI0_H-1,dl0_l=DI0_L-1;
    unsigned char i;	

    if( di0_h <= 1 )
    {
        if( dl0_l < 3 )
        {
            if( di0_h == 0 )
            {
                temp = (unsigned short)( CurrentVI[dl0_l]/10 );
                temp = Hex2BcdShort(temp);
            }
            else
            {
                temp = Hex2BcdShort( CurrentVI[dl0_l+di0_h*3] );
            }
            FrameBuffer[FRM_DATA+2] = (unsigned char)(temp);
            FrameBuffer[FRM_DATA+3] = (unsigned char)(temp>>8);
            FrameBuffer[FRM_DATALEN] = 2;
            return(RET_SEND_RIGHT_RESPONSION);
        }
        else if( dl0_l == 0x0E )
        {            
            if( di0_h == 0 )
            {
                for( i = 0; i < 3; i++ )
                {
                    temp = (unsigned short)( CurrentVI[i]/10 );
                    temp = Hex2BcdShort(temp);
                    FrameBuffer[FRM_DATA+2+i*2] = (unsigned char)(temp);
                    FrameBuffer[FRM_DATA+3+i*2] = (unsigned char)(temp>>8);                    
                }
            }
            else
            {
                for( i = 0; i < 3; i++ )
                {
                    temp = Hex2BcdShort( CurrentVI[3+i] );
                    FrameBuffer[FRM_DATA+2+i*2] = (unsigned char)(temp);
                    FrameBuffer[FRM_DATA+3+i*2] = (unsigned char)(temp>>8);                    
                }            
            }
            FrameBuffer[FRM_DATA+8] = 0xAA;
            FrameBuffer[FRM_DATALEN] = 7;
            return(RET_SEND_RIGHT_RESPONSION);			
        }
    }
	
    FrameBuffer[FRM_DATA] = RET_ERR_ID;	
    return RET_SEND_ERROR_RESPONSION;
}

/*************************************************
 * 读数据处理(B63X)
 * ------------------------------------------------
 * 0xB630 ---- 瞬时有功功率-3字节
 * 0xB631 ---- A相有功功率-3字节
 * 0xB632 ---- B相有功功率-3字节
 * 0xB633 ---- C相有功功率-3字节
 * 0xB634 ---- 正向有功功率上限值-2字节
 * 0xB635 ---- 反向有功功率上限值-2字节
 * 0xB636 ---- 瞬时有功功率相位-1字节
 *************************************************/
static unsigned char __SlvsReadProcB63x(void)
{
    unsigned char di0_l=DI0_L, i;
	
    if( di0_l <= 3 )
    {
        CalcInstantPower((unsigned char *)&FrameBuffer[FRM_DATA+2],di0_l);
        FrameBuffer[FRM_DATALEN]=3;
    }
    else if( di0_l <= 5 )
    {
        FrameBuffer[FRM_DATALEN]=2;
        DI1DI0=ADDR_OF_AP_UPPER_LIMIT+(di0_l-4)*2;
        return(RET_SEND_RIGHT_RESPONSION|RET_READ_E2PROM_A|RET_WRITE_E2PROM_A);
    }
    else if( di0_l == 6 )
    {
        FrameBuffer[FRM_DATALEN]=1;
        FrameBuffer[FRM_DATA+2]=PhaseActive;
    }
    else if( di0_l == 0x0F )
    {           
        for( i = 0; i < 4; i++ )
        {
            CalcInstantPower( (unsigned char *)&FrameBuffer[FRM_DATA+2+i*3], i );
        }
		
        for( i = 0; i < 2; i++ )
        {
            FramRead( ADDR_OF_AP_UPPER_LIMIT+i*2, &FrameBuffer[FRM_DATA+14+i*2], 2 );
        }
        FrameBuffer[FRM_DATA+18] = 0xAA;
        FrameBuffer[FRM_DATALEN]=17;
    }
    else
    {
        FrameBuffer[FRM_DATA] = RET_ERR_ID;	
        return RET_SEND_ERROR_RESPONSION;
    }
	
    return(RET_SEND_RIGHT_RESPONSION);
}

/*************************************************
 * 读数据处理(B64X)
 * ------------------------------------------------
 * 0xB640 ---- 瞬时无功功率-2字节
 * 0xB641 ---- A相无功功率-2字节
 * 0xB642 ---- B相无功功率-2字节
 * 0xB643 ---- C相无功功率-2字节
 * 0xB644 ---- 瞬时无功功率相位-1字节
 *************************************************/
static unsigned char __SlvsReadProcB64x(void)
{
    unsigned char i,temp[16];
	
    if(DI0_L<=3)
    {
        CalcInstantPower((unsigned char *)&FrameBuffer[FRM_DATA+2],DI0_L+4);
        FrameBuffer[FRM_DATA+2]=FrameBuffer[FRM_DATA+3];
        FrameBuffer[FRM_DATA+3]=FrameBuffer[FRM_DATA+4];
        FrameBuffer[FRM_DATALEN]=2;
    }
    else if(DI0_L==4)
    {
        FrameBuffer[FRM_DATALEN]=1;
        FrameBuffer[FRM_DATA+2]=PhaseReactive;
    }
    else if( DI0_L == 0x0F )	
    {
        for( i = 0; i < 4; i++ )
        {
            CalcInstantPower((unsigned char *)&temp[i*4], i+4);
            FrameBuffer[FRM_DATA+2+i*2] = temp[1+i*4];
            FrameBuffer[FRM_DATA+3+i*2] = temp[2+i*4];
        }
        FrameBuffer[FRM_DATA+10] = 0xAA;
        FrameBuffer[FRM_DATALEN] = 9;
    }
    else
    {
        FrameBuffer[FRM_DATA] = RET_ERR_ID;	
        return RET_SEND_ERROR_RESPONSION;
    }
	
    return(RET_SEND_RIGHT_RESPONSION);
}

/*************************************************
 * 读数据处理(B65X)
 * ------------------------------------------------
 * 0xB650 ---- 总功率因数-2字节
 * 0xB651 ---- A相功率因数-2字节
 * 0xB652 ---- B相功率因数-2字节
 * 0xB653 ---- C相功率因数-2字节
 *************************************************/
static unsigned char __SlvsReadProcB65x(void)
{
    unsigned short pcoe;
    unsigned char di0l=DI0_L,i;

    if(di0l<=3)
    {
        pcoe=GetPowerFactor(di0l);
        memcpy((unsigned char *)&FrameBuffer[FRM_DATA+2],(unsigned char *)&pcoe,2);
        FrameBuffer[FRM_DATALEN]=2;
        return(RET_SEND_RIGHT_RESPONSION);
    }
    else if( di0l == 0x0F )
    {
        for( i = 0; i < 4; i++ )
        {
            pcoe=GetPowerFactor(i);
            memcpy( &FrameBuffer[FRM_DATA+2+2*i], (unsigned char *)&pcoe, 2 );
        }
        FrameBuffer[FRM_DATA+10] = 0xAA;
        FrameBuffer[FRM_DATALEN] = 9;
        return(RET_SEND_RIGHT_RESPONSION);		
    }
	
    FrameBuffer[FRM_DATA] = RET_ERR_ID;	
    return RET_SEND_ERROR_RESPONSION;
}

static unsigned char __SlvsReadProcB66x(void)
{
    unsigned long instp;
    
    if(DI0_L<=3)
    {
        CalcInstantPower((unsigned char *)&FrameBuffer[FRM_DATA+2],DI0_L+8);
        FrameBuffer[FRM_DATALEN]=3;
        return(RET_SEND_RIGHT_RESPONSION);
    }
    else if(DI0_L==4)
    {
        GetFreq();
        instp=CurrentFreq;
        FrameBuffer[FRM_DATA+2]=(unsigned char)instp;
        FrameBuffer[FRM_DATA+3]=(unsigned char)(instp>>8);
        FrameBuffer[FRM_DATALEN]=2;
        return(RET_SEND_RIGHT_RESPONSION);
    }
	
    FrameBuffer[FRM_DATA] = RET_ERR_ID;	
    return RET_SEND_ERROR_RESPONSION;
}

/*************************************************
 * 读数据处理(B67X)
 * ------------------------------------------------
 * 0xB670 ---- 电表类型-2字节
 * 0xB671 ---- 内部参数(电表运行状态)-1字节
 * 0xB672 ---- 内部参数(测试参数)-1字节
 * 0xB673 ---- 3.6V电池电压-1字节
 * 0xB674 ---- 公共假日状态-1字节
 * 0xB675 ---- 时区,时段表表号,时段,费率-4字节
 * 0xB676 ---- 6V停电电池状态-1字节
 * 0xB677 ---- 内部参数(失压失流状态字)-3字节
 *************************************************/
static unsigned char __SlvsReadProcB67x(void)
{
    if(DI0_L==0)
    {
        FrameBuffer[FRM_DATA+2]=0x00;
    }
    else if(DI0_L==1)
    {
        FrameBuffer[FRM_DATA+2]=MeterRunningState&0x7F;
    }
    else if(DI0_L==2)
    {
        FrameBuffer[FRM_DATA+2]=AlarmCtlWord1;
    }
    else if(DI0_L==3)
    {
        FrameBuffer[FRM_DATA+2]=0;
    }
    else if(DI0_L==4)
    {
        FrameBuffer[FRM_DATA+2]=_SysPotInfo.pubvacstate;
    }
    else if(DI0_L==5)
    {
        FrameBuffer[FRM_DATA+2]=Hex2BcdChar(_SysPotInfo.zonenum+1);//时区
        FrameBuffer[FRM_DATA+3]=Hex2BcdChar(_SysPotInfo.pottblnum);//时段表号
        FrameBuffer[FRM_DATA+4]=Hex2BcdChar(CurrentPotNum);//时段
        FrameBuffer[FRM_DATA+5]=Tariff&0x03;//费率
    }
    else if( DI0_L == 6 )
    {
        FrameBuffer[FRM_DATA+2] = 0;
    }
    else if( DI0_L == 7 )
    {
        FrameBuffer[FRM_DATA+2] = LowVIStateWord;
    }
    else if( DI0_L == 8 )
    {
        FrameBuffer[FRM_DATA+2] = AlarmCtlWord2;
    }
    else if( DI0_L == 9 )
    {
        FrameBuffer[FRM_DATA+2] = AlarmCtlWord3;
    }
    else
    {
        FrameBuffer[FRM_DATA] = RET_ERR_ID;	
        return RET_SEND_ERROR_RESPONSION;
    }
	
    if( DI0_L == 5 )
    {
        FrameBuffer[FRM_DATALEN] = 4;
    }
    else
    {
        FrameBuffer[FRM_DATALEN] = 1;
    }
	
    return(RET_SEND_RIGHT_RESPONSION);
}

static unsigned char __SlvsReadProcB69x(void)
{
    unsigned char ii;
    
    if( DI0_L < 3 )
    {
        CalcVoltageAngle( (unsigned char *)&FrameBuffer[FRM_DATA+2], DI0_L );
        FrameBuffer[FRM_DATALEN] = 3;
        return RET_SEND_RIGHT_RESPONSION;
    }
    else if( DI0_L == 0x0F )
    {
        for( ii = 0; ii < 3; ii++ )
        {
            CalcVoltageAngle( (unsigned char *)&FrameBuffer[FRM_DATA+2+ii*3], ii );
        }
        FrameBuffer[FRM_DATALEN] = 9;
        return RET_SEND_RIGHT_RESPONSION;
    }

    FrameBuffer[FRM_DATA] = RET_ERR_ID;
    return RET_SEND_ERROR_RESPONSION;
}

static unsigned char __SlvsReadProcB6Ax(void)
{
    if( DI0_L < 3 )
    {       
        CalcVoltageAngle( (unsigned char *)&FrameBuffer[FRM_DATA+2], DI0_L+3 );
        FrameBuffer[FRM_DATALEN] = 3;		
        return RET_SEND_RIGHT_RESPONSION;
    }
    else if( DI0_L == 0x0F )
    {
        FrameBuffer[FRM_DATALEN] = 9;
        return RET_SEND_RIGHT_RESPONSION;
    }

    FrameBuffer[FRM_DATA] = RET_ERR_ID;	
    return RET_SEND_ERROR_RESPONSION;
}

static unsigned char __SlvsReadProcB6Bx(void)
{
    if( DI0_L == 0 )
    {
        FrameBuffer[FRM_DATALEN] = 2;
        FrameBuffer[FRM_DATA+2] = 0;
        FrameBuffer[FRM_DATA+3] = 0;
        return RET_SEND_RIGHT_RESPONSION;
    }
    else if( DI0_L == 1 )
    {
        FrameBuffer[FRM_DATALEN] = 3;
        FrameBuffer[FRM_DATA+2] = 0;
        FrameBuffer[FRM_DATA+3] = 0;
        FrameBuffer[FRM_DATA+4] = 0;
        return RET_SEND_RIGHT_RESPONSION;        
    }
    
    FrameBuffer[FRM_DATA] = RET_ERR_ID;	
    return RET_SEND_ERROR_RESPONSION;
}

const unsigned char __slvs_rd_b6xx_di0_h_[]=
{
    0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x09,0x0A,0x0B,
    ERROR
};

const COMM_PROC_PTR __slvs_rd_proc_b6xx_di0_h_[]=
{
    __SlvsReadProcB6_12_x,
    __SlvsReadProcB6_12_x,
    __SlvsReadProcB63x,
    __SlvsReadProcB64x,
    __SlvsReadProcB65x,
    __SlvsReadProcB66x,
    __SlvsReadProcB67x,
    __SlvsReadProcB69x,
    __SlvsReadProcB6Ax,
    __SlvsReadProcB6Bx
    
};

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

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

void CopySystemTime(unsigned char *data1,unsigned char *data2)
{
    FrameBuffer[FRM_DATALEN]=3+(unsigned char)(DI1DI0);
    memcpy(data1,data2, FrameBuffer[FRM_DATALEN]);
}

static unsigned char __SlvsReadProcC01x(void)
{
    if( DI0_L < 2 )
    {
        DI1DI0=~((unsigned short)(FrameBuffer[DI0]|0xFFFE));
        CopySystemTime(&FrameBuffer[FRM_DATA+2],SystemTime+(unsigned char)(3*DI1DI0));
        return(RET_SEND_RIGHT_RESPONSION);
    }
    else if( DI0_L == 0x0F )
    {
        FrameBuffer[FRM_DATA+2] = SystemTime[SPACE_OF_WEEKDAY];

⌨️ 快捷键说明

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