QT技巧系列(9)QModbusTcpClient使用Modbus Tcp客户端程序示例及代码

本文详细介绍了采用QModbusTcpClient类作为MODBUS客户端程序的主要流程和主要函数示例代码,供大家参考。

包含文件:

#include <QModbusDataUnit>

#include <QModbusTcpClient>

#include <QModbusRtuSerialMaster>

1、首先连接到服务端

构造函数中

//QModbusClient *modbusDevice;

modbusDevice = new QModbusTcpClient(this);

connect(modbusDevice, &QModbusClient::stateChanged,

this, &loraThread::onStateChanged);//连接状态发生改变时处理函数(connect or discennect)

连接函数代码:

void loraThread::connectJzq()
{qDebug()<<"开始连接线程:"<<QThread::currentThread();  //显示当前线程的数值if(!modbusDevice){return;}if(modbusDevice->state() != QModbusDevice::ConnectedState){const QUrl url = QUrl::fromUserInput("192.168.2.111:502"); //;//获取IP和端口号modbusDevice->setConnectionParameter(QModbusDevice::NetworkPortParameter, url.port());modbusDevice->setConnectionParameter(QModbusDevice::NetworkAddressParameter, url.host());modbusDevice->setTimeout(500);modbusDevice->setNumberOfRetries(3);if(!modbusDevice->connectDevice())//连接失败{isConnected = false;}else//成功连接{isConnected = true;}}else{isConnected = false;modbusDevice->disconnectDevice();//emit change2Con();}qDebug() << modbusDevice->state();}

2、发送读或写请求到服务端

写请求代码:

给QModbusDataUnit赋值后发送写请求sendWriteRequest,写到相应寄存器中的相应位置,操作成功,没有发生错误的话sendWriteRequest将返回一个QModbusReply,否则返回空指针。当reply完成或放弃后reply->isFinished()将返回true。

void loraThread::on_writeTor(QString t)
{if (!modbusDevice)return;QModbusDataUnit writeUnit = QModbusDataUnit(QModbusDataUnit::HoldingRegisters, 4, 2);for (uint i = 0; i < writeUnit.valueCount(); i++){int ii = static_cast<int>(i);int j = 4*ii;QString st = t.mid (j,4);bool ok;int hex =st.toInt(&ok,16);//将读取到的数据转换为16进制发送quint16 qhex =static_cast<quint16>(hex);// qDebug()<<writeUnit.valueCount();writeUnit.setValue(ii,qhex);}if (auto *reply = modbusDevice->sendWriteRequest(writeUnit, 1)) {//1->modbus 地址if (!reply->isFinished()) {connect(reply, &QModbusReply::finished, this, [this, reply]() {if (reply->error() == QModbusDevice::ProtocolError){emit statusBar(tr("Write response error: %1 (Mobus exception: 0x%2)").arg(reply->errorString()).arg(reply->rawResult().exceptionCode(), -1, 16));} else if (reply->error() != QModbusDevice::NoError){emit statusBar(tr("Write response error: %1 (code: 0x%2)").arg(reply->errorString()).arg(reply->error(), -1, 16));}reply->deleteLater();});} else {// broadcast replies return immediatelyreply->deleteLater();}} else {emit statusBar(tr("Write error: ") + modbusDevice->errorString());}}

读请求代码:

发送sendReadRequest读请求,成功则异步函数回调处理读回的数据,错误则进行相应的处理。代码如下:

void loraThread::readDevice()
{if(!isConnected)return;if (!modbusDevice){return;}qDebug()<<"read device";QModbusDataUnit readUnit = QModbusDataUnit(QModbusDataUnit::HoldingRegisters, 520, 50);if (auto *reply = modbusDevice->sendReadRequest(readUnit, 1))   //1->modbus设备地址{if (!reply->isFinished()){connect(reply, &QModbusReply::finished, this, &loraThread::toReadReady);}else{delete reply; // broadcast replies return immediately}}else{//emit statusBar(tr("Read error: ") + modbusDevice->errorString());}QThread::msleep(1);}

读请求成功异步回调函数处理读回的数据,参考代码如下:

void loraThread::toReadReady()
{
//QModbusReply这个类存储了来自client的数据,sender()返回发送信号的对象的指针auto reply = qobject_cast<QModbusReply *>(sender());if (!reply){return;}if (reply->error() == QModbusDevice::NoError){//处理成功返回的数据const QModbusDataUnit unit = reply->result();//quint16 stat = unit.value(1);  //状态(位与关系)。。。。。。}else if (reply->error() == QModbusDevice::ProtocolError){emit statusBar(tr("Read response error: %1 (Mobus exception: 0x%2)").arg(reply->errorString()).arg(reply->rawResult().exceptionCode(), -1, 16));}else{emit statusBar(tr("Read response error: %1 (code: 0x%2)").arg(reply->errorString()).arg(reply->error(), -1, 16));}reply->deleteLater();}

状态变化处理代码:

void loraThread::onStateChanged(int state)//连接状态发生改变时处理函数(connect or discennect){if (state == QModbusDevice::UnconnectedState){//ui->connectButton_2->setText(tr("Connect"));isConnected = false;//emit updateCount("0,0");}else if (state == QModbusDevice::ConnectedState){//ui->connectButton_2->setText(tr("Disconnect"));isConnected = true;}
}

注:实战示例,解疑答惑。

           --不间端地思考,实时地批判你的工作!

QT技巧系列(9)QModbusTcpClient客户端程序示例及代码相关推荐

  1. QT技巧系列(5)按时间顺序列出目录下所有的文件名

                                   QT技巧系列(5)按时间顺序列出目录下所有的文件名 包含文件 #include <qstringlistmodel.h> #i ...

  2. 使用QT编写TCP服务器与客户端程序

    建立工程 在学习了霍亚飞的<Qt Creator快速入门(第3版)>后,参考"18.4 TCP"中的示例程序,编写了一个在同一个工程中实现服务器与客户端的习作程序,变量 ...

  3. 表白技巧升级,大神程序员表白代码泄露(内含彩蛋)!

    七夕快到了,表白素材赶紧先准备好... 1.委婉的表白 Python 代码: import string l = string.ascii_letters s = [] s.append(l[34]) ...

  4. Spring Restful Web服务示例 - 使用JSON/Jackson和客户端程序

    Spring Restful Web服务示例 - 使用JSON/Jackson和客户端程序 Spring是最广泛使用的Java EE框架之一.我们之前已经看到了如何使用Spring MVC来创建基于J ...

  5. Spring Restful Web服务示例 - 使用JSON,Jackson和客户端程序

    Spring Restful Web服务示例 - 使用JSON,Jackson和客户端程序 Spring是最广泛使用的Java EE框架之一.我们之前已经看到了如何使用Spring MVC来创建基于J ...

  6. 【微信小程序系列】微信小程序超简单教程,基本语法,获取用户基本数据信息,实现对云数据库的增删改查及小程序外部api的引用示例(附源码)

    [微信小程序系列]微信小程序超简单教程 小程序项目结构 静态页面的构成 HTML:结构 css:样式 js:行为 小程序 页面全部存放在pages, 而且pages目录只能存放页面 页面包括4个文件, ...

  7. QT实现OPC_UA客户端程序以及与OPC_UA服务器通信

    1.OPC_UA服务器准备工作 1.关于OPC_UA服务器的搭建可以参考前面一篇文章:https://blog.csdn.net/xipengbozai/article/details/1150809 ...

  8. 三菱FX系列PLC和台达ASDA-B2伺服驱动器位置控制接线和程序示例

    三菱FX系列PLC和台达ASDA-B2伺服驱动器位置控制接线和程序示例 如下图所示,为台达ASDA-B2伺服驱动器的接线实物图,其中CN1接各种I/O控制信号,CN2接伺服电机编码器反馈线, CN1接 ...

  9. 关于Qt客户端程序开发的一些思考

    最近一直忙于新项目Qt客户端程序的开发工作,对于整个项目开发中的一些坑点做一些总结,余惟愿诸友远避之. 1.关于UI界面开发.我的建议是,能用贴图就贴图.尽管我们知道Qt提供了"强大&quo ...

  10. 【QT从零开始系列12】QT学习心得及资源汇总

    文章目录 下载方面 Qt官网下载(非常慢) Qt 国内镜像站下载(较快) 书籍 C++ GUI Qt 4编程(第二版).pdf Qt5 开发实战 Qt5 开发及实例 Qt Creator快速入门 视频 ...

最新文章

  1. 顺序表-顺序表表示集合-差集(for + while ,不断遍历)
  2. 网络编程学习笔记(getnameinfo函数)
  3. 支付宝支付 - 异步通知与同步通知
  4. 前端学习(1350):用户的增删改查操作7增删改查
  5. 利用 cwRsync 实现代码(文件)同步的解决办法
  6. 【Node全局变量global模块】
  7. 自学python到什么程度可以找工作-Python学到什么程度就可以找工作?
  8. heic格式转化jpg方法
  9. 按照特定名字批量创建文件夹
  10. Office ❀ PPT图形中的合并形状梳理
  11. 美团面试被问“红黑树”,我一脸懵逼......
  12. 电商收付通系列⑤,商户进件之二级商户进件申请
  13. 【小程序开发】ios中时间显示为NaNNaN
  14. 学测绘和计算机,测绘工程就业方向与前景 女生学测绘好找工作吗
  15. 计算机顶会论文多少钱,计算机视觉顶会文章的解读汇总(CVPR/ECCV/ICCV/NIPS)
  16. swoole 点对点发送消息推送
  17. java实现 mysql导入数据库_Java实现MySQL数据库导入
  18. 历代诗词咏宁夏注释1----常星景: 六盘
  19. C语言自定义函数的调用
  20. 通俗易懂了解50个IT专业术语

热门文章

  1. 制度决定成败:揭秘思科顶层设计的秘密
  2. spacy实体关系抽取_使用spacy从Wikipedia文章中命名实体识别
  3. 计算机科学与技术导论结课报告,计算机科学与技术导论论文提纲范文模板 计算机科学与技术导论论文框架怎样写...
  4. linux磁盘镜像技术,Linux 下使用 dd 和 gzip 命令来代替 Ghost 做磁盘镜像
  5. [欧范 必备]帅气 中性 军色 工装 铜扣勋章 休闲衬衣 男女通款
  6. Jmeter压测报告
  7. 项目管理经验-豆知识
  8. 算力之都杭州:楼市向何处去
  9. 开路电压法与电流积分法
  10. esayExcel自定义注解导出表头批注