QModbus long frame transmission error
-
I use a USB-to-RS485 converter, send request frame with write a small number of registers(such as 5 registers), it is ok, but with a large number of registers(such as 60 registers), it can not work well.
Environment:
Windows 7
Qt 5.10.0
MinGW 32bitRepetition:
I use a spinBox to choose number of register, and a button to send Modbus request.void MainWindow::on_pushButtonSend_clicked() { int reg = ui->spinBoxReg->value(); if (auto *reply = mClient->sendWriteRequest(QModbusDataUnit(QModbusDataUnit::HoldingRegisters, 0, reg), 1)) { if (!reply->isFinished()) { connect(reply, &QModbusReply::finished, this, [this, reply]() { if (reply->error() == QModbusDevice::ProtocolError) { statusBar()->showMessage(tr("Write response error: %1 (Modbus exception: 0x%2)") .arg(reply->errorString()).arg(reply->rawResult().exceptionCode(), -1, 16)); } else if (reply->error() != QModbusDevice::NoError) { statusBar()->showMessage(tr("Write response error: %1 (code: 0x%2)") .arg(reply->errorString()).arg(reply->error(), -1, 16)); } else { statusBar()->showMessage(tr("Write ok")); } reply->deleteLater(); }); } else { reply->deleteLater(); } } else { ui->statusBar->showMessage(tr("Write error: ") + mClient->errorString()); } }and the initialize:
mClient = new QModbusRtuSerialMaster; mClient->setConnectionParameter(QModbusDevice::SerialPortNameParameter, "COM3"); mClient->setConnectionParameter(QModbusDevice::SerialBaudRateParameter, 9600); mClient->setConnectionParameter(QModbusDevice::SerialParityParameter, QSerialPort::NoParity); mClient->setConnectionParameter(QModbusDevice::SerialDataBitsParameter, QSerialPort::Data8); mClient->setConnectionParameter(QModbusDevice::SerialStopBitsParameter, QSerialPort::OneStop); mClient->setTimeout(3000); mClient->setNumberOfRetries(2); if (!mClient->connectDevice()) { QMessageBox::information(this, tr("err"), tr("can not open")); delete mClient; mClient = nullptr; ui->pushButtonSend->setEnabled(false); } else { ui->pushButtonSend->setEnabled(true); }the log info:

-
I use a USB-to-RS485 converter, send request frame with write a small number of registers(such as 5 registers), it is ok, but with a large number of registers(such as 60 registers), it can not work well.
Environment:
Windows 7
Qt 5.10.0
MinGW 32bitRepetition:
I use a spinBox to choose number of register, and a button to send Modbus request.void MainWindow::on_pushButtonSend_clicked() { int reg = ui->spinBoxReg->value(); if (auto *reply = mClient->sendWriteRequest(QModbusDataUnit(QModbusDataUnit::HoldingRegisters, 0, reg), 1)) { if (!reply->isFinished()) { connect(reply, &QModbusReply::finished, this, [this, reply]() { if (reply->error() == QModbusDevice::ProtocolError) { statusBar()->showMessage(tr("Write response error: %1 (Modbus exception: 0x%2)") .arg(reply->errorString()).arg(reply->rawResult().exceptionCode(), -1, 16)); } else if (reply->error() != QModbusDevice::NoError) { statusBar()->showMessage(tr("Write response error: %1 (code: 0x%2)") .arg(reply->errorString()).arg(reply->error(), -1, 16)); } else { statusBar()->showMessage(tr("Write ok")); } reply->deleteLater(); }); } else { reply->deleteLater(); } } else { ui->statusBar->showMessage(tr("Write error: ") + mClient->errorString()); } }and the initialize:
mClient = new QModbusRtuSerialMaster; mClient->setConnectionParameter(QModbusDevice::SerialPortNameParameter, "COM3"); mClient->setConnectionParameter(QModbusDevice::SerialBaudRateParameter, 9600); mClient->setConnectionParameter(QModbusDevice::SerialParityParameter, QSerialPort::NoParity); mClient->setConnectionParameter(QModbusDevice::SerialDataBitsParameter, QSerialPort::Data8); mClient->setConnectionParameter(QModbusDevice::SerialStopBitsParameter, QSerialPort::OneStop); mClient->setTimeout(3000); mClient->setNumberOfRetries(2); if (!mClient->connectDevice()) { QMessageBox::information(this, tr("err"), tr("can not open")); delete mClient; mClient = nullptr; ui->pushButtonSend->setEnabled(false); } else { ui->pushButtonSend->setEnabled(true); }the log info:

-
I use a USB-to-RS485 converter, send request frame with write a small number of registers(such as 5 registers), it is ok, but with a large number of registers(such as 60 registers), it can not work well.
Environment:
Windows 7
Qt 5.10.0
MinGW 32bitRepetition:
I use a spinBox to choose number of register, and a button to send Modbus request.void MainWindow::on_pushButtonSend_clicked() { int reg = ui->spinBoxReg->value(); if (auto *reply = mClient->sendWriteRequest(QModbusDataUnit(QModbusDataUnit::HoldingRegisters, 0, reg), 1)) { if (!reply->isFinished()) { connect(reply, &QModbusReply::finished, this, [this, reply]() { if (reply->error() == QModbusDevice::ProtocolError) { statusBar()->showMessage(tr("Write response error: %1 (Modbus exception: 0x%2)") .arg(reply->errorString()).arg(reply->rawResult().exceptionCode(), -1, 16)); } else if (reply->error() != QModbusDevice::NoError) { statusBar()->showMessage(tr("Write response error: %1 (code: 0x%2)") .arg(reply->errorString()).arg(reply->error(), -1, 16)); } else { statusBar()->showMessage(tr("Write ok")); } reply->deleteLater(); }); } else { reply->deleteLater(); } } else { ui->statusBar->showMessage(tr("Write error: ") + mClient->errorString()); } }and the initialize:
mClient = new QModbusRtuSerialMaster; mClient->setConnectionParameter(QModbusDevice::SerialPortNameParameter, "COM3"); mClient->setConnectionParameter(QModbusDevice::SerialBaudRateParameter, 9600); mClient->setConnectionParameter(QModbusDevice::SerialParityParameter, QSerialPort::NoParity); mClient->setConnectionParameter(QModbusDevice::SerialDataBitsParameter, QSerialPort::Data8); mClient->setConnectionParameter(QModbusDevice::SerialStopBitsParameter, QSerialPort::OneStop); mClient->setTimeout(3000); mClient->setNumberOfRetries(2); if (!mClient->connectDevice()) { QMessageBox::information(this, tr("err"), tr("can not open")); delete mClient; mClient = nullptr; ui->pushButtonSend->setEnabled(false); } else { ui->pushButtonSend->setEnabled(true); }the log info:

@Hy-Tang does your device even accept such long frames ? How does it handle, for example, access tries of invalid registers. Is the Modbus Exception implemented correctly ?
are you really only sending 60 Registers ?
MODBUS only allows to READ 125 and WRITE 123 Registers in one datagram. aka 256 byte are you sure you'r not exceeding this ?
-
@Hy-Tang You will need to provide more information if you want to get meaningful answer.
"it can not work well" - this is not a problem description... -
@J-Hilk I use Modbus Slave (https://modbustools.com/modbus_slave.html) to test this question, in modbus slave's Communication Traffic window, it has receive the long frame, and send the response, but qt client has error information.