diff options
author | Karsten Heimrich <karsten.heimrich@theqtcompany.com> | 2016-01-05 23:15:26 +0100 |
---|---|---|
committer | Karsten Heimrich <karsten.heimrich@theqtcompany.com> | 2016-01-06 10:21:54 +0000 |
commit | 246b75dc99e96010f8e265027d679ca52901c085 (patch) | |
tree | 13a847d4880f54cb18807ca6699d0a45083b4db4 /examples | |
parent | bfb510255e1f0fa83b0ec3caeb559ac371532024 (diff) |
Improve example applications.
* Master: Small coding style change.
* Slave|Master: Have a defined tab order.
* Master: Have a single server address field only.
* Master: Show either coils or holding registers, not both.
* Master: Limit number of possible write values on start address.
* Master: Enable/disable possible items depending on start address.
Change-Id: I2892efe3c4cd1a6f29e26b6b6b2e6b3a3f24ea99
Reviewed-by: Alex Blasche <alexander.blasche@theqtcompany.com>
Diffstat (limited to 'examples')
-rw-r--r-- | examples/serialbus/modbus/master/mainwindow.cpp | 47 | ||||
-rw-r--r-- | examples/serialbus/modbus/master/mainwindow.h | 1 | ||||
-rw-r--r-- | examples/serialbus/modbus/master/mainwindow.ui | 363 | ||||
-rw-r--r-- | examples/serialbus/modbus/master/writeregistermodel.cpp | 59 | ||||
-rw-r--r-- | examples/serialbus/modbus/master/writeregistermodel.h | 12 | ||||
-rw-r--r-- | examples/serialbus/modbus/slave/mainwindow.ui | 46 |
6 files changed, 330 insertions, 198 deletions
diff --git a/examples/serialbus/modbus/master/mainwindow.cpp b/examples/serialbus/modbus/master/mainwindow.cpp index 98cade6..1fb8ee5 100644 --- a/examples/serialbus/modbus/master/mainwindow.cpp +++ b/examples/serialbus/modbus/master/mainwindow.cpp @@ -47,6 +47,7 @@ #include <QtSerialBus/qmodbusrtuserialmaster.h> #include <QtCore/qbytearray.h> #include <QtCore/qurl.h> +#include <QtGui/qstandarditemmodel.h> #include <QtWidgets/qstatusbar.h> enum ModbusConnection { @@ -67,10 +68,14 @@ MainWindow::MainWindow(QWidget *parent) initActions(); writeModel = new WriteRegisterModel(this); + writeModel->setStartAddress(ui->writeAddress->value()); + writeModel->setNumberOfValues(ui->writeSize->currentText()); + ui->writeValueTable->setModel(writeModel); + ui->writeValueTable->hideColumn(2); ui->writeValueTable->resizeColumnToContents(0); - ui->writeValueTable->horizontalHeader()->setStretchLastSection(true); - ui->writeValueTable->verticalHeader()->setSectionResizeMode(QHeaderView::Stretch); + connect(writeModel, &WriteRegisterModel::updateViewport, ui->writeValueTable->viewport(), + static_cast<void (QWidget::*)()>(&QWidget::update)); ui->readTable->addItem(tr("Coils"), QModbusDataUnit::Coils); ui->readTable->addItem(tr("Discrete Inputs"), QModbusDataUnit::DiscreteInputs); @@ -79,6 +84,31 @@ MainWindow::MainWindow(QWidget *parent) ui->connectType->setCurrentIndex(0); on_connectType_currentIndexChanged(0); + + QStandardItemModel *model = new QStandardItemModel(10, 1, this); + for (int i = 0; i < 10; ++i) + model->setItem(i, new QStandardItem(QStringLiteral("%1").arg(i + 1))); + ui->writeSize->setModel(model); + ui->writeSize->setCurrentText("10"); + connect(ui->writeSize,&QComboBox::currentTextChanged, writeModel, + &WriteRegisterModel::setNumberOfValues); + + auto valueChanged = static_cast<void (QSpinBox::*)(int)> (&QSpinBox::valueChanged); + connect(ui->writeAddress, valueChanged, writeModel, &WriteRegisterModel::setStartAddress); + connect(ui->writeAddress, valueChanged, this, [this, model](int i) { + int lastPossibleIndex = 0; + const int currentIndex = ui->writeSize->currentIndex(); + for (int ii = 0; ii < 10; ++ii) { + if (ii < (10 - i)) { + lastPossibleIndex = ii; + model->item(ii)->setEnabled(true); + } else { + model->item(ii)->setEnabled(false); + } + } + if (currentIndex > lastPossibleIndex) + ui->writeSize->setCurrentIndex(lastPossibleIndex); + }); } MainWindow::~MainWindow() @@ -212,7 +242,7 @@ void MainWindow::on_readButton_clicked() statusBar()->clearMessage(); QModbusReply *reply = modbusDevice->sendReadRequest(dataRequest, - ui->readServer->text().toInt()); + ui->serverEdit->text().toInt()); // broadcast replies return immediately if (reply && reply->isFinished()) { delete reply; @@ -268,8 +298,7 @@ void MainWindow::on_writeButton_clicked() Q_ASSERT(startAddress >= 0 && startAddress < 10); QModbusDataUnit writeUnit(table, startAddress, numberOfEntries); - for (int i = startAddress; i < (startAddress + numberOfEntries); i++) - { + for (int i = startAddress; i < (startAddress + numberOfEntries); i++) { if (table == QModbusDataUnit::Coils) writeUnit.setValue(i - startAddress, writeModel->m_coils[i]); else @@ -279,7 +308,7 @@ void MainWindow::on_writeButton_clicked() statusBar()->clearMessage(); // TODO test for R/W MultipleRegisters is missing - QModbusReply *reply = modbusDevice->sendWriteRequest(writeUnit, ui->writeServer->text().toInt()); + QModbusReply *reply = modbusDevice->sendWriteRequest(writeUnit, ui->serverEdit->text().toInt()); // broadcast replies return immediately if (reply && reply->isFinished()) { @@ -311,3 +340,9 @@ void MainWindow::writeReady() reply->deleteLater(); } + +void MainWindow::on_writeTable_currentIndexChanged(int index) +{ + ui->writeValueTable->setColumnHidden(1, index != 0); + ui->writeValueTable->setColumnHidden(2, index != 1); +} diff --git a/examples/serialbus/modbus/master/mainwindow.h b/examples/serialbus/modbus/master/mainwindow.h index 2f6c481..992b687 100644 --- a/examples/serialbus/modbus/master/mainwindow.h +++ b/examples/serialbus/modbus/master/mainwindow.h @@ -80,6 +80,7 @@ private slots: void writeReady(); void on_connectType_currentIndexChanged(int); + void on_writeTable_currentIndexChanged(int); private: Ui::MainWindow *ui; diff --git a/examples/serialbus/modbus/master/mainwindow.ui b/examples/serialbus/modbus/master/mainwindow.ui index 11e8e90..f76074e 100644 --- a/examples/serialbus/modbus/master/mainwindow.ui +++ b/examples/serialbus/modbus/master/mainwindow.ui @@ -6,7 +6,7 @@ <rect> <x>0</x> <y>0</y> - <width>517</width> + <width>514</width> <height>378</height> </rect> </property> @@ -20,35 +20,11 @@ <string>Modbus Master Example</string> </property> <widget class="QWidget" name="centralWidget"> - <layout class="QVBoxLayout" name="verticalLayout"> - <item> + <layout class="QGridLayout" name="gridLayout_4"> + <item row="0" column="0"> <layout class="QGridLayout" name="gridLayout"> - <item row="0" column="0"> - <widget class="QLabel" name="label_111"> - <property name="text"> - <string>Connection type:</string> - </property> - </widget> - </item> - <item row="0" column="1"> - <widget class="QComboBox" name="connectType"> - <property name="text" stdset="0"> - <string>Connection type:</string> - </property> - <item> - <property name="text"> - <string>Serial</string> - </property> - </item> - <item> - <property name="text"> - <string>TCP</string> - </property> - </item> - </widget> - </item> - <item row="0" column="2"> - <widget class="QLabel" name="label_2"> + <item row="0" column="5"> + <widget class="QLabel" name="label_27"> <property name="sizePolicy"> <sizepolicy hsizetype="Maximum" vsizetype="Preferred"> <horstretch>0</horstretch> @@ -56,18 +32,30 @@ </sizepolicy> </property> <property name="text"> - <string>Port:</string> + <string>Server Address:</string> </property> </widget> </item> - <item row="0" column="3"> - <widget class="QLineEdit" name="portEdit"> + <item row="0" column="7"> + <widget class="QPushButton" name="connectButton"> <property name="sizePolicy"> - <sizepolicy hsizetype="Preferred" vsizetype="Fixed"> + <sizepolicy hsizetype="Maximum" vsizetype="Fixed"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> + <property name="text"> + <string>Connect</string> + </property> + <property name="checkable"> + <bool>false</bool> + </property> + <property name="autoDefault"> + <bool>false</bool> + </property> + <property name="default"> + <bool>true</bool> + </property> </widget> </item> <item row="0" column="4"> @@ -83,31 +71,69 @@ </property> </spacer> </item> - <item row="0" column="5"> - <widget class="QPushButton" name="connectButton"> + <item row="0" column="6"> + <widget class="QSpinBox" name="serverEdit"> <property name="sizePolicy"> <sizepolicy hsizetype="Maximum" vsizetype="Fixed"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> - <property name="text"> - <string>Connect</string> + <property name="minimum"> + <number>1</number> </property> - <property name="checkable"> - <bool>false</bool> + <property name="maximum"> + <number>247</number> </property> - <property name="autoDefault"> - <bool>false</bool> + </widget> + </item> + <item row="0" column="1"> + <widget class="QComboBox" name="connectType"> + <item> + <property name="text"> + <string>Serial</string> + </property> + </item> + <item> + <property name="text"> + <string>TCP</string> + </property> + </item> + </widget> + </item> + <item row="0" column="2"> + <widget class="QLabel" name="label_2"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Maximum" vsizetype="Preferred"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> </property> - <property name="default"> - <bool>true</bool> + <property name="text"> + <string>Port:</string> + </property> + </widget> + </item> + <item row="0" column="0"> + <widget class="QLabel" name="label"> + <property name="text"> + <string>Connection type:</string> + </property> + </widget> + </item> + <item row="0" column="3"> + <widget class="QLineEdit" name="portEdit"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Preferred" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> </property> </widget> </item> </layout> </item> - <item> + <item row="1" column="0"> <layout class="QHBoxLayout" name="horizontalLayout_5" stretch="0,0"> <item> <widget class="QFrame" name="frame"> @@ -129,7 +155,14 @@ </property> <item> <layout class="QGridLayout" name="gridLayout_2"> - <item row="5" column="1"> + <item row="0" column="0"> + <widget class="QLabel" name="label_7"> + <property name="text"> + <string>Start address:</string> + </property> + </widget> + </item> + <item row="4" column="1"> <layout class="QHBoxLayout" name="horizontalLayout_2"> <item> <spacer name="horizontalSpacer_3"> @@ -153,29 +186,7 @@ </item> </layout> </item> - <item row="0" column="1"> - <widget class="QSpinBox" name="writeServer"> - <property name="readOnly"> - <bool>false</bool> - </property> - <property name="specialValueText"> - <string>broadcast</string> - </property> - <property name="accelerated"> - <bool>true</bool> - </property> - <property name="minimum"> - <number>0</number> - </property> - <property name="maximum"> - <number>255</number> - </property> - <property name="value"> - <number>1</number> - </property> - </widget> - </item> - <item row="3" column="0"> + <item row="2" column="0"> <widget class="QLabel" name="label_8"> <property name="text"> <string>Number of values:</string> @@ -183,27 +194,13 @@ </widget> </item> <item row="1" column="0"> - <widget class="QLabel" name="label_7"> - <property name="text"> - <string>Address:</string> - </property> - </widget> - </item> - <item row="1" column="1"> - <widget class="QSpinBox" name="writeAddress"> - <property name="maximum"> - <number>9</number> - </property> - </widget> - </item> - <item row="2" column="0"> <widget class="QLabel" name="label_6"> <property name="text"> <string>Table:</string> </property> </widget> </item> - <item row="2" column="1"> + <item row="1" column="1"> <widget class="QComboBox" name="writeTable"> <item> <property name="text"> @@ -217,18 +214,18 @@ </item> </widget> </item> - <item row="0" column="0"> - <widget class="QLabel" name="label_10"> - <property name="text"> - <string>Server Address:</string> + <item row="0" column="1"> + <widget class="QSpinBox" name="writeAddress"> + <property name="maximum"> + <number>9</number> </property> </widget> </item> - <item row="4" column="0" colspan="2"> - <widget class="QTableView" name="writeValueTable"/> - </item> - <item row="3" column="1"> + <item row="2" column="1"> <widget class="QComboBox" name="writeSize"> + <property name="currentIndex"> + <number>9</number> + </property> <item> <property name="text"> <string>1</string> @@ -281,6 +278,31 @@ </item> </widget> </item> + <item row="3" column="0" colspan="2"> + <widget class="QTreeView" name="writeValueTable"> + <property name="showDropIndicator" stdset="0"> + <bool>true</bool> + </property> + <property name="alternatingRowColors"> + <bool>true</bool> + </property> + <property name="rootIsDecorated"> + <bool>false</bool> + </property> + <property name="uniformRowHeights"> + <bool>true</bool> + </property> + <property name="itemsExpandable"> + <bool>false</bool> + </property> + <property name="expandsOnDoubleClick"> + <bool>false</bool> + </property> + <attribute name="headerVisible"> + <bool>true</bool> + </attribute> + </widget> + </item> </layout> </item> </layout> @@ -303,7 +325,61 @@ <layout class="QHBoxLayout" name="horizontalLayout_4"> <item> <layout class="QGridLayout" name="gridLayout_3"> - <item row="3" column="1"> + <item row="3" column="0"> + <widget class="QLabel" name="label_9"> + <property name="text"> + <string>Values:</string> + </property> + </widget> + </item> + <item row="4" column="0"> + <spacer name="verticalSpacer_2"> + <property name="orientation"> + <enum>Qt::Vertical</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>20</width> + <height>40</height> + </size> + </property> + </spacer> + </item> + <item row="2" column="0"> + <widget class="QLabel" name="label_5"> + <property name="text"> + <string>Number of values:</string> + </property> + </widget> + </item> + <item row="3" column="1" rowspan="2"> + <widget class="QListWidget" name="readValue"/> + </item> + <item row="1" column="0"> + <widget class="QLabel" name="label_3"> + <property name="text"> + <string>Table:</string> + </property> + </widget> + </item> + <item row="1" column="1"> + <widget class="QComboBox" name="readTable"/> + </item> + <item row="0" column="1"> + <widget class="QSpinBox" name="readAddress"> + <property name="maximum"> + <number>9</number> + </property> + </widget> + </item> + <item row="0" column="0"> + <widget class="QLabel" name="label_4"> + <property name="text"> + <string>Start address:</string> + </property> + </widget> + </item> + <item row="2" column="1"> <widget class="QComboBox" name="readSize"> <item> <property name="text"> @@ -357,7 +433,7 @@ </item> </widget> </item> - <item row="6" column="1"> + <item row="5" column="1"> <layout class="QHBoxLayout" name="horizontalLayout"> <item> <spacer name="horizontalSpacer_2"> @@ -387,89 +463,6 @@ </item> </layout> </item> - <item row="1" column="1"> - <widget class="QSpinBox" name="readAddress"> - <property name="maximum"> - <number>9</number> - </property> - </widget> - </item> - <item row="0" column="0"> - <widget class="QLabel" name="label_11"> - <property name="text"> - <string>Server Address:</string> - </property> - </widget> - </item> - <item row="2" column="1"> - <widget class="QComboBox" name="readTable"/> - </item> - <item row="1" column="0"> - <widget class="QLabel" name="label_4"> - <property name="text"> - <string>Start address:</string> - </property> - </widget> - </item> - <item row="0" column="1"> - <widget class="QSpinBox" name="readServer"> - <property name="readOnly"> - <bool>false</bool> - </property> - <property name="specialValueText"> - <string>broadcast</string> - </property> - <property name="accelerated"> - <bool>true</bool> - </property> - <property name="minimum"> - <number>0</number> - </property> - <property name="maximum"> - <number>255</number> - </property> - <property name="value"> - <number>1</number> - </property> - </widget> - </item> - <item row="4" column="0"> - <widget class="QLabel" name="label_9"> - <property name="text"> - <string>Values:</string> - </property> - </widget> - </item> - <item row="3" column="0"> - <widget class="QLabel" name="label_5"> - <property name="text"> - <string>Number of values:</string> - </property> - </widget> - </item> - <item row="5" column="0"> - <spacer name="verticalSpacer_2"> - <property name="orientation"> - <enum>Qt::Vertical</enum> - </property> - <property name="sizeHint" stdset="0"> - <size> - <width>20</width> - <height>40</height> - </size> - </property> - </spacer> - </item> - <item row="4" column="1" rowspan="2"> - <widget class="QListWidget" name="readValue"/> - </item> - <item row="2" column="0"> - <widget class="QLabel" name="label_3"> - <property name="text"> - <string>Table:</string> - </property> - </widget> - </item> </layout> </item> </layout> @@ -485,7 +478,7 @@ <rect> <x>0</x> <y>0</y> - <width>517</width> + <width>514</width> <height>21</height> </rect> </property> @@ -545,6 +538,22 @@ </action> </widget> <layoutdefault spacing="6" margin="11"/> + <tabstops> + <tabstop>connectType</tabstop> + <tabstop>portEdit</tabstop> + <tabstop>serverEdit</tabstop> + <tabstop>connectButton</tabstop> + <tabstop>writeAddress</tabstop> + <tabstop>writeTable</tabstop> + <tabstop>writeSize</tabstop> + <tabstop>writeValueTable</tabstop> + <tabstop>writeButton</tabstop> + <tabstop>readAddress</tabstop> + <tabstop>readTable</tabstop> + <tabstop>readSize</tabstop> + <tabstop>readValue</tabstop> + <tabstop>readButton</tabstop> + </tabstops> <resources> <include location="master.qrc"/> </resources> diff --git a/examples/serialbus/modbus/master/writeregistermodel.cpp b/examples/serialbus/modbus/master/writeregistermodel.cpp index d3656fe..f0ed26e 100644 --- a/examples/serialbus/modbus/master/writeregistermodel.cpp +++ b/examples/serialbus/modbus/master/writeregistermodel.cpp @@ -41,7 +41,11 @@ #include "writeregistermodel.h" #define ROW_COUNT 10 -#define COLUMN_COUNT 2 +#define COLUMN_COUNT 3 + +#define COLUMN_NUM 0 +#define COLUMN_COILS 1 +#define COLUMN_HOLDING 2 WriteRegisterModel::WriteRegisterModel(QObject *parent) : QAbstractTableModel(parent), @@ -67,9 +71,13 @@ QVariant WriteRegisterModel::data(const QModelIndex &index, int role) const Q_ASSERT(m_coils.count() == ROW_COUNT); Q_ASSERT(m_holdingRegisters.count() == ROW_COUNT); - if (index.column() == 0 && role == Qt::CheckStateRole) // coils + if (index.column() == COLUMN_NUM && role == Qt::DisplayRole) + return QString::number(index.row()); + + if (index.column() == COLUMN_COILS && role == Qt::CheckStateRole) // coils return m_coils.at(index.row()) ? Qt::Checked : Qt::Unchecked; - else if (index.column() == 1 && role != Qt::CheckStateRole) //holding registers + + else if (index.column() == COLUMN_HOLDING && role == Qt::DisplayRole) //holding registers return QString("0x%1").arg(QString::number(m_holdingRegisters.at(index.row()), 16)); return QVariant(); @@ -82,13 +90,18 @@ QVariant WriteRegisterModel::headerData(int section, Qt::Orientation orientation return QVariant(); if (orientation == Qt::Horizontal) { - if (section == 0) + switch (section) { + case COLUMN_NUM: + return QStringLiteral("#"); + case COLUMN_COILS: return QStringLiteral("Coils "); - else + case COLUMN_HOLDING: return QStringLiteral("Holding Registers"); - } else { - return QString::number(section); + default: + break; + } } + return QVariant(); } bool WriteRegisterModel::setData(const QModelIndex &index, const QVariant &value, int role) @@ -99,12 +112,14 @@ bool WriteRegisterModel::setData(const QModelIndex &index, const QVariant &value Q_ASSERT(m_coils.count() == ROW_COUNT); Q_ASSERT(m_holdingRegisters.count() == ROW_COUNT); - if (index.column() == 0 && role == Qt::CheckStateRole) { // coils + if (index.column() == COLUMN_COILS && role == Qt::CheckStateRole) { // coils Qt::CheckState s = static_cast<Qt::CheckState>(value.toUInt()); s == Qt::Checked ? m_coils.setBit(index.row()) : m_coils.clearBit(index.row()); emit dataChanged(index, index); return true; - } else if (index.column() == 1 && Qt::EditRole) { // holding registers + } + + if (index.column() == COLUMN_HOLDING && Qt::EditRole) { // holding registers bool result = false; quint16 newValue = value.toString().toUShort(&result, 16); if (result) @@ -119,15 +134,29 @@ bool WriteRegisterModel::setData(const QModelIndex &index, const QVariant &value Qt::ItemFlags WriteRegisterModel::flags(const QModelIndex &index) const { - if (!index.isValid() || index.row() >= ROW_COUNT || index.column() >= COLUMN_COUNT) + if (!index.isValid() || index.row() >= ROW_COUNT || index.column() >= COLUMN_COUNT) return QAbstractTableModel::flags(index); - if (index.column() == 0) //coils - return QAbstractTableModel::flags(index) | Qt::ItemIsUserCheckable; + Qt::ItemFlags flags = QAbstractTableModel::flags(index); + if ((index.row() < m_address) || (index.row() >= (m_address + m_number))) + flags &= ~Qt::ItemIsEnabled; + + if (index.column() == COLUMN_COILS) //coils + return flags | Qt::ItemIsUserCheckable; + if (index.column() == COLUMN_HOLDING) //holding registers + return flags | Qt::ItemIsEditable; - if (index.column() == 1) //holding registers - return QAbstractTableModel::flags(index) | Qt::ItemIsEditable; + return flags; +} - return QAbstractTableModel::flags(index); +void WriteRegisterModel::setStartAddress(int address) +{ + m_address = address; + emit updateViewport(); } +void WriteRegisterModel::setNumberOfValues(const QString &number) +{ + m_number = number.toInt(); + emit updateViewport(); +} diff --git a/examples/serialbus/modbus/master/writeregistermodel.h b/examples/serialbus/modbus/master/writeregistermodel.h index 101d6d9..3705df9 100644 --- a/examples/serialbus/modbus/master/writeregistermodel.h +++ b/examples/serialbus/modbus/master/writeregistermodel.h @@ -43,9 +43,12 @@ #include <QtCore/qabstractitemmodel.h> #include <QtCore/qbitarray.h> +#include <QtCore/qobject.h> class WriteRegisterModel : public QAbstractTableModel { + Q_OBJECT + public: WriteRegisterModel(QObject* parent = 0); @@ -58,7 +61,16 @@ public: Qt::ItemFlags flags(const QModelIndex &index) const Q_DECL_OVERRIDE; +public slots: + void setStartAddress(int address); + void setNumberOfValues(const QString &number); + +signals: + void updateViewport(); + public: + int m_number; + int m_address; QBitArray m_coils; QVector<quint16> m_holdingRegisters; }; diff --git a/examples/serialbus/modbus/slave/mainwindow.ui b/examples/serialbus/modbus/slave/mainwindow.ui index c9ad757..61a0ba4 100644 --- a/examples/serialbus/modbus/slave/mainwindow.ui +++ b/examples/serialbus/modbus/slave/mainwindow.ui @@ -772,6 +772,52 @@ </action> </widget> <layoutdefault spacing="6" margin="11"/> + <tabstops> + <tabstop>connectType</tabstop> + <tabstop>portEdit</tabstop> + <tabstop>serverEdit</tabstop> + <tabstop>connectButton</tabstop> + <tabstop>coils_0</tabstop> + <tabstop>disc_0</tabstop> + <tabstop>inReg_0</tabstop> + <tabstop>holdReg_0</tabstop> + <tabstop>coils_1</tabstop> + <tabstop>disc_1</tabstop> + <tabstop>inReg_1</tabstop> + <tabstop>holdReg_1</tabstop> + <tabstop>coils_2</tabstop> + <tabstop>disc_2</tabstop> + <tabstop>inReg_2</tabstop> + <tabstop>holdReg_2</tabstop> + <tabstop>coils_3</tabstop> + <tabstop>disc_3</tabstop> + <tabstop>inReg_3</tabstop> + <tabstop>holdReg_3</tabstop> + <tabstop>coils_4</tabstop> + <tabstop>disc_4</tabstop> + <tabstop>inReg_4</tabstop> + <tabstop>holdReg_4</tabstop> + <tabstop>coils_5</tabstop> + <tabstop>disc_5</tabstop> + <tabstop>inReg_5</tabstop> + <tabstop>holdReg_5</tabstop> + <tabstop>coils_6</tabstop> + <tabstop>disc_6</tabstop> + <tabstop>inReg_6</tabstop> + <tabstop>holdReg_6</tabstop> + <tabstop>coils_7</tabstop> + <tabstop>disc_7</tabstop> + <tabstop>inReg_7</tabstop> + <tabstop>holdReg_7</tabstop> + <tabstop>coils_8</tabstop> + <tabstop>disc_8</tabstop> + <tabstop>inReg_8</tabstop> + <tabstop>holdReg_8</tabstop> + <tabstop>coils_9</tabstop> + <tabstop>disc_9</tabstop> + <tabstop>inReg_9</tabstop> + <tabstop>holdReg_9</tabstop> + </tabstops> <resources> <include location="slave.qrc"/> </resources> |