使用freemodbus托管多个客户端

JNM*_*rch 20 c embedded tcp modbus

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

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

我的想法是......

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

    • 如何修改Freemodbus来处理这个问题?那里有例子吗?我已经考虑过自己做这件事,看起来这是一个规模很大的项目.
    • 是否有任何好的modbus包可以处理多个客户端,是不是太昂贵和易于使用?我已经看过几个关于各种选项的线索,但我不确定它们是否满足我的需要.我很难找到自己的东西.大多数不支持TCP和仅支持一个客户端的TCP.支持多个客户端通常是个坏主意吗?
  2. 我如何通过PC连接微控制器有问题?

    • 为什么每次尝试重新连接时PC都会更改端口?如果它保持之前使用的相同端口,这将不是问题
  3. 一旦我停止沟通,我应该从Freemodbus中删除客户端吗?

    • 这似乎违反标准,但可能有效.

我倾向于1.特别是因为我最终还是需要支持多个连接.任何帮助,将不胜感激.

谢谢.

小智 1

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

然而,必须实施一种机制来防止超过授权连接的数量。在这种情况下,我们建议关闭最早未使用的连接。

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

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

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

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

关于流失客户。你可以放弃客户,但最好不要这样做。有些客户端会发送 modbus 命令,注意到连接失败,然后重新连接,但不会重新发出该命令。这可能是他们的问题,但如果可能的话,最好不要经常看到它。当然,诸如电池寿命之类的因素可能会使计算结果有所不同。