EDA365电子论坛网
标题:
FreeModbus从机长时间运行时会出现死机现象怎么解决
[打印本页]
作者:
Roof0102
时间:
2022-9-28 15:30
标题:
FreeModbus从机长时间运行时会出现死机现象怎么解决
9 l I {9 f8 r4 @
MCU:AT32F403ARCT7
3 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$ m
4 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 N
2 T) Z. j* j \
追踪源码:
" s% @, F4 N2 s: \+ ~1 |4 A1 I! @/ S3 T
/ n& \5 G8 E, X
void 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% r
if (dlmodule_self())
- s- e/ w _% Q
{
8 ]2 h1 I' v6 u
/* close assertion module */
" x( {8 I; ~, Q5 h. k( o
dlmodule_exit(-1);
- `+ g/ [2 J7 _+ {- ?
}
; D) C# ?5 j7 y- g+ B4 D$ j
else
: 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 A
rt_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