modbus rtu over tcp (modbus tcp gateway)



是否可以使用linux盒或arduino构建modbus-RTU以太网网关?

我使用 modbus RTU 将 plc 从站连接在一起,我想通过 TCP 将其中一个与我的 pc 作为主站连接起来。

我想知道我是否可以使用连接到路由器的 linux 盒(rasbery pi/raspbian(,通过将 USB 端口管道连接到某个端口上的本地 ip 作为 modbus 到 tcp 转换器,因为一个 plc 将在 modbus rtu 中连接到 Linux 盒子的 USB 端口。 管道命令将是这样的:

nc -l 5626 > /dev/ttyUSB0 < /dev/ttyUSB0

我的目标是使用 modbus 通过 linux 盒子将一台 PC(与 linux 盒子联网(连接到该 plc。

虽然构建Modbus TCP/RTU网关当然是可能的,但您将无法使用简单的nc命令来完成,原因有两个:

实际的Modbus协议数据单元(
  1. PDU(仅包含Modbus功能代码和数据,嵌入在应用程序数据单元(ADU(中,因此请求到达正确的设备而不会发生通信错误。此 ADU 对于 RTU 和 TCP 是不同的。通常,ADU 如下所示:

    ------------------------------------------
    | Additional address | PDU | Error check |
    ------------------------------------------
    

    对于RTU,"附加地址"是标识串行线路上的单元/从机的单个字节,"错误检查"是16位CRC。

    对于TCP,"附加地址"是7字节Modbus应用程序协议标头(MBAP(,由事务标识符,协议标识符和长度字段(每个2字节(以及标识单元/从站的单个字节组成(通常为255,但对于网关,这将是其后面的RTU从站的ID(。"错误检查"为空(零字节(,因为TCP已经处理了。

  2. RTU 和 TCP 的通信语义是不同的。

    对于 RTU,您将请求写入串行行,等待回复,然后才写入下一个请求。帧之间必须有 31/2 个字符的静音。

    对于 TCP,原则上可以同时提供多个连接。如果您尝试同时将两个TCP请求转发到串行线路,则会出现混乱。

不过,您可以使用比nc稍微复杂的程序构建一个工作网关:

  • 接受TCP端口5626上的连接(请注意,Modbus TCP的实际推荐端口号是502(,将接收到的TCP ADU转换为RTU ADU,并将它们与反向通道一起放入队列中。
  • 程序的另一部分一次从该队列中获取一个项目,通过串行线路发送ADU,并通过反向通道报告结果。然后它继续到下一项,依此类推。
  • 到达反向通道的结果将转换为 TCP ADU,并通过相应的 TCP 连接发送回。

这当然适用于Raspberry Pi,也可能适用于Arduino,具体取决于您希望队列有多大。


来源:

  • http://www.modbus.org/docs/Modbus_Application_Protocol_V1_1b.pdf
  • http://www.modbus.org/docs/Modbus_Messaging_Implementation_Guide_V1_0b.pdf

是的,您可以使用带有以太网端口的 linux 盒。

它不是一个简单的"nc"。

首先,您需要知道,您的PLC是否支持Modbus TCP或Modbus RTU over TCP。

由于两种格式不同,因此它们不可互换。

确定这一点后,您需要编写一个TCP客户端以在从属服务器运行时连接到它们。

如果它们还不支持Modbus TCP,你也需要编写一个TCP服务器。

最重要的是,你有握手延迟和半打开的连接等等。

如果是商业设备,您还需要查看它将运行的设置。

希望这有帮助

我不完全确定您的要求是什么,但您可能想看看以下库。这是一个Modbus TCP->RTU库,我认为你可以使用。

https://github.com/3cky/mbusd

此致敬意

最新更新