1

我正在尝试与使用 Modbus TCP/IP 的设备进行通信。我正在使用 C# 4.0 .NET 套接字,并且在从设备返回响应时遇到了麻烦。由于设备/网络的性质,它必须是异步通信。

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

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

这是我的代码:

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);
4

1 回答 1

1

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

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

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

希望这可以帮助。

于 2012-08-23T16:01:46.970 回答