EDA365电子论坛网

标题: 使用libmodbus软件包用一台主机轮询读取两台从机通讯不正常请问这可能是哪里的问题? [打印本页]

作者: abc66    时间: 2022-9-1 11:06
标题: 使用libmodbus软件包用一台主机轮询读取两台从机通讯不正常请问这可能是哪里的问题?
我使用libmodbus软件包,用一台主机轮询读取两台从机,两台从机的地址分别为1和2。当在轮询两台从机之间没有延时,或延时400毫秒以下时,就会有一台从机通讯不上,或通讯不正常;当在轮询两台从机之间延时500ms时,跟两台从机之间的通讯正常;当只轮询其中一台从机时(两次轮询之间间隔20ms),通讯也正常。请问这可能是哪里的问题?代码如下所示:
3 M4 j' i, b8 p' \$ G* X2 E, c/ w
7 d/ b) r: G) k! ?+ n8 Uioext_ctx = modbus_new_rtu("/dev/uart6", 9600, 'N', 8, 1);: r# y" C- R* T2 I/ T! l; `
modbus_rtu_set_serial_mode(ioext_ctx, MODBUS_RTU_RS485);
; P# k; E- f5 Jmodbus_rtu_set_rts(ioext_ctx, RS485_3_EN, MODBUS_RTU_RTS_UP);
: x1 b3 Z( N* d# c! K/ W; nmodbus_connect(ioext_ctx);
; C4 s% w0 J% C! r& J3 @% R$ dmodbus_set_response_timeout(ioext_ctx, 0, 200000);
, I9 a7 Q# v" \% K  R! ~6 b, {for(i=0;i<2;i++)+ n7 [# y% m4 ?  g/ c
{: s; X$ l$ d% H! I; }
modbus_set_slave(ioext_ctx,i+1);. o4 ?3 u3 S' b
modbus_read_input_bits(ioext_ctx,0,9,IOEXT_modbus_bit);0 ?7 a( ]( i$ y/ ~; f* q2 G2 b+ x
rt_thread_mdelay(500);6 H: ]4 h) t. F: J
}
# |1 z( D; S- U" a# q8 N1 h上述代码中的“rt_thread_mdelay(500)”即为轮询两个从机之间的延时。; F. ~7 U, h$ G3 S1 g3 B

作者: opipo    时间: 2022-9-1 13:12
看你线程是如何安排的吧,当前线程不释放控制权,其他线程有可能就得不到执行。
* N. c5 g' \# s+ plibmodbus代码本身是没啥问题的4 r' q$ y& L7 e1 u+ o3 ]

作者: lahhse    时间: 2022-9-1 13:59
单独轮询一台从机,且两次轮询之间没有延时,没什么问题。当轮询两台从机,且轮询第一台从机和轮询第二台从机之间延时小于400ms时,就会有一台从机通讯不上。
" G( m0 j$ Z& K# D8 k! [0 [
作者: Blah    时间: 2022-9-1 14:24
解决方法为在从机端加入如下两行代码:% `; b9 m. H7 a) }) F. [% e
modbus_set_error_recovery(ctx,MODBUS_ERROR_RECOVERY_PROTOCOL);% P& ^8 j* o7 m% l7 a# ?5 ?/ K
modbus_set_byte_timeout(ctx,0,50000);  F1 o0 n' E- m$ g' p
因为默认的为,1、错误不恢复;2、接收端字节间延迟时间为500ms,我这里改为,1、错误恢复;2、接收端字节间延迟时间50ms。修改后,主机轮询两台从机之间间隔50ms,通讯正常。
9 K) c' y- D+ [! E




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