Bir ana pencereye ve Modbus Yazma/Okuma işlevlerini işleyen bir sınıfa sahip tek bir iş parçacıklı QQuick uygulamam var. Şimdiye kadar her şey yolunda gidiyor, ancak qml pencereme Otobüsün meşgul olduğunu göstermek için bir BusyIndicator koyduğumda CRC uyuşmazlıkları ve yanıt zaman aşımları alıyorum, örn.:
- "Yanlış CRC ile yanıt atma, alındı: 64580, hesaplanan CRC: 55067"
- "Yanıt hatasını oku: Yanıt zaman aşımı. (kod: 0x5) " - qt.modbus: (RTU istemcisi) Yanıtı açık istekle eşleştiremiyor, yoksayılıyor
ReadRequest üzerinden gönderilir
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();
}
Penceremde çalışan bir animasyon yoksa, veriler hatasız olarak alınır.
- Bu, modbus okuma / yazma yöntemlerini çalıştırmak için ayrı bir iş parçacığı kullanılarak düzeltilebilir mi ve bunu nasıl uygulayabilirim? Yoksa Seri işlevleri ayrı bir İş Parçacığına koyarak yanlış okumaları mı artıracağım?
Şimdiye kadar anladığım kadarıyla, uygulamamın şu ana kadar tek bir iş parçacığında çalışıyor olması nedeniyle, guı'nin sürekli güncellenmesi bir şekilde Seri Verilerin alınmasına müdahale ediyor.
Yüksek cpu yükü altında da veri kaybedip kaybetmediğimi görmek için linux komut satırı aracını "stres" kullandım, ancak durum böyle değil.
Saygılarımla,