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

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