开源改变世界

启用 modbus 会出现硬故障 #64

推推 grbl 3年前 (2023-02-08) 321次浏览
关闭
andrewmarles 打开了这个问题 2022 年 3 月 19 日 · 5 条评论
关闭

启用 modbus 会出现硬故障#64

andrewmarles 打开了这个问题 2022 年 3 月 19 日 · 5 条评论

评论

启用 modbus 会出现硬故障 #64

我仍在尝试深入研究这一点,但想看看是否有其他人看到了这一点。当我使用 STM32F446 启用 modbus 时,我遇到了一个硬故障。这是一块定制板,RS485 是 USART3(PORTC,引脚 5 和 10)。我已经确认我可以成功地将这个端口和引脚与主系统 uart 和 MPG 插件一起使用。通常,开发板使用 USB_CDC 进行发送方通信。

但是,当我启用 modbus 插件时,一旦系统尝试向主流输出任何内容,我就会遇到一个硬故障。调试它在我看来确实没有分配给输出流的指针,但这可能是一个转移注意力的问题。任何见解或建议将不胜感激。

启用 modbus 会出现硬故障 #64
贡献者

这是一个定制板,…

您是否修改了原始的serial.c或者您是否有针对 USART3 的板特定版本?链接到代码?

启用 modbus 会出现硬故障 #64

此时我刚刚修改了 serial.c 以尝试让东西正常工作。我确实需要添加一些从 stmcube 生成的额外初始化代码来让 USART3 发送字节。我的测试树在这里:
https ://github.com/Expatria-Technologies/STM32F4xx/tree/F446_Flexi_Dev

启用 modbus 会出现硬故障 #64
贡献者

这里有一个错误:

https://github.com/grblHAL/Plugins_spindle/blob/ebb158fa23d5619c43960c6338b005af65d5dc97/modbus.c#L489-L507

正确的代码是:


    if(sstream->type == StreamType_Serial && sstream->flags.modbus_ready && !sstream->flags.claimed) {
#endif
        if((claimed = sstream->claim(baud[DEFAULT_BAUDRATE])) && stream_is_valid(claimed)) {

            claimed->set_enqueue_rt_handler(stream_buffer_all);

            stream.set_baud_rate = claimed->set_baud_rate;
            stream.get_tx_buffer_count = claimed->get_tx_buffer_count;
            stream.get_rx_buffer_count = claimed->get_rx_buffer_count;
            stream.write = claimed->write_n;
            stream.read = claimed->read;
            stream.flush_tx_buffer = claimed->reset_write_buffer;
            stream.flush_rx_buffer = claimed->reset_read_buffer;
#if MODBUS_ENABLE == 2
            stream.set_direction = modbus_set_direction;
#endif
            if(hal.periph_port.set_pin_description) {
                hal.periph_port.set_pin_description(Output_TX, (pin_group_t)(PinGroup_UART + claimed->instance), "Modbus");
                hal.periph_port.set_pin_description(Input_RX, (pin_group_t)(PinGroup_UART + claimed->instance), "Modbus");
            }
        } else
            claimed = NULL;
    }

您可以通过将 MODBUS_SERIAL_PORT 定义为端口实例编号来强制选择正确的端口,如果未定义,将使用第一个空闲可用端口。添加#define MODBUS_SERIAL_PORT 1my_machine.h以强制执行它。

我没有测试 USART3/STM32F446 的硬件,但使用 F756 驱动程序进行了测试,使用映射到 PC6/7 的 USART6 用于 Modbus 和 USB CDC 用于主通道。

启用 modbus 会出现硬故障 #64

没问题,将测试并返回报告。

启用 modbus 会出现硬故障 #64

好的,所以上面没有解决我的问题,最后它与 Modbus 无关。发生的事情是我在 my_machine.h 中设置了 SPINDLE_RPM_CONTROLLED。我一直在 IMX 驱动程序中这样做,所以只是复制到 STM32 驱动程序,但由于某种原因,定义似乎没有完全传播——我注意到 SPINDLE_PWM_DIRECT 在 stepper.c 的几个点上没有被正确评估. 我认为这破坏了函数指针,因此当系统尝试写入输出时出错。

我确实尝试将 SPINDLE_RPM_CONTROLLED 放入 platformio.ini,但这也不起作用,所以我将确保在 config.h 中设置它。当我在 config.h 中设置它时,硬故障就解决了。

非常感谢您在这方面的帮助。