Correct bit change
This commit is contained in:
@@ -56,6 +56,7 @@ private:
|
||||
QVector<ColoredSquare*> m_squares;
|
||||
QVector<int> m_colorIndices;
|
||||
QVector<int> m_buttonValues; // Add this new member to store button states
|
||||
QVector<int> m_buttonBits; // Add this new member for button bits
|
||||
|
||||
QModbusTcpClient* m_modbusClient;
|
||||
QPushButton* m_connectButton;
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user