嵌入式技术论坛
直播中

安德森大

8年用户 1296经验值
擅长:接口/总线/驱动
私信 关注
[问答]

FreeModbus从机长时间运行时会出现死机现象怎么解决

如图

1.jpg

MCU:AT32F403ARCT7
FinSH连串口1
RS485连串口2
用RT-Thread Studio创建工程后,加入FreeModbu slave组件,编译通过,在进行调试过程中出现以下的问题,希望各位大佬赐教。
问题一、用UartAssis.exe软件模拟Modbus主机0x03功能读取从机数据正常

1.jpg

但用Modbus Poll.exe进行调试时却出现这样的情况

1.jpg

这问题不知从何入手进解决?实际应用时是与PLC(主机)联机。

问题二、长时间运行时会出现死机现象,FinSH输出如下信息

1.jpg

追踪源码:

1.jpg

void rt_assert_handler(const char ex_string, const char func, rt_size_t line)
{
volatile char dummy = 0;

if (rt_assert_hook == RT_NULL)
{
ifdef RT_USING_MODULE
if (dlmodule_self())
{
/* close assertion module */
dlmodule_exit(-1);
}
else
endif
{
rt_kprintf("(%s) assertion failed at function:%s, line number:%d \n", ex_string, func, line);
while (dummy == 0);
}
}
else
{
rt_assert_hook(ex_string, func, line);
}
}

另在UartAssist.exe调试窗口发现从机响应报文中的CRC码有错

1.jpg

正确的响应报文应是:01 03 06 00 00 00 00 00 00 21 F5

出现这现象有些板频繁些,有些板很长时间也没出现,现在我暂时用加入看门狗的方法来解决,但我也希望能切底弄清是什么原因?

问题三、我现Modbus串口的波特率是38400,再高就出错了,用UART TTL和RS485都是一样。

但我用雅特力的DEMO板加上我自己做的扩展板,Modbus同样是采用串口2,用UART TTL波特率可到115200,但用RS485也只能到38400,我的接口芯片是SP3485SE EE(与这个有关吗?)

1.jpg

回帖(2)

张玲

2022-9-9 14:21:18
你这个问题会不会是485的通讯问题,你用的是半双工的485芯片,通过控制RE/DE实现双向收发,可能是从机发送完后控制脚立即拉低进入接受状态导致的,建议你用一个HAL_DELY延时1~2ms再将控制脚拉低进入接受状态看看。
举报

李燕

2022-9-9 14:21:28
485从机的串口配置要和modbuspoll打开的串口配置相同。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分