是否可以使用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
命令来完成,原因有两个:
PDU(仅包含Modbus功能代码和数据,嵌入在应用程序数据单元(ADU(中,因此请求到达正确的设备而不会发生通信错误。此 ADU 对于 RTU 和 TCP 是不同的。通常,ADU 如下所示:
------------------------------------------ | Additional address | PDU | Error check | ------------------------------------------
对于RTU,"附加地址"是标识串行线路上的单元/从机的单个字节,"错误检查"是16位CRC。
对于TCP,"附加地址"是7字节Modbus应用程序协议标头(MBAP(,由事务标识符,协议标识符和长度字段(每个2字节(以及标识单元/从站的单个字节组成(通常为255,但对于网关,这将是其后面的RTU从站的ID(。"错误检查"为空(零字节(,因为TCP已经处理了。
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
此致敬意