OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6649|回复: 7

PLC做客户端STM32+W5500做服务端,PLC通过modbusTCP和单片机通讯,单块板子通讯的时候SOCK没有问题

[复制链接]

20

主题

70

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2020-5-6
在线时间
43 小时
发表于 2021-9-10 10:49:41 | 显示全部楼层 |阅读模式
本帖最后由 年糕 于 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Å*/


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

20

主题

70

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2020-5-6
在线时间
43 小时
 楼主| 发表于 2021-9-10 10:50:04 | 显示全部楼层
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;                   }                 }       
回复 支持 反对

使用道具 举报

20

主题

70

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2020-5-6
在线时间
43 小时
 楼主| 发表于 2021-9-10 10:52:41 | 显示全部楼层
回复 支持 反对

使用道具 举报

20

主题

70

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2020-5-6
在线时间
43 小时
 楼主| 发表于 2021-9-10 10:53:06 | 显示全部楼层
原子哥,麻烦帮忙看看感激不尽
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手上路

积分
45
金钱
45
注册时间
2015-11-15
在线时间
6 小时
发表于 2022-4-26 12:48:09 来自手机 | 显示全部楼层
只和一块板子就没问题了吗?
回复 支持 反对

使用道具 举报

0

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
127
金钱
127
注册时间
2020-1-11
在线时间
21 小时
发表于 2022-7-14 10:46:35 | 显示全部楼层
很好11111111111111111111111
回复 支持 反对

使用道具 举报

0

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
127
金钱
127
注册时间
2020-1-11
在线时间
21 小时
发表于 2022-7-14 10:46:59 | 显示全部楼层
回复 支持 反对

使用道具 举报

0

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
127
金钱
127
注册时间
2020-1-11
在线时间
21 小时
发表于 2022-7-14 10:47:21 | 显示全部楼层
:lol:lol:lol:lol
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-25 12:28

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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