This commit is contained in:
2025-07-04 03:34:30 +07:00
parent 73243f8c7a
commit 868b770e0e
2 changed files with 22 additions and 19 deletions

View File

@@ -43,6 +43,7 @@ private:
void initModbusConnection();
void readRegisters();
void loadConfiguration();
void updateStatusBar() const; // Добавлен const
QTableWidget* m_table{};
QString m_ipAddress;
@@ -69,7 +70,6 @@ private:
QLabel* m_statusLabel{};
int m_requestCounter;
int m_responseCounter;
void updateStatusBar();
};
#endif // MAINWINDOW_H

View File

@@ -5,13 +5,10 @@
#include <QThread>
#include <QPainter>
#include <QSettings>
#include "mainwindow.h"
#include <QCoreApplication>
#include <QModbusTcpClient>
#include <QModbusDataUnit>
#include <QUrl>
#include <QMessageBox>
#include <QDebug>
#include "mainwindow.h"
#include <QCoreApplication>
ColoredSquare::ColoredSquare(QWidget *parent) : QWidget(parent), m_color(Qt::gray) {
}
@@ -117,6 +114,8 @@ void MainWindows::loadConfiguration() {
}
void MainWindows::initModbusConnection() {
delete m_modbusClient;
m_modbusClient = new QModbusTcpClient(this);
// Set timeouts
@@ -125,11 +124,13 @@ void MainWindows::initModbusConnection() {
m_modbusClient->setTimeout(m_responseTimeout);
m_modbusClient->setNumberOfRetries(1);
connect(m_modbusClient, &QModbusClient::stateChanged,
connect(m_modbusClient, &QModbusDevice::stateChanged,
this, &MainWindows::onStateChanged);
// Initialize poll timer
if (!m_pollTimer) {
m_pollTimer = new QTimer(this);
}
m_pollTimer->setInterval(m_pollInterval);
connect(m_pollTimer, &QTimer::timeout, this, &MainWindows::onPollTimer);
}
@@ -213,13 +214,15 @@ void MainWindows::readRegisters() {
}
void MainWindows::onReadReady() {
auto reply = qobject_cast<QModbusReply *>(sender());
auto* reply = qobject_cast<QModbusReply*>(sender());
if (!reply) return;
if (reply->error() == QModbusDevice::NoError) {
std::unique_ptr<QModbusReply> replyPtr(reply); // Автоматическое освобождение памяти
if (replyPtr->error() == QModbusDevice::NoError) {
m_responseCounter++;
updateStatusBar();
const QModbusDataUnit unit = reply->result();
const QModbusDataUnit unit = replyPtr->result();
int address = unit.startAddress();
int value = unit.value(0);
@@ -257,7 +260,6 @@ void MainWindows::onReadReady() {
}
}
}
reply->deleteLater();
}
void MainWindows::createUIElements() {
@@ -302,22 +304,23 @@ void MainWindows::createUIElements() {
if (i < m_buttonCount) {
auto* button = new QPushButton(QString("Register %1 Bit %2").arg(m_buttonRegisters[i]).arg(m_buttonBits[i]), this);
button->setFont(tableFont);
button->setCheckable(true); // Делаем кнопку переключаемой
button->setCheckable(true);
m_buttons.append(button);
m_buttonValues.append(0);
m_table->setCellWidget(i, 1, button);
connect(button, &QPushButton::clicked, [this, i]() {
connect(button, &QPushButton::clicked, this, [this, i]() {
QModbusDataUnit writeUnit(QModbusDataUnit::HoldingRegisters, m_buttonRegisters[i], 1);
int currentValue = m_buttonValues[i];
int newValue = currentValue ^ (1 << m_buttonBits[i]); // Toggle specific bit
int newValue = currentValue ^ (1 << m_buttonBits[i]);
m_buttonValues[i] = newValue;
writeUnit.setValue(0, newValue);
if (auto* reply = m_modbusClient->sendWriteRequest(writeUnit, 1)) {
if (!reply->isFinished())
if (!reply->isFinished()) {
connect(reply, &QModbusReply::finished, reply, &QModbusReply::deleteLater);
else
} else {
delete reply;
}
}
});
}
@@ -357,7 +360,7 @@ void MainWindows::createUIElements() {
setFixedSize(totalWidth, totalHeight);
}
void MainWindows::updateStatusBar() {
void MainWindows::updateStatusBar() const {
QString status = QString("IP: %1 Port: %2 | Requests: %3 Responses: %4")
.arg(m_ipAddress)
.arg(m_port)