日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【Qt】modbus之TCP模式写操作

發布時間:2024/4/24 编程问答 57 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Qt】modbus之TCP模式写操作 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

00. 目錄

文章目錄

    • 00. 目錄
    • 01. 概述
    • 02. 開發環境
    • 03. 讀Coils程序示例
    • 04. 讀HoldingRegisters程序示例
    • 07. 綜合示例
    • 08. 程序下載
    • 09. 附錄

01. 概述

Qt中幾個常用的串口modbus類

QModbusRtuSerialSlave //modbus串口通信方式下的服務器類 QModbusRtuSerialMaster //串口通信方式下的客戶端類 QModbusServer // QModbusServer類接收和處理modbus的請求。 QModbusDataUnit //存儲接收和發送數據的類,數據類型為1bit和16bit QModbusReply //客戶端訪問服務器后得到的回復(如客戶端讀服務器數據時包含數據信息)

02. 開發環境

Windows系統:Windows10

Qt版本:Qt5.15或者Qt6

Pro配置文件如下

QT += core gui serialbus serialportgreaterThan(QT_MAJOR_VERSION, 4): QT += widgetsCONFIG += c++11# You can make your code fail to compile if it uses deprecated APIs. # In order to do so, uncomment the following line. #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0SOURCES += \main.cpp \widget.cppHEADERS += \widget.h# Default rules for deployment. qnx: target.path = /tmp/$${TARGET}/bin else: unix:!android: target.path = /opt/$${TARGET}/bin !isEmpty(target.path): INSTALLS += target

03. 讀Coils程序示例

widget.h文件

#ifndef WIDGET_H #define WIDGET_H#include <QWidget>//前向聲明 class QModbusClient; class QModbusReply;QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : public QWidget {Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();private:Ui::Widget *ui;QModbusClient *modbusDevice = nullptr;private slots:void onReadReady();void onModbusStateChanged(int state);void on_btnConnect_clicked();void on_btnCoil_clicked();void on_btnDiscreteInputs_clicked();void on_btnInputRegisters_clicked();void on_btnHoldingRegisters_clicked();void on_btnCoil_2_clicked();void on_btnHoldingRegisters_2_clicked(); }; #endif // WIDGET_H

widget.cpp文件

#include "widget.h" #include "ui_widget.h" #include <QDebug> #include <QModbusTcpClient>//構造函數 Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);//1. 創建QModbusDevice對象modbusDevice = new QModbusTcpClient(this);//禁用所有的讀操作ui->btnCoil->setEnabled(false);ui->btnDiscreteInputs->setEnabled(false);ui->btnHoldingRegisters->setEnabled(false);ui->btnInputRegisters->setEnabled(false);//禁用所有的寫操作ui->btnCoil_2->setEnabled(false);ui->btnHoldingRegisters_2->setEnabled(false);connect(modbusDevice, &QModbusClient::errorOccurred, [this](QModbusDevice::Error) {qDebug() << "new Error: " << modbusDevice->errorString();});if (nullptr == modbusDevice){qDebug() << "Cannot Create Modbus Client";}else{connect(modbusDevice, &QModbusClient::stateChanged,this, &Widget::onModbusStateChanged);}}//析構函數 Widget::~Widget() {if (modbusDevice){modbusDevice->disconnectDevice();}delete modbusDevice;delete ui; }void Widget::onReadReady() {auto reply = qobject_cast<QModbusReply*>(sender());if (nullptr == reply){return;}//判斷是否出錯if (reply->error() == QModbusDevice::NoError){//讀取響應數據const QModbusDataUnit responseData = reply->result();qDebug() << "讀到數據為:" << responseData.values();}else if (reply->error() == QModbusDevice::ProtocolError){qDebug() << "Read response Protocol error: " << reply->errorString();}else{qDebug() << "Read response Error: " << reply->errorString();}//刪除replyreply->deleteLater(); }void Widget::onModbusStateChanged(int state) {//判斷Modbus設備連接是否處于連接狀態if (state == QModbusDevice::UnconnectedState){qDebug() << "TCP Client連接到Server 未連接";ui->btnConnect->setText(tr("連接"));ui->btnCoil->setEnabled(false);ui->btnDiscreteInputs->setEnabled(false);ui->btnHoldingRegisters->setEnabled(false);ui->btnInputRegisters->setEnabled(false);ui->btnCoil_2->setEnabled(false);ui->btnHoldingRegisters_2->setEnabled(false);}else if (state == QModbusDevice::ConnectingState){qDebug() << "TCP Client正在連接Server";}else if (state == QModbusDevice::ConnectedState){qDebug() << "TCP Client已經連接到Server";ui->btnConnect->setText(tr("斷開連接"));ui->btnCoil->setEnabled(true);ui->btnDiscreteInputs->setEnabled(true);ui->btnHoldingRegisters->setEnabled(true);ui->btnInputRegisters->setEnabled(true);ui->btnCoil_2->setEnabled(true);ui->btnHoldingRegisters_2->setEnabled(true);}else if (state == QModbusDevice::ClosingState){qDebug() << "設備已經被關閉";} }//連接按鈕槽函數 void Widget::on_btnConnect_clicked() {if (!modbusDevice){return;}if (modbusDevice->state() != QModbusDevice::ConnectedState){modbusDevice->setConnectionParameter(QModbusDevice::NetworkAddressParameter, "127.0.0.1");modbusDevice->setConnectionParameter(QModbusDevice::NetworkPortParameter, 10086);//設置超時時間modbusDevice->setTimeout(1000); //1秒//設置失敗重試次數modbusDevice->setNumberOfRetries(3);//連接到服務端bool ok = modbusDevice->connectDevice();if (!ok){qDebug() << "modbusDevice->connectDevice failed";}}else{//斷開連接modbusDevice->disconnectDevice();ui->btnConnect->setText(tr("連接"));ui->btnCoil->setEnabled(false);ui->btnDiscreteInputs->setEnabled(false);ui->btnHoldingRegisters->setEnabled(false);ui->btnInputRegisters->setEnabled(false);ui->btnCoil_2->setEnabled(false);ui->btnHoldingRegisters_2->setEnabled(false);}}//讀線圈 void Widget::on_btnCoil_clicked() {//QModbusDataUnit::Coils 從地址0開始讀取10個線圈值QModbusDataUnit data(QModbusDataUnit::Coils, 0, 10);auto reply = modbusDevice->sendReadRequest(data, 0x1);if (nullptr == reply){qDebug() << "發送請求數據失敗: " << modbusDevice->errorString();}else{if (!reply->isFinished()){connect(reply, &QModbusReply::finished, this, &Widget::onReadReady);}else{//broadcast replies return immediatelydelete reply;}} }//讀離散輸入 void Widget::on_btnDiscreteInputs_clicked() {//QModbusDataUnit::DiscreteInputs 從地址0開始讀取10個離散輸入值QModbusDataUnit data(QModbusDataUnit::DiscreteInputs, 0, 10);auto reply = modbusDevice->sendReadRequest(data, 0x1);if (nullptr == reply){qDebug() << "發送請求數據失敗: " << modbusDevice->errorString();}else{if (!reply->isFinished()){connect(reply, &QModbusReply::finished, this, &Widget::onReadReady);}else{//broadcast replies return immediatelydelete reply;}} }//讀輸入寄存器 void Widget::on_btnInputRegisters_clicked() {//QModbusDataUnit::InputRegisters 從地址0開始讀取10個輸入寄存器的值QModbusDataUnit data(QModbusDataUnit::InputRegisters, 0, 10);auto reply = modbusDevice->sendReadRequest(data, 0x1);if (nullptr == reply){qDebug() << "發送請求數據失敗: " << modbusDevice->errorString();}else{if (!reply->isFinished()){connect(reply, &QModbusReply::finished, this, &Widget::onReadReady);}else{//broadcast replies return immediatelydelete reply;}} }//讀保持寄存器 void Widget::on_btnHoldingRegisters_clicked() {//從地址0開始讀取10個保持寄存器的值QModbusDataUnit data(QModbusDataUnit::HoldingRegisters, 0, 10);auto reply = modbusDevice->sendReadRequest(data, 0x1);if (nullptr == reply){qDebug() << "發送請求數據失敗: " << modbusDevice->errorString();}else{if (!reply->isFinished()){connect(reply, &QModbusReply::finished, this, &Widget::onReadReady);}else{//broadcast replies return immediatelydelete reply;}} }//寫線圈 void Widget::on_btnCoil_2_clicked() {//從地址0開始寫10個線圈的值QModbusDataUnit writeData(QModbusDataUnit::Coils, 0, 10);for (int i = 0; i < writeData.valueCount(); i++){writeData.setValue(i, (i * i) % 2);}qDebug() << "發送的數據為: " << writeData.values();QModbusReply* reply = modbusDevice->sendWriteRequest(writeData, 1);if (reply){if (!reply->isFinished()){//接收響應信息connect(reply, &QModbusReply::finished, this, [this, reply](){if (reply->error() == QModbusDevice::ProtocolError){//接收到的響應信息是協議錯誤qDebug() << "寫入數據錯誤:" << reply->errorString();}else if (reply->error() != QModbusDevice::NoError){//接收到的響應消息是其它錯誤qDebug() << "寫入數據錯誤: " << reply->errorString();}else{//接收到的消息沒有錯誤 一般沒有必要解析響應消息const QModbusDataUnit data = reply->result();qDebug() << "消息數據個數:" << data.valueCount() << " :" << data.values();}reply->deleteLater();});}else{//發送沒有響應數據//broadcast replies return immediatelyreply->deleteLater();}}else{qDebug() << "sendWriteRequest Error: " << reply->errorString();} }//寫保持寄存器 void Widget::on_btnHoldingRegisters_2_clicked() {}

執行結果

16:02:56: Starting D:\ProgramData\Qt\build-Test1-Desktop_Qt_5_15_2_MinGW_32_bit-Debug\debug\Test1.exe ... TCP Client正在連接Server TCP Client已經連接到Server 發送的數據為: QVector(0, 1, 0, 1, 0, 1, 0, 1, 0, 1) 消息數據個數: 10 : QVector(0, 1, 0, 1, 0, 1, 0, 1, 0, 1) 設備已經被關閉 TCP Client連接到Server 未連接 16:03:17: D:\ProgramData\Qt\build-Test1-Desktop_Qt_5_15_2_MinGW_32_bit-Debug\debug\Test1.exe exited with code 0

04. 讀HoldingRegisters程序示例

widget.h文件

#ifndef WIDGET_H #define WIDGET_H#include <QWidget>//前向聲明 class QModbusClient; class QModbusReply;QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : public QWidget {Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();private:Ui::Widget *ui;QModbusClient *modbusDevice = nullptr;private slots:void onReadReady();void onModbusStateChanged(int state);void on_btnConnect_clicked();void on_btnCoil_clicked();void on_btnDiscreteInputs_clicked();void on_btnInputRegisters_clicked();void on_btnHoldingRegisters_clicked();void on_btnCoil_2_clicked();void on_btnHoldingRegisters_2_clicked(); }; #endif // WIDGET_H

widget.cpp文件

//寫保持寄存器 void Widget::on_btnHoldingRegisters_2_clicked() {QModbusDataUnit writeData(QModbusDataUnit::HoldingRegisters, 0, 10);for (int i = 0; i < writeData.valueCount(); i++){writeData.setValue(i, i * i);}qDebug() << "發送的數據為: " << writeData.values();QModbusReply* reply = modbusDevice->sendWriteRequest(writeData, 1);if (reply){if (!reply->isFinished()){//接收響應信息connect(reply, &QModbusReply::finished, this, [this, reply](){if (reply->error() == QModbusDevice::ProtocolError){//接收到的響應信息是協議錯誤qDebug() << "寫入數據錯誤:" << reply->errorString();}else if (reply->error() != QModbusDevice::NoError){//接收到的響應消息是其它錯誤qDebug() << "寫入數據錯誤: " << reply->errorString();}else{//接收到的消息沒有錯誤 一般沒有必要解析響應消息const QModbusDataUnit data = reply->result();qDebug() << "消息數據個數:" << data.valueCount() << " :" << data.values();}reply->deleteLater();});}else{//發送沒有響應數據//broadcast replies return immediatelyreply->deleteLater();}}else{qDebug() << "sendWriteRequest Error: " << reply->errorString();} }

執行結果

16:07:56: Starting D:\ProgramData\Qt\build-Test1-Desktop_Qt_5_15_2_MinGW_32_bit-Debug\debug\Test1.exe ... TCP Client正在連接Server TCP Client已經連接到Server 發送的數據為: QVector(0, 1, 4, 9, 16, 25, 36, 49, 64, 81) 消息數據個數: 10 : QVector(0, 1, 4, 9, 16, 25, 36, 49, 64, 81)

07. 綜合示例

程序界面

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-S2ap9szx-1621498438553)(assets/image-20210520154331905.png)]

settingdialog.h文件

#ifndef SETTINGDIALOG_H #define SETTINGDIALOG_H#include <QDialog> #include <QtSerialPort>namespace Ui { class SettingDialog; }//串口設置相關類 class SettingDialog : public QDialog {Q_OBJECTpublic:struct Settings{//串口名QString serialName = "COM3";//校驗位int parity = QSerialPort::NoParity;//波特率int baud = QSerialPort::Baud19200;//數據位int dataBits = QSerialPort::Data8;//停止位int stopBits = QSerialPort::OneStop;//響應時間int responseTime = 1000;//重試次數int numberOfRetries = 3;};explicit SettingDialog(QWidget *parent = nullptr);~SettingDialog();//返回參數設置信息Settings settings() const;private slots:void on_btnApply_clicked();private:Ui::SettingDialog *ui;Settings m_settings; };#endif // SETTINGDIALOG_H

settingdialog.cpp文件

#include "settingdialog.h" #include "ui_settingdialog.h"//構造函數 SettingDialog::SettingDialog(QWidget *parent) :QDialog(parent),ui(new Ui::SettingDialog) {ui->setupUi(this);//設置默認參數信息ui->serialNameLineEdit->setText(tr("COM3"));ui->parityComboBox->setCurrentIndex(0);ui->baudComboBox->setCurrentText(QString::number(m_settings.baud));ui->dataBitComboBox->setCurrentText(QString::number(m_settings.dataBits));ui->stopBitComboBox->setCurrentText(QString::number(m_settings.stopBits));ui->spinBoxTimeOut->setValue(m_settings.responseTime);ui->spinBoxRetry->setValue(m_settings.numberOfRetries);}//析構函數 SettingDialog::~SettingDialog() {delete ui; }//返回參數信息 SettingDialog::Settings SettingDialog::settings() const {return m_settings; }//引用按鈕槽函數 void SettingDialog::on_btnApply_clicked() {m_settings.serialName = ui->serialNameLineEdit->text();m_settings.parity = ui->parityComboBox->currentText().toInt();m_settings.baud = ui->baudComboBox->currentText().toInt();m_settings.dataBits = ui->dataBitComboBox->currentText().toInt();m_settings.stopBits = ui->stopBitComboBox->currentText().toInt();m_settings.responseTime = ui->spinBoxTimeOut->value();m_settings.numberOfRetries = ui->spinBoxRetry->value();//隱藏參數設置對話框hide(); }

mainwindow.h文件

#ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow> #include <QModbusDataUnit>QT_BEGIN_NAMESPACEnamespace Ui {class MainWindow; }class SettingDialog; class QModbusClient; class QModbusReply;QT_END_NAMESPACEclass MainWindow : public QMainWindow {Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();//信號與槽進行關聯void initActions();//讀請求數據包封裝QModbusDataUnit readRequest() const;private slots:void onConnectButtonClicked();void onConnectTypeChanged(int);void onModbusStateChanged(int state);void onReadButtonClicked();void onReadReady();private:Ui::MainWindow *ui = nullptr;SettingDialog *m_settingDialog = nullptr;QModbusClient *modbusDevice = nullptr;QModbusReply *reply = nullptr;}; #endif // MAINWINDOW_H

mainwindow.cpp文件

#include "mainwindow.h" #include "ui_mainwindow.h" #include <QMessageBox> #include "settingdialog.h" #include <QModbusRtuSerialMaster> #include <QModbusReply> #include <QStandardItemModel> #include <QModbusDataUnit> #include <QModbusTcpClient>//連接類型枚舉變量 enum ModbusConnection {Serial,Tcp };MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow) {ui->setupUi(this);//創建對象m_settingDialog = new SettingDialog(this);//初始化信號與槽initActions();//創建寫模型writeModel = new WriteRegisterModel(this);writeModel->setStartAddress(ui->sbWriteStartAddr->value());writeModel->setNumberOfValues(ui->cbWriteCount->currentText());//MVCui->treeViewWrite->setModel(writeModel);//隱藏第二列ui->treeViewWrite->hideColumn(2);connect(writeModel, &WriteRegisterModel::updateViewport,ui->treeViewWrite->viewport(), QOverload<>::of(&QWidget::update));//默認為串口連接方式ui->cbConnType->setCurrentIndex(0);onConnectTypeChanged(0);auto model = new QStandardItemModel(10, 1, this);for (int i = 0; i < 10; i++){model->setItem(i, new QStandardItem(QStringLiteral("%1").arg(i + 1)));}ui->cbWriteCount->setModel(model);ui->cbWriteCount->setCurrentText("10");connect(ui->cbWriteCount, &QComboBox::currentTextChanged,writeModel, &WriteRegisterModel::setNumberOfValues);auto valueChanged = QOverload<int>::of(&QSpinBox::valueChanged);connect(ui->sbWriteStartAddr, valueChanged, writeModel, &WriteRegisterModel::setStartAddress);connect(ui->sbWriteStartAddr, valueChanged, this, [this, model](int i){int lastIndex = 0;const int curIndex = ui->cbWriteCount->currentIndex();for (int j = 0; j < 10; j++){//設置使能if (j < (10 - i)){lastIndex = j;model->item(j)->setEnabled(true);}else{//設置禁用model->item(j)->setEnabled(false);}}if (curIndex > lastIndex){ui->cbWriteCount->setCurrentIndex(lastIndex);}}); }//析構函數 MainWindow::~MainWindow() {if (modbusDevice){modbusDevice->disconnectDevice();delete modbusDevice;}delete ui; }//信號與槽進行關聯s void MainWindow::initActions() {//使能部分功能ui->actionConnect->setEnabled(true);ui->actionDisconnect->setEnabled(false);ui->actionQuit->setEnabled(true);ui->actionOption->setEnabled(true);//禁用讀寫操作ui->btnRead->setEnabled(false);ui->btnWrite->setEnabled(false);ui->btnReadWrite->setEnabled(false);//信號與槽關聯connect(ui->btnConnect, &QPushButton::clicked,this, &MainWindow::onConnectButtonClicked);connect(ui->actionConnect, &QAction::triggered,this, &MainWindow::onConnectButtonClicked);connect(ui->actionDisconnect, &QAction::triggered,this, &MainWindow::onConnectButtonClicked);//讀操作按鈕槽函數關聯connect(ui->btnRead, &QPushButton::clicked,this, &MainWindow::onReadButtonClicked);connect(ui->btnWrite, &QPushButton::clicked,this, &MainWindow::onWriteButtonClicked);connect(ui->btnReadWrite, &QPushButton::clicked,this, &MainWindow::onReadWriteButtonClicked);connect(ui->cbRegisterType, QOverload<int>::of(&QComboBox::currentIndexChanged),this, &MainWindow::onWriteTableChanged);connect(ui->cbConnType, QOverload<int>::of(&QComboBox::currentIndexChanged),this, &MainWindow::onConnectTypeChanged);//退出菜單connect(ui->actionQuit, &QAction::triggered, this, &MainWindow::close);//顯示參數設置對話框connect(ui->actionOption, &QAction::triggered, m_settingDialog, &QDialog::show);connect(ui->actionAbout, &QAction::triggered, [=]() {QMessageBox::aboutQt(this, "About Qt");}); }//構建請求報文 QModbusDataUnit MainWindow::readRequest() const {//const auto type = static_cast<QModbusDataUnit::RegisterType>(ui->cbRegisterType->currentData().toInt());QModbusDataUnit::RegisterType type = QModbusDataUnit::Invalid;qDebug() << ui->cbRegisterType->currentText();if (ui->cbRegisterType->currentText() == QString("線圈")){type = QModbusDataUnit::Coils;}else if (ui->cbRegisterType->currentText() == QString("離散輸入")){type = QModbusDataUnit::DiscreteInputs;}else if (ui->cbRegisterType->currentText() == QString("輸入寄存器")){type = QModbusDataUnit::InputRegisters;}else if (ui->cbRegisterType->currentText() == QString("保持寄存器")){type = QModbusDataUnit::HoldingRegisters;}qDebug() << "請求報文類型: " << type;//獲取int startAddress = ui->spReadStartAddr->value();Q_ASSERT(startAddress >= 0 && startAddress < 10);quint16 numberOfEntries = ui->cbReadCount->currentText().toUShort();return QModbusDataUnit(type, startAddress, numberOfEntries); }//寫請求數據包封裝 QModbusDataUnit MainWindow::writeRequest() const {QModbusDataUnit::RegisterType type = QModbusDataUnit::Invalid;qDebug() << ui->cbRegisterType->currentText();if (ui->cbRegisterType->currentText() == QString("線圈")){type = QModbusDataUnit::Coils;}else if (ui->cbRegisterType->currentText() == QString("離散輸入")){type = QModbusDataUnit::DiscreteInputs;}else if (ui->cbRegisterType->currentText() == QString("輸入寄存器")){type = QModbusDataUnit::InputRegisters;}else if (ui->cbRegisterType->currentText() == QString("保持寄存器")){type = QModbusDataUnit::HoldingRegisters;}qDebug() << "請求報文類型: " << type;//獲取int startAddress = ui->sbWriteStartAddr->value();Q_ASSERT(startAddress >= 0 && startAddress < 10);quint16 numberOfEntries = ui->cbWriteCount->currentText().toUShort();//qDebug() << "Test: " << startAddress << " " << numberOfEntries;return QModbusDataUnit(type, startAddress, numberOfEntries); }//連接和斷開連接的槽函數 void MainWindow::onConnectButtonClicked() {if (!modbusDevice){return;}//清空狀態欄消息statusBar()->clearMessage();if (modbusDevice->state() != QModbusDevice::ConnectedState){auto type = static_cast<ModbusConnection>(ui->cbConnType->currentIndex());if (type == Serial){//設置串口連接信息modbusDevice->setConnectionParameter(QModbusDevice::SerialPortNameParameter,m_settingDialog->settings().serialName);modbusDevice->setConnectionParameter(QModbusDevice::SerialParityParameter,m_settingDialog->settings().parity);modbusDevice->setConnectionParameter(QModbusDevice::SerialBaudRateParameter,m_settingDialog->settings().baud);modbusDevice->setConnectionParameter(QModbusDevice::SerialDataBitsParameter,m_settingDialog->settings().dataBits);modbusDevice->setConnectionParameter(QModbusDevice::SerialStopBitsParameter,m_settingDialog->settings().stopBits);}else{//TCP連接信息const QUrl url = QUrl::fromUserInput(ui->lineEditPort->text());modbusDevice->setConnectionParameter(QModbusDevice::NetworkPortParameter,url.port());modbusDevice->setConnectionParameter(QModbusDevice::NetworkAddressParameter,url.host());}modbusDevice->setTimeout(m_settingDialog->settings().responseTime);modbusDevice->setNumberOfRetries(m_settingDialog->settings().numberOfRetries);if (!modbusDevice->connectDevice()){statusBar()->showMessage(tr("Connect failed..") + modbusDevice->errorString(), 5000);}else{statusBar()->showMessage(tr("Connect Successfully"), 5000);qDebug() << "連接OK";ui->actionConnect->setEnabled(false);ui->actionDisconnect->setEnabled(true);//使能讀寫操作ui->btnRead->setEnabled(true);ui->btnWrite->setEnabled(true);ui->btnReadWrite->setEnabled(true);}}else{//斷開連接modbusDevice->disconnectDevice();ui->actionConnect->setEnabled(true);ui->actionDisconnect->setDisabled(true);qDebug() << "斷開連接成功";//禁用讀寫操作ui->btnRead->setEnabled(false);ui->btnWrite->setEnabled(false);ui->btnReadWrite->setEnabled(false);} }//連接類型槽函數 TCP Serial void MainWindow::onConnectTypeChanged(int index) {//如果之前存在連接,則斷開連接,然后釋放內存if(modbusDevice){modbusDevice->disconnectDevice();delete modbusDevice;modbusDevice = nullptr;}auto type = static_cast<ModbusConnection>(index);if (type == Serial){modbusDevice = new QModbusRtuSerialMaster(this);qDebug() << "new QModbusRtuSerialMaster Ok";statusBar()->showMessage("new QModbusRtuSerialMaster Ok", 3000);}else if (type == Tcp){modbusDevice = new QModbusTcpClient(this);if (ui->lineEditPort->text().isEmpty())ui->lineEditPort->setText(QLatin1String("127.0.0.1:10086"));}else{statusBar()->showMessage("連接類型非法", 5000);}connect(modbusDevice, &QModbusClient::errorOccurred, [this](QModbusDevice::Error){statusBar()->showMessage(modbusDevice->errorString(), 5000);});if (!modbusDevice){//分配空間失敗ui->btnConnect->setDisabled(true);if (type == Serial){statusBar()->showMessage(tr("創建Modbus Master失敗"), 5000);}else{statusBar()->showMessage(tr("創建Modbus Client失敗"), 5000);}}else{connect(modbusDevice, &QModbusClient::stateChanged,this, &MainWindow::onModbusStateChanged);}}//Modbus狀態改變槽函數 void MainWindow::onModbusStateChanged(int state) {//判斷Modbus設備連接是否處于連接狀態bool connected = (state != QModbusDevice::UnconnectedState);ui->actionConnect->setEnabled(!connected);ui->actionDisconnect->setEnabled(connected);if (QModbusDevice::UnconnectedState == state){ui->btnConnect->setText(tr("Connect"));}else{ui->btnConnect->setText(tr("Disconnect"));} }//讀操作槽函數 void MainWindow::onReadButtonClicked() {if (!modbusDevice){return;}ui->textEditRead->clear();statusBar()->clearMessage();//發送請求報文數據auto *reply = modbusDevice->sendReadRequest(readRequest(), ui->sbServerAddr->value());if (reply){if (!reply->isFinished()){//完畢之后 自動觸發槽函數connect(reply, &QModbusReply::finished, this, &MainWindow::onReadReady);}else{//廣播消息 不需要返回響應delete reply;}}else{statusBar()->showMessage(tr("Read Error: ") + modbusDevice->errorString(), 5000);}}//讀取數據 void MainWindow::onReadReady() {auto reply = qobject_cast<QModbusReply*>(sender());if (!reply){return;}if (reply->error() == QModbusDevice::NoError){const QModbusDataUnit data = reply->result();for (int i = 0, total = (int)data.valueCount(); i < total; i++){const QString str = tr("Address: %1 Value: %2").arg(data.startAddress() + i).arg(QString::number(data.value(i), data.registerType() <= QModbusDataUnit::Coils ? 10 : 16));ui->textEditRead->append(str);}}else if (reply->error() == QModbusDevice::ProtocolError){statusBar()->showMessage(tr("Read response error: %1 (Modbus exception: 0x%2)").arg(reply->errorString()).arg(reply->rawResult().exceptionCode(), -1, 16), 5000);}else{statusBar()->showMessage(tr("Read response error: %1 (Code: 0x%2)").arg(reply->errorString()).arg(reply->error(), -1, 16), 5000);}//釋放內存reply->deleteLater(); }void MainWindow::onWriteButtonClicked() {if (!modbusDevice){return;}statusBar()->clearMessage();QModbusDataUnit writeData = writeRequest();QModbusDataUnit::RegisterType type = writeData.registerType();//qDebug() << "test: " << writeData.valueCount();for (int i = 0, total = (int)(writeData.valueCount()); i < total; i++){if (type == QModbusDataUnit::Coils){writeData.setValue(i, writeModel->m_coils[i + writeData.startAddress()]);}else{//qDebug() << "test: " << writeModel->m_holdingRegisters[i + writeData.startAddress()];writeData.setValue(i, writeModel->m_holdingRegisters[i + writeData.startAddress()]);}}qDebug() << "寫數據內容為:" << writeData.values();//發送請求報文數據auto *reply = modbusDevice->sendWriteRequest(writeData, ui->sbServerAddr->value());if (reply){if (!reply->isFinished()){//完畢之后 自動觸發槽函數connect(reply, &QModbusReply::finished, this, [this, reply]{if (reply->error() == QModbusDevice::ProtocolError){statusBar()->showMessage(tr("Write Protocaol response error: %1").arg(reply->errorString()), 5000);}else if (reply->error() != QModbusDevice::NoError){statusBar()->showMessage(tr("Write response error: %1").arg(reply->errorString()), 5000);}else{qDebug() << "寫響應的數據: " << reply->result().values();}reply->deleteLater();});}else{//廣播消息 不需要返回響應reply->deleteLater();}}else{statusBar()->showMessage(tr("Write Error: ") + modbusDevice->errorString(), 5000);} }//讀寫按鈕槽函數 void MainWindow::onReadWriteButtonClicked() {if (!modbusDevice){return;}statusBar()->clearMessage();QModbusDataUnit writeData = writeRequest();QModbusDataUnit::RegisterType type = writeData.registerType();//qDebug() << "test: " << writeData.valueCount();for (int i = 0, total = (int)(writeData.valueCount()); i < total; i++){if (type == QModbusDataUnit::Coils){writeData.setValue(i, writeModel->m_coils[i + writeData.startAddress()]);}else{//qDebug() << "test: " << writeModel->m_holdingRegisters[i + writeData.startAddress()];writeData.setValue(i, writeModel->m_holdingRegisters[i + writeData.startAddress()]);}}qDebug() << "寫數據內容為:" << writeData.values();//發送請求報文數據auto *reply = modbusDevice->sendReadWriteRequest(readRequest(), writeData, ui->sbServerAddr->value());if (reply){if (!reply->isFinished()){connect(reply, &QModbusReply::finished, this, &MainWindow::onReadReady);//完畢之后 自動觸發槽函數connect(reply, &QModbusReply::finished, this, [this, reply]{if (reply->error() == QModbusDevice::ProtocolError){statusBar()->showMessage(tr("Write Protocaol response error: %1").arg(reply->errorString()), 5000);}else if (reply->error() != QModbusDevice::NoError){statusBar()->showMessage(tr("Write response error: %1").arg(reply->errorString()), 5000);}else{qDebug() << "寫響應的數據: " << reply->result().values();}reply->deleteLater();});}else{//廣播消息 不需要返回響應reply->deleteLater();}}else{statusBar()->showMessage(tr("Write Error: ") + modbusDevice->errorString(), 5000);} }void MainWindow::onWriteTableChanged(int index) {const bool coilsOrHolding = index == 0 || index == 3;if (coilsOrHolding){ui->treeViewWrite->setColumnHidden(1, index != 0);ui->treeViewWrite->setColumnHidden(2, index != 3);ui->treeViewWrite->resizeColumnToContents(0);}ui->btnReadWrite->setEnabled(index == 3);ui->btnWrite->setEnabled(coilsOrHolding);ui->groupBox_2->setEnabled(coilsOrHolding); }

08. 程序下載

QModbus TCP模式寫操作示例(一).rar

QModbus TCP模式綜合操作(二).rar

09. 附錄

9.1 Qt教程匯總
網址:https://dengjin.blog.csdn.net/article/details/115174639

總結

以上是生活随笔為你收集整理的【Qt】modbus之TCP模式写操作的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

国内精品国产三级国产aⅴ久 | 国产高清av在线播放 | 99精品偷拍视频一区二区三区 | 久久草| 久久久久久视频 | 五月婷婷激情综合网 | 亚洲国产精品激情在线观看 | 亚洲一区动漫 | 国产一性一爱一乱一交 | 国产免费亚洲 | 欧美视频网址 | 国产精品自产拍在线观看蜜 | 麻豆91精品视频 | 黄色软件在线观看免费 | 97精品国产一二三产区 | 丁香婷婷射| www五月| 亚洲人成在线电影 | 天天操天天干天天玩 | 欧美日韩在线精品一区二区 | 91精品网站 | 亚洲国产精品激情在线观看 | 91精品麻豆 | 又污又黄的网站 | 国产韩国日本高清视频 | 久久久国产精品电影 | 国产美女视频一区 | 色中文字幕在线观看 | 7777精品伊人久久久大香线蕉 | 日韩a级免费视频 | 国产精品欧美久久久久三级 | av高清在线观看 | 午夜婷婷网 | 婷婷在线免费视频 | 91麻豆文化传媒在线观看 | 国产精品免费麻豆入口 | 国产日韩欧美网站 | 18做爰免费视频网站 | 亚洲影视九九影院在线观看 | 亚洲精选久久 | 日本色小说视频 | 九九涩涩av台湾日本热热 | 美女精品 | 最近免费观看的电影完整版 | 在线观看视频国产 | 婷婷中文字幕在线观看 | 91精品国产99久久久久久久 | 日本中文字幕久久 | 五月天亚洲综合小说网 | 久久国际影院 | 91视频在线| 色婷婷国产精品 | 亚洲视频免费在线看 | 日韩免费不卡视频 | 中文字幕 国产精品 | av福利网址导航 | 亚洲精品国产精品国自产 | 视频在线一区二区三区 | 免费看一级片 | 高清av中文在线字幕观看1 | 色香蕉在线 | 91在线免费播放 | 国产精品久久久久免费观看 | 韩日成人av | 亚洲成av人片在线观看 | 午夜影院在线观看18 | 色婷婷综合久久久久中文字幕1 | 99视频国产精品 | 中文字幕亚洲精品在线观看 | 精品 激情 | 国产小视频福利在线 | 久久成人在线 | 激情五月在线 | 国产91国语对白在线 | 日韩xxx视频 | 久久1区| 国产成人99av超碰超爽 | 日本在线视频一区二区三区 | 国产区在线 | 久久一级片 | 久久九九免费视频 | 99久久精品国 | 中文字幕在线观看免费观看 | 精品国产自 | 国产成人精品999在线观看 | 五月天久久久 | 一级α片免费看 | 国内精品视频一区二区三区八戒 | 波多野结衣电影一区二区三区 | a视频在线 | 国产色综合天天综合网 | 伊人电影天堂 | 99久久精品视频免费 | 久久精精品视频 | 美女网站免费福利视频 | 日韩一级电影在线 | 天天爽天天爽 | 免费看的黄色 | 成人啪啪18免费游戏链接 | 成人av影视在线 | 天天色天天草天天射 | 亚洲男男gaygay无套同网址 | 亚洲精品视频网 | 九九精品无码 | 久久久久日本精品一区二区三区 | 日日夜夜操操操操 | 一区二区三区手机在线观看 | 在线电影播放 | 久久精品这里都是精品 | 精品夜夜嗨av一区二区三区 | 欧美成人精品欧美一级乱 | 区一区二区三区中文字幕 | 日韩免费网址 | 毛片久久久 | 成人在线免费视频观看 | 日韩精品久久中文字幕 | 外国av网 | 黄色av一区二区 | 九九热视频在线播放 | 97涩涩视频 | 高清中文字幕 | 在线观看免费中文字幕 | 亚洲精品视频国产 | 在线免费性生活片 | 日韩欧美v| 在线 国产一区 | avlulu久久精品 | 国内精品久久久久影院一蜜桃 | 免费在线观看日韩 | 免费进去里的视频 | 黄色大片日本免费大片 | 亚洲精品美女久久 | 在线看片91 | 成人免费视频播放 | 日韩在线观看中文 | 91视频在线免费 | 五月婷丁香网 | 国产爽妇网 | 在线观看一区 | 中文字幕视频三区 | 欧美精品久久久久久久免费 | 亚洲精品一区二区三区在线观看 | 99久久99 | 国产精品久久久久久久久久久久久久 | 精品九九九九 | 久久少妇 | 日韩h在线观看 | 在线观看视频一区二区三区 | 日韩高清成人 | 日韩午夜网站 | 99久久激情| 黄色在线免费观看网址 | 黄色毛片一级片 | 成人午夜影视 | bbbbb女女女女女bbbbb国产 | 国产精品自在欧美一区 | 亚洲精品在线观 | 国产精品久久99综合免费观看尤物 | 亚洲综合网站在线观看 | 午夜久久久久久久久久久 | 黄色91在线观看 | 涩涩爱夜夜爱 | 亚洲第一区在线观看 | 久久99国产精品久久99 | 久久a久久 | av天天色 | 亚洲精品88欧美一区二区 | 久久精品国产第一区二区三区 | 久久视频这里只有精品 | 中文字幕欲求不满 | 777xxx欧美| 国产丝袜制服在线 | 国产国产人免费人成免费视频 | 奇米影视在线99精品 | 国产高清专区 | 精品一区欧美 | 韩国在线一区 | 国产福利不卡视频 | 国产亚洲婷婷免费 | 久久婷婷激情 | 国产永久免费高清在线观看视频 | 国产麻豆电影在线观看 | 国产在线观看一 | 久草视频免费播放 | www视频在线免费观看 | 97国产大学生情侣酒店的特点 | 成人亚洲网 | 天天亚洲综合 | 91资源在线 | 中文字幕日韩一区二区三区不卡 | 久草在线视频资源 | 午夜国产一区 | 国产精品99久久久久久武松影视 | 亚洲国产欧美一区二区三区丁香婷 | 中文字幕av在线电影 | 国产亚洲永久域名 | 久久免费毛片 | 国产一区久久久 | av电影免费在线看 | 日本公乱妇视频 | 99精品免费网 | 91黄视频在线观看 | 亚洲国产精品va在线看黑人动漫 | 成年人在线观看免费视频 | 免费av影视 | 欧洲精品码一区二区三区免费看 | 亚洲国产福利视频 | 久久久久久国产精品亚洲78 | 色资源在线| 97在线视频免费观看 | 国产精品18久久久 | 男女免费视频观看 | 久久精品91久久久久久再现 | 亚洲欧美乱综合图片区小说区 | 五月天av在线 | 欧美成人h版在线观看 | 日韩久久一区 | 精品一区在线 | 人人射 | 亚洲精品国产视频 | 欧美日韩免费一区二区三区 | 久久久久久久久久亚洲精品 | 欧美日韩aaaa | 91伊人久久大香线蕉蜜芽人口 | 色妞色视频一区二区三区四区 | 日韩高清免费观看 | 色五婷婷 | 成人国产精品久久久 | 综合久久久久久久 | 久久成人精品 | 亚洲国产精品传媒在线观看 | 十八岁以下禁止观看的1000个网站 | 中文字幕二区三区 | 欧美91av| 日本福利视频在线 | 中文字幕av免费观看 | 国产精品视频在线看 | 亚洲国产精品va在线看黑人动漫 | 九月婷婷人人澡人人添人人爽 | 久久免费视频3 | 超碰免费av | 久久最新视频 | 国产精品福利一区 | 色偷偷88欧美精品久久久 | 天天操比 | 亚洲激情网站免费观看 | 国产黄色高清 | 国产成人av免费在线观看 | 在线观看视频97 | 免费91在线观看 | 国产午夜精品理论片在线 | 最近2019中文免费高清视频观看www99 | 免费看国产一级片 | 免费在线国产黄色 | 狠狠干五月天 | 欧美日韩精品电影 | 在线一区电影 | 日韩精品中文字幕一区二区 | 久久艹艹| 美女天天操 | 91综合色| 久久久综合电影 | 欧美日韩在线视频一区 | 日韩电影一区二区在线 | 日韩中文在线观看 | 成人福利在线播放 | 国产成人精品久 | 免费aa大片 | 99久久精品免费看国产麻豆 | 天天爱综合 | 久久久久99999 | 精品国产三级 | 久久综合免费视频影院 | 综合色婷婷 | 亚洲午夜小视频 | 一级黄色大片 | 久久久久久久久久网 | 国产一区免费 | 天天摸日日操 | 在线探花 | 国产精品美女久久久久久 | 国产区高清在线 | 国产a级精品 | 综合网色 | 日韩精品中字 | 国产精品高潮呻吟久久av无 | 国产高清在线永久 | 国产中文字幕视频在线观看 | a成人v | 亚洲精品午夜视频 | 成年人黄色免费看 | 在线看黄色av | 91精品网站在线观看 | 福利区在线观看 | 成人久久 | 中文字幕色婷婷在线视频 | 国产一区二区久久精品 | 就色干综合 | 成人av电影免费在线播放 | 亚洲精品自拍视频在线观看 | 国产精品女人网站 | 亚洲第一av在线播放 | 国产精品一区二区电影 | 丁香资源影视免费观看 | 摸阴视频 | 亚洲国产色一区 | 亚洲作爱视频 | 欧洲精品亚洲精品 | 久草久视频 | 欧美色图另类 | 日韩欧美精品在线观看 | 中文字幕日韩免费视频 | 久久99国产精品免费 | 成人精品一区二区三区中文字幕 | 久久只精品99品免费久23小说 | 婷婷日日 | 久久久久久美女 | 亚州av成人 | 久久1区| 国产亚洲永久域名 | 精品一区二区三区电影 | 粉嫩av一区二区三区免费 | 狠狠狠狠狠狠操 | 欧美一进一出抽搐大尺度视频 | 日韩在线精品视频 | 精品视频免费观看 | 97超碰免费 | 黄色性av | 成人毛片在线视频 | 香蕉视频91 | 日韩精品无码一区二区三区 | 色偷偷网站视频 | 中文字幕免费国产精品 | 日日干日日操 | 精品国产诱惑 | 久久精品亚洲一区二区三区观看模式 | 国产精品av在线 | www,黄视频| 国产精品女同一区二区三区久久夜 | 久久久www成人免费毛片麻豆 | 人人插人人玩 | 久久不卡视频 | 一区二区久久 | 亚洲影院国产 | 欧日韩在线视频 | 综合久久网站 | 亚洲精品视频中文字幕 | 黄色免费大全 | www.成人精品 | 中文字幕av最新 | 国产精品久久久久久久久久99 | 免费久久网站 | 免费看黄色毛片 | 国产免费一区二区三区最新 | 日韩国产欧美在线视频 | 久久精品牌麻豆国产大山 | 最新国产精品视频 | 五月婷婷久久综合 | 福利片免费看 | 狠狠干狠狠久久 | 一级特黄aaa大片在线观看 | 亚洲伊人色 | 亚洲精品久久久久中文字幕二区 | 欧美国产一区在线 | 久久九九视频 | 99热在线免费观看 | 久草久 | 91免费高清在线观看 | 天天色天天上天天操 | 亚洲v欧美v国产v在线观看 | 黄色国产区 | 精品国产视频在线观看 | 国产精品黄色影片导航在线观看 | 精品国偷自产在线 | 婷婷激情五月 | 国产精品99在线播放 | 国产小视频在线 | 在线观看日本高清mv视频 | 日av免费| 狠狠色丁香九九婷婷综合五月 | 成人免费视频免费观看 | 亚洲综合激情五月 | 在线观看视频h | 91香蕉国产在线观看软件 | 色综合久久88色综合天天 | 91毛片视频| 成人av片在线观看 | av不卡免费在线观看 | av色网站| wwwww.国产 | 91视频在线国产 | 日日夜夜人人精品 | 中文一区在线 | 日韩免费在线观看视频 | 性日韩欧美在线视频 | 五月天电影免费在线观看一区 | 玖操| 亚洲激情视频在线观看 | 一区二区三区电影大全 | 97av在线视频 | 超碰国产在线观看 | 色资源网免费观看视频 | 国产精品第二十页 | 亚洲永久精品视频 | 亚洲精品乱码久久久久久蜜桃不爽 | 999视频在线播放 | 国产一区欧美在线 | 久久久久久久久久亚洲精品 | 亚洲激情 在线 | 91av蜜桃| 一区二区三区精品在线视频 | 69av在线播放 | 中文字幕乱码电影 | 日韩系列 | 国产精品精品久久久 | 欧美精品一区二区蜜臀亚洲 | 亚洲欧美国产精品久久久久 | 国产日韩精品视频 | 怡红院av久久久久久久 | www.久热| 手机在线看片日韩 | 国产专区欧美专区 | 日韩专区视频 | 欧美精品免费在线 | 久久国内精品99久久6app | 丁香网五月天 | 91九色精品 | 99性视频| 成人免费91 | 中文字幕在线看视频国产中文版 | 99久久网站 | 69欧美视频 | 91精品久久久久久综合五月天 | 国产一区在线视频观看 | 在线久热| 99在线高清视频在线播放 | av电影 一区二区 | 欧美一区二区在线免费看 | 不卡视频一区二区三区 | 玖玖在线免费视频 | 一 级 黄 色 片免费看的 | 久久女同性恋中文字幕 | 揉bbb玩bbb少妇bbb | 伊色综合久久之综合久久 | 欧美少妇影院 | 91自拍91 | 亚洲电影自拍 | 国产自产高清不卡 | 午夜精品一区二区三区在线播放 | 色综合咪咪久久网 | 日本99干网 | 日韩av片无码一区二区不卡电影 | 欧美日韩视频在线观看一区二区 | 欧美老女人xx | av手机在线播放 | 在线免费视频一区 | 91av中文| 久久歪歪 | 男女激情片在线观看 | 91激情在线视频 | 国内精品久久久久国产 | 成人电影毛片 | 91色国产在线 | 97电影手机版 | av三级在线播放 | 黄污网站在线 | 97av在线 | 天天色天天射天天综合网 | 亚洲激情五月 | 欧美成人影音 | 美女福利视频一区二区 | 丁香六月久久综合狠狠色 | 黄色的视频 | 国产亚洲婷婷 | 黄色美女免费网站 | 一区二区av| 国产精品久久久久久久av电影 | 久久久精品欧美一区二区免费 | 欧洲精品亚洲精品 | 成人av资源在线 | 天天干天天干天天干天天干天天干天天干 | 在线日韩精品视频 | 久久国产二区 | 最近中文字幕大全 | 日韩欧美69 | 亚洲精品美女在线 | 制服丝袜在线91 | 蜜桃视频成人在线观看 | 亚洲美女精品 | 久久大片 | 国内精品视频在线 | 日韩亚洲国产精品 | 久草在线资源免费 | 亚洲成人精品影院 | 久久国产精品区 | 最近免费观看的电影完整版 | 91av视频观看 | 国产免费一区二区三区最新 | 九色91在线 | 一级免费av | 免费在线观看日韩欧美 | 日日干天夜夜 | 欧美ⅹxxxxxx| 国产亚洲精品久久久久5区 成人h电影在线观看 | 久久网站最新地址 | 欧洲激情在线 | 精品久久美女 | 中文字幕在线高清 | 成人黄色电影视频 | 日韩网站在线观看 | 在线视频app | 免费网站看v片在线a | 免费在线黄色av | 在线电影91 | 国产精品高清在线 | 91麻豆精品一区二区三区 | 成人免费视频网站在线观看 | 日韩精品一区在线播放 | 色视频一区 | 午夜久久 | 四虎5151久久欧美毛片 | 欧美性一级观看 | 操操色| 欧美一级特黄高清视频 | 久久不射电影网 | 狠狠躁日日躁狂躁夜夜躁 | 免费看的视频 | 天天操狠狠操 | 免费看黄在线网站 | 精品免费| 天天操天天色综合 | 中文字幕一区二区三区四区在线视频 | 五月婷婷深开心 | 99精品福利视频 | 国产精品丝袜 | 在线免费观看国产视频 | 国产成人一区二区精品非洲 | 日韩大片在线观看 | 欧美亚洲精品在线观看 | 亚洲情感电影大片 | 激情五月在线 | 手机av电影在线 | 国内小视频在线观看 | 久久久久这里只有精品 | 久久久九九 | 国产精品毛片网 | 日韩高清av | 干av在线| 国产一区在线免费 | 成人午夜毛片 | 午夜视频在线观看一区二区 | 欧美国产三区 | 亚洲伊人成综合网 | 国产一级精品视频 | 日韩电影一区二区在线观看 | 91在线看 | 免费日韩av片 | 91精品国产91热久久久做人人 | 国产精品久久久久久久久大全 | 在线中文字幕观看 | 极品美女被弄高潮视频网站 | 成人性生交大片免费看中文网站 | 日韩av免费网站 | 狠狠狠色丁香综合久久天下网 | 91成人精品视频 | 国产二级视频 | 日日夜夜国产 | 97在线免费视频观看 | 9色在线视频 | 亚洲精品国产拍在线 | av一区在线| 在线观看国产永久免费视频 | 91爱爱网址 | 国产精品毛片一区二区 | 五月天婷婷在线观看视频 | 免费在线观看91 | 国产精品欧美日韩 | 亚洲一区 av | 国产亚洲精品电影 | 色久综合 | 麻豆传媒视频在线播放 | 国产成人黄色 | www日日夜夜 | 这里只有精彩视频 | 欧美视频www | av国产网站 | 国产亚洲日本 | 狠狠色丁香久久综合网 | 一区二区三区精品久久久 | 一区二区影院 | 中文字幕在线观看一区二区 | 97成人精品区在线播放 | 久久这里只精品 | 精品欧美一区二区三区久久久 | 亚洲欧洲精品久久 | 521色香蕉网站在线观看 | 欧美久久久久久久久久久久久 | 国产中出在线观看 | 一本色道久久精品 | 天堂网av 在线 | 亚洲永久精品在线观看 | 91在线蜜桃臀 | 青青草国产精品视频 | 久久狠狠亚洲综合 | 99精品偷拍视频一区二区三区 | 免费久久久久久久 | 中文字幕综合在线 | 国产成人在线一区 | 久草视频在线免费 | 亚洲欧洲日韩在线观看 | 美女精品国产 | 日韩精品视频免费 | 五月天色中色 | 天天操夜夜曰 | 中文字幕精品一区 | 久久精品视频2 | 亚洲电影免费 | 中文字幕久久网 | 国产精品专区在线 | 国内偷拍精品视频 | 色国产精品 | 久久久精品成人 | 丁香九月激情综合 | 成人av免费网站 | 蜜桃av人人夜夜澡人人爽 | 欧美污网站 | 91丨九色丨91啦蝌蚪老版 | 免费在线一区二区三区 | 精品一区在线看 | 日韩电影在线视频 | 天天干天天看 | 欧美日韩在线视频一区 | 久久免费视频2 | 国产精品久久久久久久久久久久午夜 | 成人在线视频免费观看 | 免费一区在线 | 九色最新网址 | 中文字幕一区二区三区久久 | 久久精品免视看 | 国产日韩精品一区二区在线观看播放 | 国产又黄又爽无遮挡 | 日韩欧美精品一区二区三区经典 | 在线观看国产www | 久草资源免费 | 韩日色视频 | av在线亚洲天堂 | 亚洲国产mv| 午夜在线观看一区 | av中文国产 | 五月婷婷在线播放 | 最近中文字幕mv免费高清在线 | 国产精品麻豆视频 | 国产精品涩涩屋www在线观看 | 亚洲欧美日韩在线一区二区 | 91精品久久久久久久久久入口 | 国产精品毛片一区二区 | 九草在线视频 | 五月婷婷视频在线 | 日本中文字幕观看 | 9999在线| 99理论片 | 五月天色中色 | 国产精品视频地址 | 月丁香婷婷 | 69av网| 亚洲精品免费在线播放 | 国产视频 亚洲视频 | av久久在线 | 在线观看日韩免费视频 | 精品久久免费看 | 午夜久久久久久久 | 亚洲干视频在线观看 | 成人9ⅰ免费影视网站 | 国产成人av电影 | 精品久久久久久久久久岛国gif | 国产精品美女久久久久久免费 | 久久久久一区二区三区四区 | 久久久久久久影视 | 国产日本亚洲高清 | 成年人免费观看国产 | 999久久国精品免费观看网站 | 国产99久久九九精品免费 | 日日夜夜噜 | 成人动漫视频在线 | 黄色一区三区 | 国产成人一区二区啪在线观看 | 黄色片免费在线 | 狠狠操狠狠干天天操 | 亚州国产精品 | 亚洲精品国产精品国自产在线 | 亚洲全部视频 | 天天射狠狠干 | 亚洲人成人在线 | 日本在线h | 色a资源在线 | 韩国一区在线 | 天堂在线免费视频 | 精品视频久久久 | av在线电影免费观看 | 成人亚洲综合 | 福利视频一区二区 | 69久久久| 亚洲精品在线观看视频 | 欧美久久久久久久 | 久久精品视频4 | 2022久久国产露脸精品国产 | 日韩欧美在线影院 | 日韩中文在线播放 | 欧美日韩免费观看一区=区三区 | 国产精品久久久久久久久久白浆 | 免费日韩一区 | 99热官网 | 中文在线8新资源库 | 国产精品乱码久久久久 | 免费在线观看成人av | 天天鲁一鲁摸一摸爽一爽 | 久久综合干 | 在线免费黄色片 | 十八岁以下禁止观看的1000个网站 | 天天摸天天弄 | 一本一道久久a久久精品 | 91麻豆精品 | 午夜国产一区二区 | 欧美激情精品久久久久久变态 | 精品国产1区 | 欧美一区二区三区在线视频观看 | 欧美韩国日本在线观看 | 亚洲精品电影在线 | 亚洲永久av | 欧美精品午夜 | 午夜国产福利在线观看 | 中文字幕日韩无 | 久久久久久久久久久久av | 日韩欧美精品一区二区三区经典 | 国产精品一区二区中文字幕 | 国产啊v在线观看 | 欧美黑人性爽 | 国产成年免费视频 | 日韩免费观看一区二区 | 国产美女视频黄a视频免费 久久综合九色欧美综合狠狠 | 久久久久久免费毛片精品 | 99热在线看| 久久网页| 涩涩伊人 | 色噜噜在线观看视频 | 国产精品不卡视频 | 中文字幕一区三区 | 麻豆影视在线观看 | 97操碰| 久久免费看毛片 | 正在播放国产91 | 天天透天天插 | 久久久伦理 | 精品九九久久 | 99精品国产一区二区 | 欧美最新大片在线看 | 91香蕉久久| 日本精品视频一区二区 | 综合网久久 | 久久玖 | 少妇按摩av| 夜夜视频资源 | 波多野结衣在线观看一区二区三区 | 曰本免费av | 成人h动漫精品一区二 | 国产区第一页 | 丰满少妇高潮在线观看 | 天天操天天爱天天干 | 中文字幕在线不卡国产视频 | 中文字幕在线日本 | 国产一区在线观看免费 | 国产精品免费在线播放 | 婷婷激情综合五月天 | 日韩欧美国产激情在线播放 | 狠狠色伊人亚洲综合网站色 | 精品久久福利 | 成人av资源 | 麻豆91网站| 久久99九九99精品 | 国产九九九九九 | 中文在线a√在线 | 日韩av中文字幕在线 | 成人蜜桃网 | 欧美精品亚洲二区 | 国产精品一区二区三区四区在线观看 | 久久99国产一区二区三区 | 波多野结衣视频一区二区 | 日韩欧美在线播放 | 天天综合网入口 | 国产最新在线视频 | 国产色视频一区二区三区qq号 | 国产高清av免费在线观看 | 欧美在线视频一区二区三区 | 91视视频在线直接观看在线看网页在线看 | 久久这里只有精品久久 | 亚洲综合少妇 | 成人av片免费观看app下载 | 不卡精品| 色午夜 | av怡红院 | 最近能播放的中文字幕 | 国产一区二区在线精品 | 国产人成在线视频 | 欧美另类一二三四区 | 国产高清视频免费 | 欧美大片aaa | 国产淫片 | 免费观看黄色av | 亚洲视频播放 | 中文字幕在线观看第一页 | 免费下载高清毛片 | 99资源网| 亚洲精选视频免费看 | av高清影院| 美州a亚洲一视本频v色道 | 午夜在线免费视频 | 丁香花在线视频观看免费 | 一区二区视频在线免费观看 | 国产免费三级在线观看 | 狠狠狠干 | 中国一级片免费看 | 国产中文字幕一区二区 | 中文字幕a∨在线乱码免费看 | 日韩欧美在线播放 | 啪啪av在线 | 一区二区三区免费网站 | 亚洲综合情| 少妇高潮流白浆在线观看 | 99热官网 | www.com黄| 国产理伦在线 | 国产小视频免费在线网址 | 国模精品在线 | 中文在线最新版天堂 | 亚洲欧美观看 | 日本精品一区二区三区在线观看 | 在线视频观看成人 | 国产福利电影网址 | 亚洲永久国产精品 | 欧美一级性生活视频 | 亚洲黄色片一级 | 91成人免费在线视频 | 久久久久久久久久免费视频 | 成人xxxx| 精品免费 | 婷婷丁香七月 | 在线观看精品国产 | 国产原创av在线 | 夜夜爱av | 国产精品日韩欧美 | 丁香花中文在线免费观看 | 国产玖玖精品视频 | 欧美亚洲免费在线一区 | 欧美成人区 | 视频二区在线 | 国产三级精品在线 | 久久久影院官网 | 亚洲 欧美 91| 看av在线| 国产精品免费久久 | 又污又黄网站 | 免费在线观看视频a | 亚洲专区中文字幕 | av日韩不卡| 日韩r级电影在线观看 | 国产精品久久一区二区三区, | 久久久久久久久福利 | 中文字幕在线日亚洲9 | 九九天堂 | 国产亚洲精品久久网站 | 久久精品国产一区二区电影 | 国产精品一区二区三区观看 | 欧美日韩精品在线免费观看 | 毛片精品免费在线观看 | 91精品视频免费在线观看 | 国产在线播放一区二区 | 亚洲精品国产片 | 成人av片免费观看app下载 | 激情视频网页 | 日韩.com| 日韩欧美在线免费 | 国产精品永久久久久久久www | 国产69精品久久久久久久久久 | 久久久久国产一区二区三区 | 免费观看一级视频 | 亚洲人成在线观看 | 日韩电影精品一区 | 在线中文字幕一区二区 | 亚洲欧美日韩一级 | 天天天色综合 | 2023av在线| 国内精品久久久久久久久久清纯 | 久久久精品99 | 91久久久国产精品 | 天天综合网久久综合网 | 婷婷激情5月天 | 99精品国自产在线 | 中文字幕av全部资源www中文字幕在线观看 | 国产小视频精品 | 中文字幕视频免费观看 | 97电影网站 | 国产精品观看在线亚洲人成网 | 国产69精品久久99的直播节目 | www.亚洲精品视频 | 911久久香蕉国产线看观看 | 国产精品自产拍在线观看桃花 | 在线91视频| 国产999视频在线观看 | 久久黄色成人 | 欧美色图另类 | 久久不卡电影 | 国产无吗一区二区三区在线欢 | 97碰碰碰| 在线成人免费av | 国产日产精品一区二区三区四区的观看方式 | 一区二区三区四区精品 | 日韩理论在线 | 精品国产欧美一区二区 | 天天操综合网 | 日韩小视频 | 亚洲aⅴ免费在线观看 | 五月婷婷一区 | 日韩欧美黄色网址 | 欧美成人xxxx | 国产一区二区综合 | www国产亚洲精品久久网站 | 综合天天色 | 久草在线视频网站 | 狠狠色丁香久久婷婷综合_中 | av不卡在线看 | 日韩在线播放视频 | 69精品视频在线观看 | 亚洲成人欧美 | 99久热在线精品视频成人一区 | 久久综合中文字幕 | 亚洲精品午夜久久久久久久久久久 | 在线观看视频黄 | 国产精品麻豆一区二区三区 | av网站手机在线观看 | 久久99亚洲网美利坚合众国 | 国产在线播放观看 | 久草香蕉在线视频 | 国产精品视频专区 | 久久69av | 午夜电影中文字幕 | 一区二区精品在线 | 91高清免费看 | 天天色.com| 亚洲欧美国产精品va在线观看 | 婷婷在线免费观看 | 免费高清男女打扑克视频 | 国产香蕉久久 | 久久精品日产第一区二区三区乱码 | www.国产在线观看 | 精品国产1区2区 | 中中文字幕av在线 | 日韩电影在线看 | 99亚洲精品| 国产精品久久久久免费a∨ 欧美一级性生活片 | 人人爽人人爽人人爽人人爽 | 在线中文字幕一区二区 | 91精品国产麻豆 | 精品福利在线视频 | 日韩大片在线播放 | 综合网在线视频 | 精品久久五月天 | 在线观看亚洲专区 | 国产福利一区在线观看 | 国产视频丨精品|在线观看 国产精品久久久久久久久久久久午夜 | 久久久久久国产精品久久 | 免费人成在线观看网站 | 精品国内自产拍在线观看视频 | 成人夜晚看av | 九色在线| 91精品国产高清自在线观看 | 日韩中文字幕免费电影 | 成人av在线电影 | 国产欧美日韩精品一区二区免费 | 99国产高清 | 日韩在线免费播放 | 91av精品 | av片中文| 亚洲va综合va国产va中文 | 久草网站在线观看 | 成年人黄色免费网站 | 又黄又刺激又爽的视频 | www久草| 玖玖在线观看视频 | 麻豆免费精品视频 | 国产精品午夜在线 | 久久综合五月 | 国产精品久久电影网 | 国产免费亚洲高清 | 免费成人黄色片 | 亚洲视频 中文字幕 | 国产精品9999| 96在线| 欧美激情精品久久久久久免费印度 |