使用 freemodbus 托管多个客户端

Posted

技术标签:

【中文标题】使用 freemodbus 托管多个客户端【英文标题】:Hosting multiple clients with freemodbus 【发布时间】:2013-10-10 20:20:16 【问题描述】:

我正在开展一个项目,该项目涉及通过 TCP 上的 Modbus 与 PC 通信的微控制器。我的平台是 STM32F4 芯片,用 C 语言编程,没有 RTOS。我环顾四周,发现了 LwIP 和 Freemodbus,并在让它们都工作时取得了相当大的成功。不幸的是,我现在遇到了一些我不确定如何处理的问题。

我注意到,如果我建立连接,然后断开连接(通过拔下以太网电缆),我将无法重新连接(当然,一旦我重新插入)。 Freemodbus 只允许一个客户端并且仍然注册了第一个客户端。任何尝试连接的新客户端都会被忽略。它不会丢弃第一个客户端,直到在特定的超时时间之后,据我所知,这是一个 TCP/IP 标准。

我的想法是……

    我需要一个可以处理多个客户端的 Modbus 模块。通信丢失后的新客户端请求将被接受,第一个客户端最终将因超时而被丢弃。

    如何修改 Freemodbus 来处理这个问题?那里有例子吗?我自己研究过,这似乎是一个规模不错的项目。 是否有任何好的 Modbus 包可以处理多个客户端、不太昂贵且易于使用?我已经看过几个关于各种选项的线程,但我不确定它们中的任何一个都完全符合我的需要。我很难自己找到任何东西。大多数不支持 TCP,而那些只支持一个客户端。支持多个客户端通常是个坏主意吗?

    我从 PC 连接到微控制器的方式有问题吗?

    为什么 PC 每次尝试重新连接时都会更改端口?如果它保持以前使用的相同端口,这将不是问题

    我应该在停止通信后立即从 Freemodbus 中删除客户端吗?

    这似乎违反了标准,但可能会奏效。

我倾向于 1。尤其是因为无论如何我最终都需要支持多个连接。任何帮助将不胜感激。

谢谢。

【问题讨论】:

谁投票过这个是错误的 - 这是一个非常具体的问题(尽管绝不是一个不常见的问题),发帖人已经考虑了很多。 一般来说,TCP 的设计理念是“真正的计算机”(拥有体面的资源)通过一个可能不可靠但可以恢复的链接与每个计算机对话,并且会遇到相当程度的麻烦以防止新的连接,以免被误认为是旧连接。因此,PC 在其末端使用了一个新的端口号,并且双方都不会立即忘记对方。在高度安全的网络上的资源高度受限的系统上,您可以做的一件简单的事情是让任何传入的连接请求都会导致设备立即忘记任何旧的/现有的连接,但这并非没有风险。 感谢您的回复。我实际上只是实现了你提到的。接受来自相同 IP 地址的新请求,忘记旧/现有连接。绝对同意它有自己的风险。此外,当我最终允许多个客户时,这将是一个问题。现在,它应该可以帮助我前进。不过,我仍然希望有人可能有更好的解决方案。 这里没有什么好的选择。 1) 找到一种使用非标准 ModBus/UDP 实现的方法,2) 将每条消息视为一个连接(一旦发送回复,让您的客户端关闭连接)。如果执行选项 2,可以查看 TCP for Transactions 以最小化 TCP 开销。 @jwdonahue Modbus 并不比 TCP 更古老,实际上它仍在使用,我现在正在使用它。此外,Modbus 提供了一些 TCP 没有的东西,例如您可以映射到具有单个 IP 地址的设备的特定功能的地址。对我来说 Modbus TCP 很好。 【参考方案1】:

如果您对 modbus 客户端的数量有限制,那么在 modbus 实施指南 (https://www.modbus.org/docs/Modbus_Messaging_Implementation_Guide_V1_0b.pdf) 中实际上建议在新连接到达时丢弃旧连接

但是,必须实施一种机制,以防超出的数量 授权连接。在这种情况下,我们建议关闭最旧的未使用 连接。

它有它自己的问题,但一切都是妥协。

关于支持多个客户端...如果您考虑 modbus/rs 服务器 - 它一次只能有一个主服务器。然后用 TCP 替换串行电缆,你就会明白为什么只支持一个客户端并不少见(当然它更容易编程)。虽然很烦人。

根据您正在做的事情,您不需要整个 modbus 协议,并且实现您需要的部分非常容易。当然,如果您必须绝对支持所有内容,那就另当别论了。我没有使用 freemodbus 或任何其他适合您的设置的库,所以我无法提供建议。

关于 PC 每次使用不同的 TCP 源端口 - 这就是 TCP 应该如何工作的方式,并且您这边没有错误。如果它确实重用了相同的源端口,那么它不会帮助你,因为例如序列号是错误的。

关于删除客户端。您可以放弃客户,但最好不要这样做。一些客户端会发送 modbus 命令,通知连接失败,重新连接,但不重新发出命令。这可能是他们的问题,但最好不要经常看到它。当然,电池寿命等因素可能会使计算结果有所不同。

【讨论】:

以上是关于使用 freemodbus 托管多个客户端的主要内容,如果未能解决你的问题,请参考以下文章

freemodbus源码分析

HAL库每天一例freemodbus移植

FreeModbus RTU 移植指南

FreeModbus移植实例(转)

协议 freemodbus的分层结构分析

单片机的freemodbus移植应用