#include "mainwindow.h" #include "ui_mainwindow.h" #include "qdebug.h" #include MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { ui->setupUi(this); ui->writeTable->addItem(tr("Coils"), 0); ui->writeTable->addItem(tr("Discrete Inputs"), 1); ui->writeTable->addItem(tr("Input Registers"), 2); ui->writeTable->addItem(tr("Holding Registers"), 3); connect(&modBusObj, &modBusMaster::modbusConnectionState, this, &MainWindow::connectionState); } MainWindow::~MainWindow() { delete ui; } void MainWindow::on_connectButton_clicked() { if( ui->connectButton->text()==tr("Disconnect")) { modBusObj.stop(); } else { modBusObj.init(); modBusObj.open(ui->portEdit->text(),ui->serverEdit->value()); } } void MainWindow::on_readButton_clicked() { int startAddress = ui->readAddress->value(); // do not go beyond 10 entries int numberOfEntries = qMin(ui->readSize->currentText().toInt(), 10 - startAddress); switch (ui->writeTable->currentData().toInt()) { case 0: printCoilsDataFromSlave(modBusObj.getCoil(startAddress,static_cast(numberOfEntries))); break; case 1: printCoilsDataFromSlave(modBusObj.getInputCoil(startAddress,static_cast(numberOfEntries))); break; case 2: printRegisterDataFromSlave(modBusObj.getInputRegister(startAddress,static_cast(numberOfEntries))); break; case 3: printRegisterDataFromSlave(modBusObj.getHoldingRegister(startAddress,static_cast(numberOfEntries))); break; } } void MainWindow::printRegisterDataFromSlave(QVector uiHoldingRegisters) { QString readedData; for (int i = 0; i < uiHoldingRegisters.count(); i++) { const QString entry = tr("Number: %1, Value: %2").arg(i) .arg(QString::number(uiCoils[i])); readedData += (entry + "\n" ); } ui->textEditRead->setText(readedData); } void MainWindow::printCoilsDataFromSlave(QBitArray uiCoils) { QString readedData; for (int i = 0; i < uiCoils.count(); i++) { const QString entry = tr("Number: %1, Value: %2").arg(i) .arg(QString::number(uiCoils[i])); readedData += (entry + "\n" ); } ui->textEditRead->setText(readedData); } void MainWindow::connectionState(bool state) { if (state) ui->connectButton->setText(tr("Disconnect")); else ui->connectButton->setText(tr("Connect")); } void MainWindow::on_writeButton_clicked() { uiCoils.resize(2); uiholdingRegisters.resize(2); int startAddress = ui->writeAddress->value(); // do not go beyond 10 entries int numberOfEntries = qMin(ui->writeSize->currentText().toInt(), 10 - startAddress); switch (ui->writeTable->currentData().toInt()) { case 0: if(numberOfEntries>1) { uiCoils.setBit(0,ui->coilData1->isChecked()); uiCoils.setBit(1,ui->coilData2->isChecked()); modBusObj.setMultipleCoil(startAddress, numberOfEntries, uiCoils); } else if (numberOfEntries==1) { modBusObj.setSingleCoil(startAddress, ui->coilData1->isChecked()); } break; case 3: if(numberOfEntries>1) { uiholdingRegisters[0]=ui->textEdit1->toPlainText().toUInt(); uiholdingRegisters[1]=ui->textEdit2->toPlainText().toUInt(); modBusObj.setMultipleRegister(startAddress, numberOfEntries, uiholdingRegisters); } else if (numberOfEntries==1) { modBusObj.setSingleRegister(startAddress, ui->textEdit1->toPlainText().toUInt()); } break; } }