初级会员

- 积分
- 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Å*/
|
|