modbus rtu over tcp(modbus tcp gateway)

时间:2018-05-30 12:53:05

标签: arduino raspberry-pi modbus modbus-tcp

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

我有使用modbus RTU连接在一起的plc奴隶,我想通过TCP连接其中一个与我的电脑作为主电源。

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

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

我的目标是使用modbus通过linux盒将pc(与linux盒子联网)连接到那个plc。

3 个答案:

答案 0 :(得分:1)

是的,您可以使用带有以太网端口的Linux机器。

不是一个简单的“ nc”。

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

bcos的两种格式不相同,并且不能互换。

一旦确定这一点,就需要编写一个TCP客户端以连接到从站运行服务器时。

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

最重要的是,您有握手延迟和半开放连接,而没有。

如果是商用设备,则需要查看它也将运行的设置。

希望这会有所帮助

答案 1 :(得分:0)

虽然肯定可以构建Modbus TCP / RTU网关,但由于以下两个原因,您将无法使用简单的nc命令来做到这一点:

  1. 仅包含Modbus功能代码和数据的实际Modbus协议数据单元(PDU)嵌入在应用程序数据单元(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,您将请求写入串行线路,等待答复,然后才写入下一个请求。帧之间必须有3½个沉默字符。

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

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

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

这当然可以在Raspberry Pi上运行,也可能在Arduino上运行,具体取决于您希望队列的大小。


来源:

答案 2 :(得分:0)

我不确定您的要求是什么,但是您可能需要查看以下库。我假设您可以使用Modbus TCP-> RTU库。

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

最好的问候