Qt Modbus 寄存器读写实例

一.线圈状态寄存器读写

  • 项目效果如下

1. 写单个寄存器

  • MODBUS_API int modbus_write_bit(modbus_t *ctx, int coil_addr, int status);
cpp 复制代码
int addr=ui->spinBoxwirte_addr->value();
    int data=ui->spinBoxwirte_data->value();
    int ret = modbus_write_bit(mb,addr,data);

    if(ret!=1)
    {
        QMessageBox::information(this,"失败",
                                 "写状态寄存器失败,地址:"+QString::number(data));
    }else
    {
        label_status->setText("写线圈状态寄存器成功!");
    }

2. 读单个寄存器

  • int modbus_read_bits(modbus_t *ctx, int addr, int nb, uint8_t *dest);
cpp 复制代码
int addr=ui->spinBoxRead_addr->value();
    int data=ui->spinBoxRead_data->value();
    //int modbus_read_bits(modbus_t *ctx, int addr, int nb, uint8_t *dest);
    uint8_t dest[4];
    int ret = modbus_read_bits(mb,addr,1,dest);

    if(ret!=1)
    {
        QMessageBox::information(this,"失败",
                                 "读状态寄存器失败,地址:"+QString::number(data));
    }else
    {
        label_status->setText("读线圈状态寄存器成功!");
        qDebug()<<"读出的数据为:"<<dest[0];
        ui->spinBoxRead_data->setValue(dest[0]);
    }

3. 写多个寄存器

  • int modbus_write_bits(modbus_t *ctx, int addr, int nb, const uint8_t *data);
cpp 复制代码
int addr=ui->spinBoxWriteMore_addr->value();

    //使用正则表达式,来处理字符串的分割
    QString  str = ui->textEdit_xianWrite->toPlainText();

    //用正则表达式进行分割
    QRegExp separator= QRegExp("\t|\n|\r\n|,| |;");

    //进行分割
    QStringList list =  str.split(separator,QString::SkipEmptyParts);

    uint8_t*value=new uint8_t[list.count()];

    for(int i=0;i<list.count();i++)
    {
        value[i]=list[i].toInt();
    }

    //int modbus_write_bits(modbus_t *ctx, int addr, int nb, const uint8_t *data);

    int ret = modbus_write_bits(mb,addr,list.count(),value);

    if(ret!=list.count())
    {
        QMessageBox::information(this,"写多个失败",
                                 "读状态寄存器失败,地址:"+QString::number(addr));
         label_status->setText("写多个线圈状态寄存器失败!");
    }else
    {
        label_status->setText("写多个线圈状态寄存器成功!");
    }

    delete [] value;

4. 读多个寄存器

- int modbus_read_bits(modbus_t *ctx, int addr, int nb, uint8_t *dest);

cpp 复制代码
ui->textEditRead_xian->clear();
    int addr=ui->spinBoxReadMorexian_addr->value();
    int count=ui->spinBoxReadMorexian_num->value();

    uint8_t *values = new uint8_t[count];

    //int modbus_read_bits(modbus_t *ctx, int addr, int nb, uint8_t *dest);
    int ret=modbus_read_bits(mb,addr,count,values);

    if(ret!=count)
    {
        QMessageBox::information(this,"读多个失败",
                                 "读状态寄存器失败,地址:"+QString::number(addr));
         label_status->setText("读多个线圈状态寄存器失败!");
    }else
    {
        label_status->setText("读多个线圈状态寄存器成功!");
        QString str;
        for(int i=0;i<count;i++)
        {
            str+=QString::number(values[i])+"\t";
        }

        ui->textEditRead_xian->setText(str);

    }

    delete [] values;

二.离散输入状态寄存器读写

  • 效果展示如下

1. 读单个寄存器

  • int modbus_read_input_bits(modbus_t *ctx, int addr, int nb, uint8_t *dest);
cpp 复制代码
 int addr=ui->spinBoxInput_one_addr->value();
    int data;
    //int modbus_read_input_bits(modbus_t *ctx, int addr, int nb, uint8_t *dest);
    uint8_t dest[4];
    int ret = modbus_read_input_bits(mb,addr,1,dest);

    if(ret!=1)
    {
        QMessageBox::information(this,"失败",
                                 "读单个离散输入寄存器失败,地址:"+QString::number(addr));
    }else
    {
        label_status->setText("读单个离散输入寄存器成功!");
        qDebug()<<"读出的数据为:"<<dest[0];
        ui->spinBoxInput_one_data->setValue(dest[0]);
    }

2. 读多个寄存器

  • int modbus_read_input_bits(modbus_t *ctx, int addr, int nb, uint8_t *dest);
cpp 复制代码
ui->textEdit_input->clear();
    int addr=ui->spinBoxInput_more_addr->value();
    int count=ui->spinBoxInput_more_num->value();

    //int modbus_read_input_bits(modbus_t *ctx, int addr, int nb, uint8_t *dest);
    uint8_t *dest=new uint8_t[count];
    int ret = modbus_read_input_bits(mb,addr,count,dest);

    if(ret!=count)
    {
        QMessageBox::information(this,"失败",
                                 "读多个离散输入寄存器失败,地址:"+QString::number(addr));
    }else
    {
        label_status->setText("读多个离散输入寄存器成功!");
        QString str;
        for(int i=0;i<count;i++)
        {
            str+= QString::number(dest[i])+"\t";
        }

        ui->textEdit_input->setText(str);

    }

三.保持寄存器读写

  • 效果如下:

1. 写单个寄存器

  • int modbus_write_register(modbus_t *ctx, int reg_addr, const uint16_t value);
cpp 复制代码
 //int modbus_write_register(modbus_t *ctx, int reg_addr, const uint16_t value);
    int addr=ui->spinBoxHoldRegWrite_addr->value();
    int value=ui->spinBoxHoldRegW_data->value();

    int ret =modbus_write_register(mb,addr,value);

    if(ret!=1)
    {
        QMessageBox::information(this,"失败","保持寄存器写单个失败");
    }else
    {
        QMessageBox::information(this,"成功","保持寄存器写单个成功!!!");
    }

2. 读单个寄存器

- int modbus_read_registers(modbus_t *ctx, int addr, int nb, uint16_t *dest);

cpp 复制代码
int addr=ui->spinBox_HoldR_addr->value();
    uint16_t dest[4];
    //int modbus_read_registers(modbus_t *ctx, int addr, int nb, uint16_t *dest);
    int ret = modbus_read_registers(mb,addr,1,dest);

    if(ret!=1)
    {
        QMessageBox::information(this,"失败","保持寄存器读单个失败");
    }else
    {
        QMessageBox::information(this,"成功","保持寄存器读单个成功!!!");
        ui->spinBox_HoldR_data->setValue(dest[0]);
    }

四.输入寄存器读写

  • 项目效果

1. 读单个寄存器

- int modbus_read_input_registers(modbus_t *ctx, int addr, int nb, uint16_t *dest);

cpp 复制代码
 int addr=ui->spinBoxInput_one_addr->value();
    int data;
    //int modbus_read_input_bits(modbus_t *ctx, int addr, int nb, uint8_t *dest);
    uint8_t dest[4];
    int ret = modbus_read_input_registers(mb,addr,1,dest);

    if(ret!=1)
    {
        QMessageBox::information(this,"失败",
                                 "读单个离散输入寄存器失败,地址:"+QString::number(addr));
    }else
    {
        label_status->setText("读单个离散输入寄存器成功!");
        qDebug()<<"读出的数据为:"<<dest[0];
        ui->spinBoxInput_one_data->setValue(dest[0]);
    }

2. 读多个寄存器

  • int modbus_read_input_registers(modbus_t *ctx, int addr, int nb, uint16_t *dest);
cpp 复制代码
ui->textEdit_input->clear();
    int addr=ui->spinBoxInput_more_addr->value();
    int count=ui->spinBoxInput_more_num->value();

    //int modbus_read_input_bits(modbus_t *ctx, int addr, int nb, uint8_t *dest);
    uint8_t *dest=new uint8_t[count];
    int ret = modbus_read_input_registers(mb,addr,count,dest);

    if(ret!=count)
    {
        QMessageBox::information(this,"失败",
                                 "读多个离散输入寄存器失败,地址:"+QString::number(addr));
    }else
    {
        label_status->setText("读多个离散输入寄存器成功!");
        QString str;
        for(int i=0;i<count;i++)
        {
            str+= QString::number(dest[i])+"\t";
        }

        ui->textEdit_input->setText(str);

    }
相关推荐
一叶之秋14122 天前
QT背景介绍与环境搭建
开发语言·qt
QT 小鲜肉2 天前
【QT/C++】Qt网络编程进阶:UDP通信和HTTP请求的基本原理和实际应用(超详细)
c语言·网络·c++·笔记·qt·http·udp
四维碎片2 天前
【Qt】大数据量表格刷新优化--只刷新可见区域
开发语言·qt
一叶之秋14122 天前
Qt开发初识
开发语言·qt
梵尔纳多2 天前
ffmpeg 使用滤镜实现播放倍速
c++·qt·ffmpeg
QT 小鲜肉2 天前
【QT/C++】Qt网络编程进阶:TCP网络编程的基本原理和实际应用(超详细)
c语言·开发语言·网络·c++·qt·学习·tcp/ip
Tony小周2 天前
使用QKeyEvent keyPress(QEvent::KeyPress, key模拟键盘发送事件,会导致主程序卡死
嵌入式硬件·qt
Larry_Yanan2 天前
QML学习笔记(五十)QML与C++交互:QML中单例C++对象
开发语言·c++·笔记·qt·学习·ui·交互
zhmhbest3 天前
Qt 全球峰会 2025:中国站速递 —— 技术中立,拥抱更大生态
开发语言·qt·系统架构
feiyangqingyun3 天前
Qt实时绘制飞行轨迹/移动轨迹实时显示/带旋转角度/平滑移动/效果一级棒/地面站软件开发/无人机管理平台
qt·无人机·集群地面站