使用freemodbus托管多个客户端

46
我正在开发一个使用Modbus over TCP协议的微控制器到PC通信项目。我的平台是STM32F4芯片,使用C语言编程而没有RTOS。我找到了LwIP和Freemodbus,并成功地让它们都工作了。但不幸的是,我现在遇到了一些问题,不知道如何处理。
我注意到如果我建立了连接,然后失去了连接(通过拔掉以太网电缆),我将无法重新连接(当然,插上电缆后)。Freemodbus只允许一个客户端并且仍然注册第一个客户端。任何尝试连接的新客户端都将被忽略。它不会在特定超时周期之前放弃第一个客户端,这个超时周期似乎是TCP/IP标准。
我的想法是...
1.我需要一个可以处理多个客户端的Modbus模块。通信中断后的新客户端请求将被接受,并且第一个客户端将因超时而最终被删除。
- 我要如何修改Freemodbus以处理这种情况?有没有相关示例?我已经研究过自己做,但看起来是一个相当大的项目。 - 有没有好的Modbus包可以处理多个客户端,价格不太昂贵,容易使用?我看到了一些关于各种选项的讨论,但不确定它们是否完全符合我的需求。我很难自己找到任何一个。大多数不支持TCP,而那些支持TCP的只支持一个客户端。通常支持多个客户端是一个坏主意吗?
2.我从PC连接到微控制器的方式有问题吗?
- 为什么PC每次尝试重新连接时都会更改端口?如果它保留了之前使用的端口,这将不是一个问题。
3.我应该立即从Freemodbus中删除客户端吗?
- 这似乎违反标准,但可能有效。

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

谢谢。


8
谁曾经投了反对票,是错误的——这是一个非常具体的问题(虽然并不罕见),发帖人已经认真考虑过了。 - Chris Stratton
通常TCP是用“真实计算机”(具有良好的资源)之间通过可能不可靠但可以恢复的链路进行设计,并且会花费相当大的力气来防止新连接被误认为是旧连接。因此,PC在其端口号上使用一个新的端口号,而双方都不会立即忘记对方。在高度资源受限的系统和紧密安全的网络上,您可以做的一件简单的事情是使任何传入的连接请求立即导致设备忘记任何旧/现有连接,但这并非没有风险。 - Chris Stratton
感谢您的回复。我实际上已经实现了您提到的内容。来自同一IP地址的新请求将被接受,旧/现有连接将被忘记。肯定认为这也带来了自己的风险。此外,当我最终开始允许多个客户端时,这将是一个问题。目前,它应该可以帮助我向前迈进。但我仍然希望有人能提供更好的解决方案。 - JNMarch
2
@jwdonahue Modbus并不比TCP更古老,实际上它仍在使用中,我现在正在使用它。此外,Modbus提供了一些TCP没有的东西,例如您可以将地址映射到具有单个IP地址的设备的特定功能。对我来说,Modbus TCP很好。 - Dali
我的Modbus/TCP实现在每个请求后都会断开连接,以避免资源耗尽。但即使我不这样做,LWIP也没有问题运行多个连接——那只是配置的问题。 - david
显示剩余6条评论
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命令,注意到连接已失败,重新连接,但不重新发出命令。那可能是他们的问题,但在可能的情况下最好不要经常看到它。当然,像电池寿命之类的事情可能会使计算不同。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接