当前位置: 首页 > 知识库问答 >
问题:

现场Modbus RTU硬件响应延迟不正确

钱华晖
2023-03-14

我们在该领域有硬件,可以使用RS-485/Modbus RTU(1200,9600,一直到115200)以各种不同的波特率进行通信。

在我们的设备上运行的固件有一个小错误,其中Modbus RTU响应延迟是固定的,并根据运行在115200波特计算。这个问题一直没有被注意到,直到最近我们的一个客户开始使用1200波特率。看来115200的响应延迟对9600以下的所有事情都足够了。

但是,在1200波特率下,响应包的第一个字节被遗漏了(我假设是由于在1200波特率下从发送切换到接收所需的时间)。如果请求的是一个大数据包,情况就可以了(因为设备将数据包放在一起所花费的时间弥补了延迟的不足),尽管大多数数据包都被破坏了。

不幸的是,升级这些设备上的固件以使用正确的/更长的响应延迟并不是一个选项。有没有人有任何想法,关于我们如何可以取回完整的包在1200波特?(响应延迟不正确,当前导致错过1个字节)

我唯一能想到的想法是,每次请求都从软件中请求过多的寄存器,从而导致延迟增加。

共有1个答案

杜骏祥
2023-03-14

如果我正确理解你的问题,我曾经有过同样的问题。

我被叫去解决一个非常不可靠的Modbus链接的故障,这个链接经常出现故障,但在很短的一段时间内,它都正常工作。

事实证明,从服务器上的固件有一个问题:它在收到查询的停止位后立即触发其Modbus答案。于是部分答案在主人来得及解脱大巴之前就传了出来(图中黄色箭头)。

当时,我们对更新固件的前景并不满意,所以我们首先探索了其他选择。我们想出的最好的办法是在主控器(施耐德电气的PLC)上设置了一个设置,允许调整主控器在停止位后断言总线的时间。

手册中是这样定义的:

我隐约记得我们能够改善这种情况,但有一个看门狗触发一个警报的地方,每次有一个错误,所以这个解决方案被认为是不可接受的,我们必须更新固件。

不知何故与你的问题有关,我曾经测量过使用硬件方向控制和软件解决方案释放总线所需的时间。你可以在这里看到一些细节。如果更新固件对你来说是不可能的,我想摆弄收发器也不会是一个选择...在这个问题的最后,我连接了一个电路来自动切换RS485链路的方向控制线。如果你的主人不能更快地切换,这可能是一个(不可否认的)解决方案。

 类似资料:
  • 我正在用Netty框架创建一个代理,但我注意到收到的最后一条消息在传递到下一个节点之前往往会延迟。 设计: 客户| 基本上,当服务器在将消息传递给客户机之前启动消息时会出现延迟,或者如果服务器在第一条消息之后立即发送后续消息,那么第一条消息就会通过,第二条消息会延迟几秒钟。为什么会这样?是否缺少一些配置参数?

  • 首先,是否有人对GRPC客户机服务器实现与websocket protobuf客户机服务器实现之间的吞吐量/延迟进行了性能比较?或者至少是类似的东西。 为了实现这一目标,我正在试用示例JAVA helloworld grpc客户机服务器,并尝试将响应的延迟与类似的websocket客户机服务器进行比较。目前,我正在本地机器上用客户端和服务器进行测试。 websocket客户端服务器在服务器端有一个

  • 问题内容: 我正在尝试使用新的React Lazy和Suspense创建后备加载组件。这很好用,但后备时间仅显示几毫秒。有没有办法增加额外的延迟或最短时间,因此我可以在渲染下一个组件之前显示该组件的动画? 现在懒导入 等待组件: 我可以做这样的事情吗? 问题答案: 函数应该返回对象的承诺,该对象由具有默认导出功能的模块返回。不会返回承诺,也不能那样使用。尽管任意承诺可以: 如果目标是提供 最小的

  • 我试图将SDL程序限制为60 FPS,并使用以下代码计算FPS: 但似乎SDL_Delay以某种方式影响了SDL_GetTicks的返回值,因此time_delta得到的值类似于0到3,而当我只删除最后2行时,它通常约为15。 对我来说,这毫无意义。有人知道怎么回事吗? 编辑: 上面的代码基本上是我程序的主循环。我首先实现了一个fps计数器,通过在start_time和afterwords中计算多

  • 问题内容: 因此,当我运行此代码时,我的JFrame变得无响应。我设法将其追溯到gameLoop()下的while循环。无论使用其中调用Thread.sleep()的delay(1000 / FRAMERATE),它都不允许键或鼠标侦听器执行其工作。 下面的完整代码,gameLoop()中存在问题 如果很重要,程序将从此处开始,然后转到Game类 可能无关紧要,但这是github存储库的插件htt

  • 对我如何做到这一点有什么建议吗? 这是我到目前为止编写的代码,但它似乎忽略了Thread.Sleep并且只使第三个代码变为蓝色。