嵌入式技术论坛
直播中

郝埃连

7年用户 1395经验值
私信 关注
[问答]

使用libmodbus软件包用一台主机轮询读取两台从机通讯不正常请问这可能是哪里的问题

您好,我使用libmodbus软件包,用一台主机轮询读取两台从机,两台从机的地址分别为1和2。当在轮询两台从机之间没有延时,或延时400毫秒以下时,就会有一台从机通讯不上,或通讯不正常;当在轮询两台从机之间延时500ms时,跟两台从机之间的通讯正常;当只轮询其中一台从机时(两次轮询之间间隔20ms),通讯也正常。请问这可能是哪里的问题?谢谢!代码如下所示:

ioext_ctx = modbus_new_rtu("/dev/uart6", 9600, 'N', 8, 1);
modbus_rtu_set_serial_mode(ioext_ctx, MODBUS_RTU_RS485);
modbus_rtu_set_rts(ioext_ctx, RS485_3_EN, MODBUS_RTU_RTS_UP);
modbus_connect(ioext_ctx);
modbus_set_response_timeout(ioext_ctx, 0, 200000);
for(i=0;i<2;i++)
{
modbus_set_slave(ioext_ctx,i+1);
modbus_read_input_bits(ioext_ctx,0,9,IOEXT_modbus_bit);
rt_thread_mdelay(500);
}
上述代码中的“rt_thread_mdelay(500)”即为轮询两个从机之间的延时。

回帖(3)

李玲

2022-8-18 10:08:45
看你线程是如何安排的吧,当前线程不释放控制权,其他线程有可能就得不到执行。
libmodbus代码本身是没啥问题的
举报

郝埃连

2022-8-18 10:08:56
单独轮询一台从机,且两次轮询之间没有延时,没什么问题。当轮询两台从机,且轮询第一台从机和轮询第二台从机之间延时小于400ms时,就会有一台从机通讯不上。
1.jpg
2.jpg
以上为通讯不上的从机端的错误信息

举报

李玲

2022-8-18 10:10:27
解决方法为在从机端加入如下两行代码:
modbus_set_error_recovery(ctx,MODBUS_ERROR_RECOVERY_PROTOCOL);
modbus_set_byte_timeout(ctx,0,50000);
因为默认的为,1、错误不恢复;2、接收端字节间延迟时间为500ms,我这里改为,1、错误恢复;2、接收端字节间延迟时间50ms。修改后,主机轮询两台从机之间间隔50ms,通讯正常。
举报

更多回帖

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