libmodbus报文打印、记录;适配多个版本

为什么要做这个?

        libmodbus可以通过本身的设置,把读取和下发的报文都输出到终端中。这种方式用作平常的调试还行。但是如果相对这些报文单独处理,或者是进行细致化的操作的话,就变得不是很方便。

        所以在原先的基础上,做了一些改变,方便从库中拿到modbus的报文,以方便不同的开发需求。

函数介绍

        不同版本的libmodbus中,读写报文有着不同的区别,但是我都做了适配。 函数命名规则就是在原先的函数的名字加上_msgs。

        以读取功能码3为例子:

//这是库本身读取功能码3的函数
MODBUS_API int modbus_read_registers(
    modbus_t *ctx, int addr, int nb, uint16_t *dest);

/*
这是新增函数,用来接收报文;
参数:
    sbuf:下发报文
    slen:下发报文长度
    rbuf:上送报文
    rlen:上送报文长度(当接收报文失败,长度为0)
返回值:
    保持和libmodbus一致
*/
MODBUS_API int modbus_read_registers_msgs(
    modbus_t *ctx, int addr, int nb, uint16_t *dest,
    uint8_t *sbuf, int *slen, uint8_t *rbuf, int *rlen);

demo

int test01()
{
	modbus_t *ctx;
	ctx = modbus_new_rtu("COM3", 9600, 'N', 8, 1);
	if (ctx == NULL) {
		fprintf(stderr, "Unable to create the libmodbus context\n");
		return -1;
	}
	modbus_set_response_timeout(ctx, 0, 999999);

	modbus_set_slave(ctx, 1);
	//modbus_set_debug(ctx, 1);
	modbus_set_error_recovery(
		ctx,
		MODBUS_ERROR_RECOVERY_LINK
	);
	if (modbus_connect(ctx) == -1) {
		fprintf(stderr, "Connection failed: %s\n", modbus_strerror(errno));
		modbus_free(ctx);
		return -1;
	}

	uint16_t dest[20] = { 0 };
	uint8_t sbuf[20] = { 0 };
	int slen = 0;
	uint8_t rbuf[20] = { 0 };
	int rlen = 0;

	modbus_read_registers_msgs(ctx, 1, 1, dest, sbuf, &slen, rbuf, &rlen);
	// modbus_read_registers(ctx, 1, 1, dest);
	// modbus_read_bits(ctx, 11, 10, sbuf);
	printf("Connection failed: %s\n", modbus_strerror(errno));

	printf("____\n");
	for (size_t i = 0; i < slen; i++)
	{
		printf("%x ", (uint8_t*)sbuf[i]);
	}
	printf("\n");
	for (size_t i = 0; i < rlen; i++)
	{
		printf("%x ", (uint8_t*)rbuf[i]);
	}

	std::cout << slen << " " << rlen << std::endl;


	modbus_close(ctx);
	modbus_free(ctx);
}

结果:

Connection failed: No error
____
1 3 0 1 0 1 d5 ca
1 3 2 0 0 b8 44 8 7

仓库介绍:

        标题中写到“适配多个版本”,而不同的版本在不同分支中。

主分支:只是我fork的开源作者的仓库的主分支罢了。

        该分支,不支持本文说的功能。

分支1:modbus_3.1.2_RTUoverTCP_msg

        首先modbus版本是3.1.2,然后作者并没有完全合到主分支上,根据作者的意思,他也不打算往上面合。

        我的这个分支是跟着另外一个开发者的分支做的改动。

        这个分支的特点是支持RTU跑在TCP链接连接上。

分支2:modbus_3.1.6_unify_file_registers_msg

        首先modbus版本是3.1.6。主分支也没有合并,看作者意思是说要合并了,但是一直没弄。

        同样这个分支也是根据另外一个开发者的分支来做的。

        这个分支的特点是支持功能码20、21.

分支3:modbus_3.1.10_msg

        这个分支,只是目前最新主干,基于这个做了一个报文记录

        

下载地址:

去github下载

你可能感兴趣的:(开源项目,c++,qt,c语言)