diff --git a/M3KTE_TERM/m3kte.cpp b/M3KTE_TERM/m3kte.cpp index 7460c6e..720d3bf 100644 --- a/M3KTE_TERM/m3kte.cpp +++ b/M3KTE_TERM/m3kte.cpp @@ -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()));