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没有中断那是肯定的,网络中断不是服务器程序中断,所以会继续发信息,直到服务端连接超时才会中断。
建议,检查你的超时设置,确保其正预期时间反馈信息。