From c9b44e5dabb751aba7dfca733f99564ac78f7bd6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=92=D1=8F=D1=87=D0=B5=D1=81=D0=BB=D0=B0=D0=B2=20=D0=A8?= =?UTF-8?q?=D1=82=D0=B5=D0=B9=D0=B1=D0=B5=D0=B7=D0=B0=D0=BD=D0=B4=D1=82?= Date: Mon, 22 Sep 2025 12:40:36 +0300 Subject: [PATCH] =?UTF-8?q?=D0=98=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5=20=D0=BE=D0=B1=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=BA?= =?UTF-8?q?=D0=B8=20=D0=BE=D1=88=D0=B8=D0=B1=D0=BE=D0=BA=20=D0=B8=20=D0=B2?= =?UTF-8?q?=D1=8B=D0=B2=D0=BE=D0=B4=D0=B0=20=D0=B7=D0=B0=D0=BF=D0=B8=D1=81?= =?UTF-8?q?=D0=B8=20=D0=B2=20=D0=BB=D0=BE=D0=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- M3KTE_TERM/m3kte.cpp | 638 ++++++++++++++++++------------------------- M3KTE_TERM/m3kte.h | 3 +- 2 files changed, 268 insertions(+), 373 deletions(-) diff --git a/M3KTE_TERM/m3kte.cpp b/M3KTE_TERM/m3kte.cpp index 7287c01..abc33cf 100644 --- a/M3KTE_TERM/m3kte.cpp +++ b/M3KTE_TERM/m3kte.cpp @@ -395,6 +395,7 @@ M3KTE::M3KTE(QWidget *parent) ui->BSM_Accident->setEnabled(false); ui->BSM_WorkInProgress->setEnabled(false); initActions(); + ui->BST_On->setCheckable(false); ui->BST_Off->setChecked(true); ui->boardSelectBox->setCurrentIndex(0); ui->writeTable->setCurrentIndex(0); @@ -488,6 +489,20 @@ void M3KTE::initActions() connect(ui->M3kteMenuSettings, &QAction::triggered, m_deviceSettingsDialog, &QDialog::show); } +void M3KTE::logError(const QString &errorPlace, const QString &errorString, unsigned errorCount, const QString &description) +{ + unsigned newRow = loggerTable->rowCount(); + loggerTable->insertRow(newRow); + loggerTable->setItem(newRow, 0, new QTableWidgetItem(QTime::currentTime().toString("HH:mm:ss"))); + loggerTable->setItem(newRow, 1, new QTableWidgetItem(errorPlace)); + loggerTable->setItem(newRow, 2, new QTableWidgetItem(errorString)); + loggerTable->setItem(newRow, 3, new QTableWidgetItem(QString::number(errorCount))); + loggerTable->setItem(newRow, 4, new QTableWidgetItem(description)); + loggerTable->resizeColumnsToContents(); + if(!loggerTable->verticalScrollBar()->isSliderDown()) + loggerTable->verticalScrollBar()->setSliderPosition(loggerTable->verticalScrollBar()->maximum()); +} + void M3KTE::onConnectClicked() { if(!modbusDevice) @@ -527,7 +542,9 @@ void M3KTE::onConnectClicked() changeTable(0, 0); ui->M3kteMenuSettings->setEnabled(true); ui->M3kteRegSettings->setEnabled(true); + ui->BST_Off->setCheckable(false); ui->BST_Off->setChecked(false); + ui->BST_On->setCheckable(true); ui->BST_On->setChecked(true); ui->BSM_Warning->setEnabled(true); ui->BSM_Accident->setEnabled(true); @@ -563,7 +580,9 @@ void M3KTE::onConnectClicked() ui->M3kteRegSettings->setEnabled(false); ui->ConnectionMenuConnect->setEnabled(true); ui->ConnectionMenuDisconnect->setEnabled(false); + ui->BST_Off->setCheckable(true); ui->BST_Off->setChecked(true); + ui->BST_On->setCheckable(false); ui->BST_On->setChecked(false); ui->BSM_Warning->setChecked(false); ui->BSM_Accident->setChecked(false); @@ -633,30 +652,16 @@ void M3KTE::onReadReady() statusBar()->showMessage(tr("Read response error: %1 (Mobus exception: 0x%2)"). arg(reply->errorString()). arg(reply->rawResult().exceptionCode(), -1, 16), 5000); - unsigned newRow = loggerTable->rowCount(); - loggerTable->insertRow(newRow); - loggerTable->setItem(newRow, 0, new QTableWidgetItem((QTime::currentTime().toString("HH:mm:ss")))); - loggerTable->setItem(newRow, 1, new QTableWidgetItem(tr("Плата %1 (ID %2)").arg(Adr+1).arg(Boards[Adr].adr))); - loggerTable->setItem(newRow, 2, new QTableWidgetItem(reply->errorString())); - loggerTable->setItem(newRow, 3, new QTableWidgetItem(QString::number(++Boards[Adr].error_RX, 10))); - loggerTable->setItem(newRow, 4, new QTableWidgetItem(QString::number(reply->rawResult().exceptionCode(), 16))); - loggerTable->resizeColumnsToContents(); - if(!loggerTable->verticalScrollBar()->isSliderDown()) - loggerTable->verticalScrollBar()->setSliderPosition(loggerTable->verticalScrollBar()->maximum()); + logError(tr("Плата %1 (ID %2)").arg(Adr+1).arg(Boards[Adr].adr), + reply->errorString(), ++Boards[Adr].error_RX, + QString::number(reply->rawResult().exceptionCode())); } else { statusBar()->showMessage(tr("Read response error: %1 (code: 0x%2)"). arg(reply->errorString()). arg(reply->error(), -1, 16), 5000); - unsigned newRow = loggerTable->rowCount(); - loggerTable->insertRow(newRow); - loggerTable->setItem(newRow, 0, new QTableWidgetItem((QTime::currentTime().toString("HH:mm:ss")))); - loggerTable->setItem(newRow, 1, new QTableWidgetItem(tr("Плата %1 (ID %2)").arg(Adr+1).arg(Boards[Adr].adr))); - loggerTable->setItem(newRow, 2, new QTableWidgetItem(reply->errorString())); - loggerTable->setItem(newRow, 3, new QTableWidgetItem(QString::number(++Boards[Adr].error_RX, 10))); - loggerTable->setItem(newRow, 4, new QTableWidgetItem(QString::number(reply->error(), 16))); - loggerTable->resizeColumnsToContents(); - if(!loggerTable->verticalScrollBar()->isSliderDown()) - loggerTable->verticalScrollBar()->setSliderPosition(loggerTable->verticalScrollBar()->maximum()); + logError(tr("Плата %1 (ID %2)").arg(Adr+1).arg(Boards[Adr].adr), + reply->errorString(), ++Boards[Adr].error_RX, + QString::number(reply->error(), 16)); } reply->deleteLater(); } @@ -686,29 +691,15 @@ void M3KTE::onWriteButtonClicked() statusBar()->showMessage(tr("Write response error: %1 (Mobus exception: 0x%2)") .arg(reply->errorString()).arg(reply->rawResult().exceptionCode(), -1, 16), 5000); - unsigned newRow = loggerTable->rowCount(); - loggerTable->insertRow(newRow); - loggerTable->setItem(newRow, 0, new QTableWidgetItem((QTime::currentTime().toString("HH:mm:ss")))); - loggerTable->setItem(newRow, 1, new QTableWidgetItem(tr("Плата %1 (ID %2)").arg(tmp_id+1).arg(Boards[tmp_id].adr))); - loggerTable->setItem(newRow, 2, new QTableWidgetItem(reply->errorString())); - loggerTable->setItem(newRow, 3, new QTableWidgetItem(QString::number(++Boards[tmp_id].error_TX, 10))); - loggerTable->setItem(newRow, 4, new QTableWidgetItem(QString::number(reply->rawResult().exceptionCode(), 16))); - loggerTable->resizeColumnsToContents(); - if(!loggerTable->verticalScrollBar()->isSliderDown()) - loggerTable->verticalScrollBar()->setSliderPosition(loggerTable->verticalScrollBar()->maximum()); + logError(tr("Плата %1 (ID %2)").arg(tmp_id+1).arg(Boards[tmp_id].adr), + reply->errorString(), ++Boards[tmp_id].error_TX, + QString::number(reply->rawResult().exceptionCode(), 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), 5000); - unsigned newRow = loggerTable->rowCount(); - loggerTable->insertRow(newRow); - loggerTable->setItem(newRow, 0, new QTableWidgetItem((QTime::currentTime().toString("HH:mm:ss")))); - loggerTable->setItem(newRow, 1, new QTableWidgetItem(tr("Плата %1 (ID %2)").arg(tmp_id+1).arg(Boards[tmp_id].adr))); - loggerTable->setItem(newRow, 2, new QTableWidgetItem(reply->errorString())); - loggerTable->setItem(newRow, 3, new QTableWidgetItem(QString::number(++Boards[tmp_id].error_TX, 10))); - loggerTable->setItem(newRow, 4, new QTableWidgetItem(QString::number(reply->error(), 16))); - loggerTable->resizeColumnsToContents(); - if(!loggerTable->verticalScrollBar()->isSliderDown()) - loggerTable->verticalScrollBar()->setSliderPosition(loggerTable->verticalScrollBar()->maximum()); + logError(tr("Плата %1 (ID %2)").arg(tmp_id+1).arg(Boards[tmp_id].adr), + reply->errorString(), ++Boards[tmp_id].error_TX, + QString::number(reply->error())); } reply->deleteLater(); }); @@ -718,14 +709,7 @@ void M3KTE::onWriteButtonClicked() } } else { statusBar()->showMessage(tr("Write error: ") + modbusDevice->errorString(), 5000); - unsigned newRow = loggerTable->rowCount(); - loggerTable->insertRow(newRow); - loggerTable->setItem(newRow, 0, new QTableWidgetItem((QTime::currentTime().toString("HH:mm:ss")))); - loggerTable->setItem(newRow, 1, new QTableWidgetItem(tr("Терминал"))); - loggerTable->setItem(newRow, 2, new QTableWidgetItem(modbusDevice->errorString())); - loggerTable->resizeColumnsToContents(); - if(!loggerTable->verticalScrollBar()->isSliderDown()) - loggerTable->verticalScrollBar()->setSliderPosition(loggerTable->verticalScrollBar()->maximum()); + logError(tr("Терминал"), modbusDevice->errorString(), 0, ""); } } @@ -815,71 +799,36 @@ bool M3KTE::event(QEvent *event) checkAdrChange(subreply, _event->BoardNum()); }); else { - unsigned newRow = loggerTable->rowCount(); - loggerTable->insertRow(newRow); - loggerTable->setItem(newRow, 0, new QTableWidgetItem((QTime::currentTime().toString("HH:mm:ss")))); - loggerTable->setItem(newRow, 1, new QTableWidgetItem(tr("Плата %1 (ID %2)").arg(_event->BoardNum()+1).arg(Boards[_event->BoardNum()].adr))); - loggerTable->setItem(newRow, 2, new QTableWidgetItem(subreply->errorString())); - loggerTable->setItem(newRow, 3, new QTableWidgetItem(QString::number(++Boards[_event->BoardNum()].error_adr_change, 10))); - loggerTable->setItem(newRow, 4, new QTableWidgetItem("Не удалось изменить адрес устройства. [1]")); - loggerTable->resizeColumnsToContents(); - if(!loggerTable->verticalScrollBar()->isSliderDown()) - loggerTable->verticalScrollBar()->setSliderPosition(loggerTable->verticalScrollBar()->maximum()); + logError(tr("Плата %1 (ID %2)").arg(_event->BoardNum()+1).arg(Boards[_event->BoardNum()].adr), + subreply->errorString(), ++Boards[_event->BoardNum()].error_adr_change, + "Не удалось изменить адрес устройства. [1]"); reply->deleteLater(); delete subreply; // broadcast replies return immediately } } else { - unsigned newRow = loggerTable->rowCount(); - loggerTable->insertRow(newRow); - loggerTable->setItem(newRow, 0, new QTableWidgetItem((QTime::currentTime().toString("HH:mm:ss")))); - loggerTable->setItem(newRow, 1, new QTableWidgetItem(tr("Плата %1 (ID %2)").arg(_event->BoardNum()+1).arg(Boards[_event->BoardNum()].adr))); - loggerTable->setItem(newRow, 2, new QTableWidgetItem(modbusDevice->errorString())); - loggerTable->setItem(newRow, 3, new QTableWidgetItem(QString::number(++Boards[_event->BoardNum()].error_adr_change, 10))); - loggerTable->setItem(newRow, 4, new QTableWidgetItem("Не удалось изменить адрес устройства. [2]")); - loggerTable->resizeColumnsToContents(); - if(!loggerTable->verticalScrollBar()->isSliderDown()) - loggerTable->verticalScrollBar()->setSliderPosition(loggerTable->verticalScrollBar()->maximum()); + logError(tr("Плата %1 (ID %2)").arg(_event->BoardNum()+1).arg(Boards[_event->BoardNum()].adr), + modbusDevice->errorString(), ++Boards[_event->BoardNum()].error_adr_change, + "Не удалось изменить адрес устройства. [2]"); reply->deleteLater(); } } else { - unsigned newRow = loggerTable->rowCount(); - loggerTable->insertRow(newRow); - loggerTable->setItem(newRow, 0, new QTableWidgetItem((QTime::currentTime().toString("HH:mm:ss")))); - loggerTable->setItem(newRow, 1, new QTableWidgetItem(tr("Плата %1 (ID %2)").arg(_event->BoardNum()+1).arg(Boards[_event->BoardNum()].adr))); - loggerTable->setItem(newRow, 2, new QTableWidgetItem(reply->errorString())); - loggerTable->setItem(newRow, 3, new QTableWidgetItem(QString::number(++Boards[_event->BoardNum()].error_adr_change, 10))); - loggerTable->setItem(newRow, 4, new QTableWidgetItem("Не удалось изменить адрес устройства. [3]")); - loggerTable->resizeColumnsToContents(); - if(!loggerTable->verticalScrollBar()->isSliderDown()) - loggerTable->verticalScrollBar()->setSliderPosition(loggerTable->verticalScrollBar()->maximum()); + logError(tr("Плата %1 (ID %2)").arg(_event->BoardNum()+1).arg(Boards[_event->BoardNum()].adr), + reply->errorString(), ++Boards[_event->BoardNum()].error_adr_change, + "Не удалось изменить адрес устройства. [3]"); reply->deleteLater(); } }); else { - unsigned newRow = loggerTable->rowCount(); - loggerTable->insertRow(newRow); - loggerTable->setItem(newRow, 0, new QTableWidgetItem((QTime::currentTime().toString("HH:mm:ss")))); - loggerTable->setItem(newRow, 1, new QTableWidgetItem(tr("Плата %1 (ID %2)").arg(_event->BoardNum()+1).arg(Boards[_event->BoardNum()].adr))); - loggerTable->setItem(newRow, 2, new QTableWidgetItem(reply->errorString())); - loggerTable->setItem(newRow, 3, new QTableWidgetItem(QString::number(++Boards[_event->BoardNum()].error_adr_change, 10))); - loggerTable->setItem(newRow, 4, new QTableWidgetItem("Не удалось изменить адрес устройства. [4]")); - loggerTable->resizeColumnsToContents(); - if(!loggerTable->verticalScrollBar()->isSliderDown()) - loggerTable->verticalScrollBar()->setSliderPosition(loggerTable->verticalScrollBar()->maximum()); + logError(tr("Плата %1 (ID %2)").arg(_event->BoardNum()+1).arg(Boards[_event->BoardNum()].adr), + reply->errorString(), ++Boards[_event->BoardNum()].error_adr_change, + "Не удалось изменить адрес устройства. [4]"); reply->deleteLater(); delete reply; } } else { - unsigned newRow = loggerTable->rowCount(); - loggerTable->insertRow(newRow); - loggerTable->setItem(newRow, 0, new QTableWidgetItem((QTime::currentTime().toString("HH:mm:ss")))); - loggerTable->setItem(newRow, 1, new QTableWidgetItem(tr("Плата %1 (ID %2)").arg(_event->BoardNum()+1).arg(Boards[_event->BoardNum()].adr))); - loggerTable->setItem(newRow, 2, new QTableWidgetItem(modbusDevice->errorString())); - loggerTable->setItem(newRow, 3, new QTableWidgetItem(QString::number(++Boards[_event->BoardNum()].error_adr_change, 10))); - loggerTable->setItem(newRow, 4, new QTableWidgetItem("Не удалось изменить адрес устройства. [5]")); - loggerTable->resizeColumnsToContents(); - if(!loggerTable->verticalScrollBar()->isSliderDown()) - loggerTable->verticalScrollBar()->setSliderPosition(loggerTable->verticalScrollBar()->maximum()); + logError(tr("Плата %1 (ID %2)").arg(_event->BoardNum()+1).arg(Boards[_event->BoardNum()].adr), + modbusDevice->errorString(), ++Boards[_event->BoardNum()].error_adr_change, + "Не удалось изменить адрес устройства. [5]"); reply->deleteLater(); } m_deviceSettingsDialog->show(); @@ -892,28 +841,14 @@ bool M3KTE::event(QEvent *event) if(!reply->isFinished()) connect(reply, &QModbusReply::finished, this, [reply, this, _event]() { if(reply->error()!=QModbusDevice::NoError) { - unsigned newRow = loggerTable->rowCount(); - loggerTable->insertRow(newRow); - loggerTable->setItem(newRow, 0, new QTableWidgetItem((QTime::currentTime().toString("HH:mm:ss")))); - loggerTable->setItem(newRow, 1, new QTableWidgetItem(tr("Плата %1 (ID %2)").arg(_event->BoardID()+1).arg(Boards[_event->BoardID()].adr))); - loggerTable->setItem(newRow, 2, new QTableWidgetItem(reply->errorString())); - loggerTable->setItem(newRow, 3, new QTableWidgetItem(QString::number(++Boards[_event->BoardID()].error_cmd_change, 10))); - loggerTable->resizeColumnsToContents(); - if(!loggerTable->verticalScrollBar()->isSliderDown()) - loggerTable->verticalScrollBar()->setSliderPosition(loggerTable->verticalScrollBar()->maximum()); + logError(tr("Плата %1 (ID %2)").arg(_event->BoardID()+1).arg(Boards[_event->BoardID()].adr), + reply->errorString(), ++Boards[_event->BoardID()].error_cmd_change, ""); reply->deleteLater(); } }); } else { - unsigned newRow = loggerTable->rowCount(); - loggerTable->insertRow(newRow); - loggerTable->setItem(newRow, 0, new QTableWidgetItem((QTime::currentTime().toString("HH:mm:ss")))); - loggerTable->setItem(newRow, 1, new QTableWidgetItem(tr("Плата %1 (ID %2)").arg(_event->BoardID()+1).arg(Boards[_event->BoardID()].adr))); - loggerTable->setItem(newRow, 2, new QTableWidgetItem(modbusDevice->errorString())); - loggerTable->setItem(newRow, 3, new QTableWidgetItem(QString::number(++Boards[_event->BoardID()].error_cmd_change, 10))); - loggerTable->resizeColumnsToContents(); - if(!loggerTable->verticalScrollBar()->isSliderDown()) - loggerTable->verticalScrollBar()->setSliderPosition(loggerTable->verticalScrollBar()->maximum()); + logError(tr("Плата %1 (ID %2)").arg(_event->BoardID()+1).arg(Boards[_event->BoardID()].adr), + modbusDevice->errorString(), ++Boards[_event->BoardID()].error_cmd_change, ""); reply->deleteLater(); } return true; @@ -924,16 +859,9 @@ bool M3KTE::event(QEvent *event) void M3KTE::checkAdrChange(QModbusReply *reply, unsigned boardNum) { if(!reply) { - unsigned newRow = loggerTable->rowCount(); - loggerTable->insertRow(newRow); - loggerTable->setItem(newRow, 0, new QTableWidgetItem((QTime::currentTime().toString("HH:mm:ss")))); - loggerTable->setItem(newRow, 1, new QTableWidgetItem(tr("Плата %1 (ID %2)").arg(boardNum+1).arg(Boards[boardNum].adr))); - loggerTable->setItem(newRow, 2, new QTableWidgetItem(modbusDevice->errorString())); - loggerTable->setItem(newRow, 3, new QTableWidgetItem(QString::number(++Boards[boardNum].error_adr_change, 10))); - loggerTable->setItem(newRow, 4, new QTableWidgetItem("Не удалось проверить изменение адреса устройства.")); - loggerTable->resizeColumnsToContents(); - if(!loggerTable->verticalScrollBar()->isSliderDown()) - loggerTable->verticalScrollBar()->setSliderPosition(loggerTable->verticalScrollBar()->maximum()); + logError(tr("Плата %1 (ID %2)").arg(boardNum+1).arg(Boards[boardNum].adr), + modbusDevice->errorString(), ++Boards[boardNum].error_adr_change, + "Не удалось проверить изменение адреса устройства."); reply->deleteLater(); return; } @@ -943,16 +871,10 @@ void M3KTE::checkAdrChange(QModbusReply *reply, unsigned boardNum) reply->deleteLater(); } else { - unsigned newRow = loggerTable->rowCount(); - loggerTable->insertRow(newRow); - loggerTable->setItem(newRow, 0, new QTableWidgetItem((QTime::currentTime().toString("HH:mm:ss")))); - loggerTable->setItem(newRow, 1, new QTableWidgetItem(tr("Плата %1 (ID %2)").arg(boardNum+1).arg(Boards[boardNum].adr))); - loggerTable->setItem(newRow, 2, new QTableWidgetItem(reply->errorString())); - loggerTable->setItem(newRow, 3, new QTableWidgetItem(QString::number(++Boards[boardNum].error_adr_change, 10))); - loggerTable->setItem(newRow, 4, new QTableWidgetItem("Ошибка при подтверждении изменения адреса устройства.")); - loggerTable->resizeColumnsToContents(); - if(!loggerTable->verticalScrollBar()->isSliderDown()) - loggerTable->verticalScrollBar()->setSliderPosition(loggerTable->verticalScrollBar()->maximum()); + logError(tr("Плата %1 (ID %2)").arg(boardNum+1).arg(Boards[boardNum].adr), + reply->errorString(), + ++Boards[boardNum].error_adr_change, + "Ошибка при подтверждении изменения адреса устройства."); reply->deleteLater(); } } @@ -1103,17 +1025,13 @@ void M3KTE::checkBoards() pendingBoards.insert(slaveAddress); - connect(reply, &QModbusReply::finished, this, [this, reply, slaveAddress, &confirmedBoards, &pendingBoards, totalActiveBoards]() mutable { + connect(reply, &QModbusReply::finished, this, [this, i, reply, slaveAddress, &confirmedBoards, &pendingBoards, totalActiveBoards]() mutable { if(reply->error() == QModbusDevice::NoError) { - // Проверяем что пришел валидный ответ - QModbusDataUnit unit = reply->result(); - if(unit.valueCount() > 0) { - confirmedBoards++; - } else { - - } + confirmedBoards++; } else { - + logError(tr("Плата %1 (ID %2)").arg(i+1).arg(slaveAddress), + reply->errorString(), ++Boards[i].error_baud_change, + "Ошибка при подтверждении изменения скорости обмена."); } pendingBoards.remove(slaveAddress); @@ -1167,16 +1085,8 @@ void M3KTE::onSpeedUpdate() break; } if(tmp_speed == 0) { - unsigned newRow = loggerTable->rowCount(); - loggerTable->insertRow(newRow); - loggerTable->setItem(newRow, 0, new QTableWidgetItem((QTime::currentTime().toString("HH:mm:ss")))); - loggerTable->setItem(newRow, 1, new QTableWidgetItem(tr("Программная ошибка"))); - loggerTable->setItem(newRow, 2, new QTableWidgetItem("Неожиданное значение скорости")); - loggerTable->setItem(newRow, 3, new QTableWidgetItem(0)); - loggerTable->setItem(newRow, 4, new QTableWidgetItem("Ошибка при изменении скорости обмена.")); - loggerTable->resizeColumnsToContents(); - if(!loggerTable->verticalScrollBar()->isSliderDown()) - loggerTable->verticalScrollBar()->setSliderPosition(loggerTable->verticalScrollBar()->maximum()); + logError(tr("Программная ошибка"), "Неожиданное значение скорости", 0, + "Ошибка при изменении скорости обмена."); beginScanBoards(); return; } @@ -1199,9 +1109,17 @@ void M3KTE::onSpeedUpdate() if(reply) { totalActiveBoards++; pendingBoards.insert(slaveAdress); - connect(reply, &QModbusReply::finished, this, [this, reply, slaveAdress, &confirmedBoards, &pendingBoards, totalActiveBoards, tmp_speed]() mutable { + connect(reply, &QModbusReply::finished, this, [this, i, reply, slaveAdress, &confirmedBoards, &pendingBoards, totalActiveBoards, tmp_speed]() mutable { if(reply->error() == QModbusDevice::TimeoutError) { confirmedBoards++; + } else if (reply->error() == QModbusDevice::NoError) { + logError(tr("Плата %1 (ID %2)").arg(i+1).arg(slaveAdress), + tr("Неожиданный ответ."), ++Boards[i].error_baud_change, + "Ошибка при изменении скорости обмена."); + } else { + logError(tr("Плата %1 (ID %2)").arg(i+1).arg(slaveAdress), + reply->errorString(), ++Boards[i].error_baud_change, + "Ошибка при изменении скорости обмена."); } pendingBoards.remove(slaveAdress); reply->deleteLater(); @@ -1211,18 +1129,18 @@ void M3KTE::onSpeedUpdate() revertToOldSpeedAndRestart(); beginScanBoards(); } else { - // Переключаемся на tmp_speed modbusDevice->disconnectDevice(); modbusDevice->setConnectionParameter(QModbusDevice::SerialBaudRateParameter, tmp_speed); modbusDevice->connectDevice(); - connect(this, &M3KTE::errorAtCheckBoards, this, [this](){ + connect(this, &M3KTE::errorAtCheckBoards, this, [this]() { disconnect(this, &M3KTE::errorAtCheckBoards, this, nullptr); modbusDevice->setTimeout(m_settingsDialog->settings().responseTime); revertToOldSpeedAndRestart(); beginScanBoards(); }); - connect(this, &M3KTE::successAtCheckBoards, this, [this](){ + connect(this, &M3KTE::successAtCheckBoards, this, [this]() { disconnect(this, &M3KTE::successAtCheckBoards, this, nullptr); + m_settingsDialog->UpdateBaud(m_deviceSettingsDialog->currentSpeed()); modbusDevice->setTimeout(m_settingsDialog->settings().responseTime); beginScanBoards(); }); @@ -1244,98 +1162,177 @@ void M3KTE::revertToOldSpeedAndRestart() modbusDevice->connectDevice(); } +//void M3KTE::onParityUpdate() +//{ +// stopScanBoard(); +// QModbusDataUnit* _unit = new QModbusDataUnit(QModbusDataUnit::HoldingRegisters, 174, 1); +// switch(m_deviceSettingsDialog->currentParity()) { +// case 0: //Нет контроля +// _unit->setValue(0, 0x000); +// break; +// case 1: //Четный +// _unit->setValue(0, 0x0400); +// break; +// case 2: //Нечетный +// _unit->setValue(0, 0x0600); +// break; +// } +// for(int i = 0; i < 4; i++) { +// if(!Boards[i].isActive) { +// continue; +// } +// if(auto *reply = modbusDevice->sendWriteRequest(*_unit, Boards[i].adr)) { +// QEventLoop loop; +// connect(reply, &QModbusReply::finished, &loop, &QEventLoop::quit); +// loop.exec(); // Ожидает завершения reply без блокировки интерфейса +// if(reply->error()==QModbusDevice::TimeoutError) { +// modbusDevice->disconnectDevice(); +// modbusDevice->setConnectionParameter(QModbusDevice::SerialParityParameter, +// m_deviceSettingsDialog->currentParity()); +// modbusDevice->connectDevice(); +// QModbusDataUnit* _unit = new QModbusDataUnit(QModbusDataUnit::InputRegisters, 85, 1); +// if(auto *subreply = modbusDevice->sendReadRequest(*_unit, Boards[i].adr)) { +// QEventLoop subloop; +// connect(subreply, &QModbusReply::finished, &subloop, &QEventLoop::quit); +// subloop.exec(); // Ожидает завершения subreply без блокировки интерфейса +// if(subreply->error() != QModbusDevice::NoError) { +// unsigned newRow = loggerTable->rowCount(); +// loggerTable->insertRow(newRow); +// loggerTable->setItem(newRow, 0, new QTableWidgetItem((QTime::currentTime().toString("HH:mm:ss")))); +// loggerTable->setItem(newRow, 1, new QTableWidgetItem(tr("Плата %1 (ID %2)").arg(i+1).arg(Boards[i].adr))); +// loggerTable->setItem(newRow, 2, new QTableWidgetItem(subreply->errorString())); +// loggerTable->setItem(newRow, 3, new QTableWidgetItem(QString::number(++Boards[i].error_parity_change))); +// loggerTable->setItem(newRow, 4, new QTableWidgetItem("Ошибка при изменении чётности платы.")); +// loggerTable->resizeColumnsToContents(); +// if(!loggerTable->verticalScrollBar()->isSliderDown()) +// loggerTable->verticalScrollBar()->setSliderPosition(loggerTable->verticalScrollBar()->maximum()); +// } +// } else { +// unsigned newRow = loggerTable->rowCount(); +// loggerTable->insertRow(newRow); +// loggerTable->setItem(newRow, 0, new QTableWidgetItem((QTime::currentTime().toString("HH:mm:ss")))); +// loggerTable->setItem(newRow, 1, new QTableWidgetItem(tr("Плата %1 (ID %2)").arg(i+1).arg(Boards[i].adr))); +// loggerTable->setItem(newRow, 2, new QTableWidgetItem(modbusDevice->errorString())); +// loggerTable->setItem(newRow, 3, new QTableWidgetItem(QString::number(++Boards[i].error_parity_change))); +// loggerTable->setItem(newRow, 4, new QTableWidgetItem("Ошибка при изменении чётности платы.")); +// loggerTable->resizeColumnsToContents(); +// if(!loggerTable->verticalScrollBar()->isSliderDown()) +// loggerTable->verticalScrollBar()->setSliderPosition(loggerTable->verticalScrollBar()->maximum()); +// } +// modbusDevice->disconnectDevice(); +// modbusDevice->setConnectionParameter(QModbusDevice::SerialParityParameter, +// m_settingsDialog->curParity()); +// modbusDevice->connectDevice(); +// } else { +// unsigned newRow = loggerTable->rowCount(); +// loggerTable->insertRow(newRow); +// loggerTable->setItem(newRow, 0, new QTableWidgetItem((QTime::currentTime().toString("HH:mm:ss")))); +// loggerTable->setItem(newRow, 1, new QTableWidgetItem(tr("Плата %1 (ID %2)").arg(i+1).arg(Boards[i].adr))); +// loggerTable->setItem(newRow, 2, new QTableWidgetItem(reply->errorString())); +// loggerTable->setItem(newRow, 3, new QTableWidgetItem(QString::number(++Boards[i].error_parity_change))); +// loggerTable->setItem(newRow, 4, new QTableWidgetItem("Ошибка при изменении чётности платы.")); +// loggerTable->resizeColumnsToContents(); +// if(!loggerTable->verticalScrollBar()->isSliderDown()) +// loggerTable->verticalScrollBar()->setSliderPosition(loggerTable->verticalScrollBar()->maximum()); +// } +// } else { +// unsigned newRow = loggerTable->rowCount(); +// loggerTable->insertRow(newRow); +// loggerTable->setItem(newRow, 0, new QTableWidgetItem((QTime::currentTime().toString("HH:mm:ss")))); +// loggerTable->setItem(newRow, 1, new QTableWidgetItem(tr("Плата %1 (ID %2)").arg(i+1).arg(Boards[i].adr))); +// loggerTable->setItem(newRow, 2, new QTableWidgetItem(modbusDevice->errorString())); +// loggerTable->setItem(newRow, 3, new QTableWidgetItem(QString::number(++Boards[i].error_parity_change))); +// loggerTable->setItem(newRow, 4, new QTableWidgetItem("Ошибка при изменении чётности платы.")); +// loggerTable->resizeColumnsToContents(); +// if(!loggerTable->verticalScrollBar()->isSliderDown()) +// loggerTable->verticalScrollBar()->setSliderPosition(loggerTable->verticalScrollBar()->maximum()); +// delete reply; // broadcast replies return immediately +// } +// } +// modbusDevice->disconnectDevice(); +// modbusDevice->setConnectionParameter(QModbusDevice::SerialParityParameter, +// m_settingsDialog->UpdateParity(m_deviceSettingsDialog->currentParity())); +// modbusDevice->connectDevice(); +// beginScanBoards(); +//} + void M3KTE::onParityUpdate() { stopScanBoard(); - QModbusDataUnit* _unit = new QModbusDataUnit(QModbusDataUnit::HoldingRegisters, 174, 1); + modbusDevice->setTimeout(500); + + QModbusDataUnit unit(QModbusDataUnit::HoldingRegisters, 174, 1); switch(m_deviceSettingsDialog->currentParity()) { case 0: //Нет контроля - _unit->setValue(0, 0x000); + unit.setValue(0, 0x000); break; case 1: //Четный - _unit->setValue(0, 0x0400); + unit.setValue(0, 0x0400); break; case 2: //Нечетный - _unit->setValue(0, 0x0600); + unit.setValue(0, 0x0600); break; } + + int totalActiveBoards = 0; + int confirmedBoards = 0; + + QSet pendingBoards; + for(int i = 0; i < 4; i++) { - if(!Boards[i].isActive) { + if(!Boards[i].isActive) continue; - } - if(auto *reply = modbusDevice->sendWriteRequest(*_unit, Boards[i].adr)) { - QEventLoop loop; - connect(reply, &QModbusReply::finished, &loop, &QEventLoop::quit); - loop.exec(); // Ожидает завершения reply без блокировки интерфейса - if(reply->error()==QModbusDevice::TimeoutError) { - modbusDevice->disconnectDevice(); - modbusDevice->setConnectionParameter(QModbusDevice::SerialParityParameter, - m_deviceSettingsDialog->currentParity()); - modbusDevice->connectDevice(); - QModbusDataUnit* _unit = new QModbusDataUnit(QModbusDataUnit::InputRegisters, 85, 1); - if(auto *subreply = modbusDevice->sendReadRequest(*_unit, Boards[i].adr)) { - QEventLoop subloop; - connect(subreply, &QModbusReply::finished, &subloop, &QEventLoop::quit); - subloop.exec(); // Ожидает завершения subreply без блокировки интерфейса - if(subreply->error() != QModbusDevice::NoError) { - unsigned newRow = loggerTable->rowCount(); - loggerTable->insertRow(newRow); - loggerTable->setItem(newRow, 0, new QTableWidgetItem((QTime::currentTime().toString("HH:mm:ss")))); - loggerTable->setItem(newRow, 1, new QTableWidgetItem(tr("Плата %1 (ID %2)").arg(i+1).arg(Boards[i].adr))); - loggerTable->setItem(newRow, 2, new QTableWidgetItem(subreply->errorString())); - loggerTable->setItem(newRow, 3, new QTableWidgetItem(QString::number(++Boards[i].error_parity_change))); - loggerTable->setItem(newRow, 4, new QTableWidgetItem("Ошибка при изменении чётности платы.")); - loggerTable->resizeColumnsToContents(); - if(!loggerTable->verticalScrollBar()->isSliderDown()) - loggerTable->verticalScrollBar()->setSliderPosition(loggerTable->verticalScrollBar()->maximum()); - } + + int slaveAdress = Boards[i].adr; + + auto *reply = modbusDevice->sendWriteRequest(unit, slaveAdress); + if(reply) { + totalActiveBoards++; + pendingBoards.insert(slaveAdress); + connect(reply, &QModbusReply::finished, this, [this, i, reply, slaveAdress, &confirmedBoards, &pendingBoards, totalActiveBoards]() mutable { + if(reply->error() == QModbusDevice::TimeoutError) { + confirmedBoards++; + } else if (reply->error() == QModbusDevice::NoError) { + logError(tr("Плата %1 (ID %2)").arg(i+1).arg(slaveAdress), + tr("Неожиданный ответ."), ++Boards[i].error_baud_change, + "Ошибка при изменении чётности."); } else { - unsigned newRow = loggerTable->rowCount(); - loggerTable->insertRow(newRow); - loggerTable->setItem(newRow, 0, new QTableWidgetItem((QTime::currentTime().toString("HH:mm:ss")))); - loggerTable->setItem(newRow, 1, new QTableWidgetItem(tr("Плата %1 (ID %2)").arg(i+1).arg(Boards[i].adr))); - loggerTable->setItem(newRow, 2, new QTableWidgetItem(modbusDevice->errorString())); - loggerTable->setItem(newRow, 3, new QTableWidgetItem(QString::number(++Boards[i].error_parity_change))); - loggerTable->setItem(newRow, 4, new QTableWidgetItem("Ошибка при изменении чётности платы.")); - loggerTable->resizeColumnsToContents(); - if(!loggerTable->verticalScrollBar()->isSliderDown()) - loggerTable->verticalScrollBar()->setSliderPosition(loggerTable->verticalScrollBar()->maximum()); + logError(tr("Плата %1 (ID %2)").arg(i+1).arg(slaveAdress), + reply->errorString(), ++Boards[i].error_baud_change, + "Ошибка при изменении чётности."); } - modbusDevice->disconnectDevice(); - modbusDevice->setConnectionParameter(QModbusDevice::SerialParityParameter, - m_settingsDialog->curParity()); - modbusDevice->connectDevice(); - } else { - unsigned newRow = loggerTable->rowCount(); - loggerTable->insertRow(newRow); - loggerTable->setItem(newRow, 0, new QTableWidgetItem((QTime::currentTime().toString("HH:mm:ss")))); - loggerTable->setItem(newRow, 1, new QTableWidgetItem(tr("Плата %1 (ID %2)").arg(i+1).arg(Boards[i].adr))); - loggerTable->setItem(newRow, 2, new QTableWidgetItem(reply->errorString())); - loggerTable->setItem(newRow, 3, new QTableWidgetItem(QString::number(++Boards[i].error_parity_change))); - loggerTable->setItem(newRow, 4, new QTableWidgetItem("Ошибка при изменении чётности платы.")); - loggerTable->resizeColumnsToContents(); - if(!loggerTable->verticalScrollBar()->isSliderDown()) - loggerTable->verticalScrollBar()->setSliderPosition(loggerTable->verticalScrollBar()->maximum()); - } - } else { - unsigned newRow = loggerTable->rowCount(); - loggerTable->insertRow(newRow); - loggerTable->setItem(newRow, 0, new QTableWidgetItem((QTime::currentTime().toString("HH:mm:ss")))); - loggerTable->setItem(newRow, 1, new QTableWidgetItem(tr("Плата %1 (ID %2)").arg(i+1).arg(Boards[i].adr))); - loggerTable->setItem(newRow, 2, new QTableWidgetItem(modbusDevice->errorString())); - loggerTable->setItem(newRow, 3, new QTableWidgetItem(QString::number(++Boards[i].error_parity_change))); - loggerTable->setItem(newRow, 4, new QTableWidgetItem("Ошибка при изменении чётности платы.")); - loggerTable->resizeColumnsToContents(); - if(!loggerTable->verticalScrollBar()->isSliderDown()) - loggerTable->verticalScrollBar()->setSliderPosition(loggerTable->verticalScrollBar()->maximum()); - delete reply; // broadcast replies return immediately + pendingBoards.remove(slaveAdress); + reply->deleteLater(); + if(pendingBoards.isEmpty()) { + if(confirmedBoards != totalActiveBoards) { + modbusDevice->setTimeout(m_settingsDialog->settings().responseTime); + beginScanBoards(); + } else { + modbusDevice->disconnectDevice(); + modbusDevice->setConnectionParameter(QModbusDevice::SerialParityParameter, + m_deviceSettingsDialog->currentParity()); + modbusDevice->connectDevice(); + connect(this, &M3KTE::errorAtCheckBoards, this, [this](){ + disconnect(this, &M3KTE::errorAtCheckBoards, this, nullptr); + modbusDevice->setTimeout(m_settingsDialog->settings().responseTime); + modbusDevice->disconnectDevice(); + modbusDevice->setConnectionParameter(QModbusDevice::SerialParityParameter, + m_settingsDialog->curParity()); + modbusDevice->connectDevice(); + beginScanBoards(); + }); + connect(this, &M3KTE::successAtCheckBoards, this, [this](){ + disconnect(this, &M3KTE::successAtCheckBoards, this, nullptr); + m_settingsDialog->UpdateParity(m_deviceSettingsDialog->currentParity()); + modbusDevice->setTimeout(m_settingsDialog->settings().responseTime); + beginScanBoards(); + }); + checkBoards(); + } + } + }); } } - modbusDevice->disconnectDevice(); - modbusDevice->setConnectionParameter(QModbusDevice::SerialParityParameter, - m_settingsDialog->UpdateParity(m_deviceSettingsDialog->currentParity())); - modbusDevice->connectDevice(); - beginScanBoards(); } bool M3KTE::pingNetworkDevices() @@ -1375,8 +1372,7 @@ bool M3KTE::pingNetworkDevices() bar->close(); bar->deleteLater(); return false; - } - else if(isRun) { + } else if(isRun) { break; } QCoreApplication::processEvents(); @@ -1578,69 +1574,34 @@ void M3KTE::boardScan(unsigned boardID) }); } else { Boards[boardID].timerToDataResponse.elapsed(); - unsigned newRow = loggerTable->rowCount(); - loggerTable->insertRow(newRow); - loggerTable->setItem(newRow, 0, new QTableWidgetItem((QTime::currentTime().toString("HH:mm:ss")))); - loggerTable->setItem(newRow, 1, new QTableWidgetItem(tr("Плата %1 (ID %2)").arg(boardID+1).arg(Boards[boardID].adr))); - loggerTable->setItem(newRow, 2, new QTableWidgetItem(modbusDevice->errorString())); - loggerTable->setItem(newRow, 3, new QTableWidgetItem(QString::number(++Boards[boardID].error_TX))); - loggerTable->resizeColumnsToContents(); - if(!loggerTable->verticalScrollBar()->isSliderDown()) - loggerTable->verticalScrollBar()->setSliderPosition(loggerTable->verticalScrollBar()->maximum()); + logError(tr("Плата %1 (ID %2)").arg(boardID+1).arg(Boards[boardID].adr), + modbusDevice->errorString(), ++Boards[boardID].error_TX, ""); Boards[boardID].boardScanners->start(m_deviceSettingsDialog->currentBoardTimer(boardID)); delete subreply; } } else { - unsigned newRow = loggerTable->rowCount(); - loggerTable->insertRow(newRow); - loggerTable->setItem(newRow, 0, new QTableWidgetItem((QTime::currentTime().toString("HH:mm:ss")))); - loggerTable->setItem(newRow, 1, new QTableWidgetItem(tr("Плата %1 (ID %2)").arg(boardID+1).arg(Boards[boardID].adr))); - loggerTable->setItem(newRow, 2, new QTableWidgetItem(modbusDevice->errorString())); - loggerTable->setItem(newRow, 3, new QTableWidgetItem(QString::number(++Boards[boardID].error_TX))); - loggerTable->resizeColumnsToContents(); - if(!loggerTable->verticalScrollBar()->isSliderDown()) - loggerTable->verticalScrollBar()->setSliderPosition(loggerTable->verticalScrollBar()->maximum()); + logError(tr("Плата %1 (ID %2)").arg(boardID+1).arg(Boards[boardID].adr), + modbusDevice->errorString(), ++Boards[boardID].error_TX, ""); Boards[boardID].boardScanners->start(m_deviceSettingsDialog->currentBoardTimer(boardID)); delete subreply; } } else { - unsigned newRow = loggerTable->rowCount(); - loggerTable->insertRow(newRow); - loggerTable->setItem(newRow, 0, new QTableWidgetItem((QTime::currentTime().toString("HH:mm:ss")))); - loggerTable->setItem(newRow, 1, new QTableWidgetItem(tr("Плата %1 (ID %2)").arg(boardID+1).arg(Boards[boardID].adr))); - loggerTable->setItem(newRow, 2, new QTableWidgetItem(reply->errorString())); - loggerTable->setItem(newRow, 3, new QTableWidgetItem(QString::number(++Boards[boardID].error_TX))); - loggerTable->resizeColumnsToContents(); - if(!loggerTable->verticalScrollBar()->isSliderDown()) - loggerTable->verticalScrollBar()->setSliderPosition(loggerTable->verticalScrollBar()->maximum()); + logError(tr("Плата %1 (ID %2)").arg(boardID+1).arg(Boards[boardID].adr), + reply->errorString(), ++Boards[boardID].error_TX, ""); } }); else { Boards[boardID].timerToStatusResponse.elapsed(); - unsigned newRow = loggerTable->rowCount(); - loggerTable->insertRow(newRow); - loggerTable->setItem(newRow, 0, new QTableWidgetItem((QTime::currentTime().toString("HH:mm:ss")))); - loggerTable->setItem(newRow, 1, new QTableWidgetItem(tr("Плата %1 (ID %2)").arg(boardID+1).arg(Boards[boardID].adr))); - loggerTable->setItem(newRow, 2, new QTableWidgetItem(modbusDevice->errorString())); - loggerTable->setItem(newRow, 3, new QTableWidgetItem(QString::number(++Boards[boardID].error_TX))); - loggerTable->resizeColumnsToContents(); - if(!loggerTable->verticalScrollBar()->isSliderDown()) - loggerTable->verticalScrollBar()->setSliderPosition(loggerTable->verticalScrollBar()->maximum()); + logError(tr("Плата %1 (ID %2)").arg(boardID+1).arg(Boards[boardID].adr), + modbusDevice->errorString(), ++Boards[boardID].error_TX, ""); Boards[boardID].boardScanners->start(m_deviceSettingsDialog->currentBoardTimer(boardID)); delete reply; // broadcast replies return immediately } } else { // QMessageBox::warning(this, QString("Ошибка при опросе платы #%1").arg(boardID+1), QString(tr("Read error: ") + modbusDevice->errorString())); // statusBar()->showMessage(tr("Read error: ") + modbusDevice->errorString(), 5000); - unsigned newRow = loggerTable->rowCount(); - loggerTable->insertRow(newRow); - loggerTable->setItem(newRow, 0, new QTableWidgetItem((QTime::currentTime().toString("HH:mm:ss")))); - loggerTable->setItem(newRow, 1, new QTableWidgetItem(tr("Плата %1 (ID %2)").arg(boardID+1).arg(Boards[boardID].adr))); - loggerTable->setItem(newRow, 2, new QTableWidgetItem(modbusDevice->errorString())); - loggerTable->setItem(newRow, 3, new QTableWidgetItem(QString::number(++Boards[boardID].error_TX))); - loggerTable->resizeColumnsToContents(); - if(!loggerTable->verticalScrollBar()->isSliderDown()) - loggerTable->verticalScrollBar()->setSliderPosition(loggerTable->verticalScrollBar()->maximum()); + logError(tr("Плата %1 (ID %2)").arg(boardID+1).arg(Boards[boardID].adr), + modbusDevice->errorString(), ++Boards[boardID].error_TX, ""); } } @@ -1655,16 +1616,9 @@ void M3KTE::displayResultOfScan(QModbusReply *reply, int boardID) if(unit.startAddress() != 0 || unit.valueCount() != 85) { //ERROR //QMessageBox::warning(this, QString("Ошибка при опросе платы #%1").arg(boardID), QString("Принятый ответ: Стартовый адрес %1, Количество элементов %2").arg(unit.startAddress()).arg(unit.valueCount())); - unsigned newRow = loggerTable->rowCount(); - loggerTable->insertRow(newRow); - loggerTable->setItem(newRow, 0, new QTableWidgetItem((QTime::currentTime().toString("HH:mm:ss")))); - loggerTable->setItem(newRow, 1, new QTableWidgetItem(tr("Плата %1 (ID %2)").arg(boardID+1).arg(Boards[boardID].adr))); - loggerTable->setItem(newRow, 2, new QTableWidgetItem("Ошибка при приёме.")); - loggerTable->setItem(newRow, 3, new QTableWidgetItem(QString::number(++Boards[boardID].error_RX))); - loggerTable->setItem(newRow, 4, new QTableWidgetItem(QString("Принятый ответ: Стартовый адрес %1, Количество элементов %2").arg(unit.startAddress()).arg(unit.valueCount()))); - loggerTable->resizeColumnsToContents(); - if(!loggerTable->verticalScrollBar()->isSliderDown()) - loggerTable->verticalScrollBar()->setSliderPosition(loggerTable->verticalScrollBar()->maximum()); + logError(tr("Плата %1 (ID %2)").arg(boardID+1).arg(Boards[boardID].adr), + "Ошибка при приёме.", ++Boards[boardID].error_RX, + tr("Принятый ответ: Стартовый адрес %1, Количество элементов %2").arg(unit.startAddress()).arg(unit.valueCount())); reply->deleteLater(); return; } @@ -1715,30 +1669,14 @@ void M3KTE::displayResultOfScan(QModbusReply *reply, int boardID) ui->writeValueTable->model()->index(unit.startAddress() + unit.valueCount() -1, 3)); if(A_Flag) { statusM3KTE.Accidents[boardID] = true; - unsigned newRow = loggerTable->rowCount(); - loggerTable->insertRow(newRow); - loggerTable->setItem(newRow, 0, new QTableWidgetItem((QTime::currentTime().toString("HH:mm:ss")))); - loggerTable->setItem(newRow, 1, new QTableWidgetItem(tr("Плата %1 (ID %2)").arg(boardID+1).arg(Boards[boardID].adr))); - loggerTable->setItem(newRow, 2, new QTableWidgetItem("Авария")); - loggerTable->setItem(newRow, 3, new QTableWidgetItem(QString::number(Boards[boardID].error_A))); - loggerTable->setItem(newRow, 4, new QTableWidgetItem(A_Adr)); - loggerTable->resizeColumnsToContents(); - if(!loggerTable->verticalScrollBar()->isSliderDown()) - loggerTable->verticalScrollBar()->setSliderPosition(loggerTable->verticalScrollBar()->maximum()); + logError(tr("Плата %1 (ID %2)").arg(boardID+1).arg(Boards[boardID].adr), + "Авария", Boards[boardID].error_A, A_Adr); } else statusM3KTE.Accidents[boardID] = false; if(W_Flag) { statusM3KTE.Warnings[boardID] = true; - unsigned newRow = loggerTable->rowCount(); - loggerTable->insertRow(newRow); - loggerTable->setItem(newRow, 0, new QTableWidgetItem((QTime::currentTime().toString("HH:mm:ss")))); - loggerTable->setItem(newRow, 1, new QTableWidgetItem(tr("Плата %1 (ID %2)").arg(boardID+1).arg(Boards[boardID].adr))); - loggerTable->setItem(newRow, 2, new QTableWidgetItem("Предупреждение")); - loggerTable->setItem(newRow, 3, new QTableWidgetItem(QString::number(Boards[boardID].error_W))); - loggerTable->setItem(newRow, 4, new QTableWidgetItem(W_Adr)); - loggerTable->resizeColumnsToContents(); - if(!loggerTable->verticalScrollBar()->isSliderDown()) - loggerTable->verticalScrollBar()->setSliderPosition(loggerTable->verticalScrollBar()->maximum()); + logError(tr("Плата %1 (ID %2)").arg(boardID+1).arg(Boards[boardID].adr), + "Предупреждение", Boards[boardID].error_W, W_Adr); } else statusM3KTE.Warnings[boardID] = false; ui->BSM_Warning->setChecked(false); @@ -1761,30 +1699,16 @@ void M3KTE::displayResultOfScan(QModbusReply *reply, int boardID) statusBar()->showMessage(tr("Read response error: %1 (Mobus exception: 0x%2)"). arg(reply->errorString()). arg(reply->rawResult().exceptionCode(), -1, 16), 5000); - unsigned newRow = loggerTable->rowCount(); - loggerTable->insertRow(newRow); - loggerTable->setItem(newRow, 0, new QTableWidgetItem((QTime::currentTime().toString("HH:mm:ss")))); - loggerTable->setItem(newRow, 1, new QTableWidgetItem(tr("Плата %1 (ID %2)").arg(boardID+1).arg(Boards[boardID].adr))); - loggerTable->setItem(newRow, 2, new QTableWidgetItem(reply->errorString())); - loggerTable->setItem(newRow, 3, new QTableWidgetItem(QString::number(++Boards[boardID].error_RX))); - loggerTable->setItem(newRow, 4, new QTableWidgetItem(QString("Mobus exception: 0x%1").arg(reply->rawResult().exceptionCode(), -1, 16))); - loggerTable->resizeColumnsToContents(); - if(!loggerTable->verticalScrollBar()->isSliderDown()) - loggerTable->verticalScrollBar()->setSliderPosition(loggerTable->verticalScrollBar()->maximum()); + logError(tr("Плата %1 (ID %2)").arg(boardID+1).arg(Boards[boardID].adr), + reply->errorString(), ++Boards[boardID].error_RX, + QString("Mobus exception: 0x%1").arg(reply->rawResult().exceptionCode(), -1, 16)); } else { statusBar()->showMessage(tr("Read response error: %1 (code: 0x%2)"). arg(reply->errorString()). arg(reply->error(), -1, 16), 5000); - unsigned newRow = loggerTable->rowCount(); - loggerTable->insertRow(newRow); - loggerTable->setItem(newRow, 0, new QTableWidgetItem((QTime::currentTime().toString("HH:mm:ss")))); - loggerTable->setItem(newRow, 1, new QTableWidgetItem(tr("Плата %1 (ID %2)").arg(boardID+1).arg(Boards[boardID].adr))); - loggerTable->setItem(newRow, 2, new QTableWidgetItem(reply->errorString())); - loggerTable->setItem(newRow, 3, new QTableWidgetItem(QString::number(++Boards[boardID].error_RX))); - loggerTable->setItem(newRow, 4, new QTableWidgetItem(QString::number(reply->error(), 16))); - loggerTable->resizeColumnsToContents(); - if(!loggerTable->verticalScrollBar()->isSliderDown()) - loggerTable->verticalScrollBar()->setSliderPosition(loggerTable->verticalScrollBar()->maximum()); + logError(tr("Плата %1 (ID %2)").arg(boardID+1).arg(Boards[boardID].adr), + reply->errorString(), ++Boards[boardID].error_RX, + QString::number(reply->error(), 16)); } reply->deleteLater(); } @@ -1817,30 +1741,16 @@ void M3KTE::applySettingsFromScan(QModbusReply *reply) statusBar()->showMessage(tr("Read response error: %1 (Mobus exception: 0x%2)"). arg(reply->errorString()). arg(reply->rawResult().exceptionCode(), -1, 16), 5000); - unsigned newRow = loggerTable->rowCount(); - loggerTable->insertRow(newRow); - loggerTable->setItem(newRow, 0, new QTableWidgetItem((QTime::currentTime().toString("HH:mm:ss")))); - loggerTable->setItem(newRow, 1, new QTableWidgetItem(tr("Плата %1 (ID %2)").arg(Adr+1).arg(Boards[Adr].adr))); - loggerTable->setItem(newRow, 2, new QTableWidgetItem(reply->errorString())); - loggerTable->setItem(newRow, 3, new QTableWidgetItem(QString::number(++Boards[Adr].error_RX))); - loggerTable->setItem(newRow, 4, new QTableWidgetItem(QString("Mobus exception: 0x%1").arg(reply->rawResult().exceptionCode(), -1, 16))); - loggerTable->resizeColumnsToContents(); - if(!loggerTable->verticalScrollBar()->isSliderDown()) - loggerTable->verticalScrollBar()->setSliderPosition(loggerTable->verticalScrollBar()->maximum()); + logError(tr("Плата %1 (ID %2)").arg(Adr+1).arg(Boards[Adr].adr), + reply->errorString(), ++Boards[Adr].error_RX, + QString("Mobus exception: 0x%1").arg(reply->rawResult().exceptionCode(), -1, 16)); } else { statusBar()->showMessage(tr("Read response error: %1 (code: 0x%2)"). arg(reply->errorString()). arg(reply->error(), -1, 16), 5000); - unsigned newRow = loggerTable->rowCount(); - loggerTable->insertRow(newRow); - loggerTable->setItem(newRow, 0, new QTableWidgetItem((QTime::currentTime().toString("HH:mm:ss")))); - loggerTable->setItem(newRow, 1, new QTableWidgetItem(tr("Плата %1 (ID %2)").arg(Adr+1).arg(Boards[Adr].adr))); - loggerTable->setItem(newRow, 2, new QTableWidgetItem(reply->errorString())); - loggerTable->setItem(newRow, 3, new QTableWidgetItem(QString::number(++Boards[Adr].error_RX))); - loggerTable->setItem(newRow, 4, new QTableWidgetItem(QString::number(reply->error(), 16))); - loggerTable->resizeColumnsToContents(); - if(!loggerTable->verticalScrollBar()->isSliderDown()) - loggerTable->verticalScrollBar()->setSliderPosition(loggerTable->verticalScrollBar()->maximum()); + logError(tr("Плата %1 (ID %2)").arg(Adr+1).arg(Boards[Adr].adr), + reply->errorString(), ++Boards[Adr].error_RX, + QString::number(reply->error(), 16)); } reply->deleteLater(); } @@ -1884,29 +1794,15 @@ void M3KTE::multipleRegSend() statusBar()->showMessage(tr("Write response error: %1 (Mobus exception: 0x%2)") .arg(reply->errorString()).arg(reply->rawResult().exceptionCode(), -1, 16), 5000); - unsigned newRow = loggerTable->rowCount(); - loggerTable->insertRow(newRow); - loggerTable->setItem(newRow, 0, new QTableWidgetItem((QTime::currentTime().toString("HH:mm:ss")))); - loggerTable->setItem(newRow, 1, new QTableWidgetItem(tr("Плата %1 (ID %2)").arg(Adr+1).arg(Boards[Adr].adr))); - loggerTable->setItem(newRow, 2, new QTableWidgetItem(reply->errorString())); - loggerTable->setItem(newRow, 3, new QTableWidgetItem(QString::number(++Boards[Adr].error_TX))); - loggerTable->setItem(newRow, 4, new QTableWidgetItem(QString("Mobus exception: 0x%1").arg(reply->rawResult().exceptionCode(), -1, 16))); - loggerTable->resizeColumnsToContents(); - if(!loggerTable->verticalScrollBar()->isSliderDown()) - loggerTable->verticalScrollBar()->setSliderPosition(loggerTable->verticalScrollBar()->maximum()); + logError(tr("Плата %1 (ID %2)").arg(Adr+1).arg(Boards[Adr].adr), + reply->errorString(), ++Boards[Adr].error_TX, + QString("Mobus exception: 0x%1").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), 5000); - unsigned newRow = loggerTable->rowCount(); - loggerTable->insertRow(newRow); - loggerTable->setItem(newRow, 0, new QTableWidgetItem((QTime::currentTime().toString("HH:mm:ss")))); - loggerTable->setItem(newRow, 1, new QTableWidgetItem(tr("Плата %1 (ID %2)").arg(Adr+1).arg(Boards[Adr].adr))); - loggerTable->setItem(newRow, 2, new QTableWidgetItem(reply->errorString())); - loggerTable->setItem(newRow, 3, new QTableWidgetItem(QString::number(++Boards[Adr].error_TX))); - loggerTable->setItem(newRow, 4, new QTableWidgetItem(QString::number(reply->error(), 16))); - loggerTable->resizeColumnsToContents(); - if(!loggerTable->verticalScrollBar()->isSliderDown()) - loggerTable->verticalScrollBar()->setSliderPosition(loggerTable->verticalScrollBar()->maximum()); + logError(tr("Плата %1 (ID %2)").arg(Adr+1).arg(Boards[Adr].adr), + reply->errorString(), ++Boards[Adr].error_TX, + QString::number(reply->error(), 16)); } reply->deleteLater(); }); diff --git a/M3KTE_TERM/m3kte.h b/M3KTE_TERM/m3kte.h index 0991e8d..6340046 100644 --- a/M3KTE_TERM/m3kte.h +++ b/M3KTE_TERM/m3kte.h @@ -65,12 +65,11 @@ private: void selectPositionOnTree(unsigned index); signals: - void successAtCheckBoards(); void errorAtCheckBoards(); private slots: - + void logError(const QString &errorPlace, const QString &errorString, unsigned errorCount, const QString &description); void slotmultipleRegWrite(); void slotmultipleRegWriteAndSend();