【发布时间】:2022-10-19 12:42:33
【问题描述】:
我正在尝试通过无线网络向温度控制器 (PID) 发送 Modbus RTU 消息,该设备接受传入的 TCP/IP 数据包,然后通过 RS455 连接转发其数据(让我们将此设备称为“转换器”):
个人电脑--(WiFi)-->路由器--(RJ45)-->转换器--(RS485)-->PID
该转换器作为 Modbus TCP 到 RTU 转换器销售,但事实并非如此。这造成了一些混乱和挫折。但是,我决定继续使用该设备并重写我的 HMI 代码以向其发送 Modbus RTU 消息,而不是 Modbus TCP 消息。
在我开始重写代码之前,我想确保我知道我在做什么,并且我可以成功地向温度控制器发送请求并接收响应。我决定(也许是天真地)使用 netcat 通过命令行发送此消息是最好的方法。
我发送的 Modbus RTU 消息包含以下请求:
- 设备地址:1
- 功能码:3
- 内存地址:1000
- 寄存器数量:1
- CRC: 51840
转换器上的插座用于:
- IP地址:192.168.0.5
- 端口:2000
因此,我发送的 netcat 命令是:
echo -e -n '\x01\x03\x10\x00\x00\x01\x80\xCA' | nc 192.168.0.5 2000 -p 42998
在另一个终端中,我正在收听:
nc -l 42998
我还使用 Wireshark 捕获流量,这样我就可以看到网络上发生了什么。
网络上发生的事情是:
- 良好而有力的握手
- 来自我机器的 Modbus 请求
- 来自转换器的窗口调整大小通知
- 从我的机器调整窗口大小的确认
- 来自转换器的 Modbus 请求的确认
- 尽可能多的保活
显然,我的 netcat 收听中没有任何显示。
所以我试图弄清楚温度控制器的响应发生了什么。假设错误在于我而不是硬件(并且冒着把你和我搞砸的风险),这就是我认为可能出错的地方 - 或者至少这是我的问题,因为我完全在这一点上超出我的深度:
- Modbus RTU 消息由 11 位字节组成 - 一个起始位、八个数据位、一个停止位和一个奇偶校验位
- 如果我只使用 netcat 发送 8 位字节,那么温度控制器会接收到消息,然后只是将其作为垃圾丢弃,该怎么办?
- 或者如果 netcat 发送了 11 个字节,但奇偶校验不同,甚至停止位和起始位不同,该怎么办?
我稍微研究了这个想法,并尝试了:
stty cs8 parenb -parodd
然后再次发出netcat命令,但没有任何区别,我真的觉得我现在就像河岸上的鱼一样,我正在努力寻找关于tty,终端模拟器的信息等等,这一切都让我点击。
Brits' answer to this SO question 表示这种设备的驱动程序将自己显示为串行端口,而我的设备确实有这样的驱动程序 - 此类驱动程序是否添加了启动、停止和奇偶校验位信息,或者他们是否要求它们出现在输入?
根据您在此类问题上的丰富经验,您有什么想法可能会发生什么?以及如何解决它的任何建议?
【问题讨论】:
-
netcat -l侦听连接,但您的 modbus 设备永远不会尝试建立连接。相反,您的 PC 需要建立连接,发送请求,然后在同一连接上等待响应 - this 可能会有所帮助。我建议使用专门构建的工具,例如modpoll/mbpoll/qmodmaster(带有“Modbus RTU Over TCP/IP”的参数)。 -
@英国人真的吗?它只监听连接?它不会从已经打开的连接接收数据包?我不知道,我读过一篇文章,其中的例子似乎与此相矛盾。无论如何,netcat 监听器几乎不存在,因为我可以看到从 Wireshark 发送的内容。我会尝试您建议的那些工具,但由于我可能不得不编写 Java 代码来做同样的事情,我认为以最简单的方式做事并解决问题是一个好方法掌握所涉及的内容。
-
@Brits 等等......我想我误读了你的评论 - 我不是在做你说我应该做的事吗?
-
netcat -l将侦听新的传入连接,因此在这种情况下并不是很有用。我对正在发生的事情的猜测是nc建立连接,发送请求然后断开连接(请参阅我为选项链接的问题的答案,例如添加-q 2作为参数)。另外我认为您的 crc 错误,请尝试01 03 01 00 00 01 85 F6。我建议从一个已知的好工具开始(你可能有布线问题,所以首先消除它)。 -
@Brits 连接没有被删除 - 我可以看到它在 Wireshark 中保持打开状态。我对我的 CRC 相当有信心,但我肯定会推迟并尝试您的建议。通过使用已建立的工具连接来检查布线的好处。我一定会这样做的。感谢您的提示。非常感谢。