初级会员 
  
	- 积分
 - 65
 
        - 金钱
 - 65 
 
       - 注册时间
 - 2020-5-6
 
      - 在线时间
 - 43 小时
 
 
 
 | 
 
 本帖最后由 年糕 于 2021-9-10 10:51 编辑  
 
PLC做客户端STM32+W5500做服务端,PLC通过modbusTCP和单片机通讯,PLC和单块板子通讯的时候SOCK没有问题,发送接收也都正常,我这里是先单块板子和PLC单独通讯,这里有四块板子,每一块都是STM32+W5500,但是PLC在和四块板子轮询通讯的时候,SOCK就连接不上了。我查了很多资料,我个人感觉是PLC在轮询的时候,假设和第一块板子连接,正常通讯后,在轮询到第二块板子,但是第一块板子的SOCK并没有完全断开,导致SOCK的通道被占用。。。第二块板子就连接不上,第三块第四块也是同样的问题。我的每块板子IP都不一样,IP地址的最后一位用作MAC地址的最后一位,这样每块板子的MAC地址也就不一样了。。。。请问各位大佬,老哥,有没有做过类似的实验或者项目。怎样让PLC在轮询的时候吧上一块板子的通讯完全断开后,然后再去连接另一块板子。主函数里面: 
int main(void) 
{ 
    SystemInit(); 
        I2C_EE_Init();  
        read_from_24c02(); 
        Watmp_LED_INIT();    /*LED init*/ 
    Waterflow_Sw_Init(); 
    ADC_Init_Config(); 
    DAC_Config_Init(); 
    w5500_init();  
    socket_buf_init(txsize, rxsize)    ;// 3õê¼»ˉ8¸öSocketμÄ·¢Ëí½óêÕ»o′æ′óD¡                 
    DAC_SetChannel2Data(DAC_Align_12b_R,500); 
        DAC_SetChannel1Data(DAC_Align_12b_R,500); 
 
 
    while(1) 
        {         
        ADC_Calculate(); 
                do_tcp_top(); 
        }         
} 
 
 
void do_tcp_top() 
{ 
    u8 status = 0; 
        u16 len = 0; 
         if(RestFlag==2) 
    { 
            RestFlag = 0;  
                  close(0);         
        close(1);         
        mac[5] = local_ip[3]; 
 
        wiz_write_buf(SHAR0, mac, 6);                                          /*½«IPÅäÖÃDÅÏ¢D′èëW5500Ïàó|¼Ä′æÆ÷*/                      
        wiz_write_buf(SUBR0, subnet, 4);         
        wiz_write_buf(GAR0,  gateway, 4); 
        wiz_write_buf(SIPR0, local_ip, 4);          
    }  
 
    status = IINCHIP_READ(Sn_SR(0)); 
 
        switch(status)                                                        
        { 
                case SOCK_CLOSED:                                                 
            socket(0,Sn_MR_TCP,local_port,Sn_MR_ND);                             
            break; 
                  
                case SOCK_INIT:                                                                                                                                         
            listen(0);                             
            break;                 
                 
                 case SOCK_ESTABLISHED:                                                                                                        /*socket′|óúᬽó½¨á¢×′ì¬*/ 
            if(IINCHIP_READ(Sn_IR(0)) & Sn_IR_CON) 
            { 
                IINCHIP_WRITE(Sn_IR(0), Sn_IR_CON);                                                        /*Çå3y½óêÕÖD¶Ï±ê־λ*/ 
            } 
            len=getSn_RX_RSR(0);                                                              /*¶¨òålenÎaòѽóêÕêy¾YμÄ3¤¶è*/ 
            if(len>0) 
            { 
                recv(0,RJ45_Rx_buff,len);                                                                                /*½óêÕà′×ÔServerμÄêy¾Y*/ 
                recvfrom(0,RJ45_Rx_buff, len, remote_ip2,&remote_port2);        /*W5500½óêÕ¼ÆËã»ú·¢Ëíà′μÄêy¾Y*/ 
                Watp_remote_RJ45_reseive(); 
            } 
            break;   
 
                case SOCK_CLOSE_WAIT:                                                                                                               
                           close(0); 
                     break;  
 
        }                 
}         
 
 
IP 端口 MAC地址 
uint8 mac[6]={0x00,0x08,0xdc,0x11,0x11,0x66};  
uint8 mac2[6]={0x00,0x08,0xdc,0x11,0x11,0x25}; 
/* ¶¨òå±¾»úIP1DÅÏ¢*/ 
uint8 local_ip[4] ={192,168,0,102};                                                                                  /*¶¨òåé豸½ó¿úW5500ĬèÏIPμØÖ·*/ 
uint8 subnet[4]={255,255,255,0};                                                                                                  /*¶¨òåW5500ĬèÏ×óíøÑúÂë*/ 
uint8 gateway[4]={192,168,0,1};                                                                                                          /*¶¨òåW5500ĬèÏíø1Ø*/ 
uint16 local_port=502;                                                                  /*¶¨òå±¾μØ¶Ë¿ú*/ 
 
uint8  remote_ip[4]={255,255,255,255};                                                                /*Ô¶¶ËIPμØÖ·*/ 
uint16 remote_port=502;                                                                                                                                     /*Ô¶¶Ë¶Ë¿úoÅ*/ 
 
 
 
/* ¶¨òåIP2óëéÏλ»úí¨DÅDÅÏ¢ */ 
uint8 local_ip2[4] ={192,168,0,102};                                                                                    /*¶¨òåéÏλ»úW5500ĬèÏIPμØÖ·*/ 
uint8 subnet2[4]   ={255,255,255,0};                                                                                                /*¶¨òåW5500ĬèÏ×óíøÑúÂë*/ 
uint8 gateway2[4]  ={192,168,0,1};                                                                                                        /*¶¨òåW5500ĬèÏíø1Ø*/ 
uint16 local_port2 = 502;                                                          /*¶¨òå±¾μØ¶Ë¿ú*/ 
 
uint8  remote_ip2[4]={192,168,0,3};                                                                /*éÏλ»úμÄIP*/ 
uint16 remote_port2=502;                                                                                                                                                                                                     /*Ô¶¶Ë¶Ë¿úoÅ*/ 
 
 
 |   
 
 
 
 |