IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> (二)Qt MODBUS TCP应用学习:客户端读取服务器指定寄存器数据(详细标注) -> 正文阅读

[网络协议](二)Qt MODBUS TCP应用学习:客户端读取服务器指定寄存器数据(详细标注)

Pro文件中加入:

QT += serialbus serialport widgets

H文件:

#ifndef MODBUSCLIENT_H
#define MODBUSCLIENT_H

#include <QMainWindow>
#include <QTimer>
#include <QModbusDataUnit> //存储接收和发送数据的类,数据类型为1bit和16bit
#include <QModbusReply> //客户端访问服务器后得到的回复(如客户端读服务器数据时包含数据信息)

//声明全局变量,存储温度数据
extern double_t wendu1;
extern double_t wendu2;
extern double_t wendu3;
extern double_t wendu4;
extern double_t wendu5;
extern double_t wendu6;
extern double_t wendu7;
extern double_t wendu8;
class QModbusClient;
class QModbusReply;

namespace Ui {
class modbusclient;
}

class modbusclient : public QMainWindow
{
    Q_OBJECT

public:
    explicit modbusclient(QWidget *parent = 0);
    ~modbusclient();

private:
    Ui::modbusclient *ui;
    QModbusClient *modbusDevice = nullptr;

private slots:
    void on_lianjie_caijiqi_clicked();
    void on_kaiqi_caijiqi_clicked();
    void readReady();
    void kaishicaiji();
};

#endif // MODBUSCLIENT_H

1、在H文件中创建QModbusClient对象 *modbusDevice。

C文件:

#include "modbusclient.h"
#include "ui_modbusclient.h"

#include <QModbusTcpClient>
#include <QDebug>

double_t wendu1;
double_t wendu2;
double_t wendu3;
double_t wendu4;
double_t wendu5;
double_t wendu6;
double_t wendu7;
double_t wendu8;

modbusclient::modbusclient(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::modbusclient)
{
    ui->setupUi(this);

    //创建QModbusDevice对象
    modbusDevice = new QModbusTcpClient(this);
}

modbusclient::~modbusclient()
{
    delete ui;
}

void modbusclient::on_kaiqi_caijiqi_clicked()
{
    kaishicaiji();
    QTimer *timer = new QTimer(this); //this 为parent类, 表示当前窗口
    connect(timer, SIGNAL(timeout()), this, SLOT(kaishicaiji())); // SLOT填入一个槽函数
    timer->start(1000); // 1000毫秒, 等于 1 秒
}

void modbusclient::on_lianjie_caijiqi_clicked()
{
    if (!modbusDevice)
        return;
    if (modbusDevice->state() != QModbusDevice::ConnectedState) {
        //处于非连接状态,进行连接
        //TCP连接,端口502,地址192.168.1.126
        modbusDevice->setConnectionParameter(QModbusDevice::NetworkPortParameter, 502);
        modbusDevice->setConnectionParameter(QModbusDevice::NetworkAddressParameter, "192.168.1.126");
        //连接超时设置,2000ms
        modbusDevice->setTimeout(2000);
        //连接失败重试连接,3次
        modbusDevice->setNumberOfRetries(3);
        //调试窗口显示连接状态
        if (modbusDevice->connectDevice()) {
            qDebug()<< "Connected!";
        }
     }
        else {
        //处在连接状态进行断开连接的操作
        modbusDevice->disconnectDevice();
    }
}

//从服务器读数据的读按钮槽方法
void modbusclient::kaishicaiji()
{
    //如果设备没有被创建就返回
    if (!modbusDevice)
        return;
    //从寄存器地址32开始连续读取8个数
    QModbusDataUnit readUnit(QModbusDataUnit::HoldingRegisters,32,8);
    if (auto *reply = modbusDevice->sendReadRequest(readUnit,1)) {
        if (!reply->isFinished())
            connect(reply, &QModbusReply::finished, this, &modbusclient::readReady);
        else
            delete reply; // broadcast replies return immediately
    }
}

//在这里读的数据
void modbusclient::readReady()
{
    //QModbusReply这个类存储了来自client的数据,sender()返回发送信号的对象的指针
    auto reply = qobject_cast<QModbusReply *>(sender());
    if (!reply)
        return;
    //数据从QModbusReply这个类的result方法中获取,也就是本程序中的reply->result()
    //判断是否出错
    if (reply->error() == QModbusDevice::NoError) {
        //读取响应数据
        const QModbusDataUnit unit = reply->result();
        //qDebug() << unit.values();
        wendu1 = unit.value(0)/10.0;
        wendu2 = unit.value(1)/10.0;
        wendu3 = unit.value(2)/10.0;
        wendu4 = unit.value(3)/10.0;
        wendu5 = unit.value(4)/10.0;
        wendu6 = unit.value(5)/10.0;
        wendu7 = unit.value(6)/10.0;
        wendu8 = unit.value(7)/10.0;
        ui->wendu_1->setNum(wendu1);
        ui->wendu_2->setNum(wendu2);
        ui->wendu_3->setNum(wendu3);
        ui->wendu_4->setNum(wendu4);
        ui->wendu_5->setNum(wendu5);
        ui->wendu_6->setNum(wendu6);
        ui->wendu_7->setNum(wendu7);
        ui->wendu_8->setNum(wendu8);
    }
    reply->deleteLater();//删除reply
}

2、在C文件中将modbusDevice赋值为QModbusTcpClient类型的对象
3、在on_lianjie_caijiqi_clicked()函数中设置TCP连接的地址、端口、超时设置和重试次数
4、利用QModbusDevice的connectDevice方法接受MODBUS网络
5、创建QModbusDataUnit数据单元
6、调用QModbusDataUnit的sendReadRequest方法读取数据

UI文件:
ui文件截图
客户端工作时截图:
客户端工作时截图

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2021-10-20 12:51:43  更:2021-10-20 12:51:46 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 3:36:51-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码