提示:上一篇文章介绍了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前
写入成功之后:
总结
好了,本次的分享到这就结束了。希望对大家会有帮助。有不对的地方也欢迎大家指出,谢谢。