sockets - Modbus TCP/IP 设备通信问题

标签 sockets networking tcp modbus

我正在尝试使用 Modbus TCP/IP 与设备通信。我正在使用 C# 4.0 .NET 套接字,但在从设备获取响应时遇到了问题。由于设备/网络的性质,它必须是异步通信。

现在我可以连接到设备了。当 Connect 命令执行时,设备 LED 亮起表示存在事件连接。然后我执行 Send 命令,指示灯熄灭(意味着我失去了连接),当我收到时,我什么也得不到。我尝试了一堆不同的数据包,但在任何情况下都没有成功。我在想,是不是初始化Socket时的SocketType有问题?可能是我正在尝试使用的端口(当前使用端口 4)吗?

这是我尝试使用的 Modbus TCP/IP 文档: Modbus Documentation

这是我的代码:

sockPort = new Socket(IPAddress.Parse(_commInfo.IPAddress).AddressFamily, SocketType.Stream, ProtocolType.Tcp);   
IPEndPoint m_localhost = new IPEndPoint(IPAddress.Parse(addr.Address.ToString()), 4);    
sockPort.Bind(m_localhost);
sockPort.Connect(new IPEndPoint(IPAddress.Parse(_commInfo.IPAddress), 502));
byte[] rx = new byte[260];

byte[] data = { 0x03, 0x00, 0x20, 0x00, 0x04, 0x45, 0xf0 };

sockPort.Send(data);
var asf = sockPort.Receive(rx);

最佳答案

问题很可能出在您对应用程序 (modbus) 协议(protocol)的解释 - 字节序、数据包布局等。使用 wiresharktcpdump(1) 找出发送到设备和从设备发送的内容。其他几点:

  • 您不需要 bind(2) 套接字的本地端,内核将为您选择一个临时本地端口。
  • 一旦 connect(2) 完成,您就可以在套接字上进行双向通信了。
  • 不要忽略发送和接收调用的返回值 - 它们可能比您预期的要少。

至于设备本身的工作原理,最好查找制造商文档 并搜索特定于设备的邮件列表、用户组和论坛。

希望这对您有所帮助。

关于sockets - Modbus TCP/IP 设备通信问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12056496/

相关文章:

c# - System.Drawing.ImageFromStream上的System.ArgumentException

c++ - 关闭套接字而不等待发送成功 - Winsock2 非阻塞 TCP 套接字

c# - 多客户端,C#中的异步套接字,最佳实践?

c - EPIPE错误没有出现?

java - 核心游戏逻辑循环将数据发送到 Netty 中的 channel

linux - 监控 Web 托管服务器上的传入请求

c - 如何连续发送和接收数据包?

browser - 更快地超时阻塞的 HTTP 资源

java - 如何从 Netty 向客户端发送多个响应

java - 套接字上传递错误