补充上一条modbus文章,提供视频与源码

一、源码

#ifndef MODBUS_H
#define MODBUS_H

#include <QWidget>
#include <QModbusRtuSerialMaster>
#include <QModbusDevice>
#include <QSerialPort>
#include <QSerialPortInfo>
#include <QTcpServer>
#include <QTcpSocket>
#include <QModbusTcpClient>

namespace Ui {
class ModBus;
}

class ModBus : public QWidget
{
    Q_OBJECT

public:
    explicit ModBus(QWidget *parent = nullptr);
    ~ModBus();

private slots:
    void on_pushButton_read_clicked();

    void on_pushButton_write_clicked();

    void on_pushButton_connect_clicked();

    void on_pushButton_close_clicked();

    void on_pushButton_read_tcp_clicked();

    void on_pushButton_write_tcp_clicked();


private:
    Ui::ModBus *ui;
    QModbusRtuSerialMaster *m_modbusrtumaster;
    QModbusTcpClient *m_modTcpClient;

};

#endif // MODBUS_H

#include "modbus.h"
#include "ui_modbus.h"



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

    //串口初始化
    m_modbusrtumaster = new QModbusRtuSerialMaster(this);
    m_modbusrtumaster->setConnectionParameter(QModbusDevice::SerialPortNameParameter, "COM3");
    m_modbusrtumaster->setConnectionParameter(QModbusDevice::SerialParityParameter, QSerialPort::EvenParity);
    m_modbusrtumaster->setConnectionParameter(QModbusDevice::SerialBaudRateParameter, 115200);
    m_modbusrtumaster->setConnectionParameter(QModbusDevice::SerialDataBitsParameter, QSerialPort::Data8);
    m_modbusrtumaster->setConnectionParameter(QModbusDevice::SerialStopBitsParameter, QSerialPort::OneStop);

    //网口实例化
    m_modTcpClient = new QModbusTcpClient(this);


}

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

void ModBus::on_pushButton_read_clicked()
{
    //链接设备
    if(m_modbusrtumaster->state() != QModbusRtuSerialMaster::ConnectedState)
    {
        if(m_modbusrtumaster->connectDevice())
        {
            qDebug() << "串口驱动链接成功";
        }
        else
        {
            qDebug() << "串口驱动链接失败";
        }
    }



    //起始位
    QModbusDataUnit unit(QModbusDataUnit::HoldingRegisters, ui->lineEdit_startaddr->text().toInt(), 1);//读1个位
//    qDebug() << ui->lineEdit_startaddr->text().toInt();
    //发送请求响应
    QModbusReply *reply = m_modbusrtumaster->sendReadRequest(unit, 1);
//    if(reply && !reply->isFinished())
//    {
//        connect(reply, &QModbusReply::finished, this, [=]()
//        {
//            QModbusReply *reply_1 = qobject_cast<QModbusReply *>(sender());//等同于reply_1 = reply
//            if(reply_1)
//            {
//               QModbusDataUnit unit_1 = reply_1->result();//数据存入unit_1
//               reply_1->deleteLater();

//               QVector<quint16> data = unit_1.values();
//               QString s;
//               Q_FOREACH(quint16 i, data)
//               {
//                   s.append(QString::number(i)).append(" ");
//               }
//               ui->lineEdit_readwrite->setText(s);
//            }
//        });
//    }
    if(reply)
    {
        if(!reply->isFinished())
        {
//            qDebug() << "2222";
//            qDebug() << reply->error();
            connect(reply, &QModbusReply::finished, this, [=]()
            {
//                qDebug() << "3333";
//                qDebug() << reply->result().values();
                if(reply->result().valueCount()>0)
                {
                    ui->lineEdit_readwrite->setText(QString::number(reply->result().value(0)));
//                    qDebug() << "111111";
                }
            });
            return;
        }
        reply->deleteLater();
    }
}

void ModBus::on_pushButton_write_clicked()
{
    if(m_modbusrtumaster->state() != QModbusRtuSerialMaster::ConnectedState)
    {
        m_modbusrtumaster->connectDevice();
    }

//    QVector<quint16> data;
//    data << 33 << 44;
    QModbusDataUnit unit(QModbusDataUnit::HoldingRegisters,
                         ui->lineEdit_startaddr->text().toInt(), 1);
    unit.setValue(0, ui->lineEdit_readwrite->text().toUInt());
    m_modbusrtumaster->sendWriteRequest(unit, 1);
}

void ModBus::on_pushButton_connect_clicked()
{
    m_modTcpClient->setConnectionParameter(QModbusDevice::NetworkAddressParameter,
                                           ui->lineEdit_IP->text());
    m_modTcpClient->setConnectionParameter(QModbusDevice::NetworkPortParameter,
                                           ui->lineEdit_port->text());
    if(m_modTcpClient->connectDevice())
    {
        ui->label_stata->setText("连接成功");
    }
    else
    {
        ui->label_stata->setText("未连接");
    }
}

void ModBus::on_pushButton_close_clicked()
{
    m_modTcpClient->disconnectDevice();
}

void ModBus::on_pushButton_read_tcp_clicked()
{
    QModbusDataUnit unit(QModbusDataUnit::HoldingRegisters,
                         ui->lineEdit_startaddr_tcp->text().toInt(), 1);//数据单元定义的内容为:类型、起始地址、访问多少位
//    qDebug() << ui->lineEdit_startaddr_tcp->text().toInt();
    QModbusReply *reply = m_modTcpClient->sendReadRequest(unit, 1);//响应的定义内容为:响应的内容;
                                                                   //发送读取请求的内容为:数据单元、sever地址,
                                                                   //其中server地址在modbus工具里面也可以看见能设置
    //将请求的数据读取出来
    if(reply)
    {
        if(!reply->isFinished())
        {
            connect(reply, &QModbusReply::finished, this, [=]()
            {
                if(reply->result().valueCount()>0)
                {
                    ui->lineEdit_readwrite_tcp->setText(QString::number(reply->result().value(0)));
                }
            });
            return;
        }
        reply->deleteLater();
    }
}

void ModBus::on_pushButton_write_tcp_clicked()
{
    QModbusDataUnit unit(QModbusDataUnit::HoldingRegisters,
                         ui->lineEdit_startaddr_tcp->text().toInt(), 1);//数据单元定义的内容为:类型、起始地址、访问多少位
    unit.setValue(0, ui->lineEdit_readwrite_tcp->text().toUInt());

    QModbusReply *reply = m_modTcpClient->sendWriteRequest(unit, 1);
    if(reply)
    {
        reply->deleteLater();
    }
}

二、测试视频

modbus

  • 9
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值