解决ModbusRTU连接超时错误的方法

ModbusRTU err:connection timeout解决办法

一般遇到问题不要慌 检查以下几条帮你轻松解决:
1、确保链路畅通(也就是串口收发数据是否正常)
2、排查是否硬件有问题
3、程序是否有问题
如若出现下面问题,请查看超时时间是否设置正确
主板运行报错
这种问题出现的原因:
其一是因为串口断开;
其二:超时时间设置异常; 请务必注意这一点 本人在这个上面犯错
解决办法来了
modbus slave设置
里面的响应延时必须是1ms 这个是基于本人用的libmodbus开源库的缘由,库里面的机制是这样的如果超过1ms还没有响应,那么就判定为连接不上。
发现错误原因:本人执行程序 然后查看modbus salve主机接受的码字来进行判断是否为超时时间的问题
有码子 程序还报错肯定就是超时时间的问题啦
到这里该错误就搞定了
顺便附上demo

#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include "modbus.h"  //modbus动态库文件
 
int main(int argc, char *argv[])
{
	uint16_t tab_reg[64] = {0}; //定义存放数据的数组
    modbus_t *ctx = NULL;
 
    int rc;
	int i;
							        //以串口的方式创建libmobus实例,并设置参数
	ctx = modbus_new_rtu("/dev/ttyWCHUSB3", 115200, 'N', 8, 1);					
	if (ctx == NULL)                //使用UART1,对应的设备描述符为ttyS1
	{
    	fprintf(stderr, "Unable to allocate libmodbus contex\n");
    	return -1;
	}
	
	modbus_set_debug(ctx, 1);      //设置1可看到调试信息
	modbus_set_slave(ctx, 1);      //设置slave ID
	
	if (modbus_connect(ctx) == -1) //等待连接设备
	{
    	fprintf(stderr, "Connection failed:%s\n", modbus_strerror(errno));
    	return -1;
	}
	
	while (1)
	{
    	printf("\n----------------\n");
    	rc = modbus_read_registers(ctx, 0, 30, tab_reg);
    	if (rc == -1)                   //读取保持寄存器的值,可读取多个连续输入保持寄存器
    	{
			fprintf(stderr,"%s\n", modbus_strerror(errno));
			return -1;
    	}
    	for (i=0; i<10; i++)
    	{
			printf("reg[%d] = %d(0x%x)\n", i, tab_reg[i], tab_reg[i]);
    	}
		/*printf("=====================reg[48]=%d(0x%x)\n",tab_reg[0],tab_reg[0]);
		printf("=====================reg[49]=%d(0x%x)\n",tab_reg[1],tab_reg[1]);
		printf("=====================reg[50]=%d(0x%x)\n",tab_reg[2],tab_reg[2]);
		printf("=====================reg[51]=%d(0x%x)\n",tab_reg[3],tab_reg[3]);*/
    	usleep(1000000);
	}
    modbus_close(ctx);  //关闭modbus连接
	modbus_free(ctx);   //释放modbus资源,使用完libmodbus需要释放掉
 
	return 0;
}


物联沃分享整理
物联沃-IOTWORD物联网 » 解决ModbusRTU连接超时错误的方法

发表评论