фиксы графика и статической компиляции

This commit is contained in:
Вячеслав Штейбезандт 2025-10-09 18:30:27 +03:00
parent 93b4a24b8b
commit 5b3faa798b
5 changed files with 116 additions and 24 deletions

View File

@ -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<int>::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();
// Немедленно обновляем данные

View File

@ -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;

View File

@ -14,7 +14,6 @@
<string>График АЦП</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<!-- Панель управления диапазоном -->
<item>
<layout class="QHBoxLayout" name="rangeLayout">
<item>
@ -77,13 +76,32 @@
</property>
</spacer>
</item>
<item>
<widget class="QLabel" name="label_5">
<property name="text">
<string>Номер ТЭ</string>
</property>
</widget>
</item>
<item>
<widget class="QSpinBox" name="teNumberSpinBox">
<property name="maximum">
<number>85</number>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="teApplyButton">
<property name="text">
<string>Применить</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<widget class="QWidget" name="plotWidget" native="true"/>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
@ -168,4 +186,4 @@
</widget>
<resources/>
<connections/>
</ui>
</ui>

View File

@ -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),

Binary file not shown.