Browse Source

multithread

design
nasi 4 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() void ModBusMaster::init()
{ {
qDebug() << " modBusMaster::init " <<QThread::currentThreadId() ; connect(&objsimModbus, &Simulatermodbus::coilIsReady , this, &ModBusMaster::modbusReplyRecievedSimulate);
objsimModbus.init(); qDebug() << " modBusMaster::init " <<QThread::currentThreadId() ;
objsimModbus.init();
/* close();
/* close();
modbusDevice = nullptr; modbusDevice = nullptr;
modbusDevice = new QModbusRtuSerialMaster(this); modbusDevice = new QModbusRtuSerialMaster(this);
@ -37,10 +39,10 @@ void ModBusMaster::init()
void ModBusMaster::open(QString serialPort , int slaveAddress) void ModBusMaster::open(QString serialPort , int slaveAddress)
{ {
qDebug() << "imodBusMaster::open " << QThread::currentThreadId() ; qDebug() << "imodBusMaster::open " << QThread::currentThreadId() ;
objsimModbus.open(serialPort, slaveAddress); objsimModbus.open(serialPort, slaveAddress);
/* _serialPort = serialPort; /* _serialPort = serialPort;
_slaveAddress = slaveAddress; _slaveAddress = slaveAddress;
if (!modbusDevice) if (!modbusDevice)
return; return;
@ -116,16 +118,17 @@ void ModBusMaster::setMultipleRegister(int startAddress, quint16 writeSize , QVe
QBitArray ModBusMaster::getCoil(int startAddress, quint16 readSize) 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); QModbusDataUnit unit = readRequest(QModbusDataUnit::RegisterType::Coils, startAddress, readSize);
qDebug() << " QThread::currentThreadId() getCoil after" <<QThread::currentThreadId() ; qDebug() << " QThread::currentThreadId() getCoil after" <<QThread::currentThreadId() ;
mutex.lock(); mutex.lock();
if(!freeThread) if(!freeThread)
modBusAnswerNotReady.wait(&mutex); modBusAnswerNotReady.wait(&mutex);
mutex.unlock(); mutex.unlock();
QBitArray coils; QBitArray coils;
coils.resize(2); coils.resize(2);
auto num = unit.valueCount(); auto num = unit.valueCount();
@ -134,12 +137,15 @@ QBitArray ModBusMaster::getCoil(int startAddress, quint16 readSize)
{ {
coils.setBit((unit.value(i))); 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) void ModBusMaster::writeRequest(QModbusDataUnit::RegisterType registerType, int startAddress, quint16 writeSize)
{ {
qDebug() << " ---- setSingleCoil coilFlag writeRequest "; qDebug() << " ---- setSingleCoil coilFlag writeRequest ";

8
serialConnectionManager/ModbusMaster.h

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

7
serialConnectionManager/Modbuswrapper.cpp

@ -3,7 +3,7 @@
ModbusWrapper::ModbusWrapper(QObject *parent) : QObject(parent) ModbusWrapper::ModbusWrapper(QObject *parent) : QObject(parent)
{ {
qDebug() << " QThread::currentThreadId() ModbusWrapper before " <<QThread::currentThreadId() ; 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(); workerThread.start();
qDebug() << " QThread::currentThreadId() ModbusWrapper then " <<QThread::currentThreadId() ; 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(this, &ModbusWrapper::stopConnectionOrder, &modBusObj, &ModBusMaster::stop, Qt::BlockingQueuedConnection);
connect(&workerThread, &QThread::started, &modBusObj, &ModBusMaster::init); connect(&workerThread, &QThread::started, &modBusObj, &ModBusMaster::init);
connect(&modBusObj, &ModBusMaster::finished, &workerThread, &QThread::terminate); connect(&modBusObj, &ModBusMaster::finished, &workerThread, &QThread::terminate);
@ -37,6 +37,7 @@ void ModbusWrapper::stopWrapper()
QBitArray ModbusWrapper::getCoilWrapper(int startAddress, quint16 numberOfEntries) QBitArray ModbusWrapper::getCoilWrapper(int startAddress, quint16 numberOfEntries)
{ {
connect(this, &ModbusWrapper::getCoilOrder, &modBusObj, &ModBusMaster::getCoil, Qt::BlockingQueuedConnection); 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 #ifndef SIMULATERMODBUS_H
#define SIMULATERMODBUS_H #define SIMULATERMODBUS_H
#include <QBitArray>
#include <QObject> #include <QObject>
#include <QTimer> #include <QTimer>
class Simulatermodbus : public QObject class Simulatermodbus : public QObject
{ {
Q_OBJECT Q_OBJECT
public: public:
explicit Simulatermodbus(QObject *parent = nullptr); explicit Simulatermodbus(QObject *parent = nullptr);
void init(); void init();
void open(QString serialPort , int slaveAddress); void open(QString serialPort , int slaveAddress);
signals: void readCoil(int startAddress, quint16 readSize);
public: signals:
void initiateStateResult(bool initFlag);
void openStateResult(bool openFlag);
void coilIsReady(QBitArray coilDataFromClient);
public: public:
QTimer *timer; QTimer *timer;
}; };
#endif // SIMULATERMODBUS_H #endif // SIMULATERMODBUS_H

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

@ -24,7 +24,6 @@ void Simulatermodbus::open(QString serialPort, int slaveAddress)
{ {
QEventLoop qloop; QEventLoop qloop;
qDebug() << "Simulatermodbus::open " << QThread::currentThreadId() ; qDebug() << "Simulatermodbus::open " << QThread::currentThreadId() ;
QThread::sleep(2);
timer = new QTimer(); timer = new QTimer();
timer->setInterval(2000); timer->setInterval(2000);
timer->start(); timer->start();
@ -33,5 +32,24 @@ void Simulatermodbus::open(QString serialPort, int slaveAddress)
qDebug() << " Simulatermodbus open Done serial is " << serialPort; qDebug() << " Simulatermodbus open Done serial is " << serialPort;
qDebug() << " Simulatermodbus open Done slaveAddress is " << slaveAddress; qDebug() << " Simulatermodbus open Done slaveAddress is " << slaveAddress;
timer->stop(); 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 \ Modbuswrapper.cpp \
SerialportException.cpp \ SerialportException.cpp \
SettingSerialParameters..cpp \ SettingSerialParameters..cpp \
Simulatermodbus.cpp \
main.cpp \ main.cpp \
mainwindow.cpp \ mainwindow.cpp
simulatermodbus.cpp
HEADERS += \ HEADERS += \
ModbusMaster.h \ ModbusMaster.h \

Loading…
Cancel
Save