Browse Source

multithread test

design
nasi 4 years ago
parent
commit
81dab266f4
  1. 9
      serialConnectionManager/ModbusMaster.cpp
  2. 7
      serialConnectionManager/ModbusMaster.h
  3. 36
      serialConnectionManager/Modbuswrapper.cpp
  4. 31
      serialConnectionManager/Modbuswrapper.h
  5. 17
      serialConnectionManager/SimulaterModbus.h
  6. 40
      serialConnectionManager/mainwindow.cpp
  7. 9
      serialConnectionManager/mainwindow.h
  8. 6
      serialConnectionManager/serialConnectionManager.pro
  9. 6
      serialConnectionManager/simulatermodbus.cpp

9
serialConnectionManager/ModbusMaster.cpp

@ -14,7 +14,8 @@ modBusMaster::modBusMaster(QObject *parent) : QObject(parent)
void modBusMaster::init() void modBusMaster::init()
{ {
close();
/* close();
modbusDevice = nullptr; modbusDevice = nullptr;
modbusDevice = new QModbusRtuSerialMaster(this); modbusDevice = new QModbusRtuSerialMaster(this);
@ -24,14 +25,14 @@ void modBusMaster::init()
}); });
if (!modbusDevice) if (!modbusDevice)
throw serialPortException("Could not create Modbus master."); throw serialPortException("Could not create Modbus master."); */
} }
void modBusMaster::open(QString serialPort , int slaveAddress) void modBusMaster::open(QString serialPort , int slaveAddress)
{ {
_serialPort = serialPort; /* _serialPort = serialPort;
_slaveAddress = slaveAddress; _slaveAddress = slaveAddress;
if (!modbusDevice) if (!modbusDevice)
return; return;
@ -54,7 +55,7 @@ void modBusMaster::open(QString serialPort , int slaveAddress)
if (!modbusDevice->connectDevice()) if (!modbusDevice->connectDevice())
{ {
throw serialPortException(modbusDevice->errorString()); throw serialPortException(modbusDevice->errorString());
} } */
} }
void modBusMaster::close() void modBusMaster::close()
{ {

7
serialConnectionManager/ModbusMaster.h

@ -20,8 +20,7 @@ class modBusMaster : public QObject
public: public:
explicit modBusMaster(QObject *parent = nullptr); explicit modBusMaster(QObject *parent = nullptr);
void init();
void open(QString serialPort, int slaveAddress);
void start(); void start();
void deinit(); void deinit();
void close(); void close();
@ -47,10 +46,12 @@ signals:
void modbusConnectionState(bool state); void modbusConnectionState(bool state);
private slots: private slots:
void modbusReplyRecieved(); void modbusReplyRecieved();
public slots:
void init();
void open(QString serialPort, int slaveAddress);
private: private:
QModbusReply *modbusReplyFromClient; QModbusReply *modbusReplyFromClient;
// QModbusDataUnit modbusReplyUnit;
QModbusClient *modbusDevice = nullptr; QModbusClient *modbusDevice = nullptr;
QString _serialPort ; QString _serialPort ;
int _slaveAddress; int _slaveAddress;

36
serialConnectionManager/Modbuswrapper.cpp

@ -0,0 +1,36 @@
#include "Modbuswrapper.h"
ModbusWrapper::ModbusWrapper(QObject *parent) : QObject(parent)
{
modBusObj = new modBusMaster();
connect(this, &ModbusWrapper::initConnectionOrder, modBusObj, &modBusMaster::init);
connect(this, &ModbusWrapper::openConnectionOrder, modBusObj, &modBusMaster::open);
connect(this, &ModbusWrapper::stopConnectionOrder, modBusObj, &modBusMaster::stop);
modBusObj->moveToThread(&workerThread);
workerThread.setObjectName("workerThread");
workerThread.start();
}
ModbusWrapper::~ModbusWrapper()
{
workerThread.quit();
workerThread.wait();
}
void ModbusWrapper::initWrapper(QString serialPort, int slaveAddress)
{
emit initConnectionOrder();
emit openConnectionOrder(serialPort, slaveAddress);
}
void ModbusWrapper::stopWrapper()
{
emit stopConnectionOrder();
}
QBitArray ModbusWrapper::getCoilWrapper(int startAddress, quint16 numberOfEntries)
{
emit getCoilOrder(startAddress, numberOfEntries);
}

31
serialConnectionManager/Modbuswrapper.h

@ -0,0 +1,31 @@
#ifndef MODBUSWRAPPER_H
#define MODBUSWRAPPER_H
#include <QObject>
#include <QThread>
#include <ModbusMaster.h>
class ModbusWrapper : public QObject
{
Q_OBJECT
public:
explicit ModbusWrapper(QObject *parent = nullptr);
~ModbusWrapper();
void initWrapper(QString serialPort, int slaveAddress);
void stopWrapper();
QBitArray getCoilWrapper( int startAddress, quint16 numberOfEntries);
signals:
void openConnectionOrder(QString _serialPort, int _slaveAddress);
void initConnectionOrder();
void stopConnectionOrder();
QBitArray getCoilOrder(int startAddress, quint16 numberOfEntries);
public slots:
private:
modBusMaster *modBusObj;
QThread workerThread;
};
#endif // MODBUSWRAPPER_H

17
serialConnectionManager/SimulaterModbus.h

@ -0,0 +1,17 @@
#ifndef SIMULATERMODBUS_H
#define SIMULATERMODBUS_H
#include <QObject>
class Simulatermodbus : public QObject
{
Q_OBJECT
public:
explicit Simulatermodbus(QObject *parent = nullptr);
signals:
public slots:
};
#endif // SIMULATERMODBUS_H

40
serialConnectionManager/mainwindow.cpp

@ -12,12 +12,9 @@ MainWindow::MainWindow(QWidget *parent)
ui->writeTable->addItem(tr("Discrete Inputs"), 1); ui->writeTable->addItem(tr("Discrete Inputs"), 1);
ui->writeTable->addItem(tr("Input Registers"), 2); ui->writeTable->addItem(tr("Input Registers"), 2);
ui->writeTable->addItem(tr("Holding Registers"), 3); ui->writeTable->addItem(tr("Holding Registers"), 3);
modBusObj = new modBusMaster();
modBusObj->moveToThread(&workerThread);
workerThread.setObjectName("workerThread");
workerThread.start();
// the thread starts the event loop and blocks waiting for events // the thread starts the event loop and blocks waiting for events
connect(modBusObj, &modBusMaster::modbusConnectionState, this, &MainWindow::connectionState); // connect(modBusObj, &modBusMaster::modbusConnectionState, this, &MainWindow::connectionState);
} }
@ -25,24 +22,19 @@ MainWindow::MainWindow(QWidget *parent)
MainWindow::~MainWindow() MainWindow::~MainWindow()
{ {
delete ui; delete ui;
workerThread.quit();
workerThread.wait();
} }
void MainWindow::on_connectButton_clicked() void MainWindow::on_connectButton_clicked()
{ {
if( ui->connectButton->text()==tr("Disconnect")) if( ui->connectButton->text()==tr("Disconnect"))
{ {
modBusObj->stop(); modBusWrapperObj->stopWrapper();
} }
else else
{ {
modBusObj->init(); modBusWrapperObj->initWrapper(ui->portEdit->text(),ui->serverEdit->value());
modBusObj->open(ui->portEdit->text(),ui->serverEdit->value());
}
}
} }
void MainWindow::on_readButton_clicked() void MainWindow::on_readButton_clicked()
@ -51,14 +43,14 @@ void MainWindow::on_readButton_clicked()
// do not go beyond 10 entries // do not go beyond 10 entries
int numberOfEntries = qMin(ui->readSize->currentText().toInt(), 10 - startAddress); int numberOfEntries = qMin(ui->readSize->currentText().toInt(), 10 - startAddress);
switch (ui->writeTable->currentData().toInt()) { switch (ui->writeTable->currentData().toInt()) {
case 0: printCoilsDataFromSlave(modBusObj->getCoil(startAddress,static_cast<quint16>(numberOfEntries))); case 0: printCoilsDataFromSlave(modBusWrapperObj->getCoilWrapper(startAddress,static_cast<quint16>(numberOfEntries)));
break;
case 1: printCoilsDataFromSlave(modBusObj->getInputCoil(startAddress,static_cast<quint16>(numberOfEntries)));
break;
case 2: printRegisterDataFromSlave(modBusObj->getInputRegister(startAddress,static_cast<quint16>(numberOfEntries)));
break;
case 3: printRegisterDataFromSlave(modBusObj->getHoldingRegister(startAddress,static_cast<quint16>(numberOfEntries)));
break; break;
// case 1: printCoilsDataFromSlave(modBusObj->getInputCoil(startAddress,static_cast<quint16>(numberOfEntries)));
// break;
// case 2: printRegisterDataFromSlave(modBusObj->getInputRegister(startAddress,static_cast<quint16>(numberOfEntries)));
// break;
// case 3: printRegisterDataFromSlave(modBusObj->getHoldingRegister(startAddress,static_cast<quint16>(numberOfEntries)));
// break;
} }
} }
@ -106,11 +98,11 @@ void MainWindow::on_writeButton_clicked()
{ {
uiCoils.setBit(0,ui->coilData1->isChecked()); uiCoils.setBit(0,ui->coilData1->isChecked());
uiCoils.setBit(1,ui->coilData2->isChecked()); uiCoils.setBit(1,ui->coilData2->isChecked());
modBusObj->setMultipleCoil(startAddress, numberOfEntries, uiCoils); // modBusObj->setMultipleCoil(startAddress, numberOfEntries, uiCoils);
} }
else if (numberOfEntries==1) else if (numberOfEntries==1)
{ {
modBusObj->setSingleCoil(startAddress, ui->coilData1->isChecked()); // modBusObj->setSingleCoil(startAddress, ui->coilData1->isChecked());
} }
break; break;
@ -119,11 +111,11 @@ void MainWindow::on_writeButton_clicked()
{ {
uiholdingRegisters[0]=ui->textEdit1->toPlainText().toUInt(); uiholdingRegisters[0]=ui->textEdit1->toPlainText().toUInt();
uiholdingRegisters[1]=ui->textEdit2->toPlainText().toUInt(); uiholdingRegisters[1]=ui->textEdit2->toPlainText().toUInt();
modBusObj->setMultipleRegister(startAddress, numberOfEntries, uiholdingRegisters); // modBusObj->setMultipleRegister(startAddress, numberOfEntries, uiholdingRegisters);
} }
else if (numberOfEntries==1) else if (numberOfEntries==1)
{ {
modBusObj->setSingleRegister(startAddress, ui->textEdit1->toPlainText().toUInt()); // modBusObj->setSingleRegister(startAddress, ui->textEdit1->toPlainText().toUInt());
} }
break; break;
} }

9
serialConnectionManager/mainwindow.h

@ -1,8 +1,9 @@
#ifndef MAINWINDOW_H #ifndef MAINWINDOW_H
#define MAINWINDOW_H #define MAINWINDOW_H
#include <QThread>
#include <QMainWindow> #include <QMainWindow>
#include "ModbusMaster.h" #include <Modbuswrapper.h>
#include <QBitArray>
QT_BEGIN_NAMESPACE QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; } namespace Ui { class MainWindow; }
QT_END_NAMESPACE QT_END_NAMESPACE
@ -26,9 +27,9 @@ private slots:
private: private:
Ui::MainWindow *ui; Ui::MainWindow *ui;
modBusMaster *modBusObj; ModbusWrapper *modBusWrapperObj;
QBitArray uiCoils; QBitArray uiCoils;
QVector<quint16> uiholdingRegisters; QVector<quint16> uiholdingRegisters;
QThread workerThread;
}; };
#endif // MAINWINDOW_H #endif // MAINWINDOW_H

6
serialConnectionManager/serialConnectionManager.pro

@ -21,15 +21,19 @@ DEFINES += QT_DEPRECATED_WARNINGS
SOURCES += \ SOURCES += \
ModbusMaster.cpp \ ModbusMaster.cpp \
Modbuswrapper.cpp \
SerialportException.cpp \ SerialportException.cpp \
SettingSerialParameters..cpp \ SettingSerialParameters..cpp \
main.cpp \ main.cpp \
mainwindow.cpp mainwindow.cpp \
simulatermodbus.cpp
HEADERS += \ HEADERS += \
ModbusMaster.h \ ModbusMaster.h \
Modbuswrapper.h \
SerialportException.h \ SerialportException.h \
SettingSerialParameters.h \ SettingSerialParameters.h \
SimulaterModbus.h \
mainwindow.h mainwindow.h
FORMS += \ FORMS += \

6
serialConnectionManager/simulatermodbus.cpp

@ -0,0 +1,6 @@
#include "SimulaterModbus.h"
Simulatermodbus::Simulatermodbus(QObject *parent) : QObject(parent)
{
}
Loading…
Cancel
Save