diff --git a/M3KTE_TERM/adcgraphdialog.cpp b/M3KTE_TERM/adcgraphdialog.cpp index 8838398..e856d44 100644 --- a/M3KTE_TERM/adcgraphdialog.cpp +++ b/M3KTE_TERM/adcgraphdialog.cpp @@ -85,6 +85,10 @@ AdcGraphDialog::AdcGraphDialog(QModbusClient *modbusDevice, QWidget *parent) : this, &AdcGraphDialog::on_registerCountChanged); connect(ui->rangeApplyButton, &QPushButton::clicked, this, &AdcGraphDialog::on_rangeApplyClicked); + connect(ui->teNumberSpinBox, QOverload::of(&QSpinBox::valueChanged), + this, &AdcGraphDialog::on_teNumberChanged); + connect(ui->teApplyButton, &QPushButton::clicked, + this, &AdcGraphDialog::on_teApplyClicked); connect(m_updateTimer, &QTimer::timeout, this, &AdcGraphDialog::onUpdateTimer); connect(ui->closeBtn, &QPushButton::clicked, this, &AdcGraphDialog::on_closeBtn_clicked); @@ -105,6 +109,54 @@ void AdcGraphDialog::setModbusDevice(QModbusClient *device) m_modbusDevice = device; } +void AdcGraphDialog::on_teNumberChanged(int value) +{ + // Можно сохранить значение, но не применять сразу + m_pendingTeNumber = value; +} + +void AdcGraphDialog::on_teApplyClicked() +{ + setTENumber(ui->teNumberSpinBox->value()); +} + +void AdcGraphDialog::setTENumber(int teNumber) +{ + if (m_boardAddress == -1) return; + + m_teNumber = teNumber; + + // Обновляем заголовок окна + setWindowTitle(QString("График АЦП - Плата %1, ТЭ %2 (адр %3-%4)") + .arg(m_boardId + 1) + .arg(m_teNumber) + .arg(m_startAddress) + .arg(m_startAddress + m_registerCount - 1)); + + // Записываем новый номер ТЭ в устройство + if (m_modbusDevice) { + QModbusDataUnit unit(QModbusDataUnit::HoldingRegisters, REG_TE_NUMBER, 1); + unit.setValue(0, teNumber); + + if (auto *reply = m_modbusDevice->sendWriteRequest(unit, m_boardAddress)) { + if (!reply->isFinished()) { + connect(reply, &QModbusReply::finished, this, [this, reply, teNumber]() { + if (reply->error() == QModbusDevice::NoError) { + qDebug() << "TE number changed to:" << teNumber; + // Можно обновить данные сразу после смены ТЭ + readAdcDataAndIndices(); + } else { + qDebug() << "Error writing TE number:" << reply->errorString(); + } + reply->deleteLater(); + }); + } else { + reply->deleteLater(); + } + } + } +} + void AdcGraphDialog::readCalibrationValues() { if (!m_modbusDevice || m_boardAddress == -1) return; @@ -120,10 +172,10 @@ void AdcGraphDialog::readCalibrationValues() if (result.valueCount() >= 2) { m_adcZero = result.value(0); m_adcOneVolt = result.value(1); - qDebug() << "Calibration values - Zero:" << m_adcZero << "1V:" << m_adcOneVolt; + //qDebug() << "Calibration values - Zero:" << m_adcZero << "1V:" << m_adcOneVolt; } } else { - qDebug() << "Error reading calibration:" << reply->errorString(); + //qDebug() << "Error reading calibration:" << reply->errorString(); } reply->deleteLater(); }); @@ -159,14 +211,14 @@ void AdcGraphDialog::onStableIndicesReady() if (result.valueCount() >= 2) { m_stableStartIndex = result.value(0); m_stableEndIndex = result.value(1); - qDebug() << "Stable indices updated - Start:" << m_stableStartIndex << "End:" << m_stableEndIndex; + //qDebug() << "Stable indices updated - Start:" << m_stableStartIndex << "End:" << m_stableEndIndex; updateStableLines(); // Обновляем статистику с новыми индексами updateStatisticsWithStableInfo(); } } else { - qDebug() << "Error reading stable indices:" << reply->errorString(); + //qDebug() << "Error reading stable indices:" << reply->errorString(); } reply->deleteLater(); @@ -272,7 +324,7 @@ void AdcGraphDialog::readAdcDataAndIndices() QModbusDataUnit unit(QModbusDataUnit::InputRegisters, REG_STABLE_START, count + (start - REG_STABLE_START)); - qDebug() << "Reading combined data from address" << REG_STABLE_START << "count:" << unit.valueCount(); + //qDebug() << "Reading combined data from address" << REG_STABLE_START << "count:" << unit.valueCount(); if (auto *reply = m_modbusDevice->sendReadRequest(unit, m_boardAddress)) { if (!reply->isFinished()) { @@ -281,7 +333,7 @@ void AdcGraphDialog::readAdcDataAndIndices() reply->deleteLater(); } } else { - qDebug() << "Failed to send combined data read request"; + //qDebug() << "Failed to send combined data read request"; } } @@ -298,7 +350,7 @@ void AdcGraphDialog::onCombinedDataReady() if (result.valueCount() >= 2) { m_stableStartIndex = result.value(0); m_stableEndIndex = result.value(1); - qDebug() << "Stable indices - Start:" << m_stableStartIndex << "End:" << m_stableEndIndex; + //qDebug() << "Stable indices - Start:" << m_stableStartIndex << "End:" << m_stableEndIndex; } // Обрабатываем данные АЦП (остальные регистры) @@ -326,7 +378,7 @@ void AdcGraphDialog::onCombinedDataReady() updateStatistics(); } else { - qDebug() << "Error reading combined data:" << reply->errorString(); + // qDebug() << "Error reading combined data:" << reply->errorString(); } reply->deleteLater(); @@ -340,7 +392,7 @@ void AdcGraphDialog::readAdcBuffer() // Читаем выбранный диапазон буфера АЦП QModbusDataUnit unit(QModbusDataUnit::InputRegisters, m_startAddress+REG_ADC_BUFFER_START, m_registerCount); - qDebug() << "Reading ADC buffer from address" << m_startAddress << "count:" << m_registerCount; + // qDebug() << "Reading ADC buffer from address" << m_startAddress << "count:" << m_registerCount; if (auto *reply = m_modbusDevice->sendReadRequest(unit, m_boardAddress)) { if (!reply->isFinished()) { @@ -349,7 +401,7 @@ void AdcGraphDialog::readAdcBuffer() reply->deleteLater(); } } else { - qDebug() << "Failed to send ADC buffer read request"; + // qDebug() << "Failed to send ADC buffer read request"; } } @@ -359,6 +411,9 @@ void AdcGraphDialog::startGraph(int boardId, int teNumber) m_teNumber = teNumber; m_boardAddress = boardId + 1; + // Устанавливаем начальное значение в спинбокс + ui->teNumberSpinBox->setValue(teNumber); + setWindowTitle(QString("График АЦП - Плата %1, ТЭ %2 (адр %3-%4)") .arg(boardId + 1) .arg(teNumber) @@ -373,11 +428,16 @@ void AdcGraphDialog::startGraph(int boardId, int teNumber) // Обновляем диапазон графика updateGraphRange(); - readCalibrationValues(); // Калибровку оставляем отдельно (она редко меняется) - m_updateTimer->start(m_timeout); // Запускаем обновление + readCalibrationValues(); + + // Записываем начальный номер ТЭ + setTENumber(teNumber); + + m_updateTimer->start(m_timeout); } + void AdcGraphDialog::setTimeout(int timeout) { m_timeout = timeout; @@ -450,7 +510,7 @@ void AdcGraphDialog::onReadReady() } } else { - qDebug() << "Error reading ADC buffer:" << reply->errorString(); + // qDebug() << "Error reading ADC buffer:" << reply->errorString(); } reply->deleteLater(); @@ -475,7 +535,7 @@ void AdcGraphDialog::updateYAxisRange(double minVoltage, double maxVoltage) yMin = -0.1; yMax = 1.5; } - else if(maxVoltage < 0.5) + else if(minVoltage < -0.5) { yMin = -1.5; yMax =0.1; @@ -507,18 +567,18 @@ double AdcGraphDialog::convertAdcToVoltage(quint16 adcValue) void AdcGraphDialog::on_startAddressChanged(int value) { m_startAddress = value; - qDebug() << "Start address changed to:" << value; + // qDebug() << "Start address changed to:" << value; } void AdcGraphDialog::on_registerCountChanged(int value) { m_registerCount = value; - qDebug() << "Register count changed to:" << value; + // qDebug() << "Register count changed to:" << value; } void AdcGraphDialog::on_rangeApplyClicked() { - qDebug() << "Applying new range - Start:" << m_startAddress << "Count:" << m_registerCount; + // qDebug() << "Applying new range - Start:" << m_startAddress << "Count:" << m_registerCount; updateGraphRange(); // Немедленно обновляем данные diff --git a/M3KTE_TERM/adcgraphdialog.h b/M3KTE_TERM/adcgraphdialog.h index bb33d2a..5fb87bf 100644 --- a/M3KTE_TERM/adcgraphdialog.h +++ b/M3KTE_TERM/adcgraphdialog.h @@ -34,6 +34,9 @@ protected: void closeEvent(QCloseEvent *event) override; private slots: + void on_teNumberChanged(int value); + void on_teApplyClicked(); + void setTENumber(int teNumber); void onUpdateTimer(); void onReadReady(); void onStableIndicesReady(); @@ -68,6 +71,7 @@ private: QChart *m_chart; // Добавить указатель на chart // Управление диапазоном регистров + int m_pendingTeNumber; int m_startAddress; int m_registerCount; diff --git a/M3KTE_TERM/adcgraphdialog.ui b/M3KTE_TERM/adcgraphdialog.ui index b5283ec..335fe3e 100644 --- a/M3KTE_TERM/adcgraphdialog.ui +++ b/M3KTE_TERM/adcgraphdialog.ui @@ -14,7 +14,6 @@ График АЦП - @@ -77,13 +76,32 @@ + + + + Номер ТЭ + + + + + + + 85 + + + + + + + Применить + + + - - @@ -168,4 +186,4 @@ - \ No newline at end of file + diff --git a/M3KTE_TERM/m3kte.cpp b/M3KTE_TERM/m3kte.cpp index 06827d9..105d0a7 100644 --- a/M3KTE_TERM/m3kte.cpp +++ b/M3KTE_TERM/m3kte.cpp @@ -1532,6 +1532,7 @@ void M3KTE::displayResultOfScan(QModbusReply *reply, int boardID, int status) const QModbusDataUnit unit = reply->result(); bool W_Flag = false; bool A_Flag = false; + if(unit.startAddress() != 0 || unit.valueCount() != 85) { logError(tr("Плата %1 (ID %2)").arg(boardID+1).arg(Boards[boardID].adr), "Ошибка при приёме.", ++Boards[boardID].error_RX, @@ -1595,7 +1596,16 @@ void M3KTE::displayResultOfScan(QModbusReply *reply, int boardID, int status) QString W_Adr; QString A_Adr; - for(int i = unit.startAddress(), total = int(unit.valueCount()); i < total; ++i) { + int total_qnt; + if(boardID == 3) + { + total_qnt = 65; + } + else + { + total_qnt = 85; + } + for(int i = unit.startAddress(), total = total_qnt; i < total; ++i) { if(Boards[boardID].coil[i]==true) { int j = 0; if(Boards[boardID].HR[i+85] > unit.value(i)) { @@ -1635,9 +1645,9 @@ void M3KTE::displayResultOfScan(QModbusReply *reply, int boardID, int status) Boards[boardID].ModbusModelHoldingReg->set_currentU(unit.value(i), i); } Boards[boardID].ModbusModelCoil->dataChanged(ui->writeValueTable->model()->index(unit.startAddress(), 2), - ui->writeValueTable->model()->index(unit.startAddress() + unit.valueCount() -1, 2)); + ui->writeValueTable->model()->index(unit.startAddress() + total_qnt -1, 2)); Boards[boardID].ModbusModelHoldingReg->dataChanged(ui->writeValueTable->model()->index(unit.startAddress(), 3), - ui->writeValueTable->model()->index(unit.startAddress() + unit.valueCount() -1, 3)); + ui->writeValueTable->model()->index(unit.startAddress() + total_qnt -1, 3)); if(A_Flag && !A_Adr.isEmpty()) { statusM3KTE.Accidents[boardID] = true; logError(tr("Плата %1 (ID %2)").arg(boardID+1).arg(Boards[boardID].adr), diff --git a/Release/release/M3KTE_TERM.exe b/Release/release/M3KTE_TERM.exe index f35b8d8..890dc96 100644 Binary files a/Release/release/M3KTE_TERM.exe and b/Release/release/M3KTE_TERM.exe differ