This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] RM46L852:TCP/IP 上的 Modbus、TCP Rx 中断中的控制手

Guru**** 2201430 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/675413/rm46l852-modbus-over-tcp-ip-control-hand-in-tcp-rx-interrupt

器件型号:RM46L852

您好!

我们使用 lwip Stack 在 TCP 上实现了 Modbus 协议、而不使用任何 RTOS。 我们的控制每1秒发送一次 Modbus 查询0x03 (读取保持寄存器)和0x10 (写入多个寄存器)。

为了进行测试、我们使用 Modbustools.com 上的 PLC 从 Modbus 仿真器并进行控制。

在卤素模式下、在 EMAC 选项卡下、我们将"接收数据包缓冲区的数量"配置为10。 我们还通过将缓冲区设置为15和30进行了测试、在这两种情况下、控制卡在接收中断中的时间都不到20秒。

我们观察到控制器正常工作几秒钟(反复观察到的控制器工作大约 22秒),然后控制器 在 Rx_Interrupt 处理程序循环中永久挂起,是否有人可以帮助解决此问题?

 

下面附上了查询和响应日志。 下面的日志中突出显示了最后的查询和响应

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Pramod、

    EMAC 模块有用于描述符的8K 字节内部存储器。 EMAC 模块最多可在需要应用程序为其提供服务之前发送和接收512个数据包。

    RX ISR 处理数据需要多长时间? 您的工具将数据发送到 EMAC 的速度有多快? 该工具可能会以太快的速度传输数据包。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    QJ、

    感谢您的回复。

    之前,我们用于将本地缓冲区填充到 Rx ISR 中,并将该数据处理到 Modbus 应用程序代码中。 我们已在主循环中移动了该处理函数、并缩短了 EMAC Rx ISR 时间。

    但我们仍然观察到相同的结果(在 hdkif_rx_inthandler() 函数中发生22秒控制挂起后)。 再观察一下、一旦它卡在 Rx ISR 循环 控制中、开始使 RXDMA 和 RXOver 递增运行 EMAC 寄存器。 请在下面找到捕获的快照。

    我们已检查工具响应时间、并将其设置为10msec。 此外、我们还使用两种不同的工具进行了测试、并观察到相同的行为。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Pramod、

    请限制 Modbus 侧的吞吐量。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 QJ、

    我限制了 Modbus 侧的吞吐量。 现在、控制在200ms 后发送查询、Modbus 工具响应时间也从10ms 增加到100ms。

    但我们仍然观察到同样的结果。  控制卡在 Rx ISR 循环中、如上一个线程中所述。   

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    QJ、

    还有一个观察结果、
    当控制在 hdkif_rx_inthandler 函数中停止时,"rxch->active_head"变为零,因此"CURR_BD"。 我们曾尝试通过制动循环(while (hdkif_swingle_data (curry_bd->flags_pktlen)& EMAC_BUF_DESC_SOP)来设置条件、但控制将启动一些转换、但再次失败。

    我们还有其他 TCP 应用程序(如 httpd 服务器、FTP 客户端、SNTP 客户端和 XCP 协议等)、可以完美运行、没有任何问题。 特定时间后、只有 Modbus over TCP 应用程序失败。

    我请求您,请仔细查看随启动线程附带的日志。 您认为我们错过了什么。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 QJ、

    请提供您的输入。  

    此致、

    Pramod Gaikwad

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

     是否有任何 LWIP 专家可以评论上述 Modbus over TCP 问题? 我被卡住了

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我已经解决了这个问题、

    接收回调函数中的代码错误是我没有释放 pubf 指针。

    在设置以下条件后、

    静态 ERR_t ModbusTCPrecv (void *arg、struct tcp_pcb、struct pbuf *ptrModbusResBuf、err_t errMDRcvtcp)

       if (ptrModbusResBuf)
      {
        //将接收到的数据从 MOBUS TCP 从器件复制到本地缓冲区

        pbuf_free (ptrModbusResBuf);/*添加此条件以解决问题*/
      }

    感谢 QJ 提供的友好支持。