我正在尝试使用 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)的解释 - 字节序、数据包布局等。使用 wireshark或 tcpdump(1)
找出发送到设备和从设备发送的内容。其他几点:
- 您不需要
bind(2)
套接字的本地端,内核将为您选择一个临时本地端口。 - 一旦
connect(2)
完成,您就可以在套接字上进行双向通信了。 - 不要忽略发送和接收调用的返回值 - 它们可能比您预期的要少。
至于设备本身的工作原理,最好查找制造商文档 并搜索特定于设备的邮件列表、用户组和论坛。
希望这对您有所帮助。
关于sockets - Modbus TCP/IP 设备通信问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12056496/