Browse Source

multithread

design
nasi 3 years ago
parent
commit
a136c20a62
  1. 47
      serialConnectionManager/ModbusMaster.cpp
  2. 8
      serialConnectionManager/ModbusMaster.h
  3. 7
      serialConnectionManager/Modbuswrapper.cpp
  4. 19
      serialConnectionManager/SimulaterModbus.h
  5. 20
      serialConnectionManager/Simulatermodbus.cpp
  6. 4
      serialConnectionManager/serialConnectionManager.pro

47
serialConnectionManager/ModbusMaster.cpp

@ -18,10 +18,12 @@ ModBusMaster::~ModBusMaster()
void ModBusMaster::init()
{
qDebug() << " modBusMaster::init " <<QThread::currentThreadId() ;
objsimModbus.init();
connect(&objsimModbus, &Simulatermodbus::coilIsReady , this, &ModBusMaster::modbusReplyRecievedSimulate);
qDebug() << " modBusMaster::init " <<QThread::currentThreadId() ;
objsimModbus.init();
/* close();
/* close();
modbusDevice = nullptr;
modbusDevice = new QModbusRtuSerialMaster(this);
@ -37,10 +39,10 @@ void ModBusMaster::init()
void ModBusMaster::open(QString serialPort , int slaveAddress)
{
qDebug() << "imodBusMaster::open " << QThread::currentThreadId() ;
objsimModbus.open(serialPort, slaveAddress);
qDebug() << "imodBusMaster::open " << QThread::currentThreadId() ;
objsimModbus.open(serialPort, slaveAddress);
/* _serialPort = serialPort;
/* _serialPort = serialPort;
_slaveAddress = slaveAddress;
if (!modbusDevice)
return;
@ -116,16 +118,17 @@ void ModBusMaster::setMultipleRegister(int startAddress, quint16 writeSize , QVe
QBitArray ModBusMaster::getCoil(int startAddress, quint16 readSize)
{
qDebug() << " QThread::currentThreadId() getCoil befor" <<QThread::currentThreadId() ;
objsimModbus.readCoil(startAddress,readSize);
return clientCoil;
/*
qDebug() << " QThread::currentThreadId() getCoil befor" <<QThread::currentThreadId() ;
QModbusDataUnit unit = readRequest(QModbusDataUnit::RegisterType::Coils, startAddress, readSize);
qDebug() << " QThread::currentThreadId() getCoil after" <<QThread::currentThreadId() ;
mutex.lock();
if(!freeThread)
modBusAnswerNotReady.wait(&mutex);
mutex.unlock();
QBitArray coils;
coils.resize(2);
auto num = unit.valueCount();
@ -134,12 +137,15 @@ QBitArray ModBusMaster::getCoil(int startAddress, quint16 readSize)
{
coils.setBit((unit.value(i)));
}
return coils ;
*/
return coils ;
}
void ModBusMaster::modbusReplyRecieved()
{
}
@ -254,24 +260,11 @@ bool ModBusMaster::checkForError(QModbusReply *_reply)
}
void ModBusMaster::modbusReplyRecieved()
void ModBusMaster::modbusReplyRecievedSimulate(QBitArray coilDataFromClient)
{
qDebug() << " QThread::currentThreadId() inside slot" <<QThread::currentThreadId() ;
// auto reply = qobject_cast<QModbusReply *>(sender());
// if (!reply)
// return;
// modbusReplyFromClient = reply;
freeThread=true;
mutex.lock();
if (freeThread)
modBusAnswerNotReady.wakeAll();
mutex.unlock();
// reply->deleteLater();
clientCoil = coilDataFromClient;
}
void ModBusMaster::writeRequest(QModbusDataUnit::RegisterType registerType, int startAddress, quint16 writeSize)
{
qDebug() << " ---- setSingleCoil coilFlag writeRequest ";

8
serialConnectionManager/ModbusMaster.h

@ -39,19 +39,19 @@ public:
QModbusDataUnit readRequest(QModbusDataUnit::RegisterType registerType, int startAddress, quint16 readSize);
void writeRequest(QModbusDataUnit::RegisterType registerType, int startAddress, quint16 readSize);
bool checkForError(QModbusReply *_reply);
signals:
void dataFromClient(QString readedParameter);
void modbusConnectionState(bool state);
void finished();
private slots:
void modbusReplyRecieved();
public slots:
void init();
void open(QString serialPort, int slaveAddress);
QBitArray getCoil(int startAddress, quint16 readSize);
void modbusReplyRecieved();
void modbusReplyRecievedSimulate(QBitArray coilDataFromClient);
private:
QModbusReply *modbusReplyFromClient;
QModbusClient *modbusDevice = nullptr;
@ -59,6 +59,7 @@ private:
int _slaveAddress;
SettingSerialParameters _modbusSettings;
QBitArray _coilFlags;
QBitArray clientCoil;
QVector<quint16> _registerValues;
QWaitCondition modBusAnswerNotReady;
QMutex mutex;
@ -67,6 +68,7 @@ private:
public:
QModbusReply *reply;
Simulatermodbus objsimModbus;
};
#endif // MODBUSMASTER_H

7
serialConnectionManager/Modbuswrapper.cpp

@ -3,7 +3,7 @@
ModbusWrapper::ModbusWrapper(QObject *parent) : QObject(parent)
{
qDebug() << " QThread::currentThreadId() ModbusWrapper before " <<QThread::currentThreadId() ;
// modBusObj = new modBusMaster();
// modBusObj = new modBusMaster();
}
@ -20,7 +20,7 @@ void ModbusWrapper::initWrapper(QString serialPort, int slaveAddress)
workerThread.start();
qDebug() << " QThread::currentThreadId() ModbusWrapper then " <<QThread::currentThreadId() ;
connect(this, &ModbusWrapper::openConnectionOrder, &modBusObj, &ModBusMaster::open, Qt::BlockingQueuedConnection);
connect(this, &ModbusWrapper::openConnectionOrder, &modBusObj, &ModBusMaster::open, Qt::BlockingQueuedConnection);
connect(this, &ModbusWrapper::stopConnectionOrder, &modBusObj, &ModBusMaster::stop, Qt::BlockingQueuedConnection);
connect(&workerThread, &QThread::started, &modBusObj, &ModBusMaster::init);
connect(&modBusObj, &ModBusMaster::finished, &workerThread, &QThread::terminate);
@ -37,6 +37,7 @@ void ModbusWrapper::stopWrapper()
QBitArray ModbusWrapper::getCoilWrapper(int startAddress, quint16 numberOfEntries)
{
connect(this, &ModbusWrapper::getCoilOrder, &modBusObj, &ModBusMaster::getCoil, Qt::BlockingQueuedConnection);
emit getCoilOrder(startAddress, numberOfEntries);
QBitArray coilDataFromClient = emit getCoilOrder(startAddress, numberOfEntries);
return coilDataFromClient;
}

19
serialConnectionManager/SimulaterModbus.h

@ -1,19 +1,28 @@
#ifndef SIMULATERMODBUS_H
#define SIMULATERMODBUS_H
#include <QBitArray>
#include <QObject>
#include <QTimer>
class Simulatermodbus : public QObject
{
Q_OBJECT
public:
explicit Simulatermodbus(QObject *parent = nullptr);
void init();
void open(QString serialPort , int slaveAddress);
signals:
void init();
void open(QString serialPort , int slaveAddress);
void readCoil(int startAddress, quint16 readSize);
public: signals:
void initiateStateResult(bool initFlag);
void openStateResult(bool openFlag);
void coilIsReady(QBitArray coilDataFromClient);
public:
QTimer *timer;
QTimer *timer;
};
#endif // SIMULATERMODBUS_H

20
serialConnectionManager/simulatermodbus.cpp → serialConnectionManager/Simulatermodbus.cpp

@ -24,7 +24,6 @@ void Simulatermodbus::open(QString serialPort, int slaveAddress)
{
QEventLoop qloop;
qDebug() << "Simulatermodbus::open " << QThread::currentThreadId() ;
QThread::sleep(2);
timer = new QTimer();
timer->setInterval(2000);
timer->start();
@ -33,5 +32,24 @@ void Simulatermodbus::open(QString serialPort, int slaveAddress)
qDebug() << " Simulatermodbus open Done serial is " << serialPort;
qDebug() << " Simulatermodbus open Done slaveAddress is " << slaveAddress;
timer->stop();
}
void Simulatermodbus::readCoil(int startAddress, quint16 readSize)
{
QEventLoop qloop;
qDebug() << "Simulatermodbus::open " << QThread::currentThreadId() ;
timer = new QTimer();
timer->setInterval(2000);
timer->start();
connect(timer, &QTimer::timeout, &qloop, &QEventLoop::quit);
qloop.exec();
qDebug() << " Simulatermodbus open Done serial is " << startAddress;
qDebug() << " Simulatermodbus open Done slaveAddress is " << readSize;
timer->stop();
QBitArray bitArrayTemp;
bitArrayTemp.resize(1);
bitArrayTemp[0] = true;
emit coilIsReady(bitArrayTemp);
}

4
serialConnectionManager/serialConnectionManager.pro

@ -24,9 +24,9 @@ SOURCES += \
Modbuswrapper.cpp \
SerialportException.cpp \
SettingSerialParameters..cpp \
Simulatermodbus.cpp \
main.cpp \
mainwindow.cpp \
simulatermodbus.cpp
mainwindow.cpp
HEADERS += \
ModbusMaster.h \

Loading…
Cancel
Save