Qt e QML - QModBus leitura corrompida pelo software livre BusyIndicator/Animação - SingleThread

0

Pergunta

Eu tenho uma única thread QQuick aplicação com uma janela principal e uma classe que lida com Modbus de Leitura/Escrita de funções. Tudo está funcionando bem até agora, mas quando eu coloco um BusyIndicator na minha qml janela para mostrar que o Ônibus está ocupado recebo diferenças CRC de resposta e tempos de espera, por exemplo:

  • "Descartando resposta errada CRC, recebido: 64580 , CRC calculado: 55067"
  • "Resposta de leitura de erro: tempo limite de Resposta. (código: 0 x 5)" - qt.modbus: (RTU cliente) podem Não corresponder à resposta, com pedido de abertura, ignorando

O ReadRequest é enviado 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 não há animação correndo em minha janela, os dados são recebidos sem erros.

  • Isso pode ser corrigido por meio de um thread separado para executar o modbus de leitura/gravação de métodos e de como implementar isso? Ou será que eu só aumentar o interpretam mal colocando o Serial funções em um Thread separado?

Pelo que entendi até agora, devido ao fato de que a minha candidatura é até agora rodando em um único segmento, a atualização permanente do GUI é, de alguma forma, interferir com a recepção de Dados Seriais.

Eu usei o linux ferramenta de linha de comando "stress" para ver se eu perder dados em alta a carga da cpu como bem, mas que não é o caso.

Com os melhores cumprimentos

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

Melhor resposta

1

Eu achei o problema:

Como eu pensei que o qml motor de renderização, grafo de cena ou o que você chamá-lo, causada perdeu frames do modbus recepção. Eu acho que, de alguma forma, rosqueamento poderia ter ajudado com isso, mas eu não era capaz de corrigi-lo por ter o modbusInterface executada em uma thread separada.

No final, a solução foi para ativar a thread processar ciclo do grafo de cena como dito aqui: https://doc.qt.io/qt-5/qtquick-visualcanvas-scenegraph.html#threaded-render-loop-threaded

I. e. colocando

qputenv("QSG_RENDER_LOOP","threaded");

na minha main().

2021-10-28 12:49:29

Em outros idiomas

Esta página está em outros idiomas

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