Qt QML - QModBus czytanie uszkodzone QML BusyIndicator/Animacje - Jednoprzebiegowy czytanie

0

Pytanie

Mam однопоточное aplikacja QQuick z jednym głównym oknem i jedną klasą, który obsługuje funkcje nagrywania/odczytu Modbus. Jak na razie wszystko działa ok, ale gdy podłączam wskaźnik zatrudnienia w okno qml, aby pokazać, że magistrala jest zajęta, mam niezgodności CRC i limity czasu odpowiedzi, np.:

  • "Odchylenie odpowiedzi z niewłaściwym CRC, zdobyte: 64580 , obliczony CRC: 55067"
  • "Błąd odczytu odpowiedzi: limit czasu odpowiedzi. (kod: 0x5)" - qt.modbus: (klient RTU) Nie można porównać odpowiedzi z otwartym pytaniem, ignorując

Żądanie odczytu wywoływane przez

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();
}

Jeśli w moim oknie nie ma animacji, dane przyjmowane są bez błędów.

  • Czy można to naprawić za pomocą osobny wątek, aby uruchomić metod odczytu/zapisu modbus, i jak bym to wykorzystał? Czy ja tylko wzrastał liczbę błędów, umieszczając kolejne funkcje w osobnym wątku?

Jak rozumiem, z tego względu, że moja aplikacja nadal działa w jednym wątku, ciągłe aktualizacje interfejsu graficznego w jakiś sposób przeszkadza w odbiorze kolejnych danych.

Użyłem narzędzia wiersza polecenia systemu Linux "stres", aby sprawdzić, czy ja tracę dane i przy dużym obciążeniu procesora, ale to nie tak.

Pozdrawiam

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

Najlepsza odpowiedź

1

Znalazłem problem:

Tak jak myślałem, mechanizm renderowania qml, harmonogram sceny, czy jak go tam nazwać, wywołał zjawisko gubienia klatek odbioru modbus. Myślę, że w jakiś sposób wielowątkowość mogłaby pomóc w tym, ale nie byłem w stanie to rozwiązać, uruchamiając interfejs modbusInterface w osobnym wątku.

W końcu rozwiązanie polegało na tym, aby włączyć streaming cykl renderowania grafiki sceny, jak pokazano tutaj: https://doc.qt.io/qt-5/qtquick-visualcanvas-scenegraph.html#threaded-render-loop-threaded

Czyli, umieszczając

qputenv("QSG_RENDER_LOOP","threaded");

w moim głównym().

2021-10-28 12:49:29

W innych językach

Ta strona jest w innych językach

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