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