Compare commits
9 Commits
Pre-releas
...
c9b44e5dab
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c9b44e5dab | ||
|
|
14d7907d92 | ||
|
|
b4803e19e2 | ||
|
|
d9f58e72e4 | ||
|
|
a4cdcb7091 | ||
|
|
7dc314d266 | ||
|
|
568ec9b5d3 | ||
|
|
009ac176f9 | ||
|
|
1b7388821e |
3
.gitignore
vendored
3
.gitignore
vendored
@@ -54,3 +54,6 @@ compile_commands.json
|
||||
|
||||
*_qmlcache.qrc
|
||||
|
||||
|
||||
/Debug
|
||||
/Release
|
||||
|
||||
21
Debug/.qmake.stash
Normal file
21
Debug/.qmake.stash
Normal file
@@ -0,0 +1,21 @@
|
||||
QMAKE_CXX.QT_COMPILER_STDCXX = 201402L
|
||||
QMAKE_CXX.QMAKE_GCC_MAJOR_VERSION = 7
|
||||
QMAKE_CXX.QMAKE_GCC_MINOR_VERSION = 3
|
||||
QMAKE_CXX.QMAKE_GCC_PATCH_VERSION = 0
|
||||
QMAKE_CXX.COMPILER_MACROS = \
|
||||
QT_COMPILER_STDCXX \
|
||||
QMAKE_GCC_MAJOR_VERSION \
|
||||
QMAKE_GCC_MINOR_VERSION \
|
||||
QMAKE_GCC_PATCH_VERSION
|
||||
QMAKE_CXX.INCDIRS = \
|
||||
C:/Qt/Qt5.14.2/Tools/mingw730_32/lib/gcc/i686-w64-mingw32/7.3.0/include/c++ \
|
||||
C:/Qt/Qt5.14.2/Tools/mingw730_32/lib/gcc/i686-w64-mingw32/7.3.0/include/c++/i686-w64-mingw32 \
|
||||
C:/Qt/Qt5.14.2/Tools/mingw730_32/lib/gcc/i686-w64-mingw32/7.3.0/include/c++/backward \
|
||||
C:/Qt/Qt5.14.2/Tools/mingw730_32/lib/gcc/i686-w64-mingw32/7.3.0/include \
|
||||
C:/Qt/Qt5.14.2/Tools/mingw730_32/lib/gcc/i686-w64-mingw32/7.3.0/include-fixed \
|
||||
C:/Qt/Qt5.14.2/Tools/mingw730_32/i686-w64-mingw32/include
|
||||
QMAKE_CXX.LIBDIRS = \
|
||||
C:/Qt/Qt5.14.2/Tools/mingw730_32/lib/gcc/i686-w64-mingw32/7.3.0 \
|
||||
C:/Qt/Qt5.14.2/Tools/mingw730_32/lib/gcc \
|
||||
C:/Qt/Qt5.14.2/Tools/mingw730_32/i686-w64-mingw32/lib \
|
||||
C:/Qt/Qt5.14.2/Tools/mingw730_32/lib
|
||||
@@ -16,6 +16,9 @@ CONFIG += c++11
|
||||
# deprecated API in order to know how to port your code away from it.
|
||||
DEFINES += QT_DEPRECATED_WARNINGS
|
||||
|
||||
#TEMPLATE = lib
|
||||
#DEFINES += M3KTE_LIBRARY
|
||||
|
||||
# You can also make your code fail to compile if it uses deprecated APIs.
|
||||
# In order to do so, uncomment the following line.
|
||||
# You can also select to disable deprecated APIs only up to a certain version of Qt.
|
||||
@@ -23,26 +26,37 @@ DEFINES += QT_DEPRECATED_WARNINGS
|
||||
|
||||
SOURCES += \
|
||||
devicesettingsdialog.cpp \
|
||||
lineringer.cpp \
|
||||
main.cpp \
|
||||
m3kte.cpp \
|
||||
multiplesettings.cpp \
|
||||
scanboard.cpp \
|
||||
settingsdialog.cpp \
|
||||
writeregistermodel.cpp
|
||||
|
||||
HEADERS += \
|
||||
devicesettingsdialog.h \
|
||||
lineringer.h \
|
||||
m3kte.h \
|
||||
multiplesettings.h \
|
||||
scanboard.h \
|
||||
settingsdialog.h \
|
||||
writeregistermodel.h
|
||||
|
||||
FORMS += \
|
||||
devicesettingsdialog.ui \
|
||||
lineringer.ui \
|
||||
m3kte.ui \
|
||||
multiplesettings.ui \
|
||||
scanboard.ui \
|
||||
settingsdialog.ui
|
||||
|
||||
# Default rules for deployment.
|
||||
qnx: target.path = /tmp/$${TARGET}/bin
|
||||
else: unix:!android: target.path = /opt/$${TARGET}/bin
|
||||
!isEmpty(target.path): INSTALLS += target
|
||||
|
||||
#unix {
|
||||
# target.path = /usr/lib
|
||||
#}
|
||||
#!isEmpty(target.path): INSTALLS += target
|
||||
|
||||
@@ -21,8 +21,7 @@ DeviceSettingsDialog::DeviceSettingsDialog(QWidget *parent) :
|
||||
|
||||
_currentParity = ui->parityBox->currentIndex();
|
||||
|
||||
for(int i = 0; i < 4; i++)
|
||||
{
|
||||
for(int i = 0; i < 4; i++) {
|
||||
_currentAdrs[i] = i+1;
|
||||
}
|
||||
}
|
||||
@@ -55,7 +54,7 @@ void DeviceSettingsDialog::on_buttonApplyChangeParity_clicked()
|
||||
|
||||
void DeviceSettingsDialog::on_buttonApplyChangeAdr_clicked()
|
||||
{
|
||||
BoardIdHasBeenChanged* _boardIdHasBeenChanged = new BoardIdHasBeenChanged(ui->idComboBox->currentIndex(), ui->adrSpinBox->value());
|
||||
BoardIdHasBeenChanged* _boardIdHasBeenChanged = new BoardIdHasBeenChanged(ui->idComboBox->currentText().toUInt(), ui->adrSpinBox->value());
|
||||
QCoreApplication::postEvent(parent(), _boardIdHasBeenChanged);
|
||||
close();
|
||||
}
|
||||
@@ -75,21 +74,20 @@ unsigned short DeviceSettingsDialog::currentParity()
|
||||
return _currentParity;
|
||||
}
|
||||
|
||||
void DeviceSettingsDialog::updateSettingsAfterConnection(unsigned tmp_speed, unsigned tmp_parity, unsigned *tmp_adr, int CurrentConnectedDevice)
|
||||
void DeviceSettingsDialog::updateSettingsAfterConnection(unsigned tmp_speed, unsigned tmp_parity, unsigned *tmp_adr, bool *ActiveDevices)
|
||||
{
|
||||
ui->speedBox->setCurrentText(QString::number(_currentSpeed=tmp_speed, 10));
|
||||
if(tmp_parity>0)
|
||||
tmp_parity--;
|
||||
ui->parityBox->setCurrentIndex(_currentParity = tmp_parity);
|
||||
for(int i = 0; i < CurrentConnectedDevice; i++)
|
||||
{
|
||||
_m_timer[i]->setEnabled(true);
|
||||
ui->idComboBox->addItem(QString::number(i));
|
||||
_currentAdrs[i] = tmp_adr[i];
|
||||
}
|
||||
for(int i = CurrentConnectedDevice; i < 4; i++)
|
||||
{
|
||||
_m_timer[i]->setEnabled(false);
|
||||
for(int i = 0; i < 4; i++) {
|
||||
if(ActiveDevices[i]) {
|
||||
_m_timer[i]->setEnabled(true);
|
||||
ui->idComboBox->addItem(QString::number(i));
|
||||
_currentAdrs[i] = tmp_adr[i];
|
||||
} else {
|
||||
_m_timer[i]->setEnabled(false);
|
||||
}
|
||||
}
|
||||
on_idComboBox_currentIndexChanged(ui->idComboBox->currentIndex());
|
||||
}
|
||||
@@ -118,8 +116,7 @@ void DeviceSettingsDialog::on_buttonBox_clicked(QAbstractButton *button)
|
||||
ui->parityBox->setCurrentIndex(0);
|
||||
_currentParity = ui->parityBox->currentIndex();
|
||||
|
||||
for(int i = 0; i < 4; i++)
|
||||
{
|
||||
for(int i = 0; i < 4; i++) {
|
||||
_currentAdrs[i] = i+1;
|
||||
}
|
||||
ui->adrSpinBox->setValue(_currentAdrs[ui->idComboBox->currentIndex()]);
|
||||
@@ -127,5 +124,36 @@ void DeviceSettingsDialog::on_buttonBox_clicked(QAbstractButton *button)
|
||||
case QDialogButtonBox::AcceptRole:
|
||||
close();
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void DeviceSettingsDialog::initPollForBoard(unsigned boardID, unsigned boardAdr)
|
||||
{
|
||||
ui->idPollComboBox->addItem(QString("Плата №%1 (ID %2)").arg(boardID).arg(boardAdr), QVariant(boardID));
|
||||
}
|
||||
|
||||
void DeviceSettingsDialog::updatePollStatus(unsigned boardID, bool status)
|
||||
{
|
||||
_currentPollStatus[boardID] = status;
|
||||
}
|
||||
|
||||
void DeviceSettingsDialog::on_buttonApplyChangePoll_clicked()
|
||||
{
|
||||
updatePollStatus(ui->idPollComboBox->currentData().toUInt(), (bool)ui->pollStatusBox->currentIndex());
|
||||
pollStatusChange* _pollStatusChanged = new pollStatusChange(ui->idPollComboBox->currentData().toUInt(), _currentPollStatus[ui->idPollComboBox->currentData().toUInt()]);
|
||||
QCoreApplication::postEvent(parent(), _pollStatusChanged);
|
||||
}
|
||||
|
||||
void DeviceSettingsDialog::on_idPollComboBox_currentIndexChanged(int index)
|
||||
{
|
||||
Q_UNUSED(index);
|
||||
ui->pollStatusBox->setCurrentIndex(_currentPollStatus[ui->idPollComboBox->currentData().toUInt()]);
|
||||
}
|
||||
|
||||
void DeviceSettingsDialog::onDisconnect()
|
||||
{
|
||||
ui->idComboBox->clear();
|
||||
ui->idPollComboBox->clear();
|
||||
}
|
||||
|
||||
@@ -21,6 +21,20 @@ private:
|
||||
short _BoardNewID;
|
||||
};
|
||||
|
||||
class pollStatusChange : public QEvent
|
||||
{
|
||||
public:
|
||||
pollStatusChange(unsigned BoardID, bool Stat) : QEvent((QEvent::Type)1001) {_BoardID = BoardID; _Status = Stat;}
|
||||
~pollStatusChange() {}
|
||||
|
||||
unsigned BoardID() const {return _BoardID;}
|
||||
bool Status() const {return _Status;}
|
||||
|
||||
private:
|
||||
unsigned _BoardID;
|
||||
bool _Status;
|
||||
};
|
||||
|
||||
namespace Ui {
|
||||
class DeviceSettingsDialog;
|
||||
}
|
||||
@@ -36,7 +50,10 @@ public:
|
||||
unsigned currentBoardTimer(unsigned short _ID);
|
||||
unsigned currentSpeed();
|
||||
unsigned short currentParity();
|
||||
void updateSettingsAfterConnection(unsigned tmp_speed, unsigned tmp_parity, unsigned *tmp_adr, int CurrentConnectedDevice);
|
||||
void updateSettingsAfterConnection(unsigned tmp_speed, unsigned tmp_parity, unsigned *tmp_adr, bool *ActiveDevices);
|
||||
void updatePollStatus(unsigned boardID, bool status);
|
||||
void initPollForBoard(unsigned boardID, unsigned boardAdr);
|
||||
void onDisconnect();
|
||||
signals:
|
||||
void parityChanged();
|
||||
void speedChanged();
|
||||
@@ -59,12 +76,17 @@ private slots:
|
||||
|
||||
void on_buttonBox_clicked(QAbstractButton *button);
|
||||
|
||||
void on_buttonApplyChangePoll_clicked();
|
||||
|
||||
void on_idPollComboBox_currentIndexChanged(int index);
|
||||
|
||||
private:
|
||||
QSpinBox *_m_timer[4];
|
||||
unsigned _currentBoardTimers[4];
|
||||
unsigned _currentSpeed;
|
||||
unsigned short _currentParity;
|
||||
unsigned _currentAdrs[4];
|
||||
bool _currentPollStatus[4];
|
||||
|
||||
Ui::DeviceSettingsDialog *ui;
|
||||
};
|
||||
|
||||
@@ -6,77 +6,14 @@
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>243</width>
|
||||
<height>431</height>
|
||||
<width>278</width>
|
||||
<height>500</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>Dialog</string>
|
||||
</property>
|
||||
<layout class="QGridLayout" name="gridLayout_4">
|
||||
<item row="1" column="0">
|
||||
<widget class="QGroupBox" name="groupBox_2">
|
||||
<property name="title">
|
||||
<string>Скорость обмена</string>
|
||||
</property>
|
||||
<layout class="QGridLayout" name="gridLayout_2">
|
||||
<item row="0" column="1">
|
||||
<widget class="QPushButton" name="buttonApplyChangeSpeed">
|
||||
<property name="text">
|
||||
<string>Применить</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="0">
|
||||
<widget class="QComboBox" name="speedBox">
|
||||
<property name="currentIndex">
|
||||
<number>3</number>
|
||||
</property>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>9600</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>14400</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>19200</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>31250</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>38400</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>56000</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>57600</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>115200</string>
|
||||
</property>
|
||||
</item>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="0">
|
||||
<widget class="QGroupBox" name="groupBox">
|
||||
<property name="title">
|
||||
@@ -188,6 +125,41 @@
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="0">
|
||||
<widget class="QGroupBox" name="groupBox_4">
|
||||
<property name="title">
|
||||
<string>Контроль четности</string>
|
||||
</property>
|
||||
<layout class="QGridLayout" name="gridLayout_5">
|
||||
<item row="0" column="1">
|
||||
<widget class="QPushButton" name="buttonApplyChangeParity">
|
||||
<property name="text">
|
||||
<string>Применить</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="0">
|
||||
<widget class="QComboBox" name="parityBox">
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>No</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>Even</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>Odd</string>
|
||||
</property>
|
||||
</item>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="0">
|
||||
<widget class="QGroupBox" name="groupBox_3">
|
||||
<property name="title">
|
||||
@@ -221,7 +193,70 @@
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="4" column="0">
|
||||
<item row="1" column="0">
|
||||
<widget class="QGroupBox" name="groupBox_2">
|
||||
<property name="title">
|
||||
<string>Скорость обмена</string>
|
||||
</property>
|
||||
<layout class="QGridLayout" name="gridLayout_2">
|
||||
<item row="0" column="1">
|
||||
<widget class="QPushButton" name="buttonApplyChangeSpeed">
|
||||
<property name="text">
|
||||
<string>Применить</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="0">
|
||||
<widget class="QComboBox" name="speedBox">
|
||||
<property name="currentIndex">
|
||||
<number>3</number>
|
||||
</property>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>9600</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>14400</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>19200</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>31250</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>38400</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>56000</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>57600</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>115200</string>
|
||||
</property>
|
||||
</item>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="5" column="0">
|
||||
<widget class="QDialogButtonBox" name="buttonBox">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
@@ -231,38 +266,36 @@
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="0">
|
||||
<widget class="QGroupBox" name="groupBox_4">
|
||||
<item row="4" column="0">
|
||||
<widget class="QGroupBox" name="groupBox_5">
|
||||
<property name="title">
|
||||
<string>Контроль четности</string>
|
||||
<string>Опрос ТЭ</string>
|
||||
</property>
|
||||
<layout class="QGridLayout" name="gridLayout_5">
|
||||
<layout class="QGridLayout" name="gridLayout_6">
|
||||
<item row="0" column="0">
|
||||
<widget class="QComboBox" name="idPollComboBox"/>
|
||||
</item>
|
||||
<item row="0" column="1">
|
||||
<widget class="QPushButton" name="buttonApplyChangeParity">
|
||||
<widget class="QComboBox" name="pollStatusBox">
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>Выкл</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>Вкл</string>
|
||||
</property>
|
||||
</item>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="2">
|
||||
<widget class="QPushButton" name="buttonApplyChangePoll">
|
||||
<property name="text">
|
||||
<string>Применить</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="0">
|
||||
<widget class="QComboBox" name="parityBox">
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>No</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>Even</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>Odd</string>
|
||||
</property>
|
||||
</item>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
|
||||
281
M3KTE_TERM/lineringer.cpp
Normal file
281
M3KTE_TERM/lineringer.cpp
Normal file
@@ -0,0 +1,281 @@
|
||||
#include "lineringer.h"
|
||||
#include "ui_lineringer.h"
|
||||
|
||||
LineRinger::LineRinger(QWidget *parent) :
|
||||
QWidget(parent),
|
||||
ui(new Ui::LineRinger)
|
||||
{
|
||||
ui->setupUi(this);
|
||||
|
||||
const auto listPorts = QSerialPortInfo::availablePorts();
|
||||
for (const auto& port: listPorts) {
|
||||
ui->comBox->addItem(QString(port.portName() + ": " + port.manufacturer()), QVariant(port.portName()));
|
||||
}
|
||||
|
||||
ui->parityControlBox->addItem("No", QVariant(QSerialPort::NoParity));
|
||||
ui->parityControlBox->addItem("Even", QVariant(QSerialPort::EvenParity));
|
||||
ui->parityControlBox->addItem("Odd", QVariant(QSerialPort::OddParity));
|
||||
ui->parityControlBox->addItem("Space", QVariant(QSerialPort::SpaceParity));
|
||||
ui->parityControlBox->addItem("Mark", QVariant(QSerialPort::MarkParity));
|
||||
|
||||
ui->dataBox->addItem("Data5", QVariant(QSerialPort::Data5));
|
||||
ui->dataBox->addItem("Data6", QVariant(QSerialPort::Data6));
|
||||
ui->dataBox->addItem("Data7", QVariant(QSerialPort::Data7));
|
||||
ui->dataBox->addItem("Data8", QVariant(QSerialPort::Data8));
|
||||
ui->dataBox->setCurrentIndex(3);
|
||||
|
||||
ui->stopBox->addItem("One", QVariant(QSerialPort::OneStop));
|
||||
ui->stopBox->addItem("OneAndHalf", QVariant(QSerialPort::OneAndHalfStop));
|
||||
ui->stopBox->addItem("Two", QVariant(QSerialPort::TwoStop));
|
||||
|
||||
ui->deviceOnlineView->horizontalHeader()->setVisible(true);
|
||||
syncColumnHeaders();
|
||||
ui->deviceOnlineView->setColumnHidden(1, true);
|
||||
|
||||
ui->ringButton->setEnabled(false);
|
||||
|
||||
modbusDevice = new QModbusRtuSerialMaster(this);
|
||||
}
|
||||
|
||||
LineRinger::~LineRinger()
|
||||
{
|
||||
if (modbusDevice->state() == QModbusDevice::ConnectedState)
|
||||
on_connectButton_clicked();
|
||||
delete ui;
|
||||
}
|
||||
|
||||
void LineRinger::syncColumnHeaders()
|
||||
{
|
||||
QStringList headers;
|
||||
headers << "ID" << "BaudRate" << "Vendor Name" << "Product Code" << "Major Minor Revision" << "Vendor Url" << "Product Name" << "Model Name" << "User Application Name" << "Примечание";
|
||||
ui->deviceOnlineView->setHorizontalHeaderLabels(headers);
|
||||
ui->deviceOnlineView->resizeColumnsToContents();
|
||||
}
|
||||
|
||||
void LineRinger::on_connectButton_clicked()
|
||||
{
|
||||
if(!modbusDevice)
|
||||
return;
|
||||
if(modbusDevice->state() != QModbusDevice::ConnectedState) {
|
||||
modbusDevice->setConnectionParameter(QModbusDevice::SerialPortNameParameter,
|
||||
ui->comBox->currentData().toString());
|
||||
#if QT_CONFIG(modbus_serialport)
|
||||
modbusDevice->setConnectionParameter(QModbusDevice::SerialParityParameter,
|
||||
ui->parityControlBox->currentData().toInt());
|
||||
modbusDevice->setConnectionParameter(QModbusDevice::SerialBaudRateParameter,
|
||||
ui->baudRateBox->currentText().toInt(nullptr, 10));
|
||||
modbusDevice->setConnectionParameter(QModbusDevice::SerialDataBitsParameter,
|
||||
ui->dataBox->currentData().toInt());
|
||||
modbusDevice->setConnectionParameter(QModbusDevice::SerialStopBitsParameter,
|
||||
ui->stopBox->currentData().toInt());
|
||||
#endif
|
||||
modbusDevice->setTimeout(50);
|
||||
modbusDevice->setNumberOfRetries(0);
|
||||
if(!modbusDevice->connectDevice()) {
|
||||
QMessageBox::warning(this, "Ошибка", "Произошла ошибка при попытке подключения.");
|
||||
} else {
|
||||
ui->connectButton->setText(tr("Отключить"));
|
||||
ui->ringButton->setEnabled(true);
|
||||
currentBaudRate = ui->baudRateBox->currentText().toUInt(nullptr, 10);
|
||||
}
|
||||
} else {
|
||||
modbusDevice->disconnectDevice();
|
||||
ui->connectButton->setText(tr("Подключить"));
|
||||
ui->ringButton->setEnabled(false);
|
||||
}
|
||||
}
|
||||
|
||||
LineRinger::callStatus LineRinger::lineCall()
|
||||
{
|
||||
QModbusRequest readDeviceBasicIdentification(QModbusRequest::EncapsulatedInterfaceTransport, QByteArray::fromHex("0E0100"));
|
||||
QModbusRequest readDeviceRegularIdentification(QModbusRequest::EncapsulatedInterfaceTransport, QByteArray::fromHex("0E0200"));
|
||||
bool isRun = false;
|
||||
bool *tmp_isRun = &isRun;
|
||||
uint tmp_adr = 1;
|
||||
auto bar = new QProgressDialog(this);
|
||||
connect(bar, &QProgressDialog::canceled, this, [this, tmp_isRun]() {
|
||||
*tmp_isRun = true;
|
||||
});
|
||||
connect(this, &LineRinger::stopLineCall, this, [this, tmp_isRun]() {
|
||||
*tmp_isRun = true;
|
||||
});
|
||||
bar->setLabelText(tr("Поиск устройств... Текущий адрес: %1").arg(tmp_adr));
|
||||
bar->setCancelButton(nullptr);
|
||||
bar->setRange(1, 247);
|
||||
bar->setMinimumDuration(100);
|
||||
for(tmp_adr = 1; tmp_adr<248; tmp_adr++) {
|
||||
bar->setValue(tmp_adr);
|
||||
bar->setLabelText(tr("Поиск устройств... Текущий адрес: %1/247").arg(tmp_adr));
|
||||
auto *reply = modbusDevice->sendRawRequest(readDeviceBasicIdentification, tmp_adr);
|
||||
//auto *reply = modbusDevice->sendReadRequest(*_unit, tmp_adr);
|
||||
//Запрос типа устройства.
|
||||
if(reply == nullptr) {
|
||||
QMessageBox::warning(this, "Ошибка при сканировании.", QString("%1").arg(modbusDevice->errorString()));
|
||||
bar->close();
|
||||
bar->deleteLater();
|
||||
return callStatus::ERROR;
|
||||
}
|
||||
while(!reply->isFinished()) {
|
||||
if(isRun) {
|
||||
bar->close();
|
||||
bar->deleteLater();
|
||||
return callStatus::INTERRUPT;
|
||||
}
|
||||
QCoreApplication::processEvents();
|
||||
}
|
||||
if(isRun) {
|
||||
bar->close();
|
||||
bar->deleteLater();
|
||||
return callStatus::INTERRUPT;
|
||||
} else if(!isRun) {
|
||||
//Нужна проверка типа устройства
|
||||
if(reply->error()!=QModbusDevice::TimeoutError) {
|
||||
deviceOnLine currentDevice;
|
||||
currentDevice.adr = tmp_adr;
|
||||
currentDevice.baudRate = currentBaudRate;
|
||||
bool regularReplyError = false;
|
||||
QString regularReplyErrorString;
|
||||
if(reply->error()==QModbusDevice::NoError) {
|
||||
QModbusResponse resp = reply->rawResult();
|
||||
uint8_t numOfObject = resp.data().at(5);
|
||||
QByteArray result = resp.data().remove(0, 6);
|
||||
for(int tmp_obj = 0; tmp_obj < numOfObject; tmp_obj++) {
|
||||
uint8_t objectID = result.at(0);
|
||||
uint8_t lengthOfObject = result.at(1);
|
||||
if(lengthOfObject>0) {
|
||||
currentDevice.fields[objectID].clear();
|
||||
}
|
||||
for(int i = 0; i < lengthOfObject; i++) {
|
||||
currentDevice.fields[objectID] += QString(result.at(2+i));
|
||||
}
|
||||
result.remove(0, lengthOfObject+2);
|
||||
}
|
||||
auto *regularReply = modbusDevice->sendRawRequest(readDeviceRegularIdentification, tmp_adr);
|
||||
if(regularReply == nullptr) {
|
||||
QMessageBox::warning(this, "Ошибка при сканировании.", QString("%1: %2").arg(modbusDevice->error()).arg(modbusDevice->errorString()));
|
||||
bar->close();
|
||||
bar->deleteLater();
|
||||
return callStatus::ERROR;
|
||||
}
|
||||
while(!regularReply->isFinished()) {
|
||||
if(isRun) {
|
||||
bar->close();
|
||||
bar->deleteLater();
|
||||
return callStatus::INTERRUPT;
|
||||
}
|
||||
QCoreApplication::processEvents();
|
||||
}
|
||||
if(isRun) {
|
||||
bar->close();
|
||||
bar->deleteLater();
|
||||
return callStatus::INTERRUPT;
|
||||
} else if(!isRun) {
|
||||
if(regularReply->error()!=QModbusDevice::NoError) {
|
||||
// QMessageBox::warning(this, "Ошибка при сканировании.", QString("%1: %2").arg(regularReply->error()).arg(regularReply->errorString()));
|
||||
// bar->close();
|
||||
// bar->deleteLater();
|
||||
// return callStatus::ERROR;
|
||||
regularReplyError = true;
|
||||
regularReplyErrorString = QString("%1: %2").arg(regularReply->error()).arg(regularReply->errorString());
|
||||
}
|
||||
QModbusResponse regularResp = regularReply->rawResult();
|
||||
uint8_t numOfRegularObject = regularResp.data().at(5);
|
||||
QByteArray regularResult = regularResp.data().remove(0, 6);
|
||||
for(int tmp_obj = 0; tmp_obj < numOfRegularObject; tmp_obj++) {
|
||||
uint8_t objectID = regularResult.at(0);
|
||||
if(objectID > 0x06)
|
||||
continue;
|
||||
uint8_t lengthOfObject = regularResult.at(1);
|
||||
if(lengthOfObject>0) {
|
||||
currentDevice.fields[objectID].clear();
|
||||
}
|
||||
for (int i = 0; i < lengthOfObject; i++) {
|
||||
currentDevice.fields[objectID] += QString(regularResult.at(2+i));
|
||||
}
|
||||
regularResult.remove(0, lengthOfObject+2);
|
||||
}
|
||||
}
|
||||
}
|
||||
if(!isRun) {
|
||||
devicesList.append(currentDevice);
|
||||
unsigned newRow = ui->deviceOnlineView->rowCount();
|
||||
ui->deviceOnlineView->insertRow(newRow);
|
||||
ui->deviceOnlineView->setItem(newRow, 0, new QTableWidgetItem(QString::number(currentDevice.adr)));
|
||||
ui->deviceOnlineView->setItem(newRow, 1, new QTableWidgetItem(QString::number(currentDevice.baudRate)));
|
||||
for (int i = 0; i < 7; i++) {
|
||||
ui->deviceOnlineView->setItem(newRow, i+2, new QTableWidgetItem(currentDevice.fields[i]));
|
||||
}
|
||||
if(reply->error()!=QModbusDevice::NoError) {
|
||||
ui->deviceOnlineView->setItem(newRow, 9, new QTableWidgetItem(QString("%1: %2").arg(reply->error()).arg(reply->errorString())));
|
||||
} else if(regularReplyError) {
|
||||
ui->deviceOnlineView->setItem(newRow, 9, new QTableWidgetItem(regularReplyErrorString));
|
||||
}
|
||||
ui->deviceOnlineView->resizeColumnsToContents();
|
||||
syncColumnHeaders();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return callStatus::NOERROR;
|
||||
}
|
||||
|
||||
void LineRinger::on_ringButton_clicked()
|
||||
{
|
||||
ui->deviceOnlineView->clear();
|
||||
devicesList.clear();
|
||||
syncColumnHeaders();
|
||||
while(ui->deviceOnlineView->rowCount()!=0)
|
||||
ui->deviceOnlineView->removeRow(ui->deviceOnlineView->rowCount()-1);
|
||||
if(isAutoBaud) {
|
||||
auto bar = new QProgressDialog(this);
|
||||
bar->setLabelText(tr("Поиск устройств... Текущая скорость: %1").arg(currentBaudRate));
|
||||
bar->setRange(0, ui->baudRateBox->count());
|
||||
bar->setAutoClose(true);
|
||||
bar->setMinimumDuration(0);
|
||||
bar->setCancelButton(nullptr);
|
||||
connect(bar, &QProgressDialog::canceled, this, [this]() {
|
||||
emit stopLineCall();
|
||||
});
|
||||
bar->setValue(0);
|
||||
|
||||
ui->deviceOnlineView->setColumnHidden(1, false);
|
||||
modbusDevice->disconnectDevice();
|
||||
for (int i = 0; i < ui->baudRateBox->count(); i++) {
|
||||
bar->setValue(i+1);
|
||||
|
||||
modbusDevice->setConnectionParameter(QModbusDevice::SerialBaudRateParameter,
|
||||
ui->baudRateBox->itemText(i).toInt(nullptr, 10));
|
||||
if (!modbusDevice->connectDevice()) {
|
||||
QMessageBox::warning(this, "Ошибка", "Произошла ошибка при попытке подключения.");
|
||||
on_connectButton_clicked();
|
||||
break;
|
||||
}
|
||||
currentBaudRate = ui->baudRateBox->itemText(i).toUInt(nullptr, 10);
|
||||
bar->setLabelText(tr("Поиск устройств... Текущая скорость: %1").arg(currentBaudRate));
|
||||
if(lineCall() == callStatus::INTERRUPT) {
|
||||
QMessageBox::warning(this, "Уведомление", QString("Досрочное завершение опроса. Найдено %1 устройств.").arg(devicesList.count()));
|
||||
modbusDevice->disconnectDevice();
|
||||
on_connectButton_clicked();
|
||||
bar->close();
|
||||
bar->deleteLater();
|
||||
ui->timer->setTime(QTime::currentTime());
|
||||
ui->timer->setDate(QDate::currentDate());
|
||||
return;
|
||||
}
|
||||
modbusDevice->disconnectDevice();
|
||||
}
|
||||
on_connectButton_clicked();
|
||||
} else {
|
||||
ui->deviceOnlineView->setColumnHidden(1, true);
|
||||
if(lineCall() == callStatus::INTERRUPT) {
|
||||
QMessageBox::warning(this, "Уведомление", QString("Досрочное завершение опроса. Найдено %1 устройств.").arg(devicesList.count()));
|
||||
}
|
||||
}
|
||||
ui->timer->setTime(QTime::currentTime());
|
||||
ui->timer->setDate(QDate::currentDate());
|
||||
}
|
||||
|
||||
void LineRinger::on_checkAutoBaud_stateChanged(int arg1)
|
||||
{
|
||||
isAutoBaud = (bool)arg1;
|
||||
}
|
||||
59
M3KTE_TERM/lineringer.h
Normal file
59
M3KTE_TERM/lineringer.h
Normal file
@@ -0,0 +1,59 @@
|
||||
#ifndef LINERINGER_H
|
||||
#define LINERINGER_H
|
||||
|
||||
#include <QWidget>
|
||||
#include <QModbusTcpClient>
|
||||
#include <QModbusRtuSerialMaster>
|
||||
#include <QSerialPortInfo>
|
||||
#include <QSerialPort>
|
||||
#include <QMessageBox>
|
||||
#include <QProgressDialog>
|
||||
|
||||
namespace Ui {
|
||||
class LineRinger;
|
||||
}
|
||||
|
||||
class LineRinger : public QWidget
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
enum callStatus{
|
||||
NOERROR = 0,
|
||||
ERROR = 1,
|
||||
INTERRUPT = 2
|
||||
};
|
||||
|
||||
explicit LineRinger(QWidget *parent = nullptr);
|
||||
~LineRinger();
|
||||
callStatus lineCall();
|
||||
|
||||
signals:
|
||||
void stopLineCall();
|
||||
|
||||
private slots:
|
||||
void on_connectButton_clicked();
|
||||
|
||||
void on_ringButton_clicked();
|
||||
|
||||
void on_checkAutoBaud_stateChanged(int arg1);
|
||||
|
||||
private:
|
||||
Ui::LineRinger *ui;
|
||||
|
||||
void syncColumnHeaders();
|
||||
|
||||
struct deviceOnLine
|
||||
{
|
||||
uint8_t adr;
|
||||
unsigned baudRate;
|
||||
QString fields[7] = {"Undefined", "Undefined", "Undefined", "Undefined", "Undefined", "Undefined", "Undefined"};
|
||||
};
|
||||
QVector<deviceOnLine>devicesList;
|
||||
bool isAutoBaud = false;
|
||||
unsigned currentBaudRate;
|
||||
|
||||
QModbusClient *modbusDevice = nullptr;
|
||||
};
|
||||
|
||||
#endif // LINERINGER_H
|
||||
303
M3KTE_TERM/lineringer.ui
Normal file
303
M3KTE_TERM/lineringer.ui
Normal file
@@ -0,0 +1,303 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>LineRinger</class>
|
||||
<widget class="QWidget" name="LineRinger">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>939</width>
|
||||
<height>522</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>Form</string>
|
||||
</property>
|
||||
<layout class="QGridLayout" name="gridLayout_3">
|
||||
<item row="0" column="2">
|
||||
<widget class="QGroupBox" name="gridGroupBox_2">
|
||||
<layout class="QGridLayout" name="cmdLayout">
|
||||
<item row="4" column="1">
|
||||
<widget class="QLabel" name="labelTimer">
|
||||
<property name="text">
|
||||
<string>Последний опрос:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="2">
|
||||
<widget class="QPushButton" name="ringButton">
|
||||
<property name="text">
|
||||
<string>Опросить</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="1">
|
||||
<widget class="QCheckBox" name="checkAutoBaud">
|
||||
<property name="layoutDirection">
|
||||
<enum>Qt::LeftToRight</enum>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Любая скорость</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="4" column="2">
|
||||
<widget class="QDateTimeEdit" name="timer">
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignCenter</set>
|
||||
</property>
|
||||
<property name="readOnly">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="buttonSymbols">
|
||||
<enum>QAbstractSpinBox::NoButtons</enum>
|
||||
</property>
|
||||
<property name="keyboardTracking">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="currentSection">
|
||||
<enum>QDateTimeEdit::DaySection</enum>
|
||||
</property>
|
||||
<property name="displayFormat">
|
||||
<string>dd.MM.yyyy HH:mm:ss</string>
|
||||
</property>
|
||||
<property name="calendarPopup">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<property name="currentSectionIndex">
|
||||
<number>0</number>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="0">
|
||||
<widget class="QGroupBox" name="controlGroup">
|
||||
<layout class="QGridLayout" name="controlLaylout">
|
||||
<item row="0" column="5">
|
||||
<widget class="QLabel" name="labelStopBit">
|
||||
<property name="text">
|
||||
<string>Стоп-биты</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="8">
|
||||
<widget class="QPushButton" name="connectButton">
|
||||
<property name="text">
|
||||
<string>Подключить</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="6">
|
||||
<widget class="QLabel" name="labelEvenControl">
|
||||
<property name="text">
|
||||
<string>Чётность</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="5">
|
||||
<widget class="QComboBox" name="stopBox"/>
|
||||
</item>
|
||||
<item row="1" column="0">
|
||||
<widget class="QComboBox" name="comBox">
|
||||
<property name="editable">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="1">
|
||||
<widget class="QPushButton" name="pushButton">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>21</width>
|
||||
<height>21</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Поиск</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="6">
|
||||
<widget class="QComboBox" name="parityControlBox"/>
|
||||
</item>
|
||||
<item row="1" column="3">
|
||||
<widget class="QComboBox" name="baudRateBox">
|
||||
<property name="editable">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>9600</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>14400</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>19200</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>31250</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>38400</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>56000</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>57600</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>115200</string>
|
||||
</property>
|
||||
</item>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="4">
|
||||
<widget class="QComboBox" name="dataBox"/>
|
||||
</item>
|
||||
<item row="0" column="3">
|
||||
<widget class="QLabel" name="labelBaud">
|
||||
<property name="text">
|
||||
<string>Скорость</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="0" colspan="2">
|
||||
<widget class="QLabel" name="labelCom">
|
||||
<property name="text">
|
||||
<string>Порт</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="4">
|
||||
<widget class="QLabel" name="labelDataBit">
|
||||
<property name="text">
|
||||
<string>Биты данных</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="1">
|
||||
<spacer name="horizontalSpacer">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>40</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item row="2" column="0" colspan="3">
|
||||
<widget class="QTableWidget" name="deviceOnlineView">
|
||||
<property name="editTriggers">
|
||||
<set>QAbstractItemView::NoEditTriggers</set>
|
||||
</property>
|
||||
<property name="textElideMode">
|
||||
<enum>Qt::ElideMiddle</enum>
|
||||
</property>
|
||||
<property name="sortingEnabled">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="columnCount">
|
||||
<number>10</number>
|
||||
</property>
|
||||
<attribute name="horizontalHeaderVisible">
|
||||
<bool>false</bool>
|
||||
</attribute>
|
||||
<attribute name="horizontalHeaderCascadingSectionResizes">
|
||||
<bool>false</bool>
|
||||
</attribute>
|
||||
<attribute name="verticalHeaderCascadingSectionResizes">
|
||||
<bool>false</bool>
|
||||
</attribute>
|
||||
<attribute name="verticalHeaderShowSortIndicator" stdset="0">
|
||||
<bool>false</bool>
|
||||
</attribute>
|
||||
<attribute name="verticalHeaderStretchLastSection">
|
||||
<bool>false</bool>
|
||||
</attribute>
|
||||
<column>
|
||||
<property name="text">
|
||||
<string>ID</string>
|
||||
</property>
|
||||
</column>
|
||||
<column>
|
||||
<property name="text">
|
||||
<string>BaudRate</string>
|
||||
</property>
|
||||
</column>
|
||||
<column>
|
||||
<property name="text">
|
||||
<string>Vendor Name</string>
|
||||
</property>
|
||||
</column>
|
||||
<column>
|
||||
<property name="text">
|
||||
<string>Product Code</string>
|
||||
</property>
|
||||
</column>
|
||||
<column>
|
||||
<property name="text">
|
||||
<string>Major Minor Revision</string>
|
||||
</property>
|
||||
</column>
|
||||
<column>
|
||||
<property name="text">
|
||||
<string>Vendor Url</string>
|
||||
</property>
|
||||
</column>
|
||||
<column>
|
||||
<property name="text">
|
||||
<string>Product Name</string>
|
||||
</property>
|
||||
</column>
|
||||
<column>
|
||||
<property name="text">
|
||||
<string>Model Name</string>
|
||||
</property>
|
||||
</column>
|
||||
<column>
|
||||
<property name="text">
|
||||
<string>User Application Name</string>
|
||||
</property>
|
||||
</column>
|
||||
<column>
|
||||
<property name="text">
|
||||
<string>Примечание</string>
|
||||
</property>
|
||||
</column>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<resources/>
|
||||
<connections/>
|
||||
</ui>
|
||||
1911
M3KTE_TERM/m3kte.cpp
1911
M3KTE_TERM/m3kte.cpp
@@ -9,6 +9,14 @@
|
||||
#include <QStandardItemModel>
|
||||
#include <QStatusBar>
|
||||
#include <QUrl>
|
||||
#include <QScrollBar>
|
||||
|
||||
#include <QTableWidget>
|
||||
|
||||
QWidget* init(QWidget *parent)
|
||||
{
|
||||
return new M3KTE(parent);
|
||||
}
|
||||
|
||||
//1024 768
|
||||
//Ширина колбы - уже
|
||||
@@ -17,7 +25,6 @@ M3KTE::M3KTE(QWidget *parent)
|
||||
, ui(new Ui::M3KTE)
|
||||
{
|
||||
ui->setupUi(this);
|
||||
|
||||
//Массив указателей на индикаторы напряжения топливных элементов
|
||||
{
|
||||
int i = 0;
|
||||
@@ -342,16 +349,11 @@ M3KTE::M3KTE(QWidget *parent)
|
||||
m_ProgressBar[i++] = ui->FuelCellVoltageBar_319;
|
||||
m_ProgressBar[i++] = ui->FuelCellVoltageBar_320;
|
||||
}
|
||||
|
||||
|
||||
m_settingsDialog = new SettingsDialog(this);
|
||||
|
||||
ui->writeTable->addItem(tr("Exceptions"), QModbusDataUnit::Coils);
|
||||
ui->writeTable->addItem(tr("Warnings"), QModbusDataUnit::HoldingRegisters);
|
||||
ui->writeTable->addItem(tr("Accidents"), QModbusDataUnit::HoldingRegisters);
|
||||
|
||||
for(int i = 0; i < 4; i++)
|
||||
{
|
||||
for(int i = 0; i < 4; i++) {
|
||||
Boards[i].ModbusModelCoil = new WriteRegisterModel(this, 85 - (i/3*20), false);
|
||||
Boards[i].ModbusModelCoil->setStartAddress(0);
|
||||
Boards[i].ModbusModelCoil->setNumberOfValues(QString::number(85-(i/3*20)));
|
||||
@@ -359,135 +361,114 @@ M3KTE::M3KTE(QWidget *parent)
|
||||
Boards[i].ModbusModelHoldingReg->setStartAddress(0);
|
||||
Boards[i].ModbusModelHoldingReg->setNumberOfValues(QString::number(85-(i/3*20)));
|
||||
}
|
||||
|
||||
m_deviceSettingsDialog = new DeviceSettingsDialog(this);
|
||||
m_regMultipleSettings = new MultipleSettings(this);
|
||||
|
||||
modbusDevice = new QModbusRtuSerialMaster(this);
|
||||
//ui->M3kteRegSettings->setEnabled(false);
|
||||
|
||||
m_lineRinger = new LineRinger();
|
||||
Boards[0].boardScanners = new QTimer();
|
||||
Boards[1].boardScanners = new QTimer();
|
||||
Boards[2].boardScanners = new QTimer();
|
||||
Boards[3].boardScanners = new QTimer();
|
||||
|
||||
Boards[0].boardScanners->setSingleShot(true);
|
||||
Boards[1].boardScanners->setSingleShot(true);
|
||||
Boards[2].boardScanners->setSingleShot(true);
|
||||
Boards[3].boardScanners->setSingleShot(true);
|
||||
|
||||
connect(Boards[0].boardScanners, &QTimer::timeout, this, &M3KTE::firstBoardScan);
|
||||
connect(Boards[1].boardScanners, &QTimer::timeout, this, &M3KTE::secondBoardScan);
|
||||
connect(Boards[2].boardScanners, &QTimer::timeout, this, &M3KTE::thirdBoardScan);
|
||||
connect(Boards[3].boardScanners, &QTimer::timeout, this, &M3KTE::fourthBoardScan);
|
||||
|
||||
connect(Boards[0].boardScanners, &QTimer::timeout, this, [this]() {
|
||||
boardScan(0);
|
||||
});
|
||||
connect(Boards[1].boardScanners, &QTimer::timeout, this, [this]() {
|
||||
boardScan(1);
|
||||
});
|
||||
connect(Boards[2].boardScanners, &QTimer::timeout, this, [this]() {
|
||||
boardScan(2);
|
||||
});
|
||||
connect(Boards[3].boardScanners, &QTimer::timeout, this, [this]() {
|
||||
boardScan(3);
|
||||
});
|
||||
Boards[0].adr = 1;
|
||||
Boards[1].adr = 2;
|
||||
Boards[2].adr = 3;
|
||||
Boards[3].adr = 4;
|
||||
|
||||
//ui->M3kteMenuSettings->setEnabled(false);
|
||||
ui->M3kteRegSettings->setEnabled(false);
|
||||
ui->BSM_Warning->setEnabled(false);
|
||||
ui->BSM_Accident->setEnabled(false);
|
||||
ui->BSM_WorkInProgress->setEnabled(false);
|
||||
|
||||
initActions();
|
||||
|
||||
ui->BST_On->setCheckable(false);
|
||||
ui->BST_Off->setChecked(true);
|
||||
|
||||
ui->boardSelectBox->setCurrentIndex(0);
|
||||
ui->writeTable->setCurrentIndex(0);
|
||||
changeTable(0, 0);
|
||||
Boards_Fields[0] = ui->FCBoardBox;
|
||||
Boards_Fields[1] = ui->FCBoardBox_2;
|
||||
Boards_Fields[2] = ui->FCBoardBox_3;
|
||||
Boards_Fields[3] = ui->FCBoardBox_4;
|
||||
|
||||
for (int i = 0; i < 4; i++) {
|
||||
Boards[0].timerStatus = ui->timeStatus_1;
|
||||
Boards[1].timerStatus = ui->timeStatus_2;
|
||||
Boards[2].timerStatus = ui->timeStatus_3;
|
||||
Boards[3].timerStatus = ui->timeStatus_4;
|
||||
|
||||
Boards[0].timerData = ui->timeData_1;
|
||||
Boards[1].timerData = ui->timeData_2;
|
||||
Boards[2].timerData = ui->timeData_3;
|
||||
Boards[3].timerData = ui->timeData_4;
|
||||
|
||||
for(int i = 0; i < 4; i++) {
|
||||
statusM3KTE.Warnings[i] = false;
|
||||
statusM3KTE.Accidents[i] = false;
|
||||
Boards_Fields[i]->setEnabled(false);
|
||||
Boards[i].timerData->setText(" ");
|
||||
Boards[i].timerStatus->setText(" ");;
|
||||
}
|
||||
for(int i = 0; i < 5; i++) {
|
||||
ui->writeValueTable->resizeColumnToContents(i);
|
||||
}
|
||||
|
||||
QBrush tb(Qt::transparent); // Transparent brush, solid pattern
|
||||
for(int i = 0; i<320; i++)
|
||||
{
|
||||
m_ProgressBar[i]->setValue(3);
|
||||
QString style_fc_off = "QProgressBar {border: 2px solid black; font: bold 10px} QProgressBar::chunk {background: hsva(" + QString::number(30) + ", 30, 30, 30%);} ";
|
||||
m_ProgressBar[i]->setStyleSheet(style_fc_off);
|
||||
|
||||
ThePhantomMenace[i] = new QPushButton(m_ProgressBar[i]);
|
||||
ThePhantomMenace[i]->setFlat(true);
|
||||
ThePhantomMenace[i]->setPalette(QPalette(tb, tb, tb, tb, tb, tb, tb, tb, tb));
|
||||
connect(ThePhantomMenace[i], &QPushButton::clicked, this, [this, i]() {
|
||||
selectPositionOnTree(i);
|
||||
});
|
||||
}
|
||||
debug();
|
||||
|
||||
connect(m_deviceSettingsDialog, &DeviceSettingsDialog::parityChanged, this, &M3KTE::onParityUpdate);
|
||||
connect(m_deviceSettingsDialog, &DeviceSettingsDialog::speedChanged, this, &M3KTE::onSpeedUpdate);
|
||||
|
||||
|
||||
//Вызов окна настройки подключения
|
||||
|
||||
//Вызов окна настройки устройства
|
||||
|
||||
}
|
||||
|
||||
M3KTE::~M3KTE()
|
||||
{
|
||||
if(modbusDevice->state() == QModbusDevice::ConnectedState)
|
||||
{
|
||||
onConnectClicked();
|
||||
}
|
||||
delete ui;
|
||||
}
|
||||
|
||||
void M3KTE::debug()
|
||||
{
|
||||
srand(time(0));
|
||||
for(int i = 0; i < 320; i++)
|
||||
{
|
||||
for(int i = 0; i<320; i++) {
|
||||
m_ProgressBar[i]->setTextVisible(true);
|
||||
m_ProgressBar[i]->setMinimumSize(25, 25);
|
||||
m_ProgressBar[i]->setMaximumSize(25, 25);
|
||||
m_ProgressBar[i]->resize(25, 25);
|
||||
m_ProgressBar[i]->setAlignment(Qt::AlignCenter);
|
||||
m_ProgressBar[i]->setFormat(QString("%1").arg((i%85+1)));
|
||||
// int j = rand()%4;
|
||||
// if(j!=3) j=rand()%4;
|
||||
// m_ProgressBar[i]->setValue(j);
|
||||
// QString style_fc = "QProgressBar {border: 2px solid black; font: bold 10px} QProgressBar::chunk {background: hsva(" + QString::number(j*50-50) + ", 255, 255, 100%);} ";
|
||||
// QString style_fc_off = "QProgressBar {border: 2px solid black; font: bold 10px} QProgressBar::chunk {background: hsva(" + QString::number(30) + ", 30, 30, 30%);} ";
|
||||
// m_ProgressBar[i]->setStyleSheet(style_fc);
|
||||
|
||||
// switch (j) {
|
||||
// case 1:
|
||||
// {
|
||||
// m_ProgressBar[i]->setStatusTip(QString("П%1 ТЭ%2: Аварийный уровень напряжения.").arg(QString::number(i/85+1), QString::number(i%85)));
|
||||
// break;
|
||||
// }
|
||||
// case 2:
|
||||
// {
|
||||
// m_ProgressBar[i]->setStatusTip(QString("П%1 ТЭ%2: Предупредительный уровень напряжения.").arg(QString::number(i/85+1), QString::number(i%85)));
|
||||
// break;
|
||||
// }
|
||||
// case 3:
|
||||
// {
|
||||
// m_ProgressBar[i]->setStatusTip(QString("П%1 ТЭ%2: Уровень напряжения в норме.").arg(QString::number(i/85+1), QString::number(i%85)));
|
||||
// break;
|
||||
// }
|
||||
// case 0:
|
||||
// m_ProgressBar[i]->setStatusTip(QString("П%1 ТЭ%2: Топливный Элемент не учитывается.").arg(QString::number(i/85+1), QString::number(i%85)));
|
||||
// m_ProgressBar[i]->setStyleSheet(style_fc_off);
|
||||
// m_ProgressBar[i]->setValue(3);
|
||||
// break;
|
||||
// }
|
||||
m_ProgressBar[i]->setValue(3);
|
||||
QString style_fc_off = "QProgressBar {border: 2px solid black; font: bold 10px} QProgressBar::chunk {background: hsva(" + QString::number(30) + ", 30, 30, 30%);} ";
|
||||
m_ProgressBar[i]->setStyleSheet(style_fc_off);
|
||||
ThePhantomMenace[i] = new QPushButton(m_ProgressBar[i]);
|
||||
ThePhantomMenace[i]->setFlat(true);
|
||||
ThePhantomMenace[i]->setPalette(QPalette(tb, tb, tb, tb, tb, tb, tb, tb, tb));
|
||||
connect(ThePhantomMenace[i], &QPushButton::clicked, this, [this, i]() {
|
||||
selectPositionOnTree(i);
|
||||
});
|
||||
}
|
||||
connect(m_deviceSettingsDialog, &DeviceSettingsDialog::parityChanged, this, &M3KTE::onParityUpdate);
|
||||
connect(m_deviceSettingsDialog, &DeviceSettingsDialog::speedChanged, this, &M3KTE::onSpeedUpdate);
|
||||
|
||||
loggerTable = new QTableWidget(ui->loggerWidget);
|
||||
ui->loggerWidget->layout()->addWidget(loggerTable);
|
||||
loggerTable->setColumnCount(5);
|
||||
QStringList headers;
|
||||
headers << "Время" << "Плата" << "Тип ошибки" << "Счётчик" << "Примечание";
|
||||
loggerTable->setHorizontalHeaderLabels(headers);
|
||||
loggerTable->setSortingEnabled(true);
|
||||
loggerTable->setAutoScroll(true);
|
||||
}
|
||||
|
||||
M3KTE::~M3KTE()
|
||||
{
|
||||
if(modbusDevice->state() == QModbusDevice::ConnectedState) {
|
||||
onConnectClicked();
|
||||
}
|
||||
delete ui;
|
||||
}
|
||||
|
||||
void M3KTE::initActions()
|
||||
{
|
||||
ui->ConnectionMenuConnect->setEnabled(true);
|
||||
ui->ConnectionMenuDisconnect->setEnabled(false);
|
||||
ui->ConnectionMenuSettings->setEnabled(true);
|
||||
|
||||
connect(ui->ConnectionMenuConnect, &QAction::triggered,
|
||||
this, &M3KTE::onConnectClicked);
|
||||
connect(ui->ConnectionMenuDisconnect, &QAction::triggered,
|
||||
@@ -500,212 +481,226 @@ void M3KTE::initActions()
|
||||
this, &M3KTE::onSelectedBoardChanged);
|
||||
connect(ui->writeTable, QOverload<int>::of(&QComboBox::currentIndexChanged),
|
||||
this, &M3KTE::onWriteTableChanged);
|
||||
|
||||
connect(ui->LineCall, &QAction::triggered, m_lineRinger, &QWidget::show);
|
||||
connect(ui->M3kteRegSettings, &QAction::triggered, m_regMultipleSettings, &QDialog::show);
|
||||
connect(m_regMultipleSettings, &MultipleSettings::write, this, &M3KTE::slotmultipleRegWrite);
|
||||
connect(m_regMultipleSettings, &MultipleSettings::writeAndSend, this, &M3KTE::slotmultipleRegWriteAndSend);
|
||||
|
||||
connect(ui->ConnectionMenuSettings, &QAction::triggered, m_settingsDialog, &QDialog::show);
|
||||
connect(ui->M3kteMenuSettings, &QAction::triggered, m_deviceSettingsDialog, &QDialog::show);
|
||||
}
|
||||
|
||||
void M3KTE::logError(const QString &errorPlace, const QString &errorString, unsigned errorCount, const QString &description)
|
||||
{
|
||||
unsigned newRow = loggerTable->rowCount();
|
||||
loggerTable->insertRow(newRow);
|
||||
loggerTable->setItem(newRow, 0, new QTableWidgetItem(QTime::currentTime().toString("HH:mm:ss")));
|
||||
loggerTable->setItem(newRow, 1, new QTableWidgetItem(errorPlace));
|
||||
loggerTable->setItem(newRow, 2, new QTableWidgetItem(errorString));
|
||||
loggerTable->setItem(newRow, 3, new QTableWidgetItem(QString::number(errorCount)));
|
||||
loggerTable->setItem(newRow, 4, new QTableWidgetItem(description));
|
||||
loggerTable->resizeColumnsToContents();
|
||||
if(!loggerTable->verticalScrollBar()->isSliderDown())
|
||||
loggerTable->verticalScrollBar()->setSliderPosition(loggerTable->verticalScrollBar()->maximum());
|
||||
}
|
||||
|
||||
void M3KTE::onConnectClicked()
|
||||
{
|
||||
if (!modbusDevice)
|
||||
if(!modbusDevice)
|
||||
return;
|
||||
|
||||
statusBar()->clearMessage();
|
||||
if (modbusDevice->state() != QModbusDevice::ConnectedState) {
|
||||
modbusDevice->setConnectionParameter(QModbusDevice::SerialPortNameParameter,
|
||||
m_settingsDialog->settings().portName);
|
||||
if(modbusDevice->state() != QModbusDevice::ConnectedState) {
|
||||
modbusDevice->setConnectionParameter(QModbusDevice::SerialPortNameParameter,
|
||||
m_settingsDialog->settings().portName);
|
||||
#if QT_CONFIG(modbus_serialport)
|
||||
modbusDevice->setConnectionParameter(QModbusDevice::SerialParityParameter,
|
||||
m_settingsDialog->settings().parity);
|
||||
modbusDevice->setConnectionParameter(QModbusDevice::SerialBaudRateParameter,
|
||||
m_settingsDialog->settings().baud);
|
||||
modbusDevice->setConnectionParameter(QModbusDevice::SerialDataBitsParameter,
|
||||
m_settingsDialog->settings().dataBits);
|
||||
modbusDevice->setConnectionParameter(QModbusDevice::SerialStopBitsParameter,
|
||||
m_settingsDialog->settings().stopBits);
|
||||
modbusDevice->setConnectionParameter(QModbusDevice::SerialParityParameter,
|
||||
m_settingsDialog->settings().parity);
|
||||
modbusDevice->setConnectionParameter(QModbusDevice::SerialBaudRateParameter,
|
||||
m_settingsDialog->settings().baud);
|
||||
modbusDevice->setConnectionParameter(QModbusDevice::SerialDataBitsParameter,
|
||||
m_settingsDialog->settings().dataBits);
|
||||
modbusDevice->setConnectionParameter(QModbusDevice::SerialStopBitsParameter,
|
||||
m_settingsDialog->settings().stopBits);
|
||||
#endif
|
||||
modbusDevice->setTimeout(m_settingsDialog->settings().responseTime);
|
||||
modbusDevice->setNumberOfRetries(m_settingsDialog->settings().numberOfRetries);
|
||||
if (!modbusDevice->connectDevice()) {
|
||||
if(!modbusDevice->connectDevice()) {
|
||||
statusBar()->showMessage(tr("Connect failed: ") + modbusDevice->errorString(), 5000);
|
||||
} else {
|
||||
ui->ConnectionMenuConnect->setEnabled(false);
|
||||
ui->ConnectionMenuDisconnect->setEnabled(true);
|
||||
|
||||
if(pingNetworkDevices())
|
||||
{
|
||||
if(pingNetworkDevices()) { //Опрос устройств
|
||||
unsigned tmp_adr[4];
|
||||
for (int i = 0; i < 4; i++) {
|
||||
bool ActiveDevices[4];
|
||||
for(int i = 0; i < 4; i++) {
|
||||
tmp_adr[i] = Boards[i].adr;
|
||||
ActiveDevices[i] = Boards[i].isActive;
|
||||
}
|
||||
|
||||
ui->M3kteRegSettings->setEnabled(true);
|
||||
|
||||
m_deviceSettingsDialog->updateSettingsAfterConnection(m_settingsDialog->settings().baud, m_settingsDialog->settings().parity, tmp_adr, CurrentConnectedDevice);
|
||||
|
||||
m_deviceSettingsDialog->updateSettingsAfterConnection(m_settingsDialog->settings().baud, m_settingsDialog->settings().parity, tmp_adr, ActiveDevices);
|
||||
ui->boardSelectBox->setCurrentIndex(0);
|
||||
ui->writeTable->setCurrentIndex(0);
|
||||
changeTable(0, 0);
|
||||
|
||||
ui->M3kteMenuSettings->setEnabled(true);
|
||||
ui->M3kteRegSettings->setEnabled(true);
|
||||
ui->BST_Off->setCheckable(false);
|
||||
ui->BST_Off->setChecked(false);
|
||||
ui->BST_On->setCheckable(true);
|
||||
ui->BST_On->setChecked(true);
|
||||
|
||||
ui->BSM_Warning->setEnabled(true);
|
||||
ui->BSM_Accident->setEnabled(true);
|
||||
ui->BSM_WorkInProgress->setEnabled(true);
|
||||
ui->BSM_WorkInProgress->setChecked(true);
|
||||
}
|
||||
//Опрос устройств
|
||||
}
|
||||
} else {
|
||||
QString style_fc_off = "QProgressBar {border: 2px solid black; font: bold 10px} QProgressBar::chunk {background: hsva(" + QString::number(30) + ", 30, 30, 30%);} ";
|
||||
for(int i = 0; i < 4; i++)
|
||||
{
|
||||
for(int i = 0; i < 4; i++) {
|
||||
Boards[i].boardScanners->stop();
|
||||
Boards_Fields[i]->setEnabled(false);
|
||||
Boards[i].isActive=false;
|
||||
for(int j = 0; j < (85 - (i/3*20)); j++) {
|
||||
Boards[i].coil[j] = false;
|
||||
Boards[i].ModbusModelCoil->m_coils[j]=0;
|
||||
Boards[i].ModbusModelHoldingReg->m_currentU[j]=0;
|
||||
Boards[i].ModbusModelHoldingReg->m_holdingRegisters[j] = 0;
|
||||
Boards[i].ModbusModelHoldingReg->m_holdingRegisters[j + (85 - (i/3*20))] = 0;
|
||||
}
|
||||
Boards_Fields[i]->setTitle(QString("Плата №%1").arg(i+1));
|
||||
Boards[i].timerData->setText(" ");;
|
||||
Boards[i].timerStatus->setText(" ");;
|
||||
}
|
||||
for(int i = 0; i < 320; i++)
|
||||
{
|
||||
for(int i = 0; i < 320; i++) {
|
||||
m_ProgressBar[i]->setStatusTip(QString("П%1 ТЭ%2: Топливный Элемент не учитывается.").arg(QString::number(i/85+1), QString::number(i%85)));
|
||||
m_ProgressBar[i]->setWhatsThis(QString("П%1 ТЭ%2: Топливный Элемент не учитывается.").arg(QString::number(i/85+1), QString::number(i%85)));
|
||||
m_ProgressBar[i]->setValue(3);
|
||||
m_ProgressBar[i]->setStyleSheet(style_fc_off);
|
||||
}
|
||||
|
||||
modbusDevice->disconnectDevice();
|
||||
ui->M3kteMenuSettings->setEnabled(false);
|
||||
ui->M3kteRegSettings->setEnabled(false);
|
||||
ui->ConnectionMenuConnect->setEnabled(true);
|
||||
ui->ConnectionMenuDisconnect->setEnabled(false);
|
||||
ui->BST_Off->setCheckable(true);
|
||||
ui->BST_Off->setChecked(true);
|
||||
ui->BST_On->setCheckable(false);
|
||||
ui->BST_On->setChecked(false);
|
||||
|
||||
ui->BSM_Warning->setChecked(false);
|
||||
ui->BSM_Accident->setChecked(false);
|
||||
ui->BSM_WorkInProgress->setChecked(false);
|
||||
|
||||
ui->BSM_Warning->setEnabled(false);
|
||||
ui->BSM_Accident->setEnabled(false);
|
||||
ui->BSM_WorkInProgress->setEnabled(false);
|
||||
|
||||
ui->M3kteRegSettings->setEnabled(false);
|
||||
m_deviceSettingsDialog->onDisconnect();
|
||||
}
|
||||
}
|
||||
|
||||
void M3KTE::onReadButtonClicked()
|
||||
{
|
||||
if (!modbusDevice)
|
||||
if(!modbusDevice)
|
||||
return;
|
||||
//ui->readValue->clear();
|
||||
statusBar()->clearMessage();
|
||||
|
||||
|
||||
if (auto *reply = modbusDevice->sendReadRequest(readRequest(), Boards[ui->boardSelectBox->currentIndex()].adr)) {
|
||||
if (!reply->isFinished())
|
||||
if(auto *reply = modbusDevice->sendReadRequest(readRequest(), Boards[ui->boardSelectBox->currentIndex()].adr)) {
|
||||
if(!reply->isFinished())
|
||||
connect(reply, &QModbusReply::finished, this, &M3KTE::onReadReady);
|
||||
else
|
||||
delete reply; // broadcast replies return immediately
|
||||
} else {
|
||||
statusBar()->showMessage(tr("Read error: ") + modbusDevice->errorString(), 5000);
|
||||
}
|
||||
// if (auto *reply = modbusDevice->sendReadRequest(readRequest(), ui->serverEdit->value())) {
|
||||
// if (!reply->isFinished())
|
||||
// connect(reply, &QModbusReply::finished, this, &M3KTE::onReadReady);
|
||||
// else
|
||||
// delete reply; // broadcast replies return immediately
|
||||
// } else {
|
||||
// statusBar()->showMessage(tr("Read error: ") + modbusDevice->errorString(), 5000);
|
||||
// }
|
||||
// if (auto *reply = modbusDevice->sendReadRequest(readRequest(), ui->serverEdit->value())) {
|
||||
// if (!reply->isFinished())
|
||||
// connect(reply, &QModbusReply::finished, this, &M3KTE::onReadReady);
|
||||
// else
|
||||
// delete reply; // broadcast replies return immediately
|
||||
// } else {
|
||||
// statusBar()->showMessage(tr("Read error: ") + modbusDevice->errorString(), 5000);
|
||||
// }
|
||||
}
|
||||
|
||||
void M3KTE::onReadReady()
|
||||
{
|
||||
auto reply = qobject_cast<QModbusReply *>(sender());
|
||||
if (!reply)
|
||||
if(!reply)
|
||||
return;
|
||||
|
||||
if (reply->error() == QModbusDevice::NoError) {
|
||||
const QModbusDataUnit unit = reply->result();
|
||||
int Adr = 255;
|
||||
for(int i = 0; i < CurrentConnectedDevice; i++)
|
||||
{
|
||||
if(Boards[i].adr==reply->serverAddress())
|
||||
{
|
||||
Adr = i;
|
||||
break;
|
||||
}
|
||||
int Adr = 255;
|
||||
for(int i = 0; i < 4; i++) {
|
||||
if(Boards[i].isActive && Boards[i].adr==reply->serverAddress()) {
|
||||
Adr = i;
|
||||
break;
|
||||
}
|
||||
for (int i = 0, total = int(unit.valueCount()); i < total; ++i) {
|
||||
//ui->readValue->addItem(entry);
|
||||
if(unit.registerType() == QModbusDataUnit::Coils)
|
||||
{
|
||||
//QStandardItem *item = ui->writeValueTable->model()->item
|
||||
}
|
||||
if(reply->error() == QModbusDevice::NoError) {
|
||||
const QModbusDataUnit unit = reply->result();
|
||||
for(int i = 0, total = int(unit.valueCount()); i < total; ++i) {
|
||||
if(unit.registerType() == QModbusDataUnit::Coils) {
|
||||
Boards[Adr].coil[i + unit.startAddress()] = unit.value(i);
|
||||
if(unit.value(i)==1)
|
||||
Boards[Adr].ModbusModelCoil->setData(ui->writeValueTable->model()->index(i + unit.startAddress(), 2), Qt::Checked, Qt::CheckStateRole);
|
||||
else
|
||||
Boards[Adr].ModbusModelCoil->setData(ui->writeValueTable->model()->index(i + unit.startAddress(), 2), Qt::Unchecked, Qt::CheckStateRole);
|
||||
}
|
||||
else if(unit.registerType() == QModbusDataUnit::HoldingRegisters)
|
||||
{
|
||||
Boards[Adr].ModbusModelCoil->setData(ui->writeValueTable->model()->index(i + unit.startAddress(), 2), Qt::Unchecked, Qt::CheckStateRole);
|
||||
} else if(unit.registerType() == QModbusDataUnit::HoldingRegisters) {
|
||||
Boards[Adr].HR[i + unit.startAddress()] = unit.value(i);
|
||||
Boards[Adr].ModbusModelHoldingReg->setData(ui->writeValueTable->model()->index(i + unit.startAddress(), 3), QString::number(unit.value(i), 16), Qt::EditRole);
|
||||
}
|
||||
}
|
||||
} else if (reply->error() == QModbusDevice::ProtocolError) {
|
||||
switch(unit.registerType()) {
|
||||
case QModbusDataUnit::Coils:
|
||||
Boards[Adr].ModbusModelCoil->dataChanged(ui->writeValueTable->model()->index(unit.startAddress(), 2),
|
||||
ui->writeValueTable->model()->index(unit.startAddress() + unit.valueCount() -1, 2));
|
||||
break;
|
||||
case QModbusDataUnit::HoldingRegisters:
|
||||
Boards[Adr].ModbusModelHoldingReg->dataChanged(ui->writeValueTable->model()->index(unit.startAddress(), 3),
|
||||
ui->writeValueTable->model()->index(unit.startAddress() + unit.valueCount() -1, 3));
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
} else if(reply->error() == QModbusDevice::ProtocolError) {
|
||||
statusBar()->showMessage(tr("Read response error: %1 (Mobus exception: 0x%2)").
|
||||
arg(reply->errorString()).
|
||||
arg(reply->rawResult().exceptionCode(), -1, 16), 5000);
|
||||
arg(reply->errorString()).
|
||||
arg(reply->rawResult().exceptionCode(), -1, 16), 5000);
|
||||
logError(tr("Плата %1 (ID %2)").arg(Adr+1).arg(Boards[Adr].adr),
|
||||
reply->errorString(), ++Boards[Adr].error_RX,
|
||||
QString::number(reply->rawResult().exceptionCode()));
|
||||
} else {
|
||||
statusBar()->showMessage(tr("Read response error: %1 (code: 0x%2)").
|
||||
arg(reply->errorString()).
|
||||
arg(reply->error(), -1, 16), 5000);
|
||||
arg(reply->errorString()).
|
||||
arg(reply->error(), -1, 16), 5000);
|
||||
logError(tr("Плата %1 (ID %2)").arg(Adr+1).arg(Boards[Adr].adr),
|
||||
reply->errorString(), ++Boards[Adr].error_RX,
|
||||
QString::number(reply->error(), 16));
|
||||
}
|
||||
|
||||
reply->deleteLater();
|
||||
}
|
||||
|
||||
void M3KTE::onWriteButtonClicked()
|
||||
{
|
||||
if (!modbusDevice)
|
||||
if(!modbusDevice)
|
||||
return;
|
||||
statusBar()->clearMessage();
|
||||
|
||||
QModbusDataUnit writeUnit = writeRequest();
|
||||
QModbusDataUnit::RegisterType table = writeUnit.registerType();
|
||||
for (int i = 0, total = int(writeUnit.valueCount()); i < total; ++i) {
|
||||
if (table == QModbusDataUnit::Coils)
|
||||
for(int i = 0, total = int(writeUnit.valueCount()); i < total; ++i) {
|
||||
if(table == QModbusDataUnit::Coils)
|
||||
{
|
||||
Boards[ui->boardSelectBox->currentIndex()].coil[i+writeUnit.startAddress()] = Boards[ui->boardSelectBox->currentIndex()].ModbusModelCoil->m_coils[i + writeUnit.startAddress()];
|
||||
writeUnit.setValue(i, Boards[ui->boardSelectBox->currentIndex()].ModbusModelCoil->m_coils[i + writeUnit.startAddress()]);
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
Boards[ui->boardSelectBox->currentIndex()].HR[i+writeUnit.startAddress()] = Boards[ui->boardSelectBox->currentIndex()].ModbusModelHoldingReg->m_holdingRegisters[i+writeUnit.startAddress()];
|
||||
writeUnit.setValue(i, Boards[ui->boardSelectBox->currentIndex()].ModbusModelHoldingReg->m_holdingRegisters[i + writeUnit.startAddress()]);
|
||||
}
|
||||
}
|
||||
|
||||
if (auto *reply = modbusDevice->sendWriteRequest(writeUnit, Boards[ui->boardSelectBox->currentIndex()].adr)) {
|
||||
if (!reply->isFinished()) {
|
||||
connect(reply, &QModbusReply::finished, this, [this, reply]() {
|
||||
if (reply->error() == QModbusDevice::ProtocolError) {
|
||||
if(auto *reply = modbusDevice->sendWriteRequest(writeUnit, Boards[ui->boardSelectBox->currentIndex()].adr)) {
|
||||
if(!reply->isFinished()) {
|
||||
unsigned tmp_id = ui->boardSelectBox->currentIndex();
|
||||
connect(reply, &QModbusReply::finished, this, [this, reply, tmp_id]() {
|
||||
if(reply->error() == QModbusDevice::ProtocolError) {
|
||||
statusBar()->showMessage(tr("Write response error: %1 (Mobus exception: 0x%2)")
|
||||
.arg(reply->errorString()).arg(reply->rawResult().exceptionCode(), -1, 16),
|
||||
5000);
|
||||
} else if (reply->error() != QModbusDevice::NoError) {
|
||||
.arg(reply->errorString()).arg(reply->rawResult().exceptionCode(), -1, 16),
|
||||
5000);
|
||||
logError(tr("Плата %1 (ID %2)").arg(tmp_id+1).arg(Boards[tmp_id].adr),
|
||||
reply->errorString(), ++Boards[tmp_id].error_TX,
|
||||
QString::number(reply->rawResult().exceptionCode(), 16));
|
||||
} else if(reply->error() != QModbusDevice::NoError) {
|
||||
statusBar()->showMessage(tr("Write response error: %1 (code: 0x%2)").
|
||||
arg(reply->errorString()).arg(reply->error(), -1, 16), 5000);
|
||||
}
|
||||
arg(reply->errorString()).arg(reply->error(), -1, 16), 5000);
|
||||
logError(tr("Плата %1 (ID %2)").arg(tmp_id+1).arg(Boards[tmp_id].adr),
|
||||
reply->errorString(), ++Boards[tmp_id].error_TX,
|
||||
QString::number(reply->error()));
|
||||
}
|
||||
reply->deleteLater();
|
||||
});
|
||||
} else {
|
||||
@@ -714,6 +709,7 @@ void M3KTE::onWriteButtonClicked()
|
||||
}
|
||||
} else {
|
||||
statusBar()->showMessage(tr("Write error: ") + modbusDevice->errorString(), 5000);
|
||||
logError(tr("Терминал"), modbusDevice->errorString(), 0, "");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -729,59 +725,49 @@ void M3KTE::onWriteTableChanged(int index)
|
||||
|
||||
void M3KTE::changeTable(int board, int tabletype)
|
||||
{
|
||||
|
||||
if(tabletype==0)
|
||||
{
|
||||
if(tabletype==0) {
|
||||
ui->writeValueTable->setModel(Boards[board].ModbusModelCoil);
|
||||
int i = 0;
|
||||
for(;i<Boards[board].ModbusModelHoldingReg->rowCount();i++)
|
||||
{
|
||||
for(;i<Boards[board].ModbusModelHoldingReg->rowCount();i++) {
|
||||
ui->writeValueTable->setRowHidden(i, ui->writeValueTable->model()->index(i, 0).parent(), false);
|
||||
}
|
||||
ui->writeValueTable->hideColumn(3);
|
||||
ui->writeValueTable->showColumn(2);
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
ui->writeValueTable->setModel(Boards[board].ModbusModelHoldingReg);
|
||||
if(tabletype==1)
|
||||
{
|
||||
if(tabletype==1) {
|
||||
Boards[board].ModbusModelHoldingReg->setStartAddress(0);
|
||||
int i = 0;
|
||||
for (;i<Boards[board].ModbusModelHoldingReg->rowCount()/2;i++) {
|
||||
for(;i<Boards[board].ModbusModelHoldingReg->rowCount()/2;i++) {
|
||||
ui->writeValueTable->setRowHidden(i, ui->writeValueTable->model()->index(i, 0).parent(), false);
|
||||
}
|
||||
for(;i<Boards[board].ModbusModelHoldingReg->rowCount();i++)
|
||||
{
|
||||
for(;i<Boards[board].ModbusModelHoldingReg->rowCount();i++) {
|
||||
ui->writeValueTable->setRowHidden(i, ui->writeValueTable->model()->index(i, 0).parent(), true);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
Boards[board].ModbusModelHoldingReg->setStartAddress(Boards[board].ModbusModelHoldingReg->rowCount()/2);
|
||||
int i = 0;
|
||||
for (;i<Boards[board].ModbusModelHoldingReg->rowCount()/2;i++) {
|
||||
for(;i<Boards[board].ModbusModelHoldingReg->rowCount()/2;i++) {
|
||||
ui->writeValueTable->setRowHidden(i, ui->writeValueTable->model()->index(i, 0).parent(), true);
|
||||
}
|
||||
for(;i<Boards[board].ModbusModelHoldingReg->rowCount();i++)
|
||||
{
|
||||
for(;i<Boards[board].ModbusModelHoldingReg->rowCount();i++) {
|
||||
ui->writeValueTable->setRowHidden(i, ui->writeValueTable->model()->index(i, 0).parent(), false);
|
||||
}
|
||||
}
|
||||
ui->writeValueTable->hideColumn(2);
|
||||
ui->writeValueTable->showColumn(3);
|
||||
}
|
||||
for(int i = 0; i < 5; i++) {
|
||||
ui->writeValueTable->resizeColumnToContents(i);
|
||||
}
|
||||
}
|
||||
|
||||
QModbusDataUnit M3KTE::readRequest() const
|
||||
{
|
||||
const auto table =
|
||||
static_cast<QModbusDataUnit::RegisterType>(ui->writeTable->currentData().toInt());
|
||||
|
||||
static_cast<QModbusDataUnit::RegisterType>(ui->writeTable->currentData().toInt());
|
||||
int startAddress = 85 * (ui->writeTable->currentIndex()/2);
|
||||
Q_ASSERT(startAddress >= 0 && startAddress < 340);
|
||||
|
||||
// do not go beyond 10 entries
|
||||
quint16 numberOfEntries = qMin((ushort)(85 - (ui->boardSelectBox->currentIndex()/3*20)), quint16(340 - startAddress));
|
||||
return QModbusDataUnit(table, startAddress, numberOfEntries);
|
||||
}
|
||||
@@ -789,562 +775,877 @@ QModbusDataUnit M3KTE::readRequest() const
|
||||
QModbusDataUnit M3KTE::writeRequest() const
|
||||
{
|
||||
const auto table =
|
||||
static_cast<QModbusDataUnit::RegisterType>(ui->writeTable->currentData().toInt());
|
||||
|
||||
static_cast<QModbusDataUnit::RegisterType>(ui->writeTable->currentData().toInt());
|
||||
int startAddress = 85 * (ui->writeTable->currentIndex()/2);
|
||||
Q_ASSERT(startAddress >= 0 && startAddress < 340);
|
||||
|
||||
// do not go beyond 10 entries
|
||||
quint16 numberOfEntries = qMin((ushort)(85 - (ui->boardSelectBox->currentIndex()/3*20)), quint16(340 - startAddress));
|
||||
return QModbusDataUnit(table, startAddress, numberOfEntries);
|
||||
}
|
||||
|
||||
bool M3KTE::event(QEvent *event)
|
||||
{
|
||||
if (event->type() == QEvent::User)
|
||||
{
|
||||
if(event->type() == QEvent::User) {
|
||||
BoardIdHasBeenChanged* _event = static_cast<BoardIdHasBeenChanged*>(event);
|
||||
QModbusDataUnit* _unit = new QModbusDataUnit(QModbusDataUnit::HoldingRegisters, 172, 1);
|
||||
_unit->setValue(0, _event->BoardNewID());
|
||||
if (auto *reply = modbusDevice->sendWriteRequest(*_unit, Boards[_event->BoardNum()].adr))
|
||||
{
|
||||
Boards[_event->BoardNum()]._tmp_adr = _event->BoardNewID();
|
||||
if(auto *reply = modbusDevice->sendWriteRequest(*_unit, Boards[_event->BoardNum()].adr)) {
|
||||
if(!reply->isFinished())
|
||||
connect(reply, &QModbusReply::finished, this, [reply, this, _event, _unit]()
|
||||
{
|
||||
if(reply->error()==QModbusDevice::TimeoutError)
|
||||
{
|
||||
if (auto *subreply = modbusDevice->sendReadRequest(*_unit, Boards[_event->BoardNum()]._tmp_adr))
|
||||
{
|
||||
if (!subreply->isFinished())
|
||||
connect(subreply, &QModbusReply::finished, this, &M3KTE::checkAdrChange);
|
||||
else
|
||||
{
|
||||
errorAdrChange();
|
||||
connect(reply, &QModbusReply::finished, this, [reply, this, _event, _unit]() {
|
||||
if(reply->error()==QModbusDevice::TimeoutError) {
|
||||
if(auto *subreply = modbusDevice->sendReadRequest(*_unit, Boards[_event->BoardNum()]._tmp_adr)) {
|
||||
if(!subreply->isFinished())
|
||||
connect(subreply, &QModbusReply::finished, this, [subreply, this, _event]() {
|
||||
checkAdrChange(subreply, _event->BoardNum());
|
||||
});
|
||||
else {
|
||||
logError(tr("Плата %1 (ID %2)").arg(_event->BoardNum()+1).arg(Boards[_event->BoardNum()].adr),
|
||||
subreply->errorString(), ++Boards[_event->BoardNum()].error_adr_change,
|
||||
"Не удалось изменить адрес устройства. [1]");
|
||||
reply->deleteLater();
|
||||
delete subreply; // broadcast replies return immediately
|
||||
}
|
||||
} else {
|
||||
errorAdrChange();
|
||||
logError(tr("Плата %1 (ID %2)").arg(_event->BoardNum()+1).arg(Boards[_event->BoardNum()].adr),
|
||||
modbusDevice->errorString(), ++Boards[_event->BoardNum()].error_adr_change,
|
||||
"Не удалось изменить адрес устройства. [2]");
|
||||
reply->deleteLater();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
errorAdrChange();
|
||||
} else {
|
||||
logError(tr("Плата %1 (ID %2)").arg(_event->BoardNum()+1).arg(Boards[_event->BoardNum()].adr),
|
||||
reply->errorString(), ++Boards[_event->BoardNum()].error_adr_change,
|
||||
"Не удалось изменить адрес устройства. [3]");
|
||||
reply->deleteLater();
|
||||
}
|
||||
});
|
||||
else
|
||||
{
|
||||
else {
|
||||
logError(tr("Плата %1 (ID %2)").arg(_event->BoardNum()+1).arg(Boards[_event->BoardNum()].adr),
|
||||
reply->errorString(), ++Boards[_event->BoardNum()].error_adr_change,
|
||||
"Не удалось изменить адрес устройства. [4]");
|
||||
reply->deleteLater();
|
||||
delete reply;
|
||||
}
|
||||
} else {
|
||||
logError(tr("Плата %1 (ID %2)").arg(_event->BoardNum()+1).arg(Boards[_event->BoardNum()].adr),
|
||||
modbusDevice->errorString(), ++Boards[_event->BoardNum()].error_adr_change,
|
||||
"Не удалось изменить адрес устройства. [5]");
|
||||
reply->deleteLater();
|
||||
}
|
||||
else
|
||||
{
|
||||
errorAdrChange();
|
||||
}
|
||||
// if (auto *reply = modbusDevice->sendReadRequest(*_unit, Boards[_event->BoardNum()]._tmp_adr))
|
||||
// {
|
||||
// if (!reply->isFinished())
|
||||
// connect(reply, &QModbusReply::finished, this, &M3KTE::checkAdrChange);
|
||||
// else
|
||||
// delete reply; // broadcast replies return immediately
|
||||
// } else {
|
||||
// errorAdrChange();
|
||||
// }
|
||||
m_deviceSettingsDialog->show();
|
||||
return true;
|
||||
} else if(event->type() == (QEvent::Type)1001) {
|
||||
pollStatusChange* _event = static_cast<pollStatusChange*>(event);
|
||||
QModbusDataUnit* _unit = new QModbusDataUnit(QModbusDataUnit::HoldingRegisters, 170, 1);
|
||||
_unit->setValue(0, _event->Status());
|
||||
if(auto *reply = modbusDevice->sendWriteRequest(*_unit, Boards[_event->BoardID()].adr)) {
|
||||
if(!reply->isFinished())
|
||||
connect(reply, &QModbusReply::finished, this, [reply, this, _event]() {
|
||||
if(reply->error()!=QModbusDevice::NoError) {
|
||||
logError(tr("Плата %1 (ID %2)").arg(_event->BoardID()+1).arg(Boards[_event->BoardID()].adr),
|
||||
reply->errorString(), ++Boards[_event->BoardID()].error_cmd_change, "");
|
||||
reply->deleteLater();
|
||||
}
|
||||
});
|
||||
} else {
|
||||
logError(tr("Плата %1 (ID %2)").arg(_event->BoardID()+1).arg(Boards[_event->BoardID()].adr),
|
||||
modbusDevice->errorString(), ++Boards[_event->BoardID()].error_cmd_change, "");
|
||||
reply->deleteLater();
|
||||
}
|
||||
return true;
|
||||
}
|
||||
return QWidget::event(event);
|
||||
}
|
||||
|
||||
void M3KTE::checkAdrChange()
|
||||
void M3KTE::checkAdrChange(QModbusReply *reply, unsigned boardNum)
|
||||
{
|
||||
auto reply = qobject_cast<QModbusReply *>(sender());
|
||||
if (!reply)
|
||||
{
|
||||
errorAdrChange();
|
||||
if(!reply) {
|
||||
logError(tr("Плата %1 (ID %2)").arg(boardNum+1).arg(Boards[boardNum].adr),
|
||||
modbusDevice->errorString(), ++Boards[boardNum].error_adr_change,
|
||||
"Не удалось проверить изменение адреса устройства.");
|
||||
reply->deleteLater();
|
||||
return;
|
||||
}
|
||||
if (reply->error() == QModbusDevice::NoError) {
|
||||
for (int i = 0; i < CurrentConnectedDevice; i++) {
|
||||
if(Boards[i]._tmp_adr == reply->serverAddress())
|
||||
{
|
||||
//OK
|
||||
Boards[i].adr = Boards[i]._tmp_adr;
|
||||
reply->deleteLater();
|
||||
return;
|
||||
if(reply->error() == QModbusDevice::NoError) {
|
||||
//OK
|
||||
Boards[boardNum].adr = Boards[boardNum]._tmp_adr;
|
||||
reply->deleteLater();
|
||||
}
|
||||
else {
|
||||
logError(tr("Плата %1 (ID %2)").arg(boardNum+1).arg(Boards[boardNum].adr),
|
||||
reply->errorString(),
|
||||
++Boards[boardNum].error_adr_change,
|
||||
"Ошибка при подтверждении изменения адреса устройства.");
|
||||
reply->deleteLater();
|
||||
}
|
||||
}
|
||||
/*
|
||||
void M3KTE::onSpeedUpdate()
|
||||
{
|
||||
stopScanBoard();
|
||||
QModbusDataUnit* _unit = new QModbusDataUnit(QModbusDataUnit::HoldingRegisters, 173, 1);
|
||||
QModbusDataUnit* _unitcheck = new QModbusDataUnit(QModbusDataUnit::InputRegisters, 85, 1);
|
||||
_unit->setValue(0, m_deviceSettingsDialog->currentSpeed());
|
||||
unsigned tmp_speed = 0;
|
||||
switch(m_deviceSettingsDialog->currentSpeed()) {
|
||||
case 0:
|
||||
tmp_speed = 9600;
|
||||
break;
|
||||
case 1:
|
||||
tmp_speed = 14400;
|
||||
break;
|
||||
case 2:
|
||||
tmp_speed = 19200;
|
||||
break;
|
||||
case 3:
|
||||
tmp_speed = 31250;
|
||||
break;
|
||||
case 4:
|
||||
tmp_speed = 38400;
|
||||
break;
|
||||
case 5:
|
||||
tmp_speed = 56000;
|
||||
break;
|
||||
case 6:
|
||||
tmp_speed = 57600;
|
||||
break;
|
||||
case 7:
|
||||
tmp_speed = 115200;
|
||||
break;
|
||||
}
|
||||
if(tmp_speed == 0) {
|
||||
unsigned newRow = loggerTable->rowCount();
|
||||
loggerTable->insertRow(newRow);
|
||||
loggerTable->setItem(newRow, 0, new QTableWidgetItem((QTime::currentTime().toString("HH:mm:ss"))));
|
||||
loggerTable->setItem(newRow, 1, new QTableWidgetItem(tr("Программная ошибка")));
|
||||
loggerTable->setItem(newRow, 2, new QTableWidgetItem("Неожиданное значение скорости"));
|
||||
loggerTable->setItem(newRow, 3, new QTableWidgetItem(0));
|
||||
loggerTable->setItem(newRow, 4, new QTableWidgetItem("Ошибка при изменении скорости обмена."));
|
||||
loggerTable->resizeColumnsToContents();
|
||||
if(!loggerTable->verticalScrollBar()->isSliderDown())
|
||||
loggerTable->verticalScrollBar()->setSliderPosition(loggerTable->verticalScrollBar()->maximum());
|
||||
beginScanBoards();
|
||||
return;
|
||||
}
|
||||
modbusDevice->setTimeout(500);
|
||||
for(int i = 0; i < 4; i++) {
|
||||
if(!Boards[i].isActive) {
|
||||
continue;
|
||||
}
|
||||
if(auto *reply = modbusDevice->sendWriteRequest(*_unit, Boards[i].adr)) {
|
||||
QEventLoop loop;
|
||||
connect(reply, &QModbusReply::finished, &loop, &QEventLoop::quit);
|
||||
loop.exec();
|
||||
if(reply->error()==QModbusDevice::TimeoutError) {
|
||||
modbusDevice->disconnectDevice();
|
||||
modbusDevice->setConnectionParameter(QModbusDevice::SerialBaudRateParameter,
|
||||
tmp_speed);
|
||||
modbusDevice->connectDevice();
|
||||
if(auto *subreply = modbusDevice->sendReadRequest(*_unitcheck, Boards[i].adr)) {
|
||||
QEventLoop subloop;
|
||||
connect(subreply, &QModbusReply::finished, &subloop, &QEventLoop::quit);
|
||||
subloop.exec();
|
||||
if(subreply->error() != QModbusDevice::NoError) {
|
||||
unsigned newRow = loggerTable->rowCount();
|
||||
loggerTable->insertRow(newRow);
|
||||
loggerTable->setItem(newRow, 0, new QTableWidgetItem((QTime::currentTime().toString("HH:mm:ss"))));
|
||||
loggerTable->setItem(newRow, 1, new QTableWidgetItem(tr("Плата %1 (ID %2)").arg(i+1).arg(Boards[i].adr)));
|
||||
loggerTable->setItem(newRow, 2, new QTableWidgetItem(subreply->errorString()));
|
||||
loggerTable->setItem(newRow, 3, new QTableWidgetItem(QString::number(++Boards[i].error_baud_change, 10)));
|
||||
loggerTable->setItem(newRow, 4, new QTableWidgetItem("Ошибка при подтверждении изменения скорости обмена."));
|
||||
loggerTable->resizeColumnsToContents();
|
||||
if(!loggerTable->verticalScrollBar()->isSliderDown())
|
||||
loggerTable->verticalScrollBar()->setSliderPosition(loggerTable->verticalScrollBar()->maximum());
|
||||
subreply->deleteLater();
|
||||
} else {
|
||||
modbusDevice->disconnectDevice();
|
||||
modbusDevice->setConnectionParameter(QModbusDevice::SerialBaudRateParameter,
|
||||
m_settingsDialog->UpdateBaud(m_deviceSettingsDialog->currentSpeed()));
|
||||
modbusDevice->connectDevice();
|
||||
modbusDevice->setTimeout(m_settingsDialog->settings().responseTime);
|
||||
beginScanBoards();
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
unsigned newRow = loggerTable->rowCount();
|
||||
loggerTable->insertRow(newRow);
|
||||
loggerTable->setItem(newRow, 0, new QTableWidgetItem((QTime::currentTime().toString("HH:mm:ss"))));
|
||||
loggerTable->setItem(newRow, 1, new QTableWidgetItem(tr("Плата %1 (ID %2)").arg(i+1).arg(Boards[i].adr)));
|
||||
loggerTable->setItem(newRow, 2, new QTableWidgetItem(modbusDevice->errorString()));
|
||||
loggerTable->setItem(newRow, 3, new QTableWidgetItem(QString::number(++Boards[i].error_baud_change, 10)));
|
||||
loggerTable->setItem(newRow, 4, new QTableWidgetItem("Ошибка при отправке подтверждения изменения скорости обмена."));
|
||||
loggerTable->resizeColumnsToContents();
|
||||
if(!loggerTable->verticalScrollBar()->isSliderDown())
|
||||
loggerTable->verticalScrollBar()->setSliderPosition(loggerTable->verticalScrollBar()->maximum());
|
||||
}
|
||||
} else {
|
||||
unsigned newRow = loggerTable->rowCount();
|
||||
loggerTable->insertRow(newRow);
|
||||
loggerTable->setItem(newRow, 0, new QTableWidgetItem((QTime::currentTime().toString("HH:mm:ss"))));
|
||||
loggerTable->setItem(newRow, 1, new QTableWidgetItem(tr("Плата %1 (ID %2)").arg(i+1).arg(Boards[i].adr)));
|
||||
loggerTable->setItem(newRow, 2, new QTableWidgetItem(reply->errorString()));
|
||||
loggerTable->setItem(newRow, 3, new QTableWidgetItem(QString::number(++Boards[i].error_baud_change, 10)));
|
||||
loggerTable->setItem(newRow, 4, new QTableWidgetItem("Ошибка при изменении скорости обмена."));
|
||||
loggerTable->resizeColumnsToContents();
|
||||
if(!loggerTable->verticalScrollBar()->isSliderDown())
|
||||
loggerTable->verticalScrollBar()->setSliderPosition(loggerTable->verticalScrollBar()->maximum());
|
||||
delete reply; // broadcast replies return immediately
|
||||
}
|
||||
}
|
||||
//ERROR
|
||||
errorAdrChange();
|
||||
reply->deleteLater();
|
||||
return;
|
||||
}
|
||||
errorAdrChange();
|
||||
reply->deleteLater();
|
||||
modbusDevice->disconnectDevice();
|
||||
modbusDevice->setConnectionParameter(QModbusDevice::SerialBaudRateParameter,
|
||||
m_settingsDialog->curBaud());
|
||||
modbusDevice->connectDevice();
|
||||
modbusDevice->setTimeout(m_settingsDialog->settings().responseTime);
|
||||
beginScanBoards();
|
||||
}
|
||||
*/
|
||||
|
||||
void M3KTE::errorAdrChange()
|
||||
void M3KTE::checkBoards()
|
||||
{
|
||||
QMessageBox msgBox;
|
||||
msgBox.setText("Не удалось изменить адрес устройства.");
|
||||
msgBox.setStandardButtons(QMessageBox::Ok);
|
||||
msgBox.setDefaultButton(QMessageBox::Ok);
|
||||
int ret = msgBox.exec();
|
||||
QModbusDataUnit unitCheck(QModbusDataUnit::InputRegisters, 85, 1);
|
||||
|
||||
int totalActiveBoards = 0;
|
||||
int confirmedBoards = 0;
|
||||
|
||||
QSet<int> pendingBoards;
|
||||
|
||||
for(int i = 0; i < 4; ++i) {
|
||||
if(!Boards[i].isActive)
|
||||
continue;
|
||||
|
||||
totalActiveBoards++;
|
||||
int slaveAddress = Boards[i].adr;
|
||||
|
||||
QModbusReply *reply = modbusDevice->sendReadRequest(unitCheck, slaveAddress);
|
||||
if(!reply) {
|
||||
revertToOldSpeedAndRestart();
|
||||
return;
|
||||
}
|
||||
|
||||
pendingBoards.insert(slaveAddress);
|
||||
|
||||
connect(reply, &QModbusReply::finished, this, [this, i, reply, slaveAddress, &confirmedBoards, &pendingBoards, totalActiveBoards]() mutable {
|
||||
if(reply->error() == QModbusDevice::NoError) {
|
||||
confirmedBoards++;
|
||||
} else {
|
||||
logError(tr("Плата %1 (ID %2)").arg(i+1).arg(slaveAddress),
|
||||
reply->errorString(), ++Boards[i].error_baud_change,
|
||||
"Ошибка при подтверждении изменения скорости обмена.");
|
||||
}
|
||||
|
||||
pendingBoards.remove(slaveAddress);
|
||||
reply->deleteLater();
|
||||
|
||||
if(pendingBoards.isEmpty()) {
|
||||
if(confirmedBoards != totalActiveBoards) {
|
||||
emit errorAtCheckBoards();
|
||||
} else {
|
||||
emit successAtCheckBoards();
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
// Если нет ни одной активной платы — сразу запускаем сканирование
|
||||
if(totalActiveBoards == 0) {
|
||||
emit errorAtCheckBoards();
|
||||
}
|
||||
}
|
||||
|
||||
void M3KTE::onSpeedUpdate()
|
||||
{
|
||||
//Отсутствие контроля записи регистра на плате.
|
||||
stopScanBoard();
|
||||
modbusDevice->setTimeout(500);
|
||||
|
||||
QModbusDataUnit* _unit = new QModbusDataUnit(QModbusDataUnit::HoldingRegisters, 173, 1);
|
||||
_unit->setValue(0, m_deviceSettingsDialog->currentSpeed());
|
||||
for (int i = 0; i < CurrentConnectedDevice; i++) {
|
||||
auto *reply = modbusDevice->sendWriteRequest(*_unit, Boards[i].adr);
|
||||
{
|
||||
if (!reply->isFinished())
|
||||
connect(reply, &QModbusReply::finished, this, [this, reply, i](){
|
||||
if(reply->error()==QModbusDevice::TimeoutError)
|
||||
{
|
||||
modbusDevice->disconnectDevice();
|
||||
modbusDevice->setConnectionParameter(QModbusDevice::SerialBaudRateParameter,
|
||||
m_settingsDialog->UpdateBaud(m_deviceSettingsDialog->currentSpeed()));
|
||||
modbusDevice->connectDevice();
|
||||
QModbusDataUnit* _unit = new QModbusDataUnit(QModbusDataUnit::InputRegisters, 85, 1);
|
||||
if (auto *subreply = modbusDevice->sendReadRequest(*_unit, Boards[i].adr))
|
||||
{
|
||||
if (!subreply->isFinished())
|
||||
connect(subreply, &QModbusReply::finished, this, [subreply, this, i](){
|
||||
if(subreply->error() != QModbusDevice::NoError)
|
||||
{
|
||||
QMessageBox msgBox;
|
||||
msgBox.setText(tr("Не удалось изменить скорость платы %1.").arg(i));
|
||||
msgBox.setStandardButtons(QMessageBox::Ok);
|
||||
msgBox.setDefaultButton(QMessageBox::Ok);
|
||||
int ret = msgBox.exec();
|
||||
}
|
||||
});
|
||||
else
|
||||
{
|
||||
QMessageBox msgBox;
|
||||
msgBox.setText(tr("Не удалось изменить скорость платы %1.").arg(i));
|
||||
msgBox.setStandardButtons(QMessageBox::Ok);
|
||||
msgBox.setDefaultButton(QMessageBox::Ok);
|
||||
int ret = msgBox.exec();
|
||||
delete subreply; // broadcast replies return immediately
|
||||
}
|
||||
} else {
|
||||
QMessageBox msgBox;
|
||||
msgBox.setText(tr("Не удалось изменить скорость платы %1.").arg(i));
|
||||
msgBox.setStandardButtons(QMessageBox::Ok);
|
||||
msgBox.setDefaultButton(QMessageBox::Ok);
|
||||
int ret = msgBox.exec();
|
||||
}
|
||||
|
||||
}
|
||||
});
|
||||
else
|
||||
delete reply; // broadcast replies return immediately
|
||||
}
|
||||
unsigned tmp_speed = 0;
|
||||
switch(m_deviceSettingsDialog->currentSpeed()) {
|
||||
case 0:
|
||||
tmp_speed = 9600;
|
||||
break;
|
||||
case 1:
|
||||
tmp_speed = 14400;
|
||||
break;
|
||||
case 2:
|
||||
tmp_speed = 19200;
|
||||
break;
|
||||
case 3:
|
||||
tmp_speed = 31250;
|
||||
break;
|
||||
case 4:
|
||||
tmp_speed = 38400;
|
||||
break;
|
||||
case 5:
|
||||
tmp_speed = 56000;
|
||||
break;
|
||||
case 6:
|
||||
tmp_speed = 57600;
|
||||
break;
|
||||
case 7:
|
||||
tmp_speed = 115200;
|
||||
break;
|
||||
}
|
||||
if(tmp_speed == 0) {
|
||||
logError(tr("Программная ошибка"), "Неожиданное значение скорости", 0,
|
||||
"Ошибка при изменении скорости обмена.");
|
||||
beginScanBoards();
|
||||
return;
|
||||
}
|
||||
|
||||
int totalActiveBoards = 0;
|
||||
int confirmedBoards = 0;
|
||||
|
||||
QSet<int> pendingBoards;
|
||||
|
||||
QModbusDataUnit unit(QModbusDataUnit::HoldingRegisters, 173, 1);
|
||||
unit.setValue(0, m_deviceSettingsDialog->currentSpeed());
|
||||
|
||||
for(int i = 0; i < 4; i++) {
|
||||
if(!Boards[i].isActive)
|
||||
continue;
|
||||
|
||||
int slaveAdress = Boards[i].adr;
|
||||
|
||||
auto *reply = modbusDevice->sendWriteRequest(unit, slaveAdress);
|
||||
if(reply) {
|
||||
totalActiveBoards++;
|
||||
pendingBoards.insert(slaveAdress);
|
||||
connect(reply, &QModbusReply::finished, this, [this, i, reply, slaveAdress, &confirmedBoards, &pendingBoards, totalActiveBoards, tmp_speed]() mutable {
|
||||
if(reply->error() == QModbusDevice::TimeoutError) {
|
||||
confirmedBoards++;
|
||||
} else if (reply->error() == QModbusDevice::NoError) {
|
||||
logError(tr("Плата %1 (ID %2)").arg(i+1).arg(slaveAdress),
|
||||
tr("Неожиданный ответ."), ++Boards[i].error_baud_change,
|
||||
"Ошибка при изменении скорости обмена.");
|
||||
} else {
|
||||
logError(tr("Плата %1 (ID %2)").arg(i+1).arg(slaveAdress),
|
||||
reply->errorString(), ++Boards[i].error_baud_change,
|
||||
"Ошибка при изменении скорости обмена.");
|
||||
}
|
||||
pendingBoards.remove(slaveAdress);
|
||||
reply->deleteLater();
|
||||
if(pendingBoards.isEmpty()) {
|
||||
if(confirmedBoards != totalActiveBoards) {
|
||||
modbusDevice->setTimeout(m_settingsDialog->settings().responseTime);
|
||||
revertToOldSpeedAndRestart();
|
||||
beginScanBoards();
|
||||
} else {
|
||||
modbusDevice->disconnectDevice();
|
||||
modbusDevice->setConnectionParameter(QModbusDevice::SerialBaudRateParameter, tmp_speed);
|
||||
modbusDevice->connectDevice();
|
||||
connect(this, &M3KTE::errorAtCheckBoards, this, [this]() {
|
||||
disconnect(this, &M3KTE::errorAtCheckBoards, this, nullptr);
|
||||
modbusDevice->setTimeout(m_settingsDialog->settings().responseTime);
|
||||
revertToOldSpeedAndRestart();
|
||||
beginScanBoards();
|
||||
});
|
||||
connect(this, &M3KTE::successAtCheckBoards, this, [this]() {
|
||||
disconnect(this, &M3KTE::successAtCheckBoards, this, nullptr);
|
||||
m_settingsDialog->UpdateBaud(m_deviceSettingsDialog->currentSpeed());
|
||||
modbusDevice->setTimeout(m_settingsDialog->settings().responseTime);
|
||||
beginScanBoards();
|
||||
});
|
||||
checkBoards();
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Вспомогательная функция восстановления старой скорости
|
||||
void M3KTE::revertToOldSpeedAndRestart()
|
||||
{
|
||||
modbusDevice->disconnectDevice();
|
||||
modbusDevice->setConnectionParameter(QModbusDevice::SerialBaudRateParameter,
|
||||
m_settingsDialog->curBaud());
|
||||
modbusDevice->setTimeout(m_settingsDialog->settings().responseTime);
|
||||
modbusDevice->connectDevice();
|
||||
}
|
||||
|
||||
//void M3KTE::onParityUpdate()
|
||||
//{
|
||||
// stopScanBoard();
|
||||
// QModbusDataUnit* _unit = new QModbusDataUnit(QModbusDataUnit::HoldingRegisters, 174, 1);
|
||||
// switch(m_deviceSettingsDialog->currentParity()) {
|
||||
// case 0: //Нет контроля
|
||||
// _unit->setValue(0, 0x000);
|
||||
// break;
|
||||
// case 1: //Четный
|
||||
// _unit->setValue(0, 0x0400);
|
||||
// break;
|
||||
// case 2: //Нечетный
|
||||
// _unit->setValue(0, 0x0600);
|
||||
// break;
|
||||
// }
|
||||
// for(int i = 0; i < 4; i++) {
|
||||
// if(!Boards[i].isActive) {
|
||||
// continue;
|
||||
// }
|
||||
// if(auto *reply = modbusDevice->sendWriteRequest(*_unit, Boards[i].adr)) {
|
||||
// QEventLoop loop;
|
||||
// connect(reply, &QModbusReply::finished, &loop, &QEventLoop::quit);
|
||||
// loop.exec(); // Ожидает завершения reply без блокировки интерфейса
|
||||
// if(reply->error()==QModbusDevice::TimeoutError) {
|
||||
// modbusDevice->disconnectDevice();
|
||||
// modbusDevice->setConnectionParameter(QModbusDevice::SerialParityParameter,
|
||||
// m_deviceSettingsDialog->currentParity());
|
||||
// modbusDevice->connectDevice();
|
||||
// QModbusDataUnit* _unit = new QModbusDataUnit(QModbusDataUnit::InputRegisters, 85, 1);
|
||||
// if(auto *subreply = modbusDevice->sendReadRequest(*_unit, Boards[i].adr)) {
|
||||
// QEventLoop subloop;
|
||||
// connect(subreply, &QModbusReply::finished, &subloop, &QEventLoop::quit);
|
||||
// subloop.exec(); // Ожидает завершения subreply без блокировки интерфейса
|
||||
// if(subreply->error() != QModbusDevice::NoError) {
|
||||
// unsigned newRow = loggerTable->rowCount();
|
||||
// loggerTable->insertRow(newRow);
|
||||
// loggerTable->setItem(newRow, 0, new QTableWidgetItem((QTime::currentTime().toString("HH:mm:ss"))));
|
||||
// loggerTable->setItem(newRow, 1, new QTableWidgetItem(tr("Плата %1 (ID %2)").arg(i+1).arg(Boards[i].adr)));
|
||||
// loggerTable->setItem(newRow, 2, new QTableWidgetItem(subreply->errorString()));
|
||||
// loggerTable->setItem(newRow, 3, new QTableWidgetItem(QString::number(++Boards[i].error_parity_change)));
|
||||
// loggerTable->setItem(newRow, 4, new QTableWidgetItem("Ошибка при изменении чётности платы."));
|
||||
// loggerTable->resizeColumnsToContents();
|
||||
// if(!loggerTable->verticalScrollBar()->isSliderDown())
|
||||
// loggerTable->verticalScrollBar()->setSliderPosition(loggerTable->verticalScrollBar()->maximum());
|
||||
// }
|
||||
// } else {
|
||||
// unsigned newRow = loggerTable->rowCount();
|
||||
// loggerTable->insertRow(newRow);
|
||||
// loggerTable->setItem(newRow, 0, new QTableWidgetItem((QTime::currentTime().toString("HH:mm:ss"))));
|
||||
// loggerTable->setItem(newRow, 1, new QTableWidgetItem(tr("Плата %1 (ID %2)").arg(i+1).arg(Boards[i].adr)));
|
||||
// loggerTable->setItem(newRow, 2, new QTableWidgetItem(modbusDevice->errorString()));
|
||||
// loggerTable->setItem(newRow, 3, new QTableWidgetItem(QString::number(++Boards[i].error_parity_change)));
|
||||
// loggerTable->setItem(newRow, 4, new QTableWidgetItem("Ошибка при изменении чётности платы."));
|
||||
// loggerTable->resizeColumnsToContents();
|
||||
// if(!loggerTable->verticalScrollBar()->isSliderDown())
|
||||
// loggerTable->verticalScrollBar()->setSliderPosition(loggerTable->verticalScrollBar()->maximum());
|
||||
// }
|
||||
// modbusDevice->disconnectDevice();
|
||||
// modbusDevice->setConnectionParameter(QModbusDevice::SerialParityParameter,
|
||||
// m_settingsDialog->curParity());
|
||||
// modbusDevice->connectDevice();
|
||||
// } else {
|
||||
// unsigned newRow = loggerTable->rowCount();
|
||||
// loggerTable->insertRow(newRow);
|
||||
// loggerTable->setItem(newRow, 0, new QTableWidgetItem((QTime::currentTime().toString("HH:mm:ss"))));
|
||||
// loggerTable->setItem(newRow, 1, new QTableWidgetItem(tr("Плата %1 (ID %2)").arg(i+1).arg(Boards[i].adr)));
|
||||
// loggerTable->setItem(newRow, 2, new QTableWidgetItem(reply->errorString()));
|
||||
// loggerTable->setItem(newRow, 3, new QTableWidgetItem(QString::number(++Boards[i].error_parity_change)));
|
||||
// loggerTable->setItem(newRow, 4, new QTableWidgetItem("Ошибка при изменении чётности платы."));
|
||||
// loggerTable->resizeColumnsToContents();
|
||||
// if(!loggerTable->verticalScrollBar()->isSliderDown())
|
||||
// loggerTable->verticalScrollBar()->setSliderPosition(loggerTable->verticalScrollBar()->maximum());
|
||||
// }
|
||||
// } else {
|
||||
// unsigned newRow = loggerTable->rowCount();
|
||||
// loggerTable->insertRow(newRow);
|
||||
// loggerTable->setItem(newRow, 0, new QTableWidgetItem((QTime::currentTime().toString("HH:mm:ss"))));
|
||||
// loggerTable->setItem(newRow, 1, new QTableWidgetItem(tr("Плата %1 (ID %2)").arg(i+1).arg(Boards[i].adr)));
|
||||
// loggerTable->setItem(newRow, 2, new QTableWidgetItem(modbusDevice->errorString()));
|
||||
// loggerTable->setItem(newRow, 3, new QTableWidgetItem(QString::number(++Boards[i].error_parity_change)));
|
||||
// loggerTable->setItem(newRow, 4, new QTableWidgetItem("Ошибка при изменении чётности платы."));
|
||||
// loggerTable->resizeColumnsToContents();
|
||||
// if(!loggerTable->verticalScrollBar()->isSliderDown())
|
||||
// loggerTable->verticalScrollBar()->setSliderPosition(loggerTable->verticalScrollBar()->maximum());
|
||||
// delete reply; // broadcast replies return immediately
|
||||
// }
|
||||
// }
|
||||
// modbusDevice->disconnectDevice();
|
||||
// modbusDevice->setConnectionParameter(QModbusDevice::SerialParityParameter,
|
||||
// m_settingsDialog->UpdateParity(m_deviceSettingsDialog->currentParity()));
|
||||
// modbusDevice->connectDevice();
|
||||
// beginScanBoards();
|
||||
//}
|
||||
|
||||
void M3KTE::onParityUpdate()
|
||||
{
|
||||
//Отсутствие контроля записи регистра на плате.
|
||||
stopScanBoard();
|
||||
modbusDevice->setTimeout(500);
|
||||
|
||||
QModbusDataUnit* _unit = new QModbusDataUnit(QModbusDataUnit::HoldingRegisters, 174, 1);
|
||||
switch (m_deviceSettingsDialog->currentParity())
|
||||
{
|
||||
case 0: //Нет контроля
|
||||
{
|
||||
_unit->setValue(0, 0x000);
|
||||
break;
|
||||
}
|
||||
case 1: //Четный
|
||||
{
|
||||
_unit->setValue(0, 0x0400);
|
||||
break;
|
||||
}
|
||||
case 2: //Нечетный
|
||||
{
|
||||
_unit->setValue(0, 0x0800);
|
||||
break;
|
||||
}
|
||||
QModbusDataUnit unit(QModbusDataUnit::HoldingRegisters, 174, 1);
|
||||
switch(m_deviceSettingsDialog->currentParity()) {
|
||||
case 0: //Нет контроля
|
||||
unit.setValue(0, 0x000);
|
||||
break;
|
||||
case 1: //Четный
|
||||
unit.setValue(0, 0x0400);
|
||||
break;
|
||||
case 2: //Нечетный
|
||||
unit.setValue(0, 0x0600);
|
||||
break;
|
||||
}
|
||||
for (int i = 0; i < CurrentConnectedDevice; i++) {
|
||||
auto *reply = modbusDevice->sendWriteRequest(*_unit, Boards[i].adr);
|
||||
{
|
||||
if (!reply->isFinished())
|
||||
connect(reply, &QModbusReply::finished, this, [this, reply, i](){
|
||||
if(reply->error()==QModbusDevice::TimeoutError)
|
||||
{
|
||||
modbusDevice->disconnectDevice();
|
||||
modbusDevice->setConnectionParameter(QModbusDevice::SerialParityParameter,
|
||||
m_settingsDialog->UpdateParity(m_deviceSettingsDialog->currentParity()));
|
||||
modbusDevice->connectDevice();
|
||||
QModbusDataUnit* _unit = new QModbusDataUnit(QModbusDataUnit::InputRegisters, 85, 1);
|
||||
if (auto *subreply = modbusDevice->sendReadRequest(*_unit, Boards[i].adr))
|
||||
{
|
||||
if (!subreply->isFinished())
|
||||
connect(subreply, &QModbusReply::finished, this, [subreply, this, i](){
|
||||
if(subreply->error() != QModbusDevice::NoError)
|
||||
{
|
||||
QMessageBox msgBox;
|
||||
msgBox.setText(tr("Не удалось изменить чётность платы %1.").arg(i));
|
||||
msgBox.setStandardButtons(QMessageBox::Ok);
|
||||
msgBox.setDefaultButton(QMessageBox::Ok);
|
||||
int ret = msgBox.exec();
|
||||
}
|
||||
});
|
||||
else
|
||||
{
|
||||
QMessageBox msgBox;
|
||||
msgBox.setText(tr("Не удалось изменить чётность платы %1.").arg(i));
|
||||
msgBox.setStandardButtons(QMessageBox::Ok);
|
||||
msgBox.setDefaultButton(QMessageBox::Ok);
|
||||
int ret = msgBox.exec();
|
||||
delete subreply; // broadcast replies return immediately
|
||||
}
|
||||
|
||||
int totalActiveBoards = 0;
|
||||
int confirmedBoards = 0;
|
||||
|
||||
QSet<int> pendingBoards;
|
||||
|
||||
for(int i = 0; i < 4; i++) {
|
||||
if(!Boards[i].isActive)
|
||||
continue;
|
||||
|
||||
int slaveAdress = Boards[i].adr;
|
||||
|
||||
auto *reply = modbusDevice->sendWriteRequest(unit, slaveAdress);
|
||||
if(reply) {
|
||||
totalActiveBoards++;
|
||||
pendingBoards.insert(slaveAdress);
|
||||
connect(reply, &QModbusReply::finished, this, [this, i, reply, slaveAdress, &confirmedBoards, &pendingBoards, totalActiveBoards]() mutable {
|
||||
if(reply->error() == QModbusDevice::TimeoutError) {
|
||||
confirmedBoards++;
|
||||
} else if (reply->error() == QModbusDevice::NoError) {
|
||||
logError(tr("Плата %1 (ID %2)").arg(i+1).arg(slaveAdress),
|
||||
tr("Неожиданный ответ."), ++Boards[i].error_baud_change,
|
||||
"Ошибка при изменении чётности.");
|
||||
} else {
|
||||
logError(tr("Плата %1 (ID %2)").arg(i+1).arg(slaveAdress),
|
||||
reply->errorString(), ++Boards[i].error_baud_change,
|
||||
"Ошибка при изменении чётности.");
|
||||
}
|
||||
pendingBoards.remove(slaveAdress);
|
||||
reply->deleteLater();
|
||||
if(pendingBoards.isEmpty()) {
|
||||
if(confirmedBoards != totalActiveBoards) {
|
||||
modbusDevice->setTimeout(m_settingsDialog->settings().responseTime);
|
||||
beginScanBoards();
|
||||
} else {
|
||||
QMessageBox msgBox;
|
||||
msgBox.setText(tr("Не удалось изменить чётность платы %1.").arg(i));
|
||||
msgBox.setStandardButtons(QMessageBox::Ok);
|
||||
msgBox.setDefaultButton(QMessageBox::Ok);
|
||||
int ret = msgBox.exec();
|
||||
modbusDevice->disconnectDevice();
|
||||
modbusDevice->setConnectionParameter(QModbusDevice::SerialParityParameter,
|
||||
m_deviceSettingsDialog->currentParity());
|
||||
modbusDevice->connectDevice();
|
||||
connect(this, &M3KTE::errorAtCheckBoards, this, [this](){
|
||||
disconnect(this, &M3KTE::errorAtCheckBoards, this, nullptr);
|
||||
modbusDevice->setTimeout(m_settingsDialog->settings().responseTime);
|
||||
modbusDevice->disconnectDevice();
|
||||
modbusDevice->setConnectionParameter(QModbusDevice::SerialParityParameter,
|
||||
m_settingsDialog->curParity());
|
||||
modbusDevice->connectDevice();
|
||||
beginScanBoards();
|
||||
});
|
||||
connect(this, &M3KTE::successAtCheckBoards, this, [this](){
|
||||
disconnect(this, &M3KTE::successAtCheckBoards, this, nullptr);
|
||||
m_settingsDialog->UpdateParity(m_deviceSettingsDialog->currentParity());
|
||||
modbusDevice->setTimeout(m_settingsDialog->settings().responseTime);
|
||||
beginScanBoards();
|
||||
});
|
||||
checkBoards();
|
||||
}
|
||||
}
|
||||
});
|
||||
else
|
||||
delete reply; // broadcast replies return immediately
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bool M3KTE::pingNetworkDevices()
|
||||
{
|
||||
int i=0;
|
||||
QTimer *timer = new QTimer(this);
|
||||
connect(timer, &QTimer::timeout, this, &M3KTE::timeForPingIsGone);
|
||||
timer->setSingleShot(true);
|
||||
QModbusDataUnit* _unit = new QModbusDataUnit(QModbusDataUnit::InputRegisters, 85, 1);
|
||||
CurrentConnectedDevice = 0;
|
||||
int tmp_adr = 1;
|
||||
|
||||
bool isRun = false;
|
||||
bool *tmp_isRun = &isRun;
|
||||
auto bar = new QProgressDialog(this);
|
||||
connect(bar, &QProgressDialog::canceled, this, [this, tmp_isRun]()
|
||||
{
|
||||
connect(bar, &QProgressDialog::canceled, this, [tmp_isRun]() {
|
||||
*tmp_isRun = true;
|
||||
});
|
||||
bar->setLabelText(tr("Поиск плат..."));
|
||||
bar->setLabelText(tr("Поиск плат... Текущий адрес: %1").arg(tmp_adr));
|
||||
bar->setCancelButton(nullptr);
|
||||
bar->setRange(0, 4);
|
||||
bar->setMinimumDuration(100);
|
||||
bar->setValue(i);
|
||||
bar->setValue(CurrentConnectedDevice);
|
||||
modbusDevice->setNumberOfRetries(0);
|
||||
|
||||
CurrentConnectedDevice = 0;
|
||||
QModbusRequest requestOfDeviceType(QModbusRequest::EncapsulatedInterfaceTransport, QByteArray::fromHex("0E0404"));
|
||||
QModbusRequest requestOfBoardID(QModbusRequest::EncapsulatedInterfaceTransport, QByteArray::fromHex("0E0401"));
|
||||
|
||||
for(i=0; i<4;)
|
||||
{
|
||||
|
||||
if(isRun && CurrentConnectedDevice < 1)
|
||||
{
|
||||
modbusDevice->setTimeout(50);
|
||||
for(CurrentConnectedDevice=0; CurrentConnectedDevice<4;) {
|
||||
auto *reply = modbusDevice->sendRawRequest(requestOfDeviceType, tmp_adr);
|
||||
//auto *reply = modbusDevice->sendReadRequest(*_unit, tmp_adr);
|
||||
//Запрос типа устройства.
|
||||
if(reply == nullptr) {
|
||||
onConnectClicked();
|
||||
bar->close();
|
||||
bar->deleteLater();
|
||||
return false;
|
||||
}
|
||||
else if(isRun)
|
||||
{
|
||||
break;
|
||||
}
|
||||
timerForPingSignal = false;
|
||||
timer->start(m_settingsDialog->settings().responseTime);
|
||||
auto *reply = modbusDevice->sendReadRequest(*_unit, tmp_adr);
|
||||
while(!reply->isFinished() && !timerForPingSignal)
|
||||
{
|
||||
if(isRun && CurrentConnectedDevice < 1)
|
||||
{
|
||||
while(!reply->isFinished()) {
|
||||
if(isRun && CurrentConnectedDevice < 1) {
|
||||
onConnectClicked();
|
||||
bar->close();
|
||||
bar->deleteLater();
|
||||
return false;
|
||||
}
|
||||
else if(isRun)
|
||||
{
|
||||
} else if(isRun) {
|
||||
break;
|
||||
}
|
||||
QCoreApplication::processEvents();
|
||||
}
|
||||
if(timerForPingSignal)
|
||||
{
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
if(reply->error()==QModbusDevice::NoError)
|
||||
{
|
||||
timer->stop();
|
||||
CurrentConnectedDevice++;
|
||||
Boards[i].adr = Boards[i]._tmp_adr = tmp_adr;
|
||||
statusBar()->showMessage(tr("Плата %1 найдена по адресу %2.").arg(i).arg(tmp_adr), m_settingsDialog->settings().responseTime);
|
||||
i++;
|
||||
bar->setValue(i);
|
||||
if(isRun && CurrentConnectedDevice < 1) {
|
||||
onConnectClicked();
|
||||
bar->close();
|
||||
bar->deleteLater();
|
||||
return false;
|
||||
} else if(isRun) {
|
||||
break;
|
||||
} else if(!isRun) {
|
||||
//Нужна проверка типа устройства
|
||||
if(reply->error()==QModbusDevice::NoError) {
|
||||
QModbusResponse resp = reply->rawResult();
|
||||
QString result = QString(resp.data().remove(0, MODBUS_REQUEST_PROTOCOL_INFO_LENGTH));
|
||||
//result.remove(0, MODBUS_REQUEST_PROTOCOL_INFO_LENGTH);
|
||||
if(result == QString("KTE")) {
|
||||
auto *subreply = modbusDevice->sendRawRequest(requestOfBoardID, tmp_adr);
|
||||
while(!subreply->isFinished()) {
|
||||
if(isRun && CurrentConnectedDevice < 1) {
|
||||
onConnectClicked();
|
||||
bar->close();
|
||||
bar->deleteLater();
|
||||
return false;
|
||||
} else if(isRun) {
|
||||
break;
|
||||
}
|
||||
QCoreApplication::processEvents();
|
||||
}
|
||||
if(isRun && CurrentConnectedDevice < 1) {
|
||||
onConnectClicked();
|
||||
bar->close();
|
||||
bar->deleteLater();
|
||||
return false;
|
||||
} else if(isRun) {
|
||||
break;
|
||||
} else {
|
||||
//QString boardID(subreply->rawResult().data());
|
||||
//boardID.remove(0, MODBUS_REQUEST_PROTOCOL_INFO_LENGTH);
|
||||
if(Boards[(int)(subreply->rawResult().data().at(MODBUS_REQUEST_PROTOCOL_INFO_LENGTH))-1].isActive) {
|
||||
QMessageBox::warning(this, "Ошибка при сканировании сети.", QString("Платы по адресам %1 и %2 имеют одинаковый ID %3").arg(Boards[(int)subreply->rawResult().data().at(MODBUS_REQUEST_PROTOCOL_INFO_LENGTH)].adr).arg(tmp_adr).arg((int)subreply->rawResult().data().at(MODBUS_REQUEST_PROTOCOL_INFO_LENGTH)));
|
||||
onConnectClicked();
|
||||
bar->close();
|
||||
bar->deleteLater();
|
||||
return false;
|
||||
}
|
||||
CurrentConnectedDevice++;
|
||||
Boards[(int)(subreply->rawResult().data().at(MODBUS_REQUEST_PROTOCOL_INFO_LENGTH))-1].adr = Boards[(int)(subreply->rawResult().data().at(MODBUS_REQUEST_PROTOCOL_INFO_LENGTH))-1]._tmp_adr = tmp_adr;
|
||||
statusBar()->showMessage(tr("Плата %1 найдена по адресу %2.").arg((int)(subreply->rawResult().data().at(MODBUS_REQUEST_PROTOCOL_INFO_LENGTH))-1).arg(tmp_adr), m_settingsDialog->settings().responseTime);
|
||||
Boards[(int)(subreply->rawResult().data().at(MODBUS_REQUEST_PROTOCOL_INFO_LENGTH))-1].isActive = true;
|
||||
bar->setValue(CurrentConnectedDevice);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
tmp_adr++;
|
||||
bar->setLabelText(tr("Поиск плат... Текущий адрес: %1").arg(tmp_adr));
|
||||
if(tmp_adr>=247 && (CurrentConnectedDevice<1))
|
||||
{
|
||||
if(tmp_adr>=247 && (CurrentConnectedDevice<1)) {
|
||||
//ERROR
|
||||
//OUT OF RANGE
|
||||
QMessageBox::warning(this, "Ошибка при сканировании сети.", QString("Выход за пределы допустимых адресов. Найдено %1 плат.").arg(i));
|
||||
QMessageBox::warning(this, "Ошибка при сканировании сети.", QString("Выход за пределы допустимых адресов. Найдено %1 плат.").arg(CurrentConnectedDevice));
|
||||
bar->setValue(4);
|
||||
bar->close();
|
||||
bar->deleteLater();
|
||||
onConnectClicked();
|
||||
return false;
|
||||
}
|
||||
else if(tmp_adr>=247)
|
||||
{
|
||||
} else if(tmp_adr>=247) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
isRun=false;
|
||||
QMessageBox::warning(this, "Сканирование сети завершено.", tr("Найдено плат: %1 из 4.").arg(i));
|
||||
if(isRun)
|
||||
{
|
||||
QMessageBox::warning(this, "Сканирование сети завершено.", tr("Найдено плат: %1 из 4.").arg(CurrentConnectedDevice));
|
||||
if(isRun) {
|
||||
QMessageBox::warning(this, "Ошибка при получении текущих настроек.", QString("Прерывание по запросу пользователя."));
|
||||
onConnectClicked();
|
||||
bar->close();
|
||||
bar->deleteLater();
|
||||
return false;
|
||||
}
|
||||
|
||||
modbusDevice->setTimeout(m_settingsDialog->settings().responseTime);
|
||||
bar->setLabelText(tr("Считывание текущих настроек..."));
|
||||
|
||||
bar->setRange(0, CurrentConnectedDevice*3);
|
||||
QModbusDataUnit* _unit_settings[3];
|
||||
_unit_settings[0] = new QModbusDataUnit(QModbusDataUnit::Coils, 0, 85);
|
||||
_unit_settings[1] = new QModbusDataUnit(QModbusDataUnit::HoldingRegisters, 0, 85);
|
||||
_unit_settings[2] = new QModbusDataUnit(QModbusDataUnit::HoldingRegisters, 85, 85);
|
||||
|
||||
for(i=0; i<CurrentConnectedDevice; i++)
|
||||
{
|
||||
for (int j = 0; j<3; j++)
|
||||
{
|
||||
bar->setValue(i*3+j);
|
||||
if(isRun)
|
||||
{
|
||||
onConnectClicked();
|
||||
return false;
|
||||
}
|
||||
|
||||
timerForPingSignal = false;
|
||||
timer->start(m_settingsDialog->settings().responseTime);
|
||||
auto *reply = modbusDevice->sendReadRequest(*_unit_settings[j], Boards[i].adr);
|
||||
while(!reply->isFinished() && !timerForPingSignal)
|
||||
{
|
||||
if(isRun)
|
||||
{
|
||||
for(int i=0; i<4; i++) {
|
||||
if(Boards[i].isActive) {
|
||||
Boards_Fields[i]->setEnabled(true);
|
||||
for(int j = 0; j<3; j++) {
|
||||
bar->setValue(i*3+j);
|
||||
if(isRun) {
|
||||
onConnectClicked();
|
||||
bar->close();
|
||||
bar->deleteLater();
|
||||
return false;
|
||||
}
|
||||
QCoreApplication::processEvents();
|
||||
}
|
||||
if(timerForPingSignal)
|
||||
{
|
||||
QMessageBox::warning(this, "Ошибка при получении текущих настроек.", QString("Таймаут при опросе устройства %1 по адресу %2").arg(i).arg(Boards[i].adr));
|
||||
onConnectClicked();
|
||||
return false;
|
||||
}
|
||||
else
|
||||
{
|
||||
if(reply->error()==QModbusDevice::NoError)
|
||||
{
|
||||
timer->stop();
|
||||
stepForScanCurrentSettings(reply);
|
||||
auto *reply = modbusDevice->sendReadRequest(*_unit_settings[j], Boards[i].adr);
|
||||
if(!reply) {
|
||||
onConnectClicked();
|
||||
bar->close();
|
||||
bar->deleteLater();
|
||||
return false;
|
||||
}
|
||||
else
|
||||
{
|
||||
QMessageBox::warning(this, "Ошибка при получении текущих настроек.", QString("Таймаут при опросе устройства %1 по адресу %2").arg(i).arg(Boards[i].adr));
|
||||
while(!reply->isFinished()) {
|
||||
if(isRun) {
|
||||
QMessageBox::warning(this, "Ошибка при получении текущих настроек.", QString("Прерывание по запросу пользователя."));
|
||||
onConnectClicked();
|
||||
bar->close();
|
||||
bar->deleteLater();
|
||||
return false;
|
||||
}
|
||||
QCoreApplication::processEvents();
|
||||
}
|
||||
if(reply->error()==QModbusDevice::NoError) {
|
||||
applySettingsFromScan(reply);
|
||||
} else {
|
||||
QMessageBox::warning(this, "Ошибка при получении текущих настроек.", QString("Таймаут при опросе устройства %1 по адресу %2").arg(i+1).arg(Boards[i].adr));
|
||||
bar->setValue(CurrentConnectedDevice*3);
|
||||
bar->close();
|
||||
bar->deleteLater();
|
||||
onConnectClicked();
|
||||
return false;
|
||||
}
|
||||
}
|
||||
Boards_Fields[i]->setTitle(QString("Плата №%1 (ID %2)").arg(i+1).arg(Boards[i].adr));
|
||||
}
|
||||
}
|
||||
modbusDevice->setNumberOfRetries(m_settingsDialog->settings().numberOfRetries);
|
||||
beginScanBoards();
|
||||
bar->deleteLater();
|
||||
return true;
|
||||
|
||||
}
|
||||
|
||||
void M3KTE::timeForPingIsGone()
|
||||
{
|
||||
timerForPingSignal=true;
|
||||
}
|
||||
|
||||
void M3KTE::beginScanBoards()
|
||||
{
|
||||
if(CurrentConnectedDevice>=1)
|
||||
firstBoardScan();
|
||||
if(CurrentConnectedDevice>=2)
|
||||
secondBoardScan();
|
||||
if(CurrentConnectedDevice>=3)
|
||||
thirdBoardScan();
|
||||
if(CurrentConnectedDevice>=4)
|
||||
fourthBoardScan();
|
||||
{
|
||||
for(int i = 0; i < 4; i++) {
|
||||
if(Boards[i].isActive) {
|
||||
m_deviceSettingsDialog->initPollForBoard(i+1, Boards[i].adr);
|
||||
boardScan(i);
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
void M3KTE::firstBoardScan()
|
||||
void M3KTE::boardScan(unsigned boardID)
|
||||
{
|
||||
if (!modbusDevice)
|
||||
if(!modbusDevice)
|
||||
return;
|
||||
QModbusDataUnit* _unit = new QModbusDataUnit(QModbusDataUnit::InputRegisters, 85, 1);
|
||||
statusBar()->clearMessage();
|
||||
|
||||
QModbusDataUnit* _unit = new QModbusDataUnit(QModbusDataUnit::InputRegisters, 0, 85);
|
||||
statusBar()->clearMessage();
|
||||
|
||||
if (auto *reply = modbusDevice->sendReadRequest(*_unit, Boards[0].adr)) {
|
||||
if (!reply->isFinished())
|
||||
connect(reply, &QModbusReply::finished, this, &M3KTE::firstBoardReady);
|
||||
else
|
||||
delete reply; // broadcast replies return immediately
|
||||
} else {
|
||||
QMessageBox::warning(this, QString("Ошибка при опросе платы #%1").arg(1), QString(tr("Read error: ") + modbusDevice->errorString()));
|
||||
statusBar()->showMessage(tr("Read error: ") + modbusDevice->errorString(), 5000);
|
||||
if(auto *reply = modbusDevice->sendReadRequest(*_unit, Boards[boardID].adr)) {
|
||||
Boards[boardID].timerToStatusResponse.start();
|
||||
if(!reply->isFinished())
|
||||
connect(reply, &QModbusReply::finished, this, [this, boardID, reply]() {
|
||||
Boards[boardID].timerStatus->setText(QString("Status: %1 ms").arg(Boards[boardID].timerToStatusResponse.elapsed()));
|
||||
if(reply->error()==QModbusDevice::NoError) {
|
||||
statusreg StatusReg;
|
||||
StatusReg.AllReg = reply->result().value(0);
|
||||
if(StatusReg.ParsingReg.poll_allowed) {
|
||||
Boards[boardID].boardScanners->start(m_deviceSettingsDialog->currentBoardTimer(boardID));
|
||||
return;
|
||||
}
|
||||
if(StatusReg.ParsingReg.mzkte_status) {
|
||||
switch(StatusReg.ParsingReg.mzkte_error) {
|
||||
case 1:
|
||||
Boards[boardID].boardScanners->start(m_deviceSettingsDialog->currentBoardTimer(boardID));
|
||||
return;
|
||||
case 2:
|
||||
Boards[boardID].boardScanners->start(m_deviceSettingsDialog->currentBoardTimer(boardID));
|
||||
return;
|
||||
case 3:
|
||||
Boards[boardID].boardScanners->start(m_deviceSettingsDialog->currentBoardTimer(boardID));
|
||||
return;
|
||||
case 4:
|
||||
break;
|
||||
case 5:
|
||||
break;
|
||||
case 6:
|
||||
break;
|
||||
case 7:
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
QModbusDataUnit* _unit = new QModbusDataUnit(QModbusDataUnit::InputRegisters, 0, 85);
|
||||
if(auto *subreply = modbusDevice->sendReadRequest(*_unit, Boards[boardID].adr)) {
|
||||
Boards[boardID].timerToDataResponse.start();
|
||||
if(!subreply->isFinished()) {
|
||||
connect(subreply, &QModbusReply::finished, this, [this, boardID]() {
|
||||
Boards[boardID].timerData->setText(QString("Data: %1 ms").arg(Boards[boardID].timerToStatusResponse.elapsed()));
|
||||
auto subreply = qobject_cast<QModbusReply *>(sender());
|
||||
displayResultOfScan(subreply, boardID);
|
||||
subreply->deleteLater();
|
||||
Boards[boardID].boardScanners->start(m_deviceSettingsDialog->currentBoardTimer(boardID));
|
||||
});
|
||||
} else {
|
||||
Boards[boardID].timerToDataResponse.elapsed();
|
||||
logError(tr("Плата %1 (ID %2)").arg(boardID+1).arg(Boards[boardID].adr),
|
||||
modbusDevice->errorString(), ++Boards[boardID].error_TX, "");
|
||||
Boards[boardID].boardScanners->start(m_deviceSettingsDialog->currentBoardTimer(boardID));
|
||||
delete subreply;
|
||||
}
|
||||
} else {
|
||||
logError(tr("Плата %1 (ID %2)").arg(boardID+1).arg(Boards[boardID].adr),
|
||||
modbusDevice->errorString(), ++Boards[boardID].error_TX, "");
|
||||
Boards[boardID].boardScanners->start(m_deviceSettingsDialog->currentBoardTimer(boardID));
|
||||
delete subreply;
|
||||
}
|
||||
} else {
|
||||
logError(tr("Плата %1 (ID %2)").arg(boardID+1).arg(Boards[boardID].adr),
|
||||
reply->errorString(), ++Boards[boardID].error_TX, "");
|
||||
}
|
||||
});
|
||||
else {
|
||||
Boards[boardID].timerToStatusResponse.elapsed();
|
||||
logError(tr("Плата %1 (ID %2)").arg(boardID+1).arg(Boards[boardID].adr),
|
||||
modbusDevice->errorString(), ++Boards[boardID].error_TX, "");
|
||||
Boards[boardID].boardScanners->start(m_deviceSettingsDialog->currentBoardTimer(boardID));
|
||||
delete reply; // broadcast replies return immediately
|
||||
}
|
||||
}
|
||||
|
||||
void M3KTE::secondBoardScan()
|
||||
{
|
||||
if (!modbusDevice)
|
||||
return;
|
||||
|
||||
QModbusDataUnit* _unit = new QModbusDataUnit(QModbusDataUnit::InputRegisters, 0, 85);
|
||||
statusBar()->clearMessage();
|
||||
|
||||
if (auto *reply = modbusDevice->sendReadRequest(*_unit, Boards[1].adr)) {
|
||||
if (!reply->isFinished())
|
||||
connect(reply, &QModbusReply::finished, this, &M3KTE::secondBoardReady);
|
||||
else
|
||||
delete reply; // broadcast replies return immediately
|
||||
} else {
|
||||
QMessageBox::warning(this, QString("Ошибка при опросе платы #%1").arg(2), QString(tr("Read error: ") + modbusDevice->errorString()));
|
||||
statusBar()->showMessage(tr("Read error: ") + modbusDevice->errorString(), 5000);
|
||||
}
|
||||
}
|
||||
|
||||
void M3KTE::thirdBoardScan()
|
||||
{
|
||||
if (!modbusDevice)
|
||||
return;
|
||||
|
||||
QModbusDataUnit* _unit = new QModbusDataUnit(QModbusDataUnit::InputRegisters, 0, 85);
|
||||
statusBar()->clearMessage();
|
||||
|
||||
if (auto *reply = modbusDevice->sendReadRequest(*_unit, Boards[2].adr)) {
|
||||
if (!reply->isFinished())
|
||||
connect(reply, &QModbusReply::finished, this, &M3KTE::thirdBoardReady);
|
||||
else
|
||||
delete reply; // broadcast replies return immediately
|
||||
} else {
|
||||
QMessageBox::warning(this, QString("Ошибка при опросе платы #%1").arg(3), QString(tr("Read error: ") + modbusDevice->errorString()));
|
||||
statusBar()->showMessage(tr("Read error: ") + modbusDevice->errorString(), 5000);
|
||||
}
|
||||
}
|
||||
|
||||
void M3KTE::fourthBoardScan()
|
||||
{
|
||||
if (!modbusDevice)
|
||||
return;
|
||||
|
||||
QModbusDataUnit* _unit = new QModbusDataUnit(QModbusDataUnit::InputRegisters, 0, 85);
|
||||
statusBar()->clearMessage();
|
||||
|
||||
if (auto *reply = modbusDevice->sendReadRequest(*_unit, Boards[3].adr)) {
|
||||
if (!reply->isFinished())
|
||||
connect(reply, &QModbusReply::finished, this, &M3KTE::fourthBoardReady);
|
||||
else
|
||||
delete reply; // broadcast replies return immediately
|
||||
} else {
|
||||
QMessageBox::warning(this, QString("Ошибка при опросе платы #%1").arg(4), QString(tr("Read error: ") + modbusDevice->errorString()));
|
||||
statusBar()->showMessage(tr("Read error: ") + modbusDevice->errorString(), 5000);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void M3KTE::firstBoardReady()
|
||||
{
|
||||
auto reply = qobject_cast<QModbusReply *>(sender());
|
||||
displayResultOfScan(reply, 0);
|
||||
reply->deleteLater();
|
||||
Boards[0].boardScanners->start(m_deviceSettingsDialog->currentBoardTimer(0));
|
||||
}
|
||||
|
||||
void M3KTE::secondBoardReady()
|
||||
{
|
||||
auto reply = qobject_cast<QModbusReply *>(sender());
|
||||
displayResultOfScan(reply, 1);
|
||||
reply->deleteLater();
|
||||
Boards[1].boardScanners->start(m_deviceSettingsDialog->currentBoardTimer(1));
|
||||
}
|
||||
|
||||
void M3KTE::thirdBoardReady()
|
||||
{
|
||||
auto reply = qobject_cast<QModbusReply *>(sender());
|
||||
displayResultOfScan(reply, 2);
|
||||
reply->deleteLater();
|
||||
Boards[2].boardScanners->start(m_deviceSettingsDialog->currentBoardTimer(2));
|
||||
}
|
||||
|
||||
void M3KTE::fourthBoardReady()
|
||||
{
|
||||
auto reply = qobject_cast<QModbusReply *>(sender());
|
||||
displayResultOfScan(reply, 3);
|
||||
reply->deleteLater();
|
||||
Boards[3].boardScanners->start(m_deviceSettingsDialog->currentBoardTimer(3));
|
||||
} else {
|
||||
// QMessageBox::warning(this, QString("Ошибка при опросе платы #%1").arg(boardID+1), QString(tr("Read error: ") + modbusDevice->errorString()));
|
||||
// statusBar()->showMessage(tr("Read error: ") + modbusDevice->errorString(), 5000);
|
||||
logError(tr("Плата %1 (ID %2)").arg(boardID+1).arg(Boards[boardID].adr),
|
||||
modbusDevice->errorString(), ++Boards[boardID].error_TX, "");
|
||||
}
|
||||
}
|
||||
|
||||
void M3KTE::displayResultOfScan(QModbusReply *reply, int boardID)
|
||||
{
|
||||
if (!reply)
|
||||
if(!reply)
|
||||
return;
|
||||
|
||||
if (reply->error() == QModbusDevice::NoError) {
|
||||
|
||||
if(reply->error() == QModbusDevice::NoError) {
|
||||
const QModbusDataUnit unit = reply->result();
|
||||
bool W_Flag = false;
|
||||
bool A_Flag = false;
|
||||
if(unit.startAddress() != 0 || unit.valueCount() != 85)
|
||||
{
|
||||
if(unit.startAddress() != 0 || unit.valueCount() != 85) {
|
||||
//ERROR
|
||||
//QMessageBox::warning(this, QString("Ошибка при опросе платы #%1").arg(boardID), QString("Принятый ответ: Стартовый адрес %1, Количество элементов %2").arg(unit.startAddress()).arg(unit.valueCount()));
|
||||
logError(tr("Плата %1 (ID %2)").arg(boardID+1).arg(Boards[boardID].adr),
|
||||
"Ошибка при приёме.", ++Boards[boardID].error_RX,
|
||||
tr("Принятый ответ: Стартовый адрес %1, Количество элементов %2").arg(unit.startAddress()).arg(unit.valueCount()));
|
||||
reply->deleteLater();
|
||||
QMessageBox::warning(this, QString("Ошибка при опросе платы #%1").arg(boardID), QString("Принятый ответ: Стартовый адрес %1, Количество элементов %2").arg(unit.startAddress()).arg(unit.valueCount()));
|
||||
return;
|
||||
}
|
||||
|
||||
for(int i = unit.startAddress(), total = int(unit.valueCount()); i < total; ++i)
|
||||
{
|
||||
//QErrorMessage::showMessage()
|
||||
//if(Boards[boardID].ModbusModelCoil->data(Boards[boardID].ModbusModelCoil->index(i, 2), Qt::CheckStateRole).Bool != 0)
|
||||
//if(Boards[boardID].ModbusModelCoil->get_coil(Boards[boardID].ModbusModelCoil->index(i, 2))==true)
|
||||
if(Boards[boardID].coil[i]==true)
|
||||
{
|
||||
QString W_Adr;
|
||||
QString A_Adr;
|
||||
for(int i = unit.startAddress(), total = int(unit.valueCount()); i < total; ++i) {
|
||||
if(Boards[boardID].coil[i]==true) {
|
||||
int j = 0;
|
||||
//if(Boards[boardID].ModbusModelHoldingReg->get_holreg(Boards[boardID].ModbusModelHoldingReg->index(85+i, 3)) > unit.value(i))
|
||||
if(Boards[boardID].HR[i + 85] > unit.value(i))
|
||||
{
|
||||
if(Boards[boardID].HR[i + 85] > unit.value(i)) {
|
||||
j = 1;
|
||||
if(j != m_ProgressBar[i+boardID*85]->value()) {
|
||||
A_Adr += tr("ТЭ%1 ").arg(i);
|
||||
Boards[boardID].error_A++;
|
||||
}
|
||||
m_ProgressBar[i+boardID*85]->setStatusTip(QString("П%1 ТЭ%2: Аварийный уровень напряжения.").arg(QString::number(boardID+1), QString::number(i%85)));
|
||||
m_ProgressBar[i+boardID*85]->setWhatsThis(QString("П%1 ТЭ%2: Аварийный уровень напряжения.").arg(QString::number(boardID+1), QString::number(i%85)));
|
||||
A_Flag = true;
|
||||
}
|
||||
//else if(Boards[boardID].ModbusModelHoldingReg->get_holreg(Boards[boardID].ModbusModelHoldingReg->index(i, 3)) > unit.value(i))
|
||||
else if(Boards[boardID].HR[i] > unit.value(i))
|
||||
{
|
||||
} else if(Boards[boardID].HR[i] > unit.value(i)) {
|
||||
j = 2;
|
||||
if(j != m_ProgressBar[i+boardID*85]->value()) {
|
||||
W_Adr += tr("ТЭ%1 ").arg(i);
|
||||
Boards[boardID].error_W++;
|
||||
}
|
||||
m_ProgressBar[i+boardID*85]->setStatusTip(QString("П%1 ТЭ%2: Предупредительный уровень напряжения.").arg(QString::number(boardID+1), QString::number(i%85)));
|
||||
m_ProgressBar[i+boardID*85]->setWhatsThis(QString("П%1 ТЭ%2: Предупредительный уровень напряжения.").arg(QString::number(boardID+1), QString::number(i%85)));
|
||||
W_Flag = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
j = 3;
|
||||
m_ProgressBar[i+boardID*85]->setStatusTip(QString("П%1 ТЭ%2: Уровень напряжения в норме.").arg(QString::number(boardID+1), QString::number(i%85)));
|
||||
m_ProgressBar[i+boardID*85]->setWhatsThis(QString("П%1 ТЭ%2: Уровень напряжения в норме.").arg(QString::number(boardID+1), QString::number(i%85)));
|
||||
@@ -1352,9 +1653,7 @@ void M3KTE::displayResultOfScan(QModbusReply *reply, int boardID)
|
||||
m_ProgressBar[i+boardID*85]->setValue(j);
|
||||
QString style_fc = "QProgressBar {border: 2px solid black; font: bold 10px} QProgressBar::chunk {background: hsva(" + QString::number(j*50-50) + ", 255, 255, 100%);} ";
|
||||
m_ProgressBar[i+boardID*85]->setStyleSheet(style_fc);
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
m_ProgressBar[i+boardID*85]->setValue(3);
|
||||
m_ProgressBar[i+boardID*85]->setStatusTip(QString("П%1 ТЭ%2: Топливный Элемент не учитывается.").arg(QString::number(boardID+1), QString::number(i%85)));
|
||||
m_ProgressBar[i+boardID*85]->setWhatsThis(QString("П%1 ТЭ%2: Топливный Элемент не учитывается.").arg(QString::number(boardID+1), QString::number(i%85)));
|
||||
@@ -1364,104 +1663,108 @@ void M3KTE::displayResultOfScan(QModbusReply *reply, int boardID)
|
||||
Boards[boardID].ModbusModelCoil->set_currentU(unit.value(i), i);
|
||||
Boards[boardID].ModbusModelHoldingReg->set_currentU(unit.value(i), i);
|
||||
}
|
||||
if(A_Flag)
|
||||
Boards[boardID].ModbusModelCoil->dataChanged(ui->writeValueTable->model()->index(unit.startAddress(), 2),
|
||||
ui->writeValueTable->model()->index(unit.startAddress() + unit.valueCount() -1, 2));
|
||||
Boards[boardID].ModbusModelHoldingReg->dataChanged(ui->writeValueTable->model()->index(unit.startAddress(), 3),
|
||||
ui->writeValueTable->model()->index(unit.startAddress() + unit.valueCount() -1, 3));
|
||||
if(A_Flag) {
|
||||
statusM3KTE.Accidents[boardID] = true;
|
||||
else
|
||||
statusM3KTE.Accidents[boardID] = false;
|
||||
if(W_Flag)
|
||||
logError(tr("Плата %1 (ID %2)").arg(boardID+1).arg(Boards[boardID].adr),
|
||||
"Авария", Boards[boardID].error_A, A_Adr);
|
||||
} else
|
||||
statusM3KTE.Accidents[boardID] = false;
|
||||
if(W_Flag) {
|
||||
statusM3KTE.Warnings[boardID] = true;
|
||||
else
|
||||
logError(tr("Плата %1 (ID %2)").arg(boardID+1).arg(Boards[boardID].adr),
|
||||
"Предупреждение", Boards[boardID].error_W, W_Adr);
|
||||
} else
|
||||
statusM3KTE.Warnings[boardID] = false;
|
||||
|
||||
ui->BSM_Warning->setChecked(false);
|
||||
ui->BSM_Accident->setChecked(false);
|
||||
ui->BSM_WorkInProgress->setChecked(true);
|
||||
for(int i = 0; i < 4; i++)
|
||||
{
|
||||
if(statusM3KTE.Accidents[i])
|
||||
{
|
||||
for(int i = 0; i < 4; i++) {
|
||||
if(statusM3KTE.Accidents[i]) {
|
||||
ui->BSM_WorkInProgress->setChecked(false);
|
||||
ui->BSM_Warning->setChecked(false);
|
||||
ui->BSM_Accident->setChecked(true);
|
||||
break;
|
||||
}
|
||||
if(statusM3KTE.Warnings[i])
|
||||
{
|
||||
if(statusM3KTE.Warnings[i]) {
|
||||
ui->BSM_WorkInProgress->setChecked(false);
|
||||
ui->BSM_Accident->setChecked(false);
|
||||
ui->BSM_Warning->setChecked(true);
|
||||
}
|
||||
}
|
||||
} else if (reply->error() == QModbusDevice::ProtocolError) {
|
||||
} else if(reply->error() == QModbusDevice::ProtocolError) {
|
||||
statusBar()->showMessage(tr("Read response error: %1 (Mobus exception: 0x%2)").
|
||||
arg(reply->errorString()).
|
||||
arg(reply->rawResult().exceptionCode(), -1, 16), 5000);
|
||||
arg(reply->errorString()).
|
||||
arg(reply->rawResult().exceptionCode(), -1, 16), 5000);
|
||||
logError(tr("Плата %1 (ID %2)").arg(boardID+1).arg(Boards[boardID].adr),
|
||||
reply->errorString(), ++Boards[boardID].error_RX,
|
||||
QString("Mobus exception: 0x%1").arg(reply->rawResult().exceptionCode(), -1, 16));
|
||||
} else {
|
||||
statusBar()->showMessage(tr("Read response error: %1 (code: 0x%2)").
|
||||
arg(reply->errorString()).
|
||||
arg(reply->error(), -1, 16), 5000);
|
||||
arg(reply->errorString()).
|
||||
arg(reply->error(), -1, 16), 5000);
|
||||
logError(tr("Плата %1 (ID %2)").arg(boardID+1).arg(Boards[boardID].adr),
|
||||
reply->errorString(), ++Boards[boardID].error_RX,
|
||||
QString::number(reply->error(), 16));
|
||||
}
|
||||
reply->deleteLater();
|
||||
}
|
||||
|
||||
void M3KTE::stepForScanCurrentSettings(QModbusReply *reply)
|
||||
void M3KTE::applySettingsFromScan(QModbusReply *reply)
|
||||
{
|
||||
if (reply->error() == QModbusDevice::NoError) {
|
||||
const QModbusDataUnit unit = reply->result();
|
||||
int Adr = 255;
|
||||
for(int i = 0; i < 4; i++)
|
||||
{
|
||||
if(Boards[i].adr==reply->serverAddress())
|
||||
{
|
||||
Adr = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
for (int i = 0, total = int(unit.valueCount()); i < (total); ++i) {
|
||||
//ui->readValue->addItem(entry);
|
||||
if(unit.registerType() == QModbusDataUnit::Coils)
|
||||
{
|
||||
Boards[Adr].coil[i + unit.startAddress()] = unit.value(i);
|
||||
//QStandardItem *item = ui->writeValueTable->model()->item
|
||||
if(unit.value(i)==1)
|
||||
{
|
||||
Boards[Adr].ModbusModelCoil->setData(ui->writeValueTable->model()->index(i + unit.startAddress(), 2), Qt::Checked, Qt::CheckStateRole);
|
||||
}
|
||||
else
|
||||
{
|
||||
Boards[Adr].ModbusModelCoil->setData(ui->writeValueTable->model()->index(i + unit.startAddress(), 2), Qt::Unchecked, Qt::CheckStateRole);
|
||||
}
|
||||
|
||||
}
|
||||
else if(unit.registerType() == QModbusDataUnit::HoldingRegisters)
|
||||
{
|
||||
Boards[Adr].HR[i + unit.startAddress()] = unit.value(i);
|
||||
Boards[Adr].ModbusModelHoldingReg->setData(Boards[Adr].ModbusModelHoldingReg->index(i + unit.startAddress(), 3), QString::number(unit.value(i), 16), Qt::EditRole);
|
||||
}
|
||||
}
|
||||
} else if (reply->error() == QModbusDevice::ProtocolError) {
|
||||
statusBar()->showMessage(tr("Read response error: %1 (Mobus exception: 0x%2)").
|
||||
arg(reply->errorString()).
|
||||
arg(reply->rawResult().exceptionCode(), -1, 16), 5000);
|
||||
} else {
|
||||
statusBar()->showMessage(tr("Read response error: %1 (code: 0x%2)").
|
||||
arg(reply->errorString()).
|
||||
arg(reply->error(), -1, 16), 5000);
|
||||
int Adr = 255;
|
||||
for(int i = 0; i < 4; i++) {
|
||||
if(Boards[i].adr==reply->serverAddress() &&Boards[i].isActive) {
|
||||
Adr = i;
|
||||
break;
|
||||
}
|
||||
|
||||
reply->deleteLater();
|
||||
}
|
||||
if(reply->error() == QModbusDevice::NoError) {
|
||||
const QModbusDataUnit unit = reply->result();
|
||||
for(int i = 0, total = int(unit.valueCount()); i < (total); ++i) {
|
||||
if(unit.registerType() == QModbusDataUnit::Coils) {
|
||||
Boards[Adr].coil[i + unit.startAddress()] = unit.value(i);
|
||||
if(unit.value(i)==1) {
|
||||
Boards[Adr].ModbusModelCoil->setData(ui->writeValueTable->model()->index(i + unit.startAddress(), 2), Qt::Checked, Qt::CheckStateRole);
|
||||
} else {
|
||||
Boards[Adr].ModbusModelCoil->setData(ui->writeValueTable->model()->index(i + unit.startAddress(), 2), Qt::Unchecked, Qt::CheckStateRole);
|
||||
}
|
||||
} else if(unit.registerType() == QModbusDataUnit::HoldingRegisters) {
|
||||
Boards[Adr].HR[i + unit.startAddress()] = unit.value(i);
|
||||
Boards[Adr].ModbusModelHoldingReg->setData(Boards[Adr].ModbusModelHoldingReg->index(i + unit.startAddress(), 3), QString::number(unit.value(i), 16), Qt::EditRole);
|
||||
}
|
||||
}
|
||||
} else if(reply->error() == QModbusDevice::ProtocolError) {
|
||||
statusBar()->showMessage(tr("Read response error: %1 (Mobus exception: 0x%2)").
|
||||
arg(reply->errorString()).
|
||||
arg(reply->rawResult().exceptionCode(), -1, 16), 5000);
|
||||
logError(tr("Плата %1 (ID %2)").arg(Adr+1).arg(Boards[Adr].adr),
|
||||
reply->errorString(), ++Boards[Adr].error_RX,
|
||||
QString("Mobus exception: 0x%1").arg(reply->rawResult().exceptionCode(), -1, 16));
|
||||
} else {
|
||||
statusBar()->showMessage(tr("Read response error: %1 (code: 0x%2)").
|
||||
arg(reply->errorString()).
|
||||
arg(reply->error(), -1, 16), 5000);
|
||||
logError(tr("Плата %1 (ID %2)").arg(Adr+1).arg(Boards[Adr].adr),
|
||||
reply->errorString(), ++Boards[Adr].error_RX,
|
||||
QString::number(reply->error(), 16));
|
||||
}
|
||||
reply->deleteLater();
|
||||
}
|
||||
|
||||
void M3KTE::slotmultipleRegWrite()
|
||||
{
|
||||
if (!modbusDevice)
|
||||
if(!modbusDevice)
|
||||
return;
|
||||
multipleRegWrite();
|
||||
}
|
||||
|
||||
void M3KTE::slotmultipleRegWriteAndSend()
|
||||
{
|
||||
if (!modbusDevice)
|
||||
if(!modbusDevice)
|
||||
return;
|
||||
multipleRegWrite();
|
||||
multipleRegSend();
|
||||
@@ -1470,36 +1773,36 @@ void M3KTE::slotmultipleRegWriteAndSend()
|
||||
void M3KTE::multipleRegSend()
|
||||
{
|
||||
QModbusDataUnit *unit_tx = nullptr;
|
||||
if(m_regMultipleSettings->getTypeReg())
|
||||
{
|
||||
if(m_regMultipleSettings->getTypeReg()) {
|
||||
unit_tx = new QModbusDataUnit(QModbusDataUnit::HoldingRegisters, m_regMultipleSettings->getStartAdr(), m_regMultipleSettings->getCountReg());
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
unit_tx = new QModbusDataUnit(QModbusDataUnit::Coils, m_regMultipleSettings->getStartAdr(), m_regMultipleSettings->getCountReg());
|
||||
}
|
||||
for (unsigned i = 0; i < m_regMultipleSettings->getCountReg(); i++) {
|
||||
for(unsigned i = 0; i < m_regMultipleSettings->getCountReg(); i++) {
|
||||
unit_tx->setValue(i, m_regMultipleSettings->getNewValue());
|
||||
if(m_regMultipleSettings->getTypeReg())
|
||||
{
|
||||
if(m_regMultipleSettings->getTypeReg()) {
|
||||
Boards[m_regMultipleSettings->getBoardId()].HR[i+m_regMultipleSettings->getStartAdr()] = m_regMultipleSettings->getNewValue();
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
Boards[m_regMultipleSettings->getBoardId()].coil[i+m_regMultipleSettings->getStartAdr()] = m_regMultipleSettings->getNewValue();
|
||||
}
|
||||
}
|
||||
|
||||
if (auto *reply = modbusDevice->sendWriteRequest(*unit_tx, Boards[m_regMultipleSettings->getBoardId()].adr)) {
|
||||
if (!reply->isFinished()) {
|
||||
connect(reply, &QModbusReply::finished, this, [this, reply]() {
|
||||
if (reply->error() == QModbusDevice::ProtocolError) {
|
||||
if(auto *reply = modbusDevice->sendWriteRequest(*unit_tx, Boards[m_regMultipleSettings->getBoardId()].adr)) {
|
||||
unsigned Adr = m_regMultipleSettings->getBoardId();
|
||||
if(!reply->isFinished()) {
|
||||
connect(reply, &QModbusReply::finished, this, [this, reply, Adr]() {
|
||||
if(reply->error() == QModbusDevice::ProtocolError) {
|
||||
statusBar()->showMessage(tr("Write response error: %1 (Mobus exception: 0x%2)")
|
||||
.arg(reply->errorString()).arg(reply->rawResult().exceptionCode(), -1, 16),
|
||||
5000);
|
||||
} else if (reply->error() != QModbusDevice::NoError) {
|
||||
.arg(reply->errorString()).arg(reply->rawResult().exceptionCode(), -1, 16),
|
||||
5000);
|
||||
logError(tr("Плата %1 (ID %2)").arg(Adr+1).arg(Boards[Adr].adr),
|
||||
reply->errorString(), ++Boards[Adr].error_TX,
|
||||
QString("Mobus exception: 0x%1").arg(reply->rawResult().exceptionCode(), -1, 16));
|
||||
} else if(reply->error() != QModbusDevice::NoError) {
|
||||
statusBar()->showMessage(tr("Write response error: %1 (code: 0x%2)").
|
||||
arg(reply->errorString()).arg(reply->error(), -1, 16), 5000);
|
||||
arg(reply->errorString()).arg(reply->error(), -1, 16), 5000);
|
||||
logError(tr("Плата %1 (ID %2)").arg(Adr+1).arg(Boards[Adr].adr),
|
||||
reply->errorString(), ++Boards[Adr].error_TX,
|
||||
QString::number(reply->error(), 16));
|
||||
}
|
||||
reply->deleteLater();
|
||||
});
|
||||
@@ -1514,15 +1817,10 @@ void M3KTE::multipleRegSend()
|
||||
|
||||
void M3KTE::multipleRegWrite()
|
||||
{
|
||||
for (unsigned i = 0; i < m_regMultipleSettings->getCountReg(); i++) {
|
||||
if(m_regMultipleSettings->getTypeReg())
|
||||
{
|
||||
//Boards[m_regMultipleSettings->getBoardId()].HR[i] = m_regMultipleSettings->getNewValue();
|
||||
for(unsigned i = 0; i < m_regMultipleSettings->getCountReg(); i++) {
|
||||
if(m_regMultipleSettings->getTypeReg()) {
|
||||
Boards[m_regMultipleSettings->getBoardId()].ModbusModelHoldingReg->m_holdingRegisters[i+m_regMultipleSettings->getStartAdr()] = m_regMultipleSettings->getNewValue();
|
||||
}
|
||||
else
|
||||
{
|
||||
//Boards[m_regMultipleSettings->getBoardId()].coil[i] = m_regMultipleSettings->getNewValue();
|
||||
} else {
|
||||
Boards[m_regMultipleSettings->getBoardId()].ModbusModelCoil->m_coils[i+m_regMultipleSettings->getStartAdr()] = (bool)m_regMultipleSettings->getNewValue();
|
||||
}
|
||||
}
|
||||
@@ -1534,5 +1832,178 @@ void M3KTE::selectPositionOnTree(unsigned int index)
|
||||
QModelIndex selected = ui->writeValueTable->model()->index(index%85, 0);
|
||||
ui->writeValueTable->selectionModel()->select(selected, QItemSelectionModel::ClearAndSelect |QItemSelectionModel::Rows);
|
||||
ui->writeValueTable->scrollTo(selected);
|
||||
//selection
|
||||
}
|
||||
|
||||
bool M3KTE::autoBaudRateScan()
|
||||
{
|
||||
unsigned countOfDeviceOnLine = 0;
|
||||
QString resultOfScan;
|
||||
QVector<unsigned> KTE[8];
|
||||
|
||||
modbusDevice->setConnectionParameter(QModbusDevice::SerialPortNameParameter,
|
||||
m_settingsDialog->settings().portName);
|
||||
#if QT_CONFIG(modbus_serialport)
|
||||
modbusDevice->setConnectionParameter(QModbusDevice::SerialParityParameter,
|
||||
m_settingsDialog->settings().parity);
|
||||
modbusDevice->setConnectionParameter(QModbusDevice::SerialDataBitsParameter,
|
||||
m_settingsDialog->settings().dataBits);
|
||||
modbusDevice->setConnectionParameter(QModbusDevice::SerialStopBitsParameter,
|
||||
m_settingsDialog->settings().stopBits);
|
||||
#endif
|
||||
|
||||
modbusDevice->setTimeout(50);
|
||||
modbusDevice->setNumberOfRetries(0);
|
||||
uint m_baud[] = {9600, 14400, 19200, 31250, 38400, 56000, 57600, 115200};
|
||||
|
||||
bool isRun = false;
|
||||
bool *tmp_isRun = &isRun;
|
||||
auto bar = new QProgressDialog(this);
|
||||
connect(bar, &QProgressDialog::canceled, this, [tmp_isRun]() {
|
||||
*tmp_isRun = true;
|
||||
});
|
||||
|
||||
bar->setCancelButton(nullptr);
|
||||
bar->setRange(0, 8);
|
||||
bar->setMinimumDuration(100);
|
||||
bar->setValue(0);
|
||||
|
||||
QModbusRequest requestOfDeviceType(QModbusRequest::EncapsulatedInterfaceTransport, QByteArray::fromHex("0E0404"));
|
||||
|
||||
for(int i = 0; i < 8; i++) {
|
||||
bar->setValue(i);
|
||||
bar->setLabelText(tr("Поиск плат... Текущая скорость: %1").arg(m_baud[i]));
|
||||
modbusDevice->setConnectionParameter(QModbusDevice::SerialBaudRateParameter,
|
||||
m_baud[i]);
|
||||
if(!modbusDevice->connectDevice()) {
|
||||
statusBar()->showMessage(tr("Connect failed: ") + modbusDevice->errorString(), 5000);
|
||||
}
|
||||
for(int tmp_adr = 1; tmp_adr < 248; tmp_adr++) {
|
||||
auto *reply = modbusDevice->sendRawRequest(requestOfDeviceType, tmp_adr);
|
||||
//auto *reply = modbusDevice->sendReadRequest(*_unit, tmp_adr);
|
||||
//Запрос типа устройства.
|
||||
if(reply == nullptr) {
|
||||
onConnectClicked();
|
||||
bar->close();
|
||||
bar->deleteLater();
|
||||
return false;
|
||||
}
|
||||
while(!reply->isFinished()) {
|
||||
if(isRun) {
|
||||
onConnectClicked();
|
||||
bar->close();
|
||||
bar->deleteLater();
|
||||
return false;
|
||||
}
|
||||
QCoreApplication::processEvents();
|
||||
}
|
||||
if(isRun) {
|
||||
onConnectClicked();
|
||||
bar->close();
|
||||
bar->deleteLater();
|
||||
return false;
|
||||
} else if(!isRun) {
|
||||
//Нужна проверка типа устройства
|
||||
if(reply->error()==QModbusDevice::NoError) {
|
||||
QModbusResponse resp = reply->rawResult();
|
||||
QString result = QString(resp.data().remove(0, MODBUS_REQUEST_PROTOCOL_INFO_LENGTH));
|
||||
//result.remove(0, MODBUS_REQUEST_PROTOCOL_INFO_LENGTH);
|
||||
if(result == QString("KTE")) {
|
||||
countOfDeviceOnLine++;
|
||||
KTE[i].append(tmp_adr);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if(countOfDeviceOnLine>0)
|
||||
resultOfScan += QString("%1 плат M3KTE работают на скорости %2.\n").arg(countOfDeviceOnLine).arg(m_baud[i]);
|
||||
countOfDeviceOnLine = 0;
|
||||
modbusDevice->disconnectDevice();
|
||||
}
|
||||
if(m_scanBoard->exec()==QDialog::Accepted) {
|
||||
if(m_scanBoard->getCheckState()==Qt::Checked) {
|
||||
for(int i = 0; i < 8; i++) {
|
||||
for(int j = 0; j < KTE[i].size(); j++) {
|
||||
for(int l = i; l < 8; l++) {
|
||||
if(KTE[l].indexOf(KTE[i].at(j))==-1) {
|
||||
QMessageBox::warning(this, "Error", QString("Несколько устройств по адресу %1, работающих на скоростях %2 и %3.").arg(KTE[i].at(j)).arg(m_baud[i]).arg(m_baud[l]));
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
QModbusDataUnit* _unit = new QModbusDataUnit(QModbusDataUnit::HoldingRegisters, 173, 1);
|
||||
_unit->setValue(0, m_scanBoard->getBaud());
|
||||
for(int i = 0; i < 8; i++) {
|
||||
bar->setValue(i);
|
||||
bar->setLabelText(tr("Синхронизация плат на скорости %1").arg(m_baud[i]));
|
||||
for(int j = 0; j < KTE[i].size(); j++) {
|
||||
modbusDevice->setConnectionParameter(QModbusDevice::SerialBaudRateParameter,
|
||||
m_baud[i]);
|
||||
if(!modbusDevice->connectDevice()) {
|
||||
statusBar()->showMessage(tr("Connect failed: ") + modbusDevice->errorString(), 5000);
|
||||
}
|
||||
auto *reply = modbusDevice->sendWriteRequest(*_unit, KTE[i].at(j));
|
||||
if(!reply) {
|
||||
onConnectClicked();
|
||||
bar->close();
|
||||
bar->deleteLater();
|
||||
return false;
|
||||
}
|
||||
while(!reply->isFinished()) {
|
||||
if(isRun) {
|
||||
//dfQMessageBox::warning(this, "Ошибка при синхронизации скоростей.", QString("Прерывание по запросу пользователя."));
|
||||
onConnectClicked();
|
||||
bar->close();
|
||||
bar->deleteLater();
|
||||
return false;
|
||||
}
|
||||
QCoreApplication::processEvents();
|
||||
}
|
||||
if(reply->error()==QModbusDevice::TimeoutError) {
|
||||
modbusDevice->disconnectDevice();
|
||||
modbusDevice->setConnectionParameter(QModbusDevice::SerialBaudRateParameter,
|
||||
m_settingsDialog->UpdateBaud(m_scanBoard->getBaud()));
|
||||
modbusDevice->connectDevice();
|
||||
QModbusDataUnit* _unit = new QModbusDataUnit(QModbusDataUnit::InputRegisters, 85, 1);
|
||||
if(auto *subreply = modbusDevice->sendReadRequest(*_unit, Boards[i].adr)) {
|
||||
while(!subreply->isFinished()) {
|
||||
if(isRun) {
|
||||
//dfQMessageBox::warning(this, "Ошибка при получении текущих настроек.", QString("Прерывание по запросу пользователя."));
|
||||
onConnectClicked();
|
||||
bar->close();
|
||||
bar->deleteLater();
|
||||
return false;
|
||||
}
|
||||
QCoreApplication::processEvents();
|
||||
}
|
||||
if(subreply->error()!=QModbusDevice::NoError) {
|
||||
//QMessageBox::warning();
|
||||
onConnectClicked();
|
||||
bar->close();
|
||||
bar->deleteLater();
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
else if(reply->error()!=QModbusDevice::NoError) {
|
||||
return false;
|
||||
}
|
||||
modbusDevice->disconnectDevice();
|
||||
}
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
else
|
||||
return false;
|
||||
}
|
||||
|
||||
void M3KTE::stopScanBoard()
|
||||
{
|
||||
for(int i = 0; i < 4; i++) {
|
||||
Boards[i].boardScanners->stop();
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
@@ -9,6 +9,8 @@
|
||||
#include "writeregistermodel.h"
|
||||
#include "devicesettingsdialog.h"
|
||||
#include "multiplesettings.h"
|
||||
#include "scanboard.h"
|
||||
#include "lineringer.h"
|
||||
|
||||
#include <QModbusTcpClient>
|
||||
#include <QModbusRtuSerialMaster>
|
||||
@@ -18,6 +20,10 @@
|
||||
#include <QProgressDialog>
|
||||
#include <QErrorMessage>
|
||||
#include <QPushButton>
|
||||
#include <QGroupBox>
|
||||
#include <QTableWidget>
|
||||
#include <QTime>
|
||||
#include <QElapsedTimer>
|
||||
|
||||
#include <QtSerialBus/qtserialbusglobal.h>
|
||||
|
||||
@@ -25,6 +31,10 @@
|
||||
#include <QSerialPort>
|
||||
#endif
|
||||
|
||||
#define MODBUS_REQUEST_PROTOCOL_INFO_LENGTH 8
|
||||
|
||||
extern "C" __declspec(dllexport) QWidget* init(QWidget *parent);
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
namespace Ui { class M3KTE; class SettingsDialog;}
|
||||
QT_END_NAMESPACE
|
||||
@@ -40,20 +50,26 @@ private:
|
||||
QModbusDataUnit readRequest() const;
|
||||
QModbusDataUnit writeRequest() const;
|
||||
void changeTable(int board, int tabletype);
|
||||
void debug();
|
||||
void errorAdrChange();
|
||||
bool event(QEvent* event);
|
||||
bool pingNetworkDevices();
|
||||
void beginScanBoards();
|
||||
void stopScanBoard();
|
||||
void displayResultOfScan(QModbusReply *reply, int boardID);
|
||||
void stepForScanCurrentSettings(QModbusReply *reply);
|
||||
void applySettingsFromScan(QModbusReply *reply);
|
||||
|
||||
void multipleRegWrite();
|
||||
void multipleRegSend();
|
||||
|
||||
void selectPositionOnTree(unsigned index);
|
||||
private slots:
|
||||
bool autoBaudRateScan();
|
||||
|
||||
void selectPositionOnTree(unsigned index);
|
||||
|
||||
signals:
|
||||
void successAtCheckBoards();
|
||||
void errorAtCheckBoards();
|
||||
|
||||
private slots:
|
||||
void logError(const QString &errorPlace, const QString &errorString, unsigned errorCount, const QString &description);
|
||||
void slotmultipleRegWrite();
|
||||
void slotmultipleRegWriteAndSend();
|
||||
|
||||
@@ -62,33 +78,28 @@ private slots:
|
||||
void onReadButtonClicked();
|
||||
void onReadReady();
|
||||
|
||||
void timeForPingIsGone();
|
||||
|
||||
void checkAdrChange();
|
||||
void checkAdrChange(QModbusReply *reply, unsigned boardNum);
|
||||
|
||||
void onWriteButtonClicked();
|
||||
void onSelectedBoardChanged(int index);
|
||||
void onWriteTableChanged(int index);
|
||||
|
||||
void checkBoards();
|
||||
|
||||
void onSpeedUpdate();
|
||||
void revertToOldSpeedAndRestart();
|
||||
|
||||
void onParityUpdate();
|
||||
|
||||
void firstBoardScan();
|
||||
void secondBoardScan();
|
||||
void thirdBoardScan();
|
||||
void fourthBoardScan();
|
||||
void boardScan(unsigned boardID);
|
||||
|
||||
void firstBoardReady();
|
||||
void secondBoardReady();
|
||||
void thirdBoardReady();
|
||||
void fourthBoardReady();
|
||||
public:
|
||||
M3KTE(QWidget *parent = nullptr);
|
||||
~M3KTE();
|
||||
|
||||
private:
|
||||
Ui::M3KTE *ui;
|
||||
bool timerForPingSignal = false;
|
||||
QTableWidget *loggerTable = nullptr;
|
||||
int CurrentConnectedDevice = 0;
|
||||
//int DeviceOnNetwork[4];
|
||||
QProgressBar *m_ProgressBar[320];
|
||||
@@ -98,6 +109,10 @@ private:
|
||||
DeviceSettingsDialog *m_deviceSettingsDialog = nullptr;
|
||||
SettingsDialog *m_settingsDialog = nullptr;
|
||||
MultipleSettings *m_regMultipleSettings = nullptr;
|
||||
ScanBoard *m_scanBoard = nullptr;
|
||||
|
||||
LineRinger *m_lineRinger = nullptr;
|
||||
QGroupBox *Boards_Fields[4];
|
||||
//WriteRegisterModel *writeModel = nullptr;
|
||||
|
||||
struct StatusM3KTE{
|
||||
@@ -105,17 +120,50 @@ private:
|
||||
bool Accidents[4];
|
||||
}statusM3KTE;
|
||||
|
||||
struct BoardModbusRegisters
|
||||
{
|
||||
unsigned error_terminal;
|
||||
|
||||
struct BoardModbusRegisters {
|
||||
bool isActive = false;
|
||||
bool pollIsActive = true;
|
||||
|
||||
int adr;
|
||||
int _tmp_adr;
|
||||
|
||||
bool coil[85];
|
||||
unsigned HR[170];
|
||||
|
||||
unsigned error_W = 0;
|
||||
unsigned error_A = 0;
|
||||
unsigned error_modbus = 0;
|
||||
unsigned error_baud_change = 0;
|
||||
unsigned error_parity_change = 0;
|
||||
unsigned error_RX = 0;
|
||||
unsigned error_TX = 0;
|
||||
unsigned error_adr_change = 0;
|
||||
unsigned error_cmd_change = 0;
|
||||
|
||||
QLabel *timerData = nullptr;
|
||||
QLabel *timerStatus = nullptr;
|
||||
|
||||
WriteRegisterModel *ModbusModelCoil;
|
||||
WriteRegisterModel *ModbusModelHoldingReg;
|
||||
QTimer *boardScanners;
|
||||
bool isScan = false;
|
||||
|
||||
QElapsedTimer timerToStatusResponse;
|
||||
QElapsedTimer timerToDataResponse;
|
||||
}Boards[4];
|
||||
|
||||
union statusreg {
|
||||
struct parsingFields {
|
||||
unsigned accident:1;
|
||||
unsigned warning:1;
|
||||
unsigned poll_allowed:1;
|
||||
unsigned mzkte_status:2;
|
||||
unsigned reserv:3;
|
||||
unsigned mzkte_error:8;
|
||||
}ParsingReg;
|
||||
unsigned AllReg:16;
|
||||
};
|
||||
};
|
||||
#endif // M3KTE_H
|
||||
|
||||
21694
M3KTE_TERM/m3kte.ui
21694
M3KTE_TERM/m3kte.ui
File diff suppressed because it is too large
Load Diff
@@ -18,28 +18,21 @@ MultipleSettings::~MultipleSettings()
|
||||
|
||||
void MultipleSettings::on_buttonBox_clicked(QAbstractButton *button)
|
||||
{
|
||||
if(button == ui->buttonBox->button(QDialogButtonBox::Ok))
|
||||
{
|
||||
if(button == ui->buttonBox->button(QDialogButtonBox::Ok)) {
|
||||
newValue = ui->regValueLine->text().toInt(nullptr, 16);
|
||||
typeReg = ui->regTypeBox->currentIndex();
|
||||
startAdr = ui->adrBox->value();
|
||||
countReg = ui->countBox->value();
|
||||
boardId = ui->boardBox->currentIndex();
|
||||
emit write();
|
||||
}
|
||||
else if (button == ui->buttonBox->button(QDialogButtonBox::SaveAll))
|
||||
{
|
||||
} else if (button == ui->buttonBox->button(QDialogButtonBox::SaveAll)) {
|
||||
newValue = ui->regValueLine->text().toInt(nullptr, 16);
|
||||
typeReg = ui->regTypeBox->currentIndex();
|
||||
startAdr = ui->adrBox->value();
|
||||
countReg = ui->countBox->value();
|
||||
boardId = ui->boardBox->currentIndex();
|
||||
emit writeAndSend();
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
}
|
||||
} else {}
|
||||
}
|
||||
|
||||
void MultipleSettings::on_regTypeBox_currentIndexChanged(int index)
|
||||
|
||||
39
M3KTE_TERM/scanboard.cpp
Normal file
39
M3KTE_TERM/scanboard.cpp
Normal file
@@ -0,0 +1,39 @@
|
||||
#include "scanboard.h"
|
||||
#include "ui_scanboard.h"
|
||||
|
||||
ScanBoard::ScanBoard(QWidget *parent) :
|
||||
QDialog(parent),
|
||||
ui(new Ui::ScanBoard)
|
||||
{
|
||||
ui->setupUi(this);
|
||||
}
|
||||
|
||||
ScanBoard::~ScanBoard()
|
||||
{
|
||||
delete ui;
|
||||
}
|
||||
|
||||
Qt::CheckState ScanBoard::getCheckState()
|
||||
{
|
||||
return checkState;
|
||||
}
|
||||
|
||||
void ScanBoard::on_applyToAllBox_stateChanged(int arg1)
|
||||
{
|
||||
checkState = (Qt::CheckState)arg1;
|
||||
}
|
||||
|
||||
void ScanBoard::showMeTheTruth(QString resultOfScan)
|
||||
{
|
||||
ui->logger->append(resultOfScan);
|
||||
}
|
||||
|
||||
quint16 ScanBoard::getBaud()
|
||||
{
|
||||
return baud;
|
||||
}
|
||||
|
||||
void ScanBoard::on_baudRateBox_currentTextChanged(const QString &arg1)
|
||||
{
|
||||
baud = arg1.toInt(nullptr, 10);
|
||||
}
|
||||
33
M3KTE_TERM/scanboard.h
Normal file
33
M3KTE_TERM/scanboard.h
Normal file
@@ -0,0 +1,33 @@
|
||||
#ifndef SCANBOARD_H
|
||||
#define SCANBOARD_H
|
||||
|
||||
#include <QDialog>
|
||||
|
||||
namespace Ui {
|
||||
class ScanBoard;
|
||||
}
|
||||
|
||||
class ScanBoard : public QDialog
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit ScanBoard(QWidget *parent = nullptr);
|
||||
~ScanBoard();
|
||||
|
||||
Qt::CheckState getCheckState();
|
||||
void showMeTheTruth(QString resultOfScan);
|
||||
quint16 getBaud();
|
||||
private slots:
|
||||
void on_applyToAllBox_stateChanged(int arg1);
|
||||
|
||||
void on_baudRateBox_currentTextChanged(const QString &arg1);
|
||||
|
||||
private:
|
||||
Qt::CheckState checkState;
|
||||
quint16 baud;
|
||||
|
||||
Ui::ScanBoard *ui;
|
||||
};
|
||||
|
||||
#endif // SCANBOARD_H
|
||||
81
M3KTE_TERM/scanboard.ui
Normal file
81
M3KTE_TERM/scanboard.ui
Normal file
@@ -0,0 +1,81 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>ScanBoard</class>
|
||||
<widget class="QDialog" name="ScanBoard">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>337</width>
|
||||
<height>145</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>Dialog</string>
|
||||
</property>
|
||||
<layout class="QGridLayout" name="gridLayout_2">
|
||||
<item row="0" column="0">
|
||||
<widget class="QTextEdit" name="logger"/>
|
||||
</item>
|
||||
<item row="1" column="0">
|
||||
<layout class="QGridLayout" name="gridLayout">
|
||||
<item row="0" column="0">
|
||||
<widget class="QComboBox" name="baudRateBox"/>
|
||||
</item>
|
||||
<item row="0" column="1">
|
||||
<widget class="QCheckBox" name="applyToAllBox">
|
||||
<property name="text">
|
||||
<string>Применить ко всем обнаруженным платам</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item row="2" column="0">
|
||||
<widget class="QDialogButtonBox" name="buttonBox">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="standardButtons">
|
||||
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<resources/>
|
||||
<connections>
|
||||
<connection>
|
||||
<sender>buttonBox</sender>
|
||||
<signal>accepted()</signal>
|
||||
<receiver>ScanBoard</receiver>
|
||||
<slot>accept()</slot>
|
||||
<hints>
|
||||
<hint type="sourcelabel">
|
||||
<x>248</x>
|
||||
<y>254</y>
|
||||
</hint>
|
||||
<hint type="destinationlabel">
|
||||
<x>157</x>
|
||||
<y>274</y>
|
||||
</hint>
|
||||
</hints>
|
||||
</connection>
|
||||
<connection>
|
||||
<sender>buttonBox</sender>
|
||||
<signal>rejected()</signal>
|
||||
<receiver>ScanBoard</receiver>
|
||||
<slot>reject()</slot>
|
||||
<hints>
|
||||
<hint type="sourcelabel">
|
||||
<x>316</x>
|
||||
<y>260</y>
|
||||
</hint>
|
||||
<hint type="destinationlabel">
|
||||
<x>286</x>
|
||||
<y>274</y>
|
||||
</hint>
|
||||
</hints>
|
||||
</connection>
|
||||
</connections>
|
||||
</ui>
|
||||
@@ -12,13 +12,15 @@ SettingsDialog::SettingsDialog(QWidget *parent) :
|
||||
ui->baudCombo->setCurrentText(QString::number(m_settings.baud));
|
||||
ui->dataBitsCombo->setCurrentText(QString::number(m_settings.dataBits));
|
||||
ui->stopBitsCombo->setCurrentText(QString::number(m_settings.stopBits));
|
||||
on_updateComBox_clicked();
|
||||
#endif
|
||||
ui->timeoutSpinner->setValue(m_settings.responseTime);
|
||||
ui->retriesSpinner->setValue(m_settings.numberOfRetries);
|
||||
|
||||
|
||||
connect(ui->AcceptOrRejectButtonBox, &QDialogButtonBox::accepted, [this]() {
|
||||
#if QT_CONFIG(modbus_serialport)
|
||||
m_settings.portName = ui->portEdit->text();
|
||||
m_settings.portName = ui->comBox->currentData().toString();
|
||||
m_settings.parity = ui->parityCombo->currentIndex();
|
||||
if (m_settings.parity > 0)
|
||||
m_settings.parity++;
|
||||
@@ -52,11 +54,9 @@ int SettingsDialog::UpdateBaud(int baud)
|
||||
int SettingsDialog::UpdateParity(int parity)
|
||||
{
|
||||
ui->parityCombo->setCurrentIndex(parity);
|
||||
if(parity>0)
|
||||
{
|
||||
if(parity>0) {
|
||||
return (m_settings.parity = ++parity);
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
return (m_settings.parity = parity);
|
||||
}
|
||||
}
|
||||
@@ -70,3 +70,12 @@ int SettingsDialog::curParity()
|
||||
{
|
||||
return ui->parityCombo->currentIndex();
|
||||
}
|
||||
|
||||
void SettingsDialog::on_updateComBox_clicked()
|
||||
{
|
||||
ui->comBox->clear();
|
||||
const auto listPorts = QSerialPortInfo::availablePorts();
|
||||
for (const auto& port: listPorts) {
|
||||
ui->comBox->addItem(QString(port.portName() + ": " + port.manufacturer()), QVariant(port.portName()));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
#include <QtSerialBus/qtserialbusglobal.h>
|
||||
#if QT_CONFIG(modbus_serialport)
|
||||
#include <QSerialPort>
|
||||
#include <QSerialPortInfo>
|
||||
#endif
|
||||
|
||||
namespace Ui {
|
||||
@@ -23,7 +24,7 @@ public:
|
||||
int baud = 115200;
|
||||
int dataBits = QSerialPort::Data8;
|
||||
int stopBits = QSerialPort::OneStop;
|
||||
int responseTime = 500;
|
||||
int responseTime = 50;
|
||||
int numberOfRetries = 0;
|
||||
};
|
||||
|
||||
@@ -37,6 +38,9 @@ public:
|
||||
|
||||
int curBaud();
|
||||
int curParity();
|
||||
private slots:
|
||||
void on_updateComBox_clicked();
|
||||
|
||||
private:
|
||||
Settings m_settings;
|
||||
Ui::SettingsDialog *ui;
|
||||
|
||||
@@ -20,13 +20,13 @@
|
||||
<string> мс</string>
|
||||
</property>
|
||||
<property name="minimum">
|
||||
<number>-1</number>
|
||||
<number>10</number>
|
||||
</property>
|
||||
<property name="maximum">
|
||||
<number>5000</number>
|
||||
</property>
|
||||
<property name="singleStep">
|
||||
<number>20</number>
|
||||
<number>1</number>
|
||||
</property>
|
||||
<property name="value">
|
||||
<number>200</number>
|
||||
@@ -36,7 +36,7 @@
|
||||
<item row="2" column="1" rowspan="2" colspan="2">
|
||||
<widget class="QSpinBox" name="retriesSpinner">
|
||||
<property name="enabled">
|
||||
<bool>false</bool>
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="value">
|
||||
<number>0</number>
|
||||
@@ -69,16 +69,6 @@
|
||||
<string>Serial Parameters</string>
|
||||
</property>
|
||||
<layout class="QGridLayout" name="gridLayout">
|
||||
<item row="0" column="0">
|
||||
<widget class="QLabel" name="portLabel">
|
||||
<property name="text">
|
||||
<string>Порт</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="1">
|
||||
<widget class="QLineEdit" name="portEdit"/>
|
||||
</item>
|
||||
<item row="1" column="0">
|
||||
<widget class="QLabel" name="parityLabel">
|
||||
<property name="text">
|
||||
@@ -86,32 +76,6 @@
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="1">
|
||||
<widget class="QComboBox" name="parityCombo">
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>No</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>Even</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>Odd</string>
|
||||
</property>
|
||||
</item>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="0">
|
||||
<widget class="QLabel" name="baudLabel">
|
||||
<property name="text">
|
||||
<string>Скорость</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="1">
|
||||
<widget class="QComboBox" name="baudCombo">
|
||||
<property name="currentIndex">
|
||||
@@ -166,6 +130,51 @@
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="4" column="1">
|
||||
<widget class="QComboBox" name="stopBitsCombo">
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>1</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>3</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>2</string>
|
||||
</property>
|
||||
</item>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="0">
|
||||
<widget class="QLabel" name="baudLabel">
|
||||
<property name="text">
|
||||
<string>Скорость</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="1">
|
||||
<widget class="QComboBox" name="parityCombo">
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>No</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>Even</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>Odd</string>
|
||||
</property>
|
||||
</item>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="1">
|
||||
<widget class="QComboBox" name="dataBitsCombo">
|
||||
<property name="currentIndex">
|
||||
@@ -193,6 +202,13 @@
|
||||
</item>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="0">
|
||||
<widget class="QLabel" name="portLabel">
|
||||
<property name="text">
|
||||
<string>Порт</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="4" column="0">
|
||||
<widget class="QLabel" name="stopBitsLabel">
|
||||
<property name="text">
|
||||
@@ -200,24 +216,38 @@
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="4" column="1">
|
||||
<widget class="QComboBox" name="stopBitsCombo">
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>1</string>
|
||||
</property>
|
||||
<item row="0" column="1">
|
||||
<layout class="QGridLayout" name="gridLayout_3">
|
||||
<item row="0" column="1">
|
||||
<widget class="QComboBox" name="comBox">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>0</width>
|
||||
<height>0</height>
|
||||
</size>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>3</string>
|
||||
</property>
|
||||
<item row="0" column="2">
|
||||
<widget class="QPushButton" name="updateComBox">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>45</width>
|
||||
<height>0</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Поиск</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>2</string>
|
||||
</property>
|
||||
</item>
|
||||
</widget>
|
||||
</layout>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
|
||||
@@ -25,10 +25,8 @@ QVariant WriteRegisterModel::data(const QModelIndex &index, int role) const
|
||||
{
|
||||
if (!index.isValid() || index.row() >= RowCount || index.column() >= ColumnCount)
|
||||
return QVariant();
|
||||
|
||||
Q_ASSERT(m_coils.count() == RowCount);
|
||||
Q_ASSERT(m_holdingRegisters.count() == RowCount);
|
||||
|
||||
if (index.column() == NumColumn && role == Qt::DisplayRole)
|
||||
return QString::number(index.row());
|
||||
|
||||
@@ -42,17 +40,14 @@ QVariant WriteRegisterModel::data(const QModelIndex &index, int role) const
|
||||
return QString("0x%1").arg(QString::number(m_holdingRegisters.at(index.row()), 16));
|
||||
|
||||
if(index.column() == CurrentUColumn && role == Qt::DisplayRole)
|
||||
return QString("%1 В").arg(QString::number((double)((double)m_currentU.at(index.row())/(double)1000)));
|
||||
|
||||
return QString("%1 В").arg(QString::number((double)((double)m_currentU.at(index.row())/(double)1000), 'f', 3));
|
||||
return QVariant();
|
||||
|
||||
}
|
||||
|
||||
QVariant WriteRegisterModel::headerData(int section, Qt::Orientation orientation, int role) const
|
||||
{
|
||||
if (role != Qt::DisplayRole)
|
||||
return QVariant();
|
||||
|
||||
if (orientation == Qt::Horizontal) {
|
||||
switch (section) {
|
||||
case NumColumn:
|
||||
@@ -76,7 +71,6 @@ bool WriteRegisterModel::setData(const QModelIndex &index, const QVariant &value
|
||||
{
|
||||
if (!index.isValid() || index.row() >= RowCount || index.column() >= ColumnCount)
|
||||
return false;
|
||||
|
||||
Q_ASSERT(m_coils.count() == RowCount);
|
||||
Q_ASSERT(m_holdingRegisters.count() == RowCount);
|
||||
|
||||
@@ -86,7 +80,6 @@ bool WriteRegisterModel::setData(const QModelIndex &index, const QVariant &value
|
||||
emit dataChanged(index, index);
|
||||
return true;
|
||||
}
|
||||
|
||||
if (index.column() == HoldingColumn && role == Qt::EditRole) { // holding registers
|
||||
bool result = false;
|
||||
quint16 newValue = value.toString().toUShort(&result, 16);
|
||||
@@ -96,7 +89,6 @@ bool WriteRegisterModel::setData(const QModelIndex &index, const QVariant &value
|
||||
emit dataChanged(index, index);
|
||||
return result;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
21
Release/.qmake.stash
Normal file
21
Release/.qmake.stash
Normal file
@@ -0,0 +1,21 @@
|
||||
QMAKE_CXX.QT_COMPILER_STDCXX = 201402L
|
||||
QMAKE_CXX.QMAKE_GCC_MAJOR_VERSION = 7
|
||||
QMAKE_CXX.QMAKE_GCC_MINOR_VERSION = 3
|
||||
QMAKE_CXX.QMAKE_GCC_PATCH_VERSION = 0
|
||||
QMAKE_CXX.COMPILER_MACROS = \
|
||||
QT_COMPILER_STDCXX \
|
||||
QMAKE_GCC_MAJOR_VERSION \
|
||||
QMAKE_GCC_MINOR_VERSION \
|
||||
QMAKE_GCC_PATCH_VERSION
|
||||
QMAKE_CXX.INCDIRS = \
|
||||
C:/Qt/Qt5.14.2/Tools/mingw730_32/lib/gcc/i686-w64-mingw32/7.3.0/include/c++ \
|
||||
C:/Qt/Qt5.14.2/Tools/mingw730_32/lib/gcc/i686-w64-mingw32/7.3.0/include/c++/i686-w64-mingw32 \
|
||||
C:/Qt/Qt5.14.2/Tools/mingw730_32/lib/gcc/i686-w64-mingw32/7.3.0/include/c++/backward \
|
||||
C:/Qt/Qt5.14.2/Tools/mingw730_32/lib/gcc/i686-w64-mingw32/7.3.0/include \
|
||||
C:/Qt/Qt5.14.2/Tools/mingw730_32/lib/gcc/i686-w64-mingw32/7.3.0/include-fixed \
|
||||
C:/Qt/Qt5.14.2/Tools/mingw730_32/i686-w64-mingw32/include
|
||||
QMAKE_CXX.LIBDIRS = \
|
||||
C:/Qt/Qt5.14.2/Tools/mingw730_32/lib/gcc/i686-w64-mingw32/7.3.0 \
|
||||
C:/Qt/Qt5.14.2/Tools/mingw730_32/lib/gcc \
|
||||
C:/Qt/Qt5.14.2/Tools/mingw730_32/i686-w64-mingw32/lib \
|
||||
C:/Qt/Qt5.14.2/Tools/mingw730_32/lib
|
||||
BIN
Release/release/M3KTE_TERM.exe
Normal file
BIN
Release/release/M3KTE_TERM.exe
Normal file
Binary file not shown.
Reference in New Issue
Block a user