diff --git a/Inc/mainwindow.h b/Inc/mainwindow.h index 0c992ff..95c55b9 100644 --- a/Inc/mainwindow.h +++ b/Inc/mainwindow.h @@ -56,6 +56,7 @@ private: QVector m_squares; QVector m_colorIndices; QVector m_buttonValues; // Add this new member to store button states + QVector m_buttonBits; // Add this new member for button bits QModbusTcpClient* m_modbusClient; QPushButton* m_connectButton; diff --git a/Src/mainwindow.cpp b/Src/mainwindow.cpp index 95ec666..db196f4 100644 --- a/Src/mainwindow.cpp +++ b/Src/mainwindow.cpp @@ -58,13 +58,17 @@ void Mainwindows::loadConfiguration() { m_buttonRegisters.clear(); m_indicatorRegisters.clear(); + m_buttonBits.clear(); - // Load button registers + // Load button registers and bits for(int i = 1; i <= m_buttonCount; ++i) { - QString buttonKey = QString("button_reg%1").arg(i); - int buttonReg = settings.value(buttonKey, 0).toInt(); - if(buttonReg > 0) { + QString buttonRegKey = QString("button_reg%1").arg(i); + QString buttonBitKey = QString("button_bit%1").arg(i); + int buttonReg = settings.value(buttonRegKey, 0).toInt(); + int buttonBit = settings.value(buttonBitKey, 0).toInt(); + if(buttonReg > 0 && buttonBit >= 0 && buttonBit < 16) { m_buttonRegisters.append(buttonReg); + m_buttonBits.append(buttonBit); } } @@ -72,7 +76,7 @@ void Mainwindows::loadConfiguration() { for(int i = 1; i <= m_indicatorCount; ++i) { QString indicatorKey = QString("indicator_reg%1").arg(i); int indicatorReg = settings.value(indicatorKey, 0).toInt(); - if(indicatorReg > 0) { + if (indicatorReg > 0) { m_indicatorRegisters.append(indicatorReg); } } @@ -193,9 +197,12 @@ void Mainwindows::onReadReady() { // Handle buttons for (int i = 0; i < m_buttonRegisters.size(); ++i) { if (address == m_buttonRegisters[i]) { - m_buttonValues[i] = value & 1; // Update stored button value - QStringList bName = {"Открыть", "Закрыть"}; - m_buttons[i]->setText(bName[m_buttonValues[i]]); + m_buttonValues[i] = value; + bool bitState = (value >> m_buttonBits[i]) & 1; + m_buttons[i]->setText(QString("Reg %1 Bit %2: %3") + .arg(m_buttonRegisters[i]) + .arg(m_buttonBits[i]) + .arg(bitState ? "1" : "0")); break; } } @@ -225,14 +232,16 @@ void Mainwindows::createUIElements() { // Create UI elements for(int i = 0; i < rowCount; ++i) { if (i < m_buttonCount) { - auto* button = new QPushButton(QString("Register %1").arg(m_buttonRegisters[i]), this); + auto* button = new QPushButton(QString("Register %1 Bit %2").arg(m_buttonRegisters[i]).arg(m_buttonBits[i]), this); m_buttons.append(button); - m_buttonValues.append(0); // Initialize button values + m_buttonValues.append(0); m_table->setCellWidget(i, 0, button); connect(button, &QPushButton::clicked, [this, i]() { - m_buttonValues[i] = !m_buttonValues[i]; // Toggle value QModbusDataUnit writeUnit(QModbusDataUnit::HoldingRegisters, m_buttonRegisters[i], 1); - writeUnit.setValue(0, m_buttonValues[i]); + int currentValue = m_buttonValues[i]; + int newValue = currentValue ^ (1 << m_buttonBits[i]); // Toggle specific bit + m_buttonValues[i] = newValue; + writeUnit.setValue(0, newValue); if (auto *reply = m_modbusClient->sendWriteRequest(writeUnit, 1)) { if (!reply->isFinished()) connect(reply, &QModbusReply::finished, reply, &QModbusReply::deleteLater); diff --git a/config.ini b/config.ini index 359f06e..6c6c06a 100644 --- a/config.ini +++ b/config.ini @@ -9,8 +9,11 @@ timeBetweenPolls=100 buttonCount=3 indicatorCount=4 button_reg1=3 +button_bit1=0 button_reg2=4 +button_bit2=1 button_reg3=5 +button_bit3=2 indicator_reg1=13 indicator_reg2=14 indicator_reg3=15