使用 Netcat 通过 TCP 发送 Modbus RTU 请求并捕获响应

问题描述 投票:0回答:2

假设我有一个 Modbus RTU 温度控制器,连接到一个设备,该设备从网络读取 TCP 数据包,并通过 RS485 将所述数据包中的有效负载发送到温度控制器。如果我想通过在 Linux 命令行上使用 netcat 通过 TCP/IP 发送 Modbus RTU [读取输入寄存器] 请求来测试这样的设置,假设可以的话,完整的命令是什么?

nc 192.168.0.5 2000   # ...what now?

假设以下详细信息适用:


  • 设备地址:1
  • 功能码:3(读输入寄存器)
  • 内存地址:1000H
  • 不。寄存器数量:1

  • 服务器IP地址:192.168.0.5
  • 客户端IP地址:192.168.0.4
  • 服务器端口:2000

我觉得我也可以使用 netcat 来监听响应。我可以这样做吗:

nc -l 3456

这样可以吗?要像这样发送请求并记录响应,我想我必须将发送请求的端口指定为 3456(或其他端口)。有办法做到吗?

特别是,我对如何将 [01][03][1000H][01][CRC] 等 Modbus 消息转换为其等效字节感到困惑。

提前非常感谢。

linux modbus netcat rs485
2个回答
2
投票

您可以使用以下方式发送原始字节:

echo -e '\x04\x03...' | nc host port

特别是,我对如何将 [01][03][1000H][CNC] 这样的 Modbus 消息转换为其等效字节感到困惑。

那就是:

echo -e '\x01\x03\x10\x00...' | nc host port

我不会为你计算,因为我认为除了为了好玩之外,做这样的事情没有任何意义。

您必须将 Modbus 帧的所有部分放在一起,只需 google 即可。最困难的部分是计算帧末尾的 CRC。我想这就是你所说的 CNC 的意思吗?

如果你遇到困难,我建议你尝试像QModMaster这样的东西。使用菜单 view Raw Data 查看原始数据并使用这些字节。

请注意,除了构建帧之外,QModMaster 还能够发送它们,甚至侦听和接收响应。这应该是您的 Modbus 一站式商店。您还可以找到许多其他工具,例如 pymodbus、libmodbus、minimalmodbus,甚至适用于 Windows 和 Linux 的命令行工具。

如果您编辑问题以提出需要使用

nc
的合理理由(显然不是为了好玩),也许我可以尝试提供更多帮助。

我找不到任何有关使用 netcat 发送和/或接收 Modbus 帧的参考资料。我不确定这是因为我搜索的时间不够长还是因为它毫无意义......也许两者都是。


0
投票

如果它对任何人都有用,这个问题的答案是:

echo -e -n '\x01\x03\x10\x00\x00\x01\x80\xCA' | nc 192.168.0.5 2000

-e 允许转义字符的转换
-n 防止附加换行符

使用 Netcat 监听传入消息不起作用,显然是因为各个 Netcat 进程想要自己建立 TCP 连接,否则它对到达指定端口的任何内容都不感兴趣。尽管如此,我仍然能够使用 Wireshark 看到从设备返回的回复,并且还写入了寄存器并成功控制了设备。

© www.soinside.com 2019 - 2024. All rights reserved.