为什么要做这个?
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
这个分支,只是目前最新主干,基于这个做了一个报文记录
下载地址:文章来源:https://www.toymoban.com/news/detail-812495.html
去github下载文章来源地址https://www.toymoban.com/news/detail-812495.html
到了这里,关于libmodbus报文打印、记录;适配多个版本的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!