Second checkpoint

This commit is contained in:
Вячеслав Штейбезандт 2025-01-23 17:10:34 +03:00
parent 1b7388821e
commit 009ac176f9
3 changed files with 101 additions and 1 deletions

View File

@ -1407,6 +1407,7 @@ bool M3KTE::autoBaudRateScan()
{ {
unsigned countOfDeviceOnLine = 0; unsigned countOfDeviceOnLine = 0;
QString resultOfScan; QString resultOfScan;
QVector<unsigned> KTE[8];
modbusDevice->setConnectionParameter(QModbusDevice::SerialPortNameParameter, modbusDevice->setConnectionParameter(QModbusDevice::SerialPortNameParameter,
m_settingsDialog->settings().portName); m_settingsDialog->settings().portName);
@ -1441,6 +1442,7 @@ bool M3KTE::autoBaudRateScan()
for(int i = 0; i < 8; i++) for(int i = 0; i < 8; i++)
{ {
bar->setValue(i); bar->setValue(i);
bar->setLabelText(tr("Поиск плат... Текущая скорость: %1").arg(m_baud[i]));
modbusDevice->setConnectionParameter(QModbusDevice::SerialBaudRateParameter, modbusDevice->setConnectionParameter(QModbusDevice::SerialBaudRateParameter,
m_baud[i]); m_baud[i]);
if (!modbusDevice->connectDevice()) { if (!modbusDevice->connectDevice()) {
@ -1448,7 +1450,7 @@ bool M3KTE::autoBaudRateScan()
} }
for(int tmp_adr = 1; tmp_adr < 248; tmp_adr++) for(int tmp_adr = 1; tmp_adr < 248; tmp_adr++)
{ {
bar->setLabelText(tr("Поиск плат... Текущий адрес: %1").arg(tmp_adr));
auto *reply = modbusDevice->sendRawRequest(requestOfDeviceType, tmp_adr); auto *reply = modbusDevice->sendRawRequest(requestOfDeviceType, tmp_adr);
//auto *reply = modbusDevice->sendReadRequest(*_unit, tmp_adr); //auto *reply = modbusDevice->sendReadRequest(*_unit, tmp_adr);
@ -1489,6 +1491,7 @@ bool M3KTE::autoBaudRateScan()
if(result == QString("KTE")) if(result == QString("KTE"))
{ {
countOfDeviceOnLine++; countOfDeviceOnLine++;
KTE[i].append(tmp_adr);
} }
} }
} }
@ -1496,12 +1499,95 @@ bool M3KTE::autoBaudRateScan()
if(countOfDeviceOnLine>0) if(countOfDeviceOnLine>0)
resultOfScan += QString("%1 плат M3KTE работают на скорости %2.\n").arg(countOfDeviceOnLine).arg(m_baud[i]); resultOfScan += QString("%1 плат M3KTE работают на скорости %2.\n").arg(countOfDeviceOnLine).arg(m_baud[i]);
countOfDeviceOnLine = 0; countOfDeviceOnLine = 0;
modbusDevice->disconnectDevice();
} }
if(m_scanBoard->exec()==QDialog::Accepted) if(m_scanBoard->exec()==QDialog::Accepted)
{ {
if(m_scanBoard->getCheckState()==Qt::Checked) if(m_scanBoard->getCheckState()==Qt::Checked)
{ {
for(int i = 0; i < 8; i++)
{
for (int j = 0; j < KTE[i].size(); j++)
{
for (int l = i; l < 8; l++) {
if(KTE[l].indexOf(KTE[i].at(j))==-1)
{
QMessageBox::warning(this, "Error", QString("Несколько устройств по адресу %1, работающих на скоростях %2 и %3.").arg(KTE[i].at(j)).arg(m_baud[i]).arg(m_baud[l]));
return false;
}
}
}
}
QModbusDataUnit* _unit = new QModbusDataUnit(QModbusDataUnit::HoldingRegisters, 173, 1);
_unit->setValue(0, m_scanBoard->getBaud());
for (int i = 0; i < 8; i++) {
bar->setValue(i);
bar->setLabelText(tr("Синхронизация плат на скорости %1").arg(m_baud[i]));
for(int j = 0; j < KTE[i].size(); j++)
{
modbusDevice->setConnectionParameter(QModbusDevice::SerialBaudRateParameter,
m_baud[i]);
if (!modbusDevice->connectDevice()) {
statusBar()->showMessage(tr("Connect failed: ") + modbusDevice->errorString(), 5000);
}
auto *reply = modbusDevice->sendWriteRequest(*_unit, KTE[i].at(j));
if(!reply)
{
onConnectClicked();
bar->close();
bar->deleteLater();
return false;
}
while(!reply->isFinished())
{
if(isRun)
{
dfQMessageBox::warning(this, "Ошибка при получении текущих настроек.", QString("Прерывание по запросу пользователя."));
onConnectClicked();
bar->close();
bar->deleteLater();
return false;
}
QCoreApplication::processEvents();
}
if(reply->error()==QModbusDevice::TimeoutError)
{
modbusDevice->disconnectDevice();
modbusDevice->setConnectionParameter(QModbusDevice::SerialBaudRateParameter,
m_settingsDialog->UpdateBaud(m_scanBoard->getBaud()));
modbusDevice->connectDevice();
QModbusDataUnit* _unit = new QModbusDataUnit(QModbusDataUnit::InputRegisters, 85, 1);
if (auto *subreply = modbusDevice->sendReadRequest(*_unit, Boards[i].adr))
{
while(!subreply->isFinished())
{
if(isRun)
{
dfQMessageBox::warning(this, "Ошибка при получении текущих настроек.", QString("Прерывание по запросу пользователя."));
onConnectClicked();
bar->close();
bar->deleteLater();
return false;
}
QCoreApplication::processEvents();
}
if(subreply->error()!=QModbusDevice::NoError)
{
QMessageBox::warning()
onConnectClicked();
bar->close();
bar->deleteLater();
return false;
}
}
}
else if(reply->error()!=QModbusDevice::NoError)
{
return false;
}
modbusDevice->disconnectDevice();
}
} }
return true; return true;
} }

View File

@ -27,3 +27,13 @@ void ScanBoard::showMeTheTruth(QString resultOfScan)
{ {
ui->logger->append(resultOfScan); ui->logger->append(resultOfScan);
} }
quint16 ScanBoard::getBaud()
{
return baud;
}
void ScanBoard::on_baudRateBox_currentTextChanged(const QString &arg1)
{
baud = arg1.toInt(nullptr, 10);
}

View File

@ -17,11 +17,15 @@ public:
Qt::CheckState getCheckState(); Qt::CheckState getCheckState();
void showMeTheTruth(QString resultOfScan); void showMeTheTruth(QString resultOfScan);
quint16 getBaud();
private slots: private slots:
void on_applyToAllBox_stateChanged(int arg1); void on_applyToAllBox_stateChanged(int arg1);
void on_baudRateBox_currentTextChanged(const QString &arg1);
private: private:
Qt::CheckState checkState; Qt::CheckState checkState;
quint16 baud;
Ui::ScanBoard *ui; Ui::ScanBoard *ui;
}; };