libmodbus RTU从站实现

本文详细介绍了如何使用libmodbus进行RTU从站开发,包括引入库、初始化上下文、与主站通讯等步骤,并提到了RTU与TCP的差异。
摘要由CSDN通过智能技术生成

提示:上一篇文章介绍了libmodbus+Qt TCP从站的实现,相关的文件和资源已经上传至博客,有需要的可以点击跳转,去了解。当然,如果有需要的源文件或者libmodbus中文说明文档的可以私信我。谢谢


前言

modbus rtu通讯在modbus开发中也非常常见,而使用libmodbus更容易帮助开发者在项目中更快的构建modbus模块。下面直接进入使用步骤,详细介绍RTU从站开发的流程。


一、使用步骤

1.引入库

首先必须保证在你的项目中引入了modbus.h和运行目录下有modbus.lib这些文件,具体如图:

 引入modbus.h:

#include <modbus/modbus.h>

2.初始化上下文

引入头文件后,下面就是简单的对上下文件进行构建。这里特别注意的是,RTU与TCP的区别就是,TCP在初始化上下文后,需要使用modbus_tcp_listen()去监听客户端。而RTU则是通过modbus_connect(),相当于串口通讯中的打开串口。

代码如下(示例):

void initModbus()
{
    QString com = "COM1";
    m_ctx = modbus_new_rtu(com.toLocal8Bit().constData(),9600,'N',8,1);  

    if(m_ctx == nullptr)
    {
        qDebug() << "初始化modbus上下文失败"<<modbus_strerror(errno);
        return;
    }

    modbus_set_slave(m_ctx,1);
    modbus_set_response_timeout(m_ctx,1,0);

   
    modbus_connect(m_ctx);
    qDebug() << "等待客户端连接";
    
    mb_mapping = modbus_mapping_new(MODBUS_MAX_READ_BITS, MODBUS_MAX_READ_BITS, MODBUS_MAX_READ_REGISTERS, MODBUS_MAX_WR_READ_REGISTERS);

    if (mb_mapping == NULL) {
        qDebug()<< "Failed to allocate the Modbus mapping" << modbus_strerror(errno);
        return;
    }    

    isLink = true;
    return 
}

3.与主站通讯

初始化后上下文,接下来就是通讯了。和开发tcp 从站一样,可以放入循环中,使用modbus_receive()和modbus_reply()进行回复。

部分代码如下:

while(isLink)
{


    uint8_t query[MODBUS_TCP_MAX_ADU_LENGTH];
    // 等待请求
    rc = modbus_receive(m_ctx, query);
    if (rc > 0) {
    // 处理请求
    QString str= "";
    for(int i = 0; i < 10;i++)
    {
         str += QString("%1").arg(query[i]);//不用管接收的是什么,能连接上就可以

    }
    qDebug() << str ;//3 5 //第8位是功能码
    modbus_reply(m_ctx, query, rc, mb_mapping);
}

在这次开发中发现modbus_receive()其实也是一个阻塞的,会直到将数据接收完毕才会运行下面的代码。这里在我的中文文档中也会同步更新。接下来就可以进行测试了,测试结果如图:

向寄存器0中写入12前

 

 写入成功之后:


总结

好了,本次的分享到这就结束了。希望对大家会有帮助。有不对的地方也欢迎大家指出,谢谢。

  • 7
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值