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

7
serialConnectionManager/ModbusMaster.h

@ -20,8 +20,7 @@ class modBusMaster : public QObject
public:
explicit modBusMaster(QObject *parent = nullptr);
void init();
void open(QString serialPort, int slaveAddress);
void start();
void deinit();
void close();
@ -47,10 +46,12 @@ signals:
void modbusConnectionState(bool state);
private slots:
void modbusReplyRecieved();
public slots:
void init();
void open(QString serialPort, int slaveAddress);
private:
QModbusReply *modbusReplyFromClient;
// QModbusDataUnit modbusReplyUnit;
QModbusClient *modbusDevice = nullptr;
QString _serialPort ;
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("Input Registers"), 2);
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
connect(modBusObj, &modBusMaster::modbusConnectionState, this, &MainWindow::connectionState);
// connect(modBusObj, &modBusMaster::modbusConnectionState, this, &MainWindow::connectionState);
}
@ -25,24 +22,19 @@ MainWindow::MainWindow(QWidget *parent)
MainWindow::~MainWindow()
{
delete ui;
workerThread.quit();
workerThread.wait();
}
void MainWindow::on_connectButton_clicked()
{
if( ui->connectButton->text()==tr("Disconnect"))
{
modBusObj->stop();
modBusWrapperObj->stopWrapper();
}
else
{
modBusObj->init();
modBusObj->open(ui->portEdit->text(),ui->serverEdit->value());
}
modBusWrapperObj->initWrapper(ui->portEdit->text(),ui->serverEdit->value());
}
}
void MainWindow::on_readButton_clicked()
@ -51,14 +43,14 @@ void MainWindow::on_readButton_clicked()
// do not go beyond 10 entries
int numberOfEntries = qMin(ui->readSize->currentText().toInt(), 10 - startAddress);
switch (ui->writeTable->currentData().toInt()) {
case 0: printCoilsDataFromSlave(modBusObj->getCoil(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)));
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;
}
}
@ -106,11 +98,11 @@ void MainWindow::on_writeButton_clicked()
{
uiCoils.setBit(0,ui->coilData1->isChecked());
uiCoils.setBit(1,ui->coilData2->isChecked());
modBusObj->setMultipleCoil(startAddress, numberOfEntries, uiCoils);
// modBusObj->setMultipleCoil(startAddress, numberOfEntries, uiCoils);
}
else if (numberOfEntries==1)
{
modBusObj->setSingleCoil(startAddress, ui->coilData1->isChecked());
// modBusObj->setSingleCoil(startAddress, ui->coilData1->isChecked());
}
break;
@ -119,11 +111,11 @@ void MainWindow::on_writeButton_clicked()
{
uiholdingRegisters[0]=ui->textEdit1->toPlainText().toUInt();
uiholdingRegisters[1]=ui->textEdit2->toPlainText().toUInt();
modBusObj->setMultipleRegister(startAddress, numberOfEntries, uiholdingRegisters);
// modBusObj->setMultipleRegister(startAddress, numberOfEntries, uiholdingRegisters);
}
else if (numberOfEntries==1)
{
modBusObj->setSingleRegister(startAddress, ui->textEdit1->toPlainText().toUInt());
// modBusObj->setSingleRegister(startAddress, ui->textEdit1->toPlainText().toUInt());
}
break;
}

9
serialConnectionManager/mainwindow.h

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

6
serialConnectionManager/serialConnectionManager.pro

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

6
serialConnectionManager/simulatermodbus.cpp

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