我正在尝试与使用Modbus TCP/IP的设备进行通信。我正在使用C#4.0 .NET套接字,在从设备返回响应时遇到麻烦。由于设备/网络的性质,它必须是异步通信。
现在,我可以连接到设备了。当Connect
命令执行时,设备LED点亮,表示存在 Activity 连接。然后,我执行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)的解释-字节序,数据包布局等有关。请使用wireshark或tcpdump(1)
找出发送至设备或从设备发送的内容。其他一些要点:
bind(2)
套接字的本地端,内核将为您选择一个临时本地端口。 connect(2)
完成,就应该在套接字上进行双向通信。 至于设备本身的工作方式,最好是寻找制造商的文档
并搜索特定于设备的邮件列表,用户组和论坛。
希望这可以帮助。