Обновление алгоритма для корректного опроса четвёртой платы.

This commit is contained in:
Вячеслав Штейбезандт 2025-10-16 08:41:49 +03:00
parent c2a32e3ff5
commit 5ae694d254

View File

@ -359,12 +359,12 @@ M3KTE::M3KTE(QWidget *parent)
ui->writeTable->addItem(tr("Warnings"), QModbusDataUnit::HoldingRegisters);
ui->writeTable->addItem(tr("Accidents"), QModbusDataUnit::HoldingRegisters);
for(int i = 0; i < 4; i++) {
Boards[i].ModbusModelCoil = new WriteRegisterModel(this, 85 - (i/4*20), false);
Boards[i].ModbusModelCoil = new WriteRegisterModel(this, 85 - (i/3*20), false);
Boards[i].ModbusModelCoil->setStartAddress(0);
Boards[i].ModbusModelCoil->setNumberOfValues(QString::number(85-(i/4*20)));
Boards[i].ModbusModelHoldingReg = new WriteRegisterModel(this, (85 - (i/4*20))*2, true);
Boards[i].ModbusModelCoil->setNumberOfValues(QString::number(85-(i/3*20)));
Boards[i].ModbusModelHoldingReg = new WriteRegisterModel(this, (85 - (i/3*20))*2, true);
Boards[i].ModbusModelHoldingReg->setStartAddress(0);
Boards[i].ModbusModelHoldingReg->setNumberOfValues(QString::number(85-(i/4*20)));
Boards[i].ModbusModelHoldingReg->setNumberOfValues(QString::number(85-(i/3*20)));
}
m_deviceSettingsDialog = new DeviceSettingsDialog(this);
m_debugTerminalDialog = new DebugTerminalDialog(this);
@ -1371,12 +1371,12 @@ bool M3KTE::pingNetworkDevices()
modbusDevice->setTimeout(m_settingsDialog->settings().responseTime);
bar->setLabelText(tr("Считывание текущих настроек..."));
bar->setRange(0, CurrentConnectedDevice*3);
QModbusDataUnit* _unit_settings[3];
_unit_settings[0] = new QModbusDataUnit(QModbusDataUnit::Coils, 0, 85);
_unit_settings[1] = new QModbusDataUnit(QModbusDataUnit::HoldingRegisters, 0, 85);
_unit_settings[2] = new QModbusDataUnit(QModbusDataUnit::HoldingRegisters, 85, 85);
for(int i = 0; i < 4; i++) {
if(Boards[i].isActive) {
QModbusDataUnit* _unit_settings[3];
_unit_settings[0] = new QModbusDataUnit(QModbusDataUnit::Coils, 0, 85-(i/3*20));
_unit_settings[1] = new QModbusDataUnit(QModbusDataUnit::HoldingRegisters, 0, 85-(i/3*20));
_unit_settings[2] = new QModbusDataUnit(QModbusDataUnit::HoldingRegisters, 85, 85-(i/3*20));
Boards_Fields[i]->setEnabled(true);
for(int j = 0; j < 3; j++) {
bar->setValue(i*3+j);
@ -1384,6 +1384,9 @@ bool M3KTE::pingNetworkDevices()
onConnectClicked();
bar->close();
bar->deleteLater();
delete _unit_settings[0];
delete _unit_settings[1];
delete _unit_settings[2];
return false;
}
auto *reply = modbusDevice->sendReadRequest(*_unit_settings[j], Boards[i].adr);
@ -1391,6 +1394,9 @@ bool M3KTE::pingNetworkDevices()
onConnectClicked();
bar->close();
bar->deleteLater();
delete _unit_settings[0];
delete _unit_settings[1];
delete _unit_settings[2];
return false;
}
while(!reply->isFinished()) {
@ -1400,6 +1406,9 @@ bool M3KTE::pingNetworkDevices()
onConnectClicked();
bar->close();
bar->deleteLater();
delete _unit_settings[0];
delete _unit_settings[1];
delete _unit_settings[2];
return false;
}
QCoreApplication::processEvents();
@ -1413,10 +1422,16 @@ bool M3KTE::pingNetworkDevices()
bar->close();
bar->deleteLater();
onConnectClicked();
delete _unit_settings[0];
delete _unit_settings[1];
delete _unit_settings[2];
return false;
}
}
Boards_Fields[i]->setTitle(QString("Плата №%1 (ID %2)").arg(i+1).arg(Boards[i].adr));
delete _unit_settings[0];
delete _unit_settings[1];
delete _unit_settings[2];
}
}
modbusDevice->setNumberOfRetries(m_settingsDialog->settings().numberOfRetries);
@ -1464,7 +1479,7 @@ void M3KTE::boardScan(unsigned boardID)
StatusReg.AllReg = reply->result().value(0);
// Запрос полных данных
QModbusDataUnit dataUnit(QModbusDataUnit::InputRegisters, 0, 85);
QModbusDataUnit dataUnit(QModbusDataUnit::InputRegisters, 0, 85-(boardID/3*20));
if (auto *dataReply = modbusDevice->sendReadRequest(dataUnit, Boards[boardID].adr)) {
Boards[boardID].timerToDataResponse.start();
@ -1544,7 +1559,7 @@ void M3KTE::displayResultOfScan(QModbusReply *reply, int boardID, int status)
bool W_Flag = false;
bool A_Flag = false;
if(unit.startAddress() != 0 || unit.valueCount() != 85) {
if(unit.startAddress() != 0 || unit.valueCount() != (unsigned)(85-(boardID/3*20))) {
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()));