You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

122 lines
3.6 KiB

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "qdebug.h"
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<quint16>(numberOfEntries)));
break;
case 1: printCoilsDataFromSlave(modBusObj.getInputCoil(startAddress,static_cast<quint16>(numberOfEntries)));
break;
case 2: printRegisterDataFromSlave(modBusObj.getInputRegister(startAddress,static_cast<quint16>(numberOfEntries)));
break;
case 3: printRegisterDataFromSlave(modBusObj.getHoldingRegister(startAddress,static_cast<quint16>(numberOfEntries)));
break;
}
}
void MainWindow::printRegisterDataFromSlave(QVector<quint16> 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;
}
}