一、源码
#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