c# 与PLC通讯的问题

C#连接PLC,TCP/IP协议套接字绑定的方式收发数据,网线断后重连可以Send,但是Recieve要等待很久才能收到,程序一直等在那句代码,20s的样子才收到数据 ,以太网调试软件收发又是正常的,有没有高手来帮我解答一下,求解

楼上正解。

1.网络报文抓取下看看你重联后的数据发送是否发出到plc上。

2.监视下你的本地端口2次连接是否不一样。不行就设定本地端口唯一。个人感觉,plc端未超时,不响应你的发送数据。

 

什么型号的PLC,是否是PLC有设置重连时间


                        EndPt = PortList[nums].ToString();
                        AddressIp = IPList[nums].ToString();
                        sockClientIp[i] = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); // 获得文本框中的IP对象;                                                                                                                       // sockClientIp[i].Bind(new IPEndPoint(IPAddress.Any, 0));
                        IPAddress address = IPAddress.Parse(AddressIp); // 创建包含ip和端口号的网络节点对象;
                        IPEndPoint endPoint = new IPEndPoint(address, int.Parse(EndPt));//端口号的网络节点对象plc
                        IPEndPoint endPoint1 = new IPEndPoint(ipa, LocalPort);//PC
                        
                        sockClientIp[i].SendTimeout = 500;
                        sockClientIp[i].ReceiveTimeout = 1000;                       

                        int portt = int.Parse(EndPt);
                        try
                        {
                            sockClientIp[i].Bind(endPoint1);
                            connResult = sockClientIp[i].BeginConnect(endPoint,null,null );                       
                            connResult.AsyncWaitHandle.WaitOne(2000, true);
                            Thread.Sleep(100);
                            if (connResult.IsCompleted != false && sockClientIp[i].Connected == true)
                            {
                                MessageList.Add(IPList[nums] + ">>>>>链接成功>>>>>");
                                index = 1;
                                StrSplit(StrIpa, ref LocalNetworkAdress);
                                StrSplit(AddressIp, ref LNetworkAdress);
                            }
                            else
                            {
                                //sockClientIp[i].Close();
                                MessageList.Add(IPList[nums] + ">>>>链接失败>>>>");
                                index = 0;
                            }
                        }
                        catch (SocketException se)
                        {
                            sockClientIp[i].Close();
                            MessageList.Add(IPList[nums] + ">>链接失败>>>>>" + se.Message);
                            index = 0;
                            break;                        
                        }

这是PLC 链接代码,网线断开重新连接好也绑定好了本地IP和端口,

 Socket sokcc = mthod as Socket;
            byte[] ByteMessage = new byte[1024];
            byte[] receiveData = new byte[1024];
            int length = -1;
            if (sokcc.Connected)
            {
                try
                {
                   
                    length = sokcc.Receive(ByteMessage);     //重连后会接收超时               
                    if (length >= 11 || ByteMessage[0] == 0xD0)
                    {
                        ReceiveStatus = "数据接收成功";
                        receiveData = ByteMessage;
                        ReceiveMesg = 0;
                      
                       
                    }
                    else
                    {
                        ReceiveStatus = "数据接收失败";
                        ReceiveMesg = 0;
                    }
                }
                catch (Exception se)
                {
                    sockStatue = se.Message+"1";                  
                    ReceiveMesg = 10;                   
                }
            }

这里面有Recieve语句

这玩意我也不太懂啊

 

不知道

我看您邀请我了,但我是学C++的,抱歉回答不了这个问题

我没有研究过plc😂

我看你接收Timeout=1000      也就是说超过1秒没接收到数据就应该就过去了啊,怎么会等到20s去了

以我的经验来讲,应该是你的超时设置没有起到作用。如果网络中断程序会默认等待20s左右。而后又收到信息,应该是重新连接后收到的信息了。至于send没有中断那是肯定的,网络中断不是服务器程序中断,所以会继续发信息,直到服务端连接超时才会中断。

建议,检查你的超时设置,确保其正预期时间反馈信息。