Hot Fix 1.

>Отображение кнопок статуса МЗКТЭ было изменено.
>Операция записи раньше использовала ИД вместо адреса - исправлено.
>Стартовый адрес опроса плат смещён с нуля до первого.
>При поиске плат в сети использовался адрес по умолчанию вместо итератора - исправлено.
>При поиске плат в сети добавлена проверка на наличие ошибок при приёме.
>Проверка на поведение терминала при отсутствии плат в сети - пройдена.
>Изменено поведение progressbar при поиске плат и опросе их текущих настроек.
>Добавлено сообщение об ошибке во время опроса плат об их текущих настройках.
>Добавлено сообщение об ошибке при некорректном ответе во время опроса текущего напряжения.
This commit is contained in:
Вячеслав Штейбезандт 2024-12-11 10:57:49 +03:00
parent 5b2a64a39b
commit d7063703b6

View File

@ -472,6 +472,10 @@ M3KTE::M3KTE(QWidget *parent)
Boards[2].adr = 3; Boards[2].adr = 3;
Boards[3].adr = 4; Boards[3].adr = 4;
ui->BSM_Warning->setEnabled(false);
ui->BSM_Accident->setEnabled(false);
ui->BSM_WorkInProgress->setEnabled(false);
initActions(); initActions();
ui->BST_Off->setChecked(true); ui->BST_Off->setChecked(true);
@ -594,6 +598,9 @@ void M3KTE::onConnectClicked()
ui->BST_Off->setChecked(false); ui->BST_Off->setChecked(false);
ui->BST_On->setChecked(true); ui->BST_On->setChecked(true);
ui->BSM_Warning->setEnabled(true);
ui->BSM_Accident->setEnabled(true);
ui->BSM_WorkInProgress->setEnabled(true);
ui->BSM_WorkInProgress->setChecked(true); ui->BSM_WorkInProgress->setChecked(true);
if(pingNetworkDevices()) if(pingNetworkDevices())
@ -617,6 +624,9 @@ void M3KTE::onConnectClicked()
ui->BSM_Warning->setChecked(false); ui->BSM_Warning->setChecked(false);
ui->BSM_Accident->setChecked(false); ui->BSM_Accident->setChecked(false);
ui->BSM_WorkInProgress->setChecked(false); ui->BSM_WorkInProgress->setChecked(false);
ui->BSM_Warning->setEnabled(false);
ui->BSM_Accident->setEnabled(false);
ui->BSM_WorkInProgress->setEnabled(false);
} }
} }
@ -713,7 +723,7 @@ void M3KTE::onWriteButtonClicked()
writeUnit.setValue(i, Boards[ui->boardSelectBox->currentIndex()].ModbusModelHoldingReg->m_holdingRegisters[i + writeUnit.startAddress()]); writeUnit.setValue(i, Boards[ui->boardSelectBox->currentIndex()].ModbusModelHoldingReg->m_holdingRegisters[i + writeUnit.startAddress()]);
} }
if (auto *reply = modbusDevice->sendWriteRequest(writeUnit, ui->boardSelectBox->currentIndex()+1)) { if (auto *reply = modbusDevice->sendWriteRequest(writeUnit, Boards[ui->boardSelectBox->currentIndex()].adr)) {
if (!reply->isFinished()) { if (!reply->isFinished()) {
connect(reply, &QModbusReply::finished, this, [this, reply]() { connect(reply, &QModbusReply::finished, this, [this, reply]() {
if (reply->error() == QModbusDevice::ProtocolError) { if (reply->error() == QModbusDevice::ProtocolError) {
@ -931,7 +941,7 @@ bool M3KTE::pingNetworkDevices()
connect(timer, &QTimer::timeout, this, &M3KTE::timeForPingIsGone); connect(timer, &QTimer::timeout, this, &M3KTE::timeForPingIsGone);
timer->setSingleShot(true); timer->setSingleShot(true);
QModbusDataUnit* _unit = new QModbusDataUnit(QModbusDataUnit::InputRegisters, 85, 1); QModbusDataUnit* _unit = new QModbusDataUnit(QModbusDataUnit::InputRegisters, 85, 1);
int tmp_adr = 0; int tmp_adr = 1;
auto bar = new QProgressDialog(this); auto bar = new QProgressDialog(this);
bar->setLabelText(tr("Поиск плат...")); bar->setLabelText(tr("Поиск плат..."));
@ -943,28 +953,34 @@ bool M3KTE::pingNetworkDevices()
for(i=0; i<4;) for(i=0; i<4;)
{ {
bar->setValue(i+1); bar->setValue(i);
timerForPingSignal = false; timerForPingSignal = false;
timer->start(m_settingsDialog->settings().responseTime); timer->start(m_settingsDialog->settings().responseTime);
auto *reply = modbusDevice->sendReadRequest(*_unit, Boards[i].adr); auto *reply = modbusDevice->sendReadRequest(*_unit, tmp_adr);
while(!reply->isFinished() && !timerForPingSignal) while(!reply->isFinished() && !timerForPingSignal)
{ {
QCoreApplication::processEvents(); QCoreApplication::processEvents();
} }
if(timerForPingSignal) if(timerForPingSignal)
{} {
}
else else
{ {
timer->stop(); if(reply->error()==QModbusDevice::NoError)
Boards[i].adr = Boards[i]._tmp_adr = tmp_adr; {
i++; timer->stop();
Boards[i].adr = Boards[i]._tmp_adr = tmp_adr;
i++;
}
} }
tmp_adr++; tmp_adr++;
if(tmp_adr>=247) if(tmp_adr>=247)
{ {
//ERROR //ERROR
//OUT OF RANGE //OUT OF RANGE
QMessageBox::warning(this, "Ошибка при сканировании сети.", QString("Выход за пределы допустимых адресов. Найдено %1 плат").arg(i)); QMessageBox::warning(this, "Ошибка при сканировании сети.", QString("Выход за пределы допустимых адресов. Найдено %1 плат.").arg(i));
bar->deleteLater(); bar->deleteLater();
onConnectClicked(); onConnectClicked();
return false; return false;
@ -982,7 +998,7 @@ bool M3KTE::pingNetworkDevices()
{ {
for (int j = 0; j<3; j++) for (int j = 0; j<3; j++)
{ {
bar->setValue(i*3+j+2); bar->setValue(i*3+j);
timerForPingSignal = false; timerForPingSignal = false;
timer->start(m_settingsDialog->settings().responseTime); timer->start(m_settingsDialog->settings().responseTime);
auto *reply = modbusDevice->sendReadRequest(*_unit_settings[j], Boards[i].adr); auto *reply = modbusDevice->sendReadRequest(*_unit_settings[j], Boards[i].adr);
@ -998,8 +1014,17 @@ bool M3KTE::pingNetworkDevices()
} }
else else
{ {
timer->stop(); if(reply->error()==QModbusDevice::NoError)
stepForScanCurrentSettings(reply); {
timer->stop();
stepForScanCurrentSettings(reply);
}
else
{
QMessageBox::warning(this, "Ошибка при получении текущих настроек.", QString("Таймаут при опросе устройства %1 по адресу %2").arg(i).arg(Boards[i].adr));
onConnectClicked();
return false;
}
} }
} }
} }
@ -1208,6 +1233,14 @@ void M3KTE::displayResultOfScan(QModbusReply *reply, int boardID)
ui->BSM_Warning->setEnabled(true); ui->BSM_Warning->setEnabled(true);
} }
} }
} else if (reply->error() == QModbusDevice::ProtocolError) {
statusBar()->showMessage(tr("Read response error: %1 (Mobus exception: 0x%2)").
arg(reply->errorString()).
arg(reply->rawResult().exceptionCode(), -1, 16), 5000);
} else {
statusBar()->showMessage(tr("Read response error: %1 (code: 0x%2)").
arg(reply->errorString()).
arg(reply->error(), -1, 16), 5000);
} }
reply->deleteLater(); reply->deleteLater();
} }