Modbus TCP / IP设备通信问题

时间:2012-08-21 13:57:30

标签: sockets networking tcp tcp-ip 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);

1 个答案:

答案 0 :(得分:1)

问题很可能在于您对应用程序(modbus)协议的解释 - 字节顺序,数据包布局等。使用wiresharktcpdump(1)来确定发送到设备和从设备发送的内容。其他一些观点:

  • 您不需要bind(2)套接字的本地端,内核会为您选择短暂的本地端口。
  • connect(2)完成后,您应该在套接字上进行双向通信。
  • 不要忽略发送和接收呼叫的返回值 - 它们可能比您预期的要少。

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

希望这有帮助。