0

我们需要向侦听 502 端口的远程 modbus 服务发送消息,并获取设备信息作为响应,就像从运行 modbus 的 IP 地址搜索时shodan ( https://www.shodan.io ) 所做的一样服务。我们已经阅读了 modbus 规范并尝试构建一条消息,但我们通过 TCP 将它发送到服务器并且它从未响应。例如,以下消息应该可以解决问题,但对我们不起作用:

002B0E0104
00: address, not used.
2B: function code for get information
0E: additional function code for get device information
01: read device ID code
04: object ID.

我们应该如何构建正确的消息并获取设备信息作为响应?

4

2 回答 2

1

不要求 Modbus 设备实际支持功能代码 0x2B。

根据我的经验,这是非常罕见的。

于 2016-03-14T15:32:13.883 回答
0
  • 我发现 modbus 协议有 2 种构建消息的模式:ASCII 和 RTU。我使用的是 ASCII,但它很糟糕,因为我发现 TCP 上的 modbus 服务使用 RTU 模式。
  • 此外,当它通过 TCP 时,modbus 消息不能有地址字节和错误检查字节,我正在构建带有该字节的消息。
  • 我做错的第三件事是,当 modbus 通过 TCP 时,它的消息必须在开头包含一个我没有插入的 7 字节标头。

所有这些都描述在: https ://scadahacker.com/library/Documents/ICS_Protocols/Acromag%20-%20Introduction%20to%20Modbus-TCP.pdf

例如,格式良好的消息(以十六进制表示)可以是:

000000000005002B0E0106

至少,服务器给了我一个可读的响应。消息必须从十六进制转换为二进制,然后插入 TCP 数据包的数据部分,该数据包将发送到服务器的 502 端口,并通过包含服务器 IP 的 IP 数据包。Linux nc 命令允许您在 TCP 数据包内发送消息,因此您不必处理 OSI 层。我的问题是我发送到服务器的消息不符合 modbus/TCP 协议规则。

于 2016-03-14T16:30:46.450 回答