Qt e QML - QModBus leggere danneggiato da QML BusyIndicator/Animazione - SingleThread

0

Domanda

Ho un unico thread QQuick applicazione con una finestra principale e una classe che gestisce Modbus di Lettura/Scrittura di funzioni. Tutto funziona bene, ma quando ho messo un BusyIndicator nel mio qml finestra per mostrare che il Bus è occupato ho CRC incongruenze e risposta timeout, ad esempio:

  • "Scartando risposta sbagliata CRC, ha ricevuto: 64580 , CRC calcolato: 55067"
  • "Leggere la risposta di errore: timeout di Risposta. (codice: 0 x 5)" - qt.modbus: RTU (client) Non può corrispondere risposta con richiesta di apertura, ignorando

Il ReadRequest viene inviato via

void ModbusDevice::readData(int serveraddress, int startaddress, int cnt) {
QModbusDataUnit RxData;

if(startaddress>=HOLDING_BASE) RxData.setRegisterType(QModbusDataUnit::HoldingRegisters);
else RxData.setRegisterType(QModbusDataUnit::InputRegisters);

RxData.setStartAddress(startaddress);
RxData.setValueCount(cnt);

if (auto *reply = m_ModbusClient->sendReadRequest(RxData, serveraddress)) {
    connect(reply, &QModbusReply::finished, this, &CellDevice::InterruptHandler);
else qDebug() << m_ModbusClient->errorString();
}

Se non c'è animazione in esecuzione nella mia finestra, i dati vengono ricevuti senza errori.

  • Questo può essere risolto utilizzando un thread separato per eseguire il modbus lettura/scrittura metodi e come posso implementare questo? Oppure dovrei solo aumentare la interpreti erroneamente mettendo il Seriale funzioni in un Thread separato?

Da quanto ho capito finora, a causa del fatto che la mia domanda è finora l'esecuzione in un unico thread, il continuo aggiornamento della GUI è in qualche modo interferire con la ricezione di Dati Seriali.

Ho usato la riga di comando di linux strumento di "stress" per vedere se perdo i dati in alto il carico della cpu, come pure, ma non è questo il caso.

Cordiali saluti

c++ modbus multithreading qml
2021-10-27 11:45:23
1

Migliore risposta

1

Ho trovato il problema:

Come ho pensato la qml motore di rendering grafico di scena o comunque si chiami, causato perdere fotogrammi del modbus reception. Credo che in qualche modo la filettatura potrebbe aiutare con questo, ma non ero in grado di risolvere il problema avendo il modbusInterface eseguito in un thread separato.

Alla fine la soluzione è stata quella di attivare filettato render loop del grafico di scena, come indicato qui: https://doc.qt.io/qt-5/qtquick-visualcanvas-scenegraph.html#threaded-render-loop-threaded

I. e. mettendo

qputenv("QSG_RENDER_LOOP","threaded");

nel mio main().

2021-10-28 12:49:29

In altre lingue

Questa pagina è in altre lingue

Русский
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................