搜索
bottom↓
回复: 3

求DSP(F2812、F28335)的modbus协议例子,C语言写的

[复制链接]

出0入0汤圆

发表于 2011-9-14 14:10:54 | 显示全部楼层 |阅读模式
求DSP(F2812、F28335)的modbus协议例子,C语言写的

阿莫论坛20周年了!感谢大家的支持与爱护!!

如果想吃一顿饺子,就得从冰箱里取出肉,剁馅儿,倒面粉、揉面、醒面,擀成皮儿,下锅……
一整个繁琐流程,就是为了出锅时那一嘴滚烫流油的热饺子。

如果这个过程,禁不住饿,零食下肚了,饺子出锅时也就不香了……《非诚勿扰3》

出0入0汤圆

发表于 2013-9-17 17:46:22 | 显示全部楼层
帮顶

出0入0汤圆

发表于 2013-12-10 16:28:55 | 显示全部楼层
我也急需啊,希望高人传一个。

出0入0汤圆

发表于 2013-12-10 16:43:48 | 显示全部楼层
/*CRC ¸ßλ×Ö½ÚÖµ±í*/   
const unsigned int auchCRCHi[] = {   
    0x00C1, 0x8140, 0x01C0, 0x8041, 0x01C0,   
    0x8041, 0x00C1, 0x8140, 0x01C0, 0x8041,   
    0x00C1, 0x8140, 0x00C1, 0x8140, 0x01C0,   
    0x8041, 0x01C0, 0x8041, 0x00C1, 0x8140,   
    0x00C1, 0x8140, 0x01C0, 0x8041, 0x00C1,   
    0x8140, 0x01C0, 0x8041, 0x01C0, 0x8041,   
    0x00C1, 0x8140, 0x01C0, 0x8041, 0x00C1,   
    0x8140, 0x00C1, 0x8140, 0x01C0, 0x8041,   
    0x00C1, 0x8140, 0x01C0, 0x8041, 0x01C0,   
    0x8041, 0x00C1, 0x8140, 0x00C1, 0x8140,   
    0x01C0, 0x8041, 0x01C0, 0x8041, 0x00C1,   
    0x8140, 0x01C0, 0x8041, 0x00C1, 0x8140,   
    0x00C1, 0x8140, 0x01C0, 0x8041, 0x01C0,   
    0x8041, 0x00C1, 0x8140, 0x00C1, 0x8140,   
    0x01C0, 0x8041, 0x00C1, 0x8140, 0x01C0,   
    0x8041, 0x01C0, 0x8041, 0x00C1, 0x8140,   
    0x00C1, 0x8140, 0x01C0, 0x8041, 0x01C0,   
    0x8041, 0x00C1, 0x8140, 0x01C0, 0x8041,   
    0x00C1, 0x8140, 0x00C1, 0x8140, 0x01C0,   
    0x8041, 0x00C1, 0x8140, 0x01C0, 0x8041,   
    0x01C0, 0x8041, 0x00C1, 0x8140, 0x01C0,   
    0x8041, 0x00C1, 0x8140, 0x00C1, 0x8140,   
    0x01C0, 0x8041, 0x01C0, 0x8041, 0x00C1,   
    0x8140, 0x00C1, 0x8140, 0x01C0, 0x8041,   
    0x00C1, 0x8140, 0x01C0, 0x8041, 0x01C0,   
    0x8041, 0x00C1, 0x8140   
} ;   
/*CRCµÍλ×Ö½ÚÖµ±í*/   
const unsigned int auchCRCLo[] = {   
    0x00C0, 0xC101, 0xC303, 0x02C2, 0xC606,   
    0x07C7, 0x05C5, 0xC404, 0xCC0C, 0x0DCD,   
    0x0FCF, 0xCE0E, 0x0ACA, 0xCB0B, 0xC909,   
    0x08C8, 0xD818, 0x19D9, 0x1BDB, 0xDA1A,   
    0x1EDE, 0xDF1F, 0xDD1D, 0x1CDC, 0x14D4,   
    0xD515, 0xD717, 0x16D6, 0xD212, 0x13D3,   
    0x11D1, 0xD010, 0xF030, 0x31F1, 0x33F3,   
    0xF232, 0x36F6, 0xF737, 0xF535, 0x34F4,   
    0x3CFC, 0xFD3D, 0xFF3F, 0x3EFE, 0xFA3A,   
    0x3BFB, 0x39F9, 0xF838, 0x28E8, 0xE929,   
    0xEB2B, 0x2AEA, 0xEE2E, 0x2FEF, 0x2DED,   
    0xEC2C, 0xE424, 0x25E5, 0x27E7, 0xE626,   
    0x22E2, 0xE323, 0xE121, 0x20E0, 0xA060,   
    0x61A1, 0x63A3, 0xA262, 0x66A6, 0xA767,   
    0xA565, 0x64A4, 0x6CAC, 0xAD6D, 0xAF6F,   
    0x6EAE, 0xAA6A, 0x6BAB, 0x69A9, 0xA868,   
    0x78B8, 0xB979, 0xBB7B, 0x7ABA, 0xBE7E,   
    0x7FBF, 0x7DBD, 0xBC7C, 0xB474, 0x75B5,   
    0x77B7, 0xB676, 0x72B2, 0xB373, 0xB171,   
    0x70B0, 0x5090, 0x9151, 0x9353, 0x5292,   
    0x9656, 0x5797, 0x5595, 0x9454, 0x9C5C,   
    0x5D9D, 0x5F9F, 0x9E5E, 0x5A9A, 0x9B5B,   
    0x9959, 0x5898, 0x8848, 0x4989, 0x4B8B,   
    0x8A4A, 0x4E8E, 0x8F4F, 0x8D4D, 0x4C8C,   
    0x4484, 0x8545, 0x8747, 0x4686, 0x8242,   
    0x4383, 0x4181, 0x8040   
};   
   
//const Uint16 bd_485_delay[]={26667,13333,6667,3333,1666,833,417};//ÑÓʱ1¸ö×Ö·ûʱÏÞ   
const Uint16 bd_485_delay[]={36667,18333,9167,4583,2292,1146,573};//ÑÓʱ1¸ö×Ö·ûʱÏÞ   
   
void GetSoe(Uint16 no);   
//-------------------------------------------------------------------   
//   
//ModbusÍøÂçЭÒé×Ó³ÌÐò   
//   
   
//CRCУÑ麯Êý   
Uint16 CRC16(Uchar * p_crc_msg, Uint16 crc_len)   
{   
    unsigned char crc_lo=0xff;   
    unsigned char crc_hi=0xff;   
    unsigned char crc_index;   
    unsigned int  crc_value;   
    while(crc_len--)   
    {   
        crc_index=crc_hi^((*p_crc_msg++)&0xff);//080409crc_index=crc_hi^*p_crc_msg++;   
        //crc_hi=crc_lo^auchCRCHi[crc_index];   
        //crc_lo=auchCRCLo[crc_index];         
        if(crc_index==crc_index/2*2)   
        {//żÊýλȡÆä¸ß×Ö½Ú   
            crc_hi=crc_lo^(auchCRCHi[crc_index/2]>>8);   
            crc_lo=auchCRCLo[crc_index/2]>>8;        
        }   
        else   
        {//ÆæÊýλȡÆäµÍ×Ö½Ú   
            crc_hi=crc_lo^(auchCRCHi[crc_index/2]&0xff);   
            crc_lo=auchCRCLo[crc_index/2]&0xff;        
        }   
   
    }   
    crc_value=crc_hi<<8|crc_lo;   
    return crc_value;   
}   
//ModbusЭÒé³õʼ»¯   
void InitSerModbus(Uchar flag)   
{   
    if(flag==0x55)//Òò±£´æ¶¨ÖµµÄÍ˳ö²»ÔÙ½øÐгõʼ»¯   
      return;     
    SerModbus.Access=0;      
    SerModbus.Busy=0;   
    SerModbus.receive_count=0;   
    SerModbus.send_count=0;   
    SerModbus.send_head=0;   
    SerModbus.crc_len=0;   
    SerModbus.enable_flag=0,   
    SerModbus.start_flag=0;   
    SerModbus.end_flag=0;   
    SerModbus.ck_count=0;   
    SerModbus.ck_point=0;   
    SerModbus.ck_flag=0;   
    SerModbus.event_report=0;   
    SerModbus.receive_flag=0;//½ÓÊÕÖ¡¼Æʱ   
    SerModbus.send_flag=0;//·¢ËÍÖ¡¼Æʱ   
    SerModbus.r_timer=0;//½ÓÊÕÖ¡¼Æʱ   
    SerModbus.s_timer=0;//·¢ËÍÖ¡¼Æʱ   
    /*  
    soe_no=0;  
    soe_id=0;  
    soe_count=0;  
    soe_flag=0;  
    */   
   
}   
//ModbusÒì³£Ó¦´ð·µ»Ø   
void ErrorResponse(Uchar err)   
{//err-Òì³£Âë 1-·Ç·¨¹¦ÄÜ£¬2-·Ç·¨Êý¾ÝµØÖ·£¬3-·Ç·¨Êý¾ÝÖµ   
    ///unsigned char com_type;   
    unsigned int  crc_result;   
    SerModbus.Busy=0xff;//ÖÃͨѶ״̬æ±êÖ¾   
    SerModbus.send_msg[1]=SerModbus.send_msg[1]|0x80;   
    SerModbus.send_msg[2]=err;//Òì³£Âë   
    SerModbus.crc_len=3;   
    crc_result=CRC16((Uchar *)&SerModbus.send_msg[0],SerModbus.crc_len);   
    SerModbus.send_msg[3]=crc_result&0xff;   
    SerModbus.send_msg[4]=(crc_result>>8)&0xff;   
    SerModbus.send_count=SerModbus.crc_len+2;         
    SerModbus.s_timer=0;//·¢ËͼÇʱÇåÁã               
    SerModbus.send_flag=0xff;//Ö÷¢ËͱêÖ¾   
    //com_type=COM_SER;     
    //ComSendCtrl(com_type);//ͨѶ¿Ú·¢ËÍ¿ØÖÆ   
    ComSendCtrl(Com.port_typ);   
}   
//Modbus½ÓÊÕͨÐÅÖ¡¿ØÖÆ   
void ModbusFrameCtrl(void)   
{      
    Uint16 crc_result,crc_receive;   
    //·¢ËÍÖ¡´¦Àí      
    if(SerModbus.send_flag)   
    {   
        //if(SerModbus.s_timer>(Uint32)bd_485_delay[dzbd]*7*SAMPLEPOINT/20000+1)   
        if(SerModbus.s_timer>((Uint32)bd_485_delay[dzbd]*7*SAMPLEPOINT>>14)-1)   
        {//ÅжϷ¢Ëͼä¸ôÍ£¶ÙʱÏÞ´óÓÚ7×Ö·ûʱÏÞ   
           SerModbus.enable_flag=0;   
           SerModbus.send_flag=0;//·¢ËͱêÖ¾ÇåÁã   
           SerModbus.send_count=0;   
           SerModbus.send_head=0;         
           SerModbus.Access=0;//ÊÍ·ÅÃüÁî   
           SerModbus.Busy=0;   
           Ser.port_right=0;//ÊÍ·ÅͨѶ¿Ú   
           com1_reset_cnt=0;   
           com1_de=0;//¹Ø±Õ422·¢ËÍʹÄܶˠ  
        }   
    }   
    //½ÓÊÕÖ¡´¦Àí      
    if(SerModbus.receive_flag && SerModbus.start_flag)   
    {   
        //if(SerModbus.r_timer>(Uint32)bd_485_delay[dzbd]*4*SAMPLEPOINT/20000+1)   
        if(SerModbus.r_timer>((Uint32)bd_485_delay[dzbd]*4*SAMPLEPOINT>>14)-1)   
        {//ÅжϽÓÊÕ¼ä¸ôÍ£¶ÙʱÏÞ´óÓÚ3.5×Ö·ûʱÏÞ   
            SerModbus.start_flag=0;   
            SerModbus.receive_flag=0;   
            SerModbus.end_flag=0x55;//ÖÃÖ¡½áÊø±êÖ¾   
        }   
    }   
   
    if(SerModbus.end_flag!=0x55)   
    {//Ö¡½ÓÊÕ´¦Àí¹ý³ÌÖР  
        return;   
    }   
                  
    //Ö¡½ÓÊÕÍê³É      
    Ser.port_right=0x55;//¿ØÖÆ´®¿ÚͨѶ¿Ú   
    if(SerModbus.receive_count>2)   
        SerModbus.crc_len=SerModbus.receive_count-2;//CRC16УÑ鳤¶È   
    else   
        SerModbus.crc_len=0;   
    SerModbus.receive_count=0;   
    SerModbus.enable_flag=0;   
    SerModbus.receive_flag=0;      
    SerModbus.start_flag=0;   
    SerModbus.end_flag=0;              
    SerModbus.send_msg[0]=dzid;   
    SerModbus.send_msg[1]=SerModbus.receive_msg[1];   
    //µØÖ·Óò½âÎö   
    if((SerModbus.receive_msg[0]!=dzid && SerModbus.receive_msg[0]!=0) || SerModbus.crc_len==0)   
    {//Ö¡½ÓÊÕ½âÎöµØÖ·Óò²»Æ¥Åä   
        Ser.port_right=0;   
        return;   
    }   
           
    //CRC16УÑé   
    crc_result=CRC16((Uchar *)&SerModbus.receive_msg[0],SerModbus.crc_len);   
    crc_receive=SerModbus.receive_msg[SerModbus.crc_len]*256+SerModbus.receive_msg[SerModbus.crc_len+1];   
    if(crc_result!=crc_receive)   
    {//CRCУÑé²»³É¹¦,·Ç·¨Êý¾Ý   
        Ser.port_right=0;   
        return;      
    }   
    SerModbus.Access=0xff;//УÑé³É¹¦ÖÃÃüÁîÆô¶¯±êÖ¾                 
   
}   
void RemoteCtrl()//¿ª³ö¼àÊÓ¿ØÖÆ   
{   
    Uint16* p_kc_time;   
    if (SerModbus.ck_flag==0 || bittst((Uint16 * )&SerModbus.event_report,0)==0)   
    {   
       return;   
    }   
    p_kc_time=(Uint16*)&dzkc1_t;     
    if(SerModbus.ck_point<2) SerModbus.ck_point=2;   
    if (SerModbus.ck_count>(*(p_kc_time+SerModbus.ck_point-2))*MACROSAMPLE_TIMES)   
    {   
       bitclr(&kc_value,SerModbus.ck_point);   
       SerModbus.ck_count=0;   
       SerModbus.ck_flag=0;   
       SerModbus.ck_point=0;   
       bitclr((Uint16 * )&SerModbus.event_report,0);   
    }   
    else   
       SerModbus.ck_count++;   
}                  
   
//ModbusÏûÏ¢¿ØÖÆ   
void SerModbusCtrl(void)   
{   
    Uchar   broad_flag,opcode,flag;   
    Uint16  offset,s_addr,d_num,ctrl_point,byte,id,crc_result,value,i,j,k;   
    Uint16* p_addr;   
    ModbusFrameCtrl();//MODBUSͨѶ֡¿ØÖÆ   
    RemoteCtrl();//¿ª³ö¼àÊÓ¿ØÖÆ               
    //--ÎÞ½ÓÊÕÃüÁî»òÕßͨѶæ״̬³ÌÐòÁ¢¼´·µ»Ø   
    if ((SerModbus.Access!=0xff || Ser.port_right!=0x55) || SerModbus.Busy==0xff)   
    { //--ÎÞ½ÓÊÕÃüÁî»òÕßͨѶæ״̬³ÌÐòÁ¢¼´·µ»Ø   
        return;   
    }   
    SerModbus.Busy=0xff;//ÖÃͨѶ״̬æ±êÖ¾   
    SerModbus.send_count=0;   
    //com_type=Com.port_typ;   
    //com_type=COM_SER;      
    broad_flag=0;   
    if(SerModbus.receive_msg[0]==0)   
    {//¹ã²¥ÃüÁî   
        broad_flag=0xff;   
    }   
    opcode=SerModbus.receive_msg[1];//½âÎö¹¦ÄÜÂë   
    if (opcode<1 || opcode>24)   
    {//¹¦ÄÜÂëÒì³£   
        ErrorResponse(1);   
        return;      
    }      
    switch(opcode)   
    {   
    case 1://Read Coil Status   
            SerModbus.send_count=SerModbus.crc_len+2;   
            break;      
    case 2://Read Input Status--Ò£ÐÅÁ¿   
            ///offset=SerModbus.receive_msg[2]*256+SerModbus.receive_msg[3];   
            ///d_num=SerModbus.receive_msg[4]*256+SerModbus.receive_msg[5];   
            s_addr=SerModbus.receive_msg[2]*256+SerModbus.receive_msg[3];   
            d_num=SerModbus.receive_msg[4]*256+SerModbus.receive_msg[5];   
            j=0; while((s_addr<DigitalComm[j].start_addr || s_addr>=DigitalComm[j+1].start_addr) && j<DIGITAL_NO-1){j++;}//¼ìË÷ÆðʼµØÖ·--µØÖ··¶Î§:Start_pre<=x && x<Start_next   
            offset = s_addr-DigitalComm[j].start_addr;//ÆðʼµØÖ·Æ«ÒÆÁ¿   
   
            //ÕÙ»½Êý¾ÝµØÖ·¼ì²â   
            if (d_num<1 || ((d_num-1)>>4)+6 > MACROCOMM_S_NO)   
            {   
                ErrorResponse(3);//·Ç·¨Êý¾ÝÖµ   
                return;      
            }   
            //ÏìÓ¦Êý¾ÝÖ¡   
            //Êý¾ÝÀàÐÍΪBYTE--8bit   
            SerModbus.send_msg[2]=((d_num-1)>>3)+1;//×Ö½ÚÊýÄ¿   
            for(i=0;i<SerModbus.send_msg[2];i++)   
            {   
                //ÏìÓ¦Êý¾ÝÇøÓòË÷Òý   
                  
                /*  
                for(k=0;k<8;k++)  
                {  
                    if (offset>=DigitalComm[j].data_num)  
                    {  
                        if ((offset+DigitalComm[j].start_addr)>=DigitalComm[j+1].start_addr && j<DIGITAL_NO-1)  
                        {  
                            offset = 0;j++;  
                            if (bittst(DigitalComm[j].p_addr,offset))  
                                bitset((Uint16*)&value,k);//״̬Á¿ÖÃ1  
                            else  
                                bitclr((Uint16*)&value,k);//״̬Á¿Çå0                        
                        }  
                        else bitclr((Uint16*)&value,k);//״̬Á¿Çå0  
                    }  
                    else  
                    {   
                        if (bittst(DigitalComm[j].p_addr,offset))  
                            bitset((Uint16*)&value,k);//״̬Á¿ÖÃ1  
                        else  
                            bitclr((Uint16*)&value,k);//״̬Á¿Çå0  
                    }  
                    offset++;  
                }  
                */   
   
                if (offset>=DigitalComm[j].data_num)   
                {   
                    if ((offset+DigitalComm[j].start_addr)>=DigitalComm[j+1].start_addr && j<DIGITAL_NO-1)   
                    {   
                        offset = 0;j++;   
                        value = *(DigitalComm[j].p_addr+offset);   
                    }   
                    else value=0;//״̬Á¿Çå0   
                }   
                else   
                {   
                    value = *(DigitalComm[j].p_addr+(offset>>4));   
                    if ( ((offset>>4)<<1) != offset>>3 ) { value >>=8;}//(offset/16*2 !=offset/8) is high--8bit of 16bit   
                }   
                offset +=8;   
                SerModbus.send_msg[i+3]=value&0xff;   
            }                                      
            SerModbus.crc_len=SerModbus.send_msg[2]+3;   
            SerModbus.send_count=SerModbus.crc_len+2;   
            break;      
    case 3://Read Holding Registers   
            ///offset=SerModbus.receive_msg[2]*256+SerModbus.receive_msg[3];   
            ///d_num=SerModbus.receive_msg[4]*256+SerModbus.receive_msg[5];   
            s_addr=SerModbus.receive_msg[2]*256+SerModbus.receive_msg[3];//ÆðʼµØÖ·   
            d_num=SerModbus.receive_msg[4]*256+SerModbus.receive_msg[5];//Êý¾Ý¸öÊý   
            j=0; while((s_addr<AnalogComm[j].start_addr || s_addr>=AnalogComm[j+1].start_addr ) && j<ANALOG_NO-1){j++;}//¼ìË÷ÆðʼµØÖ·--µØÖ··¶Î§:Start_pre<=x && x<Start_next   
            offset = s_addr-AnalogComm[j].start_addr;   
                           
            if (j>=ANALOG_NO-1)   
            {   
                j=ANALOG_NO-1;                 
                if (s_addr>=CommSoeEventAddr && s_addr < CommSoeEventAddr+CommSoeEventNum)   
                {//ÕÙ»½SOE---!!!ThinkRoad special function   
                    id=(s_addr-CommSoeEventAddr)/(MACROFAULT_BYTE>>1); offset = 0;   
                    GetSoe(id); //soe_id:0~127   
                    bitclr(&soe_status[0],id);//ÕÙSOE³É¹¦ÔòÇåSOE״̬±êÖ¾//080414   
                }   
                else   
                {   
                    ErrorResponse(3);//·Ç·¨Êý¾ÝÖµ   
                    return;      
                }   
            }              
            //ÕÙ»½Êý¾ÝµØÖ·¼ì²â   
            if (d_num<1 || d_num+5>MACROCOMM_S_NO)   
            {   
                ErrorResponse(3);//·Ç·¨Êý¾ÝÖµ   
                return;      
            }   
   
            //ÏìÓ¦Êý¾ÝÖ¡   
            //Êý¾ÝÀàÐÍΪWORD--16bit   
            SerModbus.send_msg[2]=2*d_num;   
            for(i=0;i<d_num;i++)   
            {   
                //ÏìÓ¦Êý¾ÝÇøÓòË÷Òý   
                if (offset>=AnalogComm[j].data_num)   
                {                     
                    if ((offset+AnalogComm[j].start_addr)>=AnalogComm[j+1].start_addr && j<ANALOG_NO-1)   
                    {   
                        offset = 0;j++;   
                        value=*(AnalogComm[j].p_addr+offset);   
                    }   
                    else value=0;   
                }   
                else value=*(AnalogComm[j].p_addr+offset);   
                /*********¶¨Öµ¿ØÖÆ×ÖÂß¼­±äÁ¿**********/   
                if ((AnalogComm[j].p_addr+offset)>=(Uint16 *)&dzkg1 && (AnalogComm[j].p_addr+offset)<((Uint16 *)&dzkg1+(MACROSETDZKG_NO<<4)) && AnalogComm[j].start_addr>=CommSetDz1Addr)//!!!¿ØÖÆ×ּĴæÆ÷±äÁ¿ÉèÖÃÇøÓò   
                {   
                    k=AnalogComm[j].p_addr+offset-(Uint16 *)&dzkg1;   
                    if (bittst((Uint16 *)&dzkg1,k))   
                        value = 1;   
                    else   
                        value = 0;   
                }   
                /************************************/   
                offset++;   
                SerModbus.send_msg[2*i+3]=(value>>8)&0xff;//Êý¾Ý¸ßλ×Ö½Ú   
                SerModbus.send_msg[2*i+4]=value&0xff;//Êý¾ÝµÍλ×Ö½Ú   
            }   
            SerModbus.crc_len=SerModbus.send_msg[2]+3;     
            SerModbus.send_count=SerModbus.crc_len+2;         
            break;      
    case 4://Read Input Registers--Ò£²âÁ¿   
            SerModbus.send_count=SerModbus.crc_len+2;   
            break;      
    case 5://Force Single Coil   
            ctrl_point=SerModbus.receive_msg[2]*256+SerModbus.receive_msg[3];//--Ö÷»úÐ޸Ķ¨ÖµµãºÅ   
            value=SerModbus.receive_msg[4]*256+SerModbus.receive_msg[5];   
            if(ctrl_point>CONTROL_NO-1)   
            {   
                ErrorResponse(3);//·Ç·¨Êý¾ÝÖµ   
                return;      
            }   
            if(ctrl_point<8 && dzyk_s == 1)   
            {//Ò£¿Ø³ö¿Ú   
                if(value)//value == 0xFF00   
                {   
                    SerModbus.ck_point=ctrl_point;   
                    bitset(&kc_value,ctrl_point);   
                    bitset((Uint16 * )&SerModbus.ck_flag,ctrl_point);   
                }   
                else   
                {   
                    SerModbus.ck_point=ctrl_point;   
                    bitclr(&kc_value,ctrl_point);   
                    bitclr((Uint16 * )&SerModbus.ck_flag,ctrl_point);   
                }   
                bitset((Uint16 * )&SerModbus.event_report,0);   
            }   
            else CommSelCtrl(ctrl_point);   
   
            SerModbus.send_msg[2]=SerModbus.receive_msg[2];//¶¨ÖµÍ¨µÀºÅ¸ßλ×Ö½Ú   
            SerModbus.send_msg[3]=SerModbus.receive_msg[3];//¶¨ÖµÍ¨µÀºÅµÍλ×Ö½Ú   
            SerModbus.send_msg[4]=SerModbus.receive_msg[4];//Êý¾Ý¸ßλ×Ö½Ú   
            SerModbus.send_msg[5]=SerModbus.receive_msg[5];//Êý¾ÝµÍλ×Ö½Ú   
            SerModbus.crc_len=6;   
            SerModbus.send_count=SerModbus.crc_len+2;         
            break;      
    case 6://Preset Single Resister--Ò£¿ØÁ¿   
            SerModbus.send_count=SerModbus.crc_len+2;         
            break;      
    case 7://Read Exception Status   
            SerModbus.send_count=SerModbus.crc_len+2;         
            break;      
    case 8://Reserve »ØËÍÕï¶ÏУÑ飬°ÑÕï¶ÏУÑ鱨ÎÄËÍ´Ó»ú£¬ÒÔ¶ÔͨÐÅ´¦Àí½øÐÐÆÀ¼ø   
            SerModbus.send_count=0;   
            break;      
    case 9://±à³Ì£¨Ö»ÓÃÓÚ484£©Ê¹Ö÷»úÄ£Äâ±à³ÌÆ÷×÷Óã¬ÐÞ¸ÄPC´Ó»úÂß¼­   
            SerModbus.send_count=0;   
            break;      
    case 10://¿Øѯ£¨Ö»ÓÃÓÚ484£©   
            SerModbus.send_count=0;   
            break;      
    case 11://Fech Comm Event Ctr   
            SerModbus.send_count=SerModbus.crc_len+2;   
            break;      
    case 12://Fech Comm Event Log   
            SerModbus.send_count=SerModbus.crc_len+2;         
            break;      
    case 13://±à³Ì£¨Ö»ÓÃÓÚ484£©Ê¹Ö÷»úÄ£Äâ±à³ÌÆ÷×÷Óã¬ÐÞ¸ÄPC´Ó»úÂß¼­   
            SerModbus.send_count=0;   
            break;      
    case 14://¿Øѯ£¨Ö»ÓÃÓÚ484£©   
            SerModbus.send_count=0;   
            break;      
    case 15://Force Mutiple Coils   
            SerModbus.send_count=SerModbus.crc_len+2;         
            break;      
    case 16://Preset Multiple Regs--Ò£µ÷Á¿   
            ///offset=SerModbus.receive_msg[2]*256+SerModbus.receive_msg[3];   
            ///d_num=SerModbus.receive_msg[4]*256+SerModbus.receive_msg[5];   
            s_addr=SerModbus.receive_msg[2]*256+SerModbus.receive_msg[3];//ÆðʼµØÖ·   
            d_num=SerModbus.receive_msg[4]*256+SerModbus.receive_msg[5];//Êý¾Ý¸öÊý   
            byte=SerModbus.receive_msg[6];//×Ö½Ú³¤¶È   
            j=0; while((s_addr<AnalogComm[j].start_addr || s_addr>=AnalogComm[j+1].start_addr) && j < ANALOG_NO-1 ){j++;}//¼ìË÷ÆðʼµØÖ·--µØÖ··¶Î§:Start_pre<=x && x<Start_next   
            offset = s_addr-AnalogComm[j].start_addr;   
   
            if (d_num<1 || d_num+5>MACROCOMM_S_NO /*|| d_num!=byte/2*/)   
            {   
                ErrorResponse(3);//·Ç·¨Êý¾ÝÖµ   
                return;      
            }   
                           
            for(i=0;i<d_num;i++)   
            {   
                value=(SerModbus.receive_msg[i*2+7])*256+SerModbus.receive_msg[i*2+8];   
                //ÏìÓ¦Êý¾ÝÇøÓòË÷Òý   
                if (offset>=AnalogComm[j].data_num)   
                {                     
                    if ((offset+AnalogComm[j].start_addr)>=AnalogComm[j+1].start_addr && j<ANALOG_NO-1)   
                        {offset = 0;j++; }   
                    else   
                        break;         
                }   
                *(AnalogComm[j].p_addr+offset)=value;   
   
                //¶¨ÖµÀàÐͼì²â   
                if ((AnalogComm[j].p_addr+offset)>=(Uint16*)&clockrade && (AnalogComm[j].p_addr+offset)<((Uint16*)&clockrade+0x06))   
                {//ʱÖÓÇøÓò   
                    p_addr = (Uint16 *)&clockwrite;   
                    *(p_addr+ (AnalogComm[j].p_addr+offset-(Uint16*)&clockrade)) = value;   
                    flag = 0x01;   
                }   
                else if ((AnalogComm[j].p_addr+offset)>=(Uint16*)&nvdd_accu && (AnalogComm[j].p_addr+offset)<((Uint16*)&nvdd_accu+0x0e))   
                {//µç¶ÈÇøÓò   
                    flag = 0x02;   
                }   
                else if ((AnalogComm[j].p_addr+offset)>=(Uint16* )&DzDat0.Point[0] && (AnalogComm[j].p_addr+offset)<((Uint16* )&DzDat0.Point[0]+0x40) && AnalogComm[j].start_addr<CommSetDz1Addr)   
                {//Óû§ÇøÓò   
                    flag = 0x03;   
                }                  
                else if ((AnalogComm[j].p_addr+offset)>=(Uint16*)&dzkg1 && (AnalogComm[j].p_addr+offset)<((Uint16*)&dzkg1+(MACROSETDZKG_NO<<4)) && AnalogComm[j].start_addr>=CommSetDz1Addr)//!!!¿ØÖÆ×ּĴæÆ÷±äÁ¿ÉèÖÃÇøÓò   
                {//¿ØÖÆ×ÖÂß¼­±äÁ¿ÇøÓò   
                    flag = 0x04;   
                    k=AnalogComm[j].p_addr+offset-(Uint16*)&dzkg1;   
                    if(value)   
                        bitset((Uint16 *)&dzkg1,k);   
                    else   
                        bitclr((Uint16 *)&dzkg1,k);   
                }   
                else if ((AnalogComm[j].p_addr+offset)>=(Uint16* )DDRAM_DAT_ABS && (AnalogComm[j].p_addr+offset)<((Uint16* )DDRAM_DAT_ABS+0x40))   
                {//ÆäËü²ÎÊýÇøÓò   
                    flag = 0x05;   
                }   
                else if ((AnalogComm[j].p_addr+offset)>=(Uint16* )&DzDat1.Point[0] && (AnalogComm[j].p_addr+offset)<((Uint16* )&DzDat1.Point[0]+0x40))   
                {//µ÷ÊÔÇøÓò   
                    flag = 0x06;   
                }   
                else {ErrorResponse(3);return;}//·Ç·¨Êý¾ÝÖµ   
                offset++;   
   
            }   
   
            //¶¨ÖµÀàÐͼì²â   
            if (flag==0x01)   
                ClockSet();//ʱÖÓÉèÖà  
            else if(flag==0x02)   
                read_energy();//µç¶ÈÉèÖÃ(½«nvddֵдÈëDDRAM)   
            else if(flag==0x03 || flag==0x04)   
                bitset(&save_event_flag,0);//Óû§¶¨Öµ   
            else if(flag==0x06)   
                bitset(&save_event_flag,1);//µ÷ÊÔ¶¨Öµ   
            else if(flag==0x05)   
                ;//ÆäËü²ÎÊý(×Ô¶¯±£´æ)   
   
            SerModbus.send_msg[2]=SerModbus.receive_msg[2];//¶¨ÖµÍ¨µÀºÅ¸ßλ×Ö½Ú   
            SerModbus.send_msg[3]=SerModbus.receive_msg[3];//¶¨ÖµÍ¨µÀºÅµÍλ×Ö½Ú   
            SerModbus.send_msg[4]=SerModbus.receive_msg[4];//Êý¾Ý¸ßλ×Ö½Ú   
            SerModbus.send_msg[5]=SerModbus.receive_msg[5];//Êý¾ÝµÍλ×Ö½Ú   
            SerModbus.crc_len=6;   
            SerModbus.send_count=SerModbus.crc_len+2;         
            break;      
    case 17://Report Slave   
            SerModbus.send_count=0;   
            break;      
    case 18://£¨884ºÍMICRO84£©   
            SerModbus.send_count=0;   
            break;      
    case 19://ÖØÖÃͨÐÅÁ´Â·   
            SerModbus.send_count=0;   
            break;      
    case 20://Read Gerenal Reference   
            SerModbus.send_count=SerModbus.crc_len+2;         
            break;      
    case 21://Write General Reference   
            SerModbus.send_count=SerModbus.crc_len+2;         
            break;      
    case 22://Mask Write 4X Register   
            SerModbus.send_count=SerModbus.crc_len+2;         
            break;      
    case 23://Read/Write 4X Registers   
            SerModbus.send_count=SerModbus.crc_len+2;         
            break;      
    case 24://Read FIFO Queue   
            SerModbus.send_count=SerModbus.crc_len+2;         
            break;      
    default:   
            SerModbus.send_count=0;   
            break;      
    }   
      
    //¹ã²¥ÃüÁî»òÕß·¢ËÍ×Ö½ÚΪ0Á¢¼´·µ»Ø   
    if(broad_flag==0xff || SerModbus.send_count==0)   
    {   
       SerModbus.Busy=0;   
       SerModbus.Access=0;   
       SerModbus.send_count=0;   
       Ser.port_right=0;        
       return;        
    }            
    // ·¢ËÍÊý¾ÝУÑé                        
    crc_result=CRC16((Uchar *)&SerModbus.send_msg[0],SerModbus.crc_len);   
    SerModbus.send_msg[SerModbus.crc_len]=(crc_result>>8)&0xff;      
    SerModbus.send_msg[SerModbus.crc_len+1]=crc_result&0xff;   
    SerModbus.s_timer=0;//·¢ËͼÇʱÇåÁã               
    SerModbus.send_flag=0xff;//Ö÷¢ËͱêÖ¾   
    //com_type=COM_SER;               
    //ComSendCtrl(com_type);//ͨѶ¿Ú·¢ËÍ¿ØÖÆ   
    ComSendCtrl(Com.port_typ);   
}   
/*  
void GetSoe(Uint16 no)  
{         
    Uint16 * p_data;  
    Uint16 start,size;  
    p_data=(Uint16*)&fault_soe;  
    size=FAULT_BYTE_NO/MACROFAULT_PAGE;  
    start=FAULTAREA_ADDR+size*no;  
    ReadFm24cl((Uint16*)p_data,start,size,1,FM2416_ID);//¹²±£´æ7120×Ö½Ú¹ÊÕϼǼ    64Ìõ¹ÊÕϼǼ  
}  
*/   
void GetSoe(Uint16 no)   
{         
    Uint16 *p_data,*p_fault;   
    Uint16 start,size;   
    Uint16 id,i;   
    p_data=(Uint16*)&fault_soe;   
    if ((no+1) != soe_id)   
    {//Ö÷»úÖ÷¶¯ÕÙ»½SOE   
        start=FAULTAREA_ADDR+MACROFAULT_BYTE*no;   
        ReadFm24cl((Uint16*)p_data,start,MACROFAULT_BYTE,1,FM2416_ID);//¹²±£´æ7120×Ö½Ú¹ÊÕϼǼ    64Ìõ¹ÊÕϼǼ   
    }   
    else   
    {//´Ó»úÇëÇóÕÙ»½SOE   
        ///id = soe_id-1-fault_block_wr*MACROFAULT_PAGE;   
        id = no-no/MACROFAULT_PAGE*MACROFAULT_PAGE;   
        p_fault = (Uint16* )&fault_record[id];   
        for(i=0;i<(MACROFAULT_BYTE>>1);i++) {*(p_data++) = *(p_fault++);}   
        if (soe_count>0)   
        {   
            soe_count--;   
            if(++soe_id>MACROFAULT_SOE) { soe_id=1; }   
            bitset(&soe_status[0],soe_id-1);//ÖÃSOE״̬±êÖ¾   
        }   
        if (soe_count==0) {soe_id=0;}//SOE´«ÊäÍê³É   
    }   
}   
   
//===========================================================================   
// No more.   














http://shop106094428.taobao.com/index.htm?v=1
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-3-28 20:58

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表