Qt QML - QModBus чтение повреждено QML BusyIndicator/Анимация - Однопроходное чтение

0

Вопрос

У меня есть однопоточное приложение QQuick с одним главным окном и одним классом, который обрабатывает функции записи/чтения Modbus. Пока все работает нормально, но когда я помещаю индикатор занятости в окно qml, чтобы показать, что шина занята, я получаю несоответствия CRC и тайм-ауты ответа, например:

  • "Отклонение ответа с неправильным CRC, получено: 64580 , вычисленный CRC: 55067"
  • "Ошибка чтения ответа: тайм-аут ответа. (код: 0x5)" - qt.modbus: (клиент RTU) Не удается сопоставить ответ с открытым запросом, игнорируя

Запрос на чтение отправляется через

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

Если в моем окне нет анимации, данные принимаются без ошибок.

  • Можно ли это исправить, используя отдельный поток для запуска методов чтения/записи modbus, и как бы я это реализовал? Или я только увеличил бы количество ошибок, поместив последовательные функции в отдельный поток?

Насколько я понимаю, из-за того, что мое приложение до сих пор работает в одном потоке, непрерывное обновление графического интерфейса каким-то образом мешает приему последовательных данных.

Я использовал инструмент командной строки Linux "стресс", чтобы проверить, не теряю ли я данные и при высокой загрузке процессора, но это не так.

С уважением

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

Лучший ответ

1

Я нашел проблему:

Как я и думал, механизм рендеринга qml, график сцены или как вы его там называете, вызвал пропущенные кадры приема modbus. Я думаю, что каким-то образом многопоточность могла бы помочь в этом, но я не смог это исправить, запустив интерфейс modbusInterface в отдельном потоке.

В конце концов, решение состояло в том, чтобы включить потоковый цикл визуализации графика сцены, как указано здесь: https://doc.qt.io/qt-5/qtquick-visualcanvas-scenegraph.html#threaded-render-loop-threaded

То есть, поместив

qputenv("QSG_RENDER_LOOP","threaded");

в моем главном().

2021-10-28 12:49:29

На других языках

Эта страница на других языках

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