EDA365电子论坛网

标题: FreeModbus从机长时间运行时会出现死机现象怎么解决 [打印本页]

作者: Roof0102    时间: 2022-9-28 15:30
标题: FreeModbus从机长时间运行时会出现死机现象怎么解决

9 l  I  {9 f8 r4 @MCU:AT32F403ARCT73 f; q+ H7 e4 O% d5 R
FinSH连串口1* E9 d2 E& \/ O. L& K; k) H) k0 X
RS485连串口2
: Z& h: I, q! `/ J6 m3 a用RT-Thread Studio创建工程后,加入FreeModbu slave组件,编译通过,在进行调试过程中出现以下的问题,希望各位大佬赐教。8 b! U6 _) L0 ?) e3 Y' z, @
问题一、用UartAssis.exe软件模拟Modbus主机0x03功能读取从机数据正常
( t% N8 T: @1 T5 z; a( @) O- |: V' E$ m4 S( l8 w- A! @
但用Modbus Poll.exe进行调试时却出现这样的情况  L" W! d& L- Z( C" S9 u( p2 S1 u
" u0 h' z. [4 J8 u# l  K2 ]
这问题不知从何入手进解决?实际应用时是与PLC(主机)联机。& D8 }; j, d! _$ T% A

, H* j0 P" D5 D9 z! z0 \7 r# _问题二、长时间运行时会出现死机现象,FinSH输出如下信息
% [0 p9 P! X4 M: s3 N2 T) Z. j* j  \
追踪源码:" s% @, F4 N2 s: \+ ~1 |4 A1 I! @/ S3 T

/ n& \5 G8 E, Xvoid rt_assert_handler(const char ex_string, const char func, rt_size_t line)( W* ~! q( e" ?
{4 S0 Y' r5 }+ R" i
volatile char dummy = 0;: y3 f9 X8 o9 p$ @! o5 `
, |! v8 w2 g/ W  J+ {! h7 K' G
if (rt_assert_hook == RT_NULL)' Q, ^0 s$ y- X+ N( l/ ~
{1 T% a6 z* J" C; i5 w- {
ifdef RT_USING_MODULE
) n8 e, r4 `* x. t% rif (dlmodule_self())
- s- e/ w  _% Q{
8 ]2 h1 I' v6 u/* close assertion module */
" x( {8 I; ~, Q5 h. k( odlmodule_exit(-1);
- `+ g/ [2 J7 _+ {- ?}
; D) C# ?5 j7 y- g+ B4 D$ jelse: X; k! L' y& W2 [
endif
9 e5 B* k; A$ M$ y% D9 ^, z6 Q3 P{4 c% n' w' k# i$ ~, O3 h4 P
rt_kprintf("(%s) assertion failed at function:%s, line number:%d \n", ex_string, func, line);, q, u  f' y! L' g# _9 J
while (dummy == 0);
% A- a# T/ Y1 H0 S+ p! M+ w}6 |% x, r, e: ^( o
}3 c% a8 V- T; H& n
else
, A  B* \/ e' _7 o{
6 ?+ x" C8 w0 d* N7 h/ V0 Art_assert_hook(ex_string, func, line);
. I0 ^, y6 s8 o/ x4 x, y}
' w8 j  [6 f/ l$ M0 i$ j6 A- {}
& j: U: y, Z  T5 V8 m/ G
; [2 x) I& l0 k& c$ R另在UartAssist.exe调试窗口发现从机响应报文中的CRC码有错
, Z7 H5 K- q3 C3 ]+ M7 N, F0 Q- b( h
3 Z( U* H( d- F正确的响应报文应是:01 03 06 00 00 00 00 00 00 21 F5
; j$ ?7 \6 g) N, e4 h' G3 J) ?5 Y" j
; E* y8 e2 H/ F2 D0 X2 Y5 j出现这现象有些板频繁些,有些板很长时间也没出现,现在我暂时用加入看门狗的方法来解决,但我也希望能切底弄清是什么原因?1 E6 O: b9 F" {0 d6 }8 }6 b

+ Y' E1 j2 b8 ?5 I9 T问题三、我现Modbus串口的波特率是38400,再高就出错了,用UART TTL和RS485都是一样。: o5 W9 ^9 U% L
: f5 Z0 r) t) y8 i+ F
但我用雅特力的DEMO板加上我自己做的扩展板,Modbus同样是采用串口2,用UART TTL波特率可到115200,但用RS485也只能到38400,我的接口芯片是SP3485SE EE(与这个有关吗?)
# U4 e6 d( `/ L" V& ]' A7 N* S7 Y( a. I& x
; Y. l9 O1 @1 Q/ {

作者: on1e    时间: 2022-9-28 16:08
会不会是485的通讯问题,你用的是半双工的485芯片,通过控制RE/DE实现双向收发,可能是从机发送完后控制脚立即拉低进入接受状态导致的,建议你用一个HAL_DELY延时1~2ms再将控制脚拉低进入接受状态看看。" u6 c2 B8 l/ w# |' |$ k( [! S

作者: MrL1    时间: 2022-9-28 16:56
485从机的串口配置要和modbuspoll打开的串口配置相同。5 Y! I  V' g# z6 \/ E9 K





欢迎光临 EDA365电子论坛网 (https://bbs.eda365.com/) Powered by Discuz! X3.2