Compare commits
4 Commits
59e9fb65a3
...
Pre-releas
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
fc01a6c06d | ||
|
|
49083ca06d | ||
|
|
d7063703b6 | ||
|
|
5b2a64a39b |
@@ -1,4 +1,10 @@
|
|||||||
QT += core gui
|
QT += core gui
|
||||||
|
QT += widgets serialport
|
||||||
|
QT += serialbus widgets
|
||||||
|
|
||||||
|
requires(qtConfig(combobox))
|
||||||
|
QT += serialport
|
||||||
|
qtConfig(modbus-serialport): QT += serialport
|
||||||
|
|
||||||
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
|
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
|
||||||
|
|
||||||
@@ -16,14 +22,25 @@ DEFINES += QT_DEPRECATED_WARNINGS
|
|||||||
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
|
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
|
||||||
|
|
||||||
SOURCES += \
|
SOURCES += \
|
||||||
|
devicesettingsdialog.cpp \
|
||||||
main.cpp \
|
main.cpp \
|
||||||
m3kte.cpp
|
m3kte.cpp \
|
||||||
|
multiplesettings.cpp \
|
||||||
|
settingsdialog.cpp \
|
||||||
|
writeregistermodel.cpp
|
||||||
|
|
||||||
HEADERS += \
|
HEADERS += \
|
||||||
m3kte.h
|
devicesettingsdialog.h \
|
||||||
|
m3kte.h \
|
||||||
|
multiplesettings.h \
|
||||||
|
settingsdialog.h \
|
||||||
|
writeregistermodel.h
|
||||||
|
|
||||||
FORMS += \
|
FORMS += \
|
||||||
m3kte.ui
|
devicesettingsdialog.ui \
|
||||||
|
m3kte.ui \
|
||||||
|
multiplesettings.ui \
|
||||||
|
settingsdialog.ui
|
||||||
|
|
||||||
# Default rules for deployment.
|
# Default rules for deployment.
|
||||||
qnx: target.path = /tmp/$${TARGET}/bin
|
qnx: target.path = /tmp/$${TARGET}/bin
|
||||||
131
M3KTE_TERM/devicesettingsdialog.cpp
Normal file
131
M3KTE_TERM/devicesettingsdialog.cpp
Normal file
@@ -0,0 +1,131 @@
|
|||||||
|
#include "devicesettingsdialog.h"
|
||||||
|
#include "ui_devicesettingsdialog.h"
|
||||||
|
|
||||||
|
DeviceSettingsDialog::DeviceSettingsDialog(QWidget *parent) :
|
||||||
|
QDialog(parent),
|
||||||
|
ui(new Ui::DeviceSettingsDialog)
|
||||||
|
{
|
||||||
|
ui->setupUi(this);
|
||||||
|
|
||||||
|
_currentBoardTimers[0] = ui->spinTimerBoard_1->value();
|
||||||
|
_currentBoardTimers[1] = ui->spinTimerBoard_2->value();
|
||||||
|
_currentBoardTimers[2] = ui->spinTimerBoard_3->value();
|
||||||
|
_currentBoardTimers[3] = ui->spinTimerBoard_4->value();
|
||||||
|
|
||||||
|
_m_timer[0] = ui->spinTimerBoard_1;
|
||||||
|
_m_timer[1] = ui->spinTimerBoard_2;
|
||||||
|
_m_timer[2] = ui->spinTimerBoard_3;
|
||||||
|
_m_timer[3] = ui->spinTimerBoard_4;
|
||||||
|
|
||||||
|
_currentSpeed = ui->speedBox->currentText().toUInt();
|
||||||
|
|
||||||
|
_currentParity = ui->parityBox->currentIndex();
|
||||||
|
|
||||||
|
for(int i = 0; i < 4; i++)
|
||||||
|
{
|
||||||
|
_currentAdrs[i] = i+1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
DeviceSettingsDialog::~DeviceSettingsDialog()
|
||||||
|
{
|
||||||
|
delete ui;
|
||||||
|
}
|
||||||
|
|
||||||
|
void DeviceSettingsDialog::on_buttonApplyChangeTimer_clicked()
|
||||||
|
{
|
||||||
|
_currentBoardTimers[0] = ui->spinTimerBoard_1->value();
|
||||||
|
_currentBoardTimers[1] = ui->spinTimerBoard_2->value();
|
||||||
|
_currentBoardTimers[2] = ui->spinTimerBoard_3->value();
|
||||||
|
_currentBoardTimers[3] = ui->spinTimerBoard_4->value();
|
||||||
|
}
|
||||||
|
|
||||||
|
void DeviceSettingsDialog::on_buttonApplyChangeSpeed_clicked()
|
||||||
|
{
|
||||||
|
|
||||||
|
_currentSpeed = ui->speedBox->currentIndex();
|
||||||
|
emit speedChanged();
|
||||||
|
}
|
||||||
|
|
||||||
|
void DeviceSettingsDialog::on_buttonApplyChangeParity_clicked()
|
||||||
|
{
|
||||||
|
_currentParity = ui->parityBox->currentIndex();
|
||||||
|
emit parityChanged();
|
||||||
|
}
|
||||||
|
|
||||||
|
void DeviceSettingsDialog::on_buttonApplyChangeAdr_clicked()
|
||||||
|
{
|
||||||
|
BoardIdHasBeenChanged* _boardIdHasBeenChanged = new BoardIdHasBeenChanged(ui->idComboBox->currentIndex(), ui->adrSpinBox->value());
|
||||||
|
QCoreApplication::postEvent(parent(), _boardIdHasBeenChanged);
|
||||||
|
close();
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned DeviceSettingsDialog::currentBoardTimer(unsigned short _ID)
|
||||||
|
{
|
||||||
|
return _currentBoardTimers[_ID];
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned DeviceSettingsDialog::currentSpeed()
|
||||||
|
{
|
||||||
|
return _currentSpeed;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned short DeviceSettingsDialog::currentParity()
|
||||||
|
{
|
||||||
|
return _currentParity;
|
||||||
|
}
|
||||||
|
|
||||||
|
void DeviceSettingsDialog::updateSettingsAfterConnection(unsigned tmp_speed, unsigned tmp_parity, unsigned *tmp_adr, int CurrentConnectedDevice)
|
||||||
|
{
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
on_idComboBox_currentIndexChanged(ui->idComboBox->currentIndex());
|
||||||
|
}
|
||||||
|
|
||||||
|
void DeviceSettingsDialog::on_idComboBox_currentIndexChanged(int index)
|
||||||
|
{
|
||||||
|
ui->adrSpinBox->setValue(_currentAdrs[index]);
|
||||||
|
}
|
||||||
|
|
||||||
|
void DeviceSettingsDialog::on_buttonBox_clicked(QAbstractButton *button)
|
||||||
|
{
|
||||||
|
switch (ui->buttonBox->buttonRole(button)) {
|
||||||
|
case QDialogButtonBox::ResetRole:
|
||||||
|
ui->spinTimerBoard_1->setValue(1000);
|
||||||
|
ui->spinTimerBoard_2->setValue(1000);
|
||||||
|
ui->spinTimerBoard_3->setValue(1000);
|
||||||
|
ui->spinTimerBoard_4->setValue(1000);
|
||||||
|
_currentBoardTimers[0] = ui->spinTimerBoard_1->value();
|
||||||
|
_currentBoardTimers[1] = ui->spinTimerBoard_2->value();
|
||||||
|
_currentBoardTimers[2] = ui->spinTimerBoard_3->value();
|
||||||
|
_currentBoardTimers[3] = ui->spinTimerBoard_4->value();
|
||||||
|
|
||||||
|
ui->speedBox->setCurrentText("31250");
|
||||||
|
_currentSpeed = ui->speedBox->currentText().toUInt();
|
||||||
|
|
||||||
|
ui->parityBox->setCurrentIndex(0);
|
||||||
|
_currentParity = ui->parityBox->currentIndex();
|
||||||
|
|
||||||
|
for(int i = 0; i < 4; i++)
|
||||||
|
{
|
||||||
|
_currentAdrs[i] = i+1;
|
||||||
|
}
|
||||||
|
ui->adrSpinBox->setValue(_currentAdrs[ui->idComboBox->currentIndex()]);
|
||||||
|
break;
|
||||||
|
case QDialogButtonBox::AcceptRole:
|
||||||
|
close();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
72
M3KTE_TERM/devicesettingsdialog.h
Normal file
72
M3KTE_TERM/devicesettingsdialog.h
Normal file
@@ -0,0 +1,72 @@
|
|||||||
|
#ifndef DEVICESETTINGSDIALOG_H
|
||||||
|
#define DEVICESETTINGSDIALOG_H
|
||||||
|
|
||||||
|
#include <QDialog>
|
||||||
|
#include <QEvent>
|
||||||
|
#include <QAbstractButton>
|
||||||
|
#include <QDialogButtonBox>
|
||||||
|
#include <QSpinBox>
|
||||||
|
|
||||||
|
class BoardIdHasBeenChanged : public QEvent
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
BoardIdHasBeenChanged(const short num, const short newId) : QEvent(QEvent::User) {_BoardNum = num; _BoardNewID = newId;}
|
||||||
|
~BoardIdHasBeenChanged() {}
|
||||||
|
|
||||||
|
short BoardNum() const {return _BoardNum;}
|
||||||
|
short BoardNewID() const {return _BoardNewID;}
|
||||||
|
|
||||||
|
private:
|
||||||
|
short _BoardNum;
|
||||||
|
short _BoardNewID;
|
||||||
|
};
|
||||||
|
|
||||||
|
namespace Ui {
|
||||||
|
class DeviceSettingsDialog;
|
||||||
|
}
|
||||||
|
|
||||||
|
class DeviceSettingsDialog : public QDialog
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
explicit DeviceSettingsDialog(QWidget *parent = nullptr);
|
||||||
|
~DeviceSettingsDialog();
|
||||||
|
|
||||||
|
unsigned currentBoardTimer(unsigned short _ID);
|
||||||
|
unsigned currentSpeed();
|
||||||
|
unsigned short currentParity();
|
||||||
|
void updateSettingsAfterConnection(unsigned tmp_speed, unsigned tmp_parity, unsigned *tmp_adr, int CurrentConnectedDevice);
|
||||||
|
signals:
|
||||||
|
void parityChanged();
|
||||||
|
void speedChanged();
|
||||||
|
|
||||||
|
void firstBoardAdrHasBeenChanged();
|
||||||
|
void secondBoardAdrHasBeenChanged();
|
||||||
|
void thirdBoardAdrHasBeenChanged();
|
||||||
|
void fourthBoardAdrHasBeenChanged();
|
||||||
|
|
||||||
|
private slots:
|
||||||
|
void on_buttonApplyChangeTimer_clicked();
|
||||||
|
|
||||||
|
void on_buttonApplyChangeSpeed_clicked();
|
||||||
|
|
||||||
|
void on_buttonApplyChangeParity_clicked();
|
||||||
|
|
||||||
|
void on_buttonApplyChangeAdr_clicked();
|
||||||
|
|
||||||
|
void on_idComboBox_currentIndexChanged(int index);
|
||||||
|
|
||||||
|
void on_buttonBox_clicked(QAbstractButton *button);
|
||||||
|
|
||||||
|
private:
|
||||||
|
QSpinBox *_m_timer[4];
|
||||||
|
unsigned _currentBoardTimers[4];
|
||||||
|
unsigned _currentSpeed;
|
||||||
|
unsigned short _currentParity;
|
||||||
|
unsigned _currentAdrs[4];
|
||||||
|
|
||||||
|
Ui::DeviceSettingsDialog *ui;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // DEVICESETTINGSDIALOG_H
|
||||||
306
M3KTE_TERM/devicesettingsdialog.ui
Normal file
306
M3KTE_TERM/devicesettingsdialog.ui
Normal file
@@ -0,0 +1,306 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<ui version="4.0">
|
||||||
|
<class>DeviceSettingsDialog</class>
|
||||||
|
<widget class="QDialog" name="DeviceSettingsDialog">
|
||||||
|
<property name="geometry">
|
||||||
|
<rect>
|
||||||
|
<x>0</x>
|
||||||
|
<y>0</y>
|
||||||
|
<width>243</width>
|
||||||
|
<height>431</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">
|
||||||
|
<string>Период опроса плат</string>
|
||||||
|
</property>
|
||||||
|
<layout class="QGridLayout" name="gridLayout">
|
||||||
|
<item row="3" column="0">
|
||||||
|
<widget class="QLabel" name="boardLabel_5">
|
||||||
|
<property name="text">
|
||||||
|
<string>Плата №3</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="3" column="1">
|
||||||
|
<widget class="QSpinBox" name="spinTimerBoard_3">
|
||||||
|
<property name="alignment">
|
||||||
|
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
||||||
|
</property>
|
||||||
|
<property name="suffix">
|
||||||
|
<string> мс</string>
|
||||||
|
</property>
|
||||||
|
<property name="maximum">
|
||||||
|
<number>1999999999</number>
|
||||||
|
</property>
|
||||||
|
<property name="value">
|
||||||
|
<number>1000</number>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="0">
|
||||||
|
<widget class="QLabel" name="boardLabel_1">
|
||||||
|
<property name="text">
|
||||||
|
<string>Плата №1</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="5" column="0" colspan="2">
|
||||||
|
<widget class="QPushButton" name="buttonApplyChangeTimer">
|
||||||
|
<property name="text">
|
||||||
|
<string>Применить</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="2" column="1">
|
||||||
|
<widget class="QSpinBox" name="spinTimerBoard_2">
|
||||||
|
<property name="alignment">
|
||||||
|
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
||||||
|
</property>
|
||||||
|
<property name="suffix">
|
||||||
|
<string> мс</string>
|
||||||
|
</property>
|
||||||
|
<property name="maximum">
|
||||||
|
<number>1999999999</number>
|
||||||
|
</property>
|
||||||
|
<property name="value">
|
||||||
|
<number>1000</number>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="2" column="0">
|
||||||
|
<widget class="QLabel" name="boardLabel_2">
|
||||||
|
<property name="text">
|
||||||
|
<string>Плата №2</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="1">
|
||||||
|
<widget class="QSpinBox" name="spinTimerBoard_1">
|
||||||
|
<property name="alignment">
|
||||||
|
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
||||||
|
</property>
|
||||||
|
<property name="suffix">
|
||||||
|
<string> мс</string>
|
||||||
|
</property>
|
||||||
|
<property name="minimum">
|
||||||
|
<number>1</number>
|
||||||
|
</property>
|
||||||
|
<property name="maximum">
|
||||||
|
<number>1999999999</number>
|
||||||
|
</property>
|
||||||
|
<property name="value">
|
||||||
|
<number>1000</number>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="4" column="0">
|
||||||
|
<widget class="QLabel" name="boardLabel_4">
|
||||||
|
<property name="text">
|
||||||
|
<string>Плата №4</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="4" column="1">
|
||||||
|
<widget class="QSpinBox" name="spinTimerBoard_4">
|
||||||
|
<property name="alignment">
|
||||||
|
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
||||||
|
</property>
|
||||||
|
<property name="suffix">
|
||||||
|
<string> мс</string>
|
||||||
|
</property>
|
||||||
|
<property name="maximum">
|
||||||
|
<number>1999999999</number>
|
||||||
|
</property>
|
||||||
|
<property name="value">
|
||||||
|
<number>1000</number>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="3" column="0">
|
||||||
|
<widget class="QGroupBox" name="groupBox_3">
|
||||||
|
<property name="title">
|
||||||
|
<string>Сетевой адрес МЗКТЭ</string>
|
||||||
|
</property>
|
||||||
|
<layout class="QGridLayout" name="gridLayout_3">
|
||||||
|
<item row="0" column="0">
|
||||||
|
<widget class="QComboBox" name="idComboBox">
|
||||||
|
<property name="whatsThis">
|
||||||
|
<string>Номер платы</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="0" column="1">
|
||||||
|
<widget class="QSpinBox" name="adrSpinBox">
|
||||||
|
<property name="minimum">
|
||||||
|
<number>1</number>
|
||||||
|
</property>
|
||||||
|
<property name="maximum">
|
||||||
|
<number>247</number>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="0" column="2">
|
||||||
|
<widget class="QPushButton" name="buttonApplyChangeAdr">
|
||||||
|
<property name="text">
|
||||||
|
<string>Применить</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="4" column="0">
|
||||||
|
<widget class="QDialogButtonBox" name="buttonBox">
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Horizontal</enum>
|
||||||
|
</property>
|
||||||
|
<property name="standardButtons">
|
||||||
|
<set>QDialogButtonBox::Ok|QDialogButtonBox::RestoreDefaults</set>
|
||||||
|
</property>
|
||||||
|
</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>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
<resources/>
|
||||||
|
<connections>
|
||||||
|
<connection>
|
||||||
|
<sender>buttonBox</sender>
|
||||||
|
<signal>accepted()</signal>
|
||||||
|
<receiver>DeviceSettingsDialog</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>DeviceSettingsDialog</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>
|
||||||
1538
M3KTE_TERM/m3kte.cpp
Normal file
1538
M3KTE_TERM/m3kte.cpp
Normal file
@@ -0,0 +1,1538 @@
|
|||||||
|
#include "m3kte.h"
|
||||||
|
#include "ui_m3kte.h"
|
||||||
|
|
||||||
|
#include "settingsdialog.h"
|
||||||
|
#include "writeregistermodel.h"
|
||||||
|
|
||||||
|
#include <QModbusTcpClient>
|
||||||
|
#include <QModbusRtuSerialMaster>
|
||||||
|
#include <QStandardItemModel>
|
||||||
|
#include <QStatusBar>
|
||||||
|
#include <QUrl>
|
||||||
|
|
||||||
|
//1024 768
|
||||||
|
//Ширина колбы - уже
|
||||||
|
M3KTE::M3KTE(QWidget *parent)
|
||||||
|
: QMainWindow(parent)
|
||||||
|
, ui(new Ui::M3KTE)
|
||||||
|
{
|
||||||
|
ui->setupUi(this);
|
||||||
|
|
||||||
|
//Массив указателей на индикаторы напряжения топливных элементов
|
||||||
|
{
|
||||||
|
int i = 0;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_1;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_2;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_3;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_4;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_5;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_6;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_7;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_8;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_9;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_10;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_11;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_12;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_13;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_14;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_15;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_16;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_17;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_18;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_19;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_20;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_21;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_22;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_23;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_24;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_25;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_26;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_27;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_28;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_29;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_30;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_31;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_32;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_33;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_34;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_35;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_36;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_37;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_38;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_39;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_40;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_41;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_42;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_43;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_44;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_45;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_46;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_47;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_48;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_49;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_50;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_51;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_52;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_53;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_54;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_55;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_56;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_57;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_58;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_59;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_60;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_61;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_62;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_63;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_64;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_65;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_66;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_67;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_68;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_69;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_70;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_71;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_72;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_73;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_74;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_75;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_76;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_77;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_78;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_79;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_80;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_81;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_82;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_83;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_84;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_85;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_86;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_87;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_88;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_89;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_90;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_91;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_92;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_93;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_94;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_95;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_96;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_97;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_98;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_99;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_100;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_101;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_102;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_103;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_104;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_105;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_106;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_107;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_108;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_109;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_110;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_111;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_112;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_113;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_114;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_115;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_116;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_117;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_118;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_119;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_120;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_121;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_122;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_123;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_124;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_125;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_126;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_127;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_128;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_129;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_130;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_131;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_132;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_133;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_134;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_135;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_136;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_137;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_138;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_139;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_140;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_141;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_142;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_143;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_144;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_145;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_146;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_147;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_148;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_149;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_150;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_151;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_152;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_153;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_154;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_155;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_156;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_157;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_158;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_159;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_160;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_161;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_162;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_163;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_164;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_165;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_166;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_167;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_168;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_169;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_170;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_171;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_172;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_173;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_174;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_175;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_176;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_177;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_178;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_179;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_180;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_181;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_182;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_183;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_184;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_185;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_186;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_187;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_188;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_189;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_190;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_191;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_192;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_193;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_194;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_195;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_196;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_197;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_198;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_199;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_200;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_201;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_202;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_203;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_204;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_205;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_206;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_207;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_208;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_209;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_210;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_211;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_212;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_213;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_214;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_215;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_216;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_217;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_218;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_219;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_220;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_221;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_222;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_223;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_224;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_225;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_226;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_227;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_228;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_229;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_230;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_231;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_232;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_233;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_234;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_235;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_236;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_237;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_238;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_239;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_240;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_241;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_242;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_243;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_244;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_245;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_246;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_247;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_248;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_249;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_250;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_251;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_252;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_253;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_254;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_255;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_256;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_257;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_258;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_259;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_260;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_261;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_262;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_263;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_264;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_265;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_266;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_267;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_268;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_269;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_270;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_271;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_272;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_273;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_274;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_275;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_276;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_277;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_278;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_279;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_280;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_281;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_282;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_283;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_284;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_285;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_286;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_287;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_288;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_289;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_290;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_291;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_292;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_293;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_294;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_295;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_296;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_297;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_298;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_299;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_300;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_301;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_302;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_303;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_304;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_305;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_306;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_307;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_308;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_309;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_310;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_311;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_312;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_313;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_314;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_315;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_316;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_317;
|
||||||
|
m_ProgressBar[i++] = ui->FuelCellVoltageBar_318;
|
||||||
|
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++)
|
||||||
|
{
|
||||||
|
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)));
|
||||||
|
Boards[i].ModbusModelHoldingReg = new WriteRegisterModel(this, (85 - (i/3*20))*2, true);
|
||||||
|
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);
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
||||||
|
Boards[0].adr = 1;
|
||||||
|
Boards[1].adr = 2;
|
||||||
|
Boards[2].adr = 3;
|
||||||
|
Boards[3].adr = 4;
|
||||||
|
|
||||||
|
ui->BSM_Warning->setEnabled(false);
|
||||||
|
ui->BSM_Accident->setEnabled(false);
|
||||||
|
ui->BSM_WorkInProgress->setEnabled(false);
|
||||||
|
|
||||||
|
initActions();
|
||||||
|
|
||||||
|
ui->BST_Off->setChecked(true);
|
||||||
|
|
||||||
|
ui->boardSelectBox->setCurrentIndex(0);
|
||||||
|
ui->writeTable->setCurrentIndex(0);
|
||||||
|
changeTable(0, 0);
|
||||||
|
|
||||||
|
for (int i = 0; i < 4; i++) {
|
||||||
|
statusM3KTE.Warnings[i] = false;
|
||||||
|
statusM3KTE.Accidents[i] = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
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++)
|
||||||
|
{
|
||||||
|
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;
|
||||||
|
// }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
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,
|
||||||
|
this, &M3KTE::onConnectClicked);
|
||||||
|
connect(ui->readButton, &QPushButton::clicked,
|
||||||
|
this, &M3KTE::onReadButtonClicked);
|
||||||
|
connect(ui->writeButton, &QPushButton::clicked,
|
||||||
|
this, &M3KTE::onWriteButtonClicked);
|
||||||
|
connect(ui->boardSelectBox, QOverload<int>::of(&QComboBox::currentIndexChanged),
|
||||||
|
this, &M3KTE::onSelectedBoardChanged);
|
||||||
|
connect(ui->writeTable, QOverload<int>::of(&QComboBox::currentIndexChanged),
|
||||||
|
this, &M3KTE::onWriteTableChanged);
|
||||||
|
|
||||||
|
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::onConnectClicked()
|
||||||
|
{
|
||||||
|
if (!modbusDevice)
|
||||||
|
return;
|
||||||
|
|
||||||
|
statusBar()->clearMessage();
|
||||||
|
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);
|
||||||
|
#endif
|
||||||
|
modbusDevice->setTimeout(m_settingsDialog->settings().responseTime);
|
||||||
|
modbusDevice->setNumberOfRetries(m_settingsDialog->settings().numberOfRetries);
|
||||||
|
if (!modbusDevice->connectDevice()) {
|
||||||
|
statusBar()->showMessage(tr("Connect failed: ") + modbusDevice->errorString(), 5000);
|
||||||
|
} else {
|
||||||
|
ui->ConnectionMenuConnect->setEnabled(false);
|
||||||
|
ui->ConnectionMenuDisconnect->setEnabled(true);
|
||||||
|
|
||||||
|
if(pingNetworkDevices())
|
||||||
|
{
|
||||||
|
unsigned tmp_adr[4];
|
||||||
|
for (int i = 0; i < 4; i++) {
|
||||||
|
tmp_adr[i] = Boards[i].adr;
|
||||||
|
}
|
||||||
|
|
||||||
|
ui->M3kteRegSettings->setEnabled(true);
|
||||||
|
|
||||||
|
m_deviceSettingsDialog->updateSettingsAfterConnection(m_settingsDialog->settings().baud, m_settingsDialog->settings().parity, tmp_adr, CurrentConnectedDevice);
|
||||||
|
|
||||||
|
ui->boardSelectBox->setCurrentIndex(0);
|
||||||
|
ui->writeTable->setCurrentIndex(0);
|
||||||
|
changeTable(0, 0);
|
||||||
|
|
||||||
|
ui->BST_Off->setChecked(false);
|
||||||
|
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++)
|
||||||
|
{
|
||||||
|
Boards[i].boardScanners->stop();
|
||||||
|
}
|
||||||
|
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->ConnectionMenuConnect->setEnabled(true);
|
||||||
|
ui->ConnectionMenuDisconnect->setEnabled(false);
|
||||||
|
ui->BST_Off->setChecked(true);
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void M3KTE::onReadButtonClicked()
|
||||||
|
{
|
||||||
|
if (!modbusDevice)
|
||||||
|
return;
|
||||||
|
//ui->readValue->clear();
|
||||||
|
statusBar()->clearMessage();
|
||||||
|
|
||||||
|
|
||||||
|
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)
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
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
|
||||||
|
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(ui->writeValueTable->model()->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);
|
||||||
|
}
|
||||||
|
|
||||||
|
reply->deleteLater();
|
||||||
|
}
|
||||||
|
|
||||||
|
void M3KTE::onWriteButtonClicked()
|
||||||
|
{
|
||||||
|
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)
|
||||||
|
{
|
||||||
|
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
|
||||||
|
{
|
||||||
|
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) {
|
||||||
|
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) {
|
||||||
|
statusBar()->showMessage(tr("Write response error: %1 (code: 0x%2)").
|
||||||
|
arg(reply->errorString()).arg(reply->error(), -1, 16), 5000);
|
||||||
|
}
|
||||||
|
reply->deleteLater();
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
// broadcast replies return immediately
|
||||||
|
reply->deleteLater();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
statusBar()->showMessage(tr("Write error: ") + modbusDevice->errorString(), 5000);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void M3KTE::onSelectedBoardChanged(int index)
|
||||||
|
{
|
||||||
|
changeTable(index, ui->writeTable->currentIndex());
|
||||||
|
}
|
||||||
|
|
||||||
|
void M3KTE::onWriteTableChanged(int index)
|
||||||
|
{
|
||||||
|
changeTable(ui->boardSelectBox->currentIndex(), index);
|
||||||
|
}
|
||||||
|
|
||||||
|
void M3KTE::changeTable(int board, int tabletype)
|
||||||
|
{
|
||||||
|
|
||||||
|
if(tabletype==0)
|
||||||
|
{
|
||||||
|
ui->writeValueTable->setModel(Boards[board].ModbusModelCoil);
|
||||||
|
int i = 0;
|
||||||
|
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
|
||||||
|
{
|
||||||
|
ui->writeValueTable->setModel(Boards[board].ModbusModelHoldingReg);
|
||||||
|
if(tabletype==1)
|
||||||
|
{
|
||||||
|
Boards[board].ModbusModelHoldingReg->setStartAddress(0);
|
||||||
|
int i = 0;
|
||||||
|
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++)
|
||||||
|
{
|
||||||
|
ui->writeValueTable->setRowHidden(i, ui->writeValueTable->model()->index(i, 0).parent(), true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Boards[board].ModbusModelHoldingReg->setStartAddress(Boards[board].ModbusModelHoldingReg->rowCount()/2);
|
||||||
|
int i = 0;
|
||||||
|
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++)
|
||||||
|
{
|
||||||
|
ui->writeValueTable->setRowHidden(i, ui->writeValueTable->model()->index(i, 0).parent(), false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ui->writeValueTable->hideColumn(2);
|
||||||
|
ui->writeValueTable->showColumn(3);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
QModbusDataUnit M3KTE::readRequest() const
|
||||||
|
{
|
||||||
|
const auto table =
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
|
QModbusDataUnit M3KTE::writeRequest() const
|
||||||
|
{
|
||||||
|
const auto table =
|
||||||
|
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)
|
||||||
|
{
|
||||||
|
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))
|
||||||
|
{
|
||||||
|
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();
|
||||||
|
delete subreply; // broadcast replies return immediately
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
errorAdrChange();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
errorAdrChange();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
else
|
||||||
|
{
|
||||||
|
delete reply;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
return QWidget::event(event);
|
||||||
|
}
|
||||||
|
|
||||||
|
void M3KTE::checkAdrChange()
|
||||||
|
{
|
||||||
|
auto reply = qobject_cast<QModbusReply *>(sender());
|
||||||
|
if (!reply)
|
||||||
|
{
|
||||||
|
errorAdrChange();
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//ERROR
|
||||||
|
errorAdrChange();
|
||||||
|
reply->deleteLater();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
errorAdrChange();
|
||||||
|
reply->deleteLater();
|
||||||
|
}
|
||||||
|
|
||||||
|
void M3KTE::errorAdrChange()
|
||||||
|
{
|
||||||
|
QMessageBox msgBox;
|
||||||
|
msgBox.setText("Не удалось изменить адрес устройства.");
|
||||||
|
msgBox.setStandardButtons(QMessageBox::Ok);
|
||||||
|
msgBox.setDefaultButton(QMessageBox::Ok);
|
||||||
|
int ret = msgBox.exec();
|
||||||
|
}
|
||||||
|
|
||||||
|
void M3KTE::onSpeedUpdate()
|
||||||
|
{
|
||||||
|
//Отсутствие контроля записи регистра на плате.
|
||||||
|
|
||||||
|
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
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void M3KTE::onParityUpdate()
|
||||||
|
{
|
||||||
|
//Отсутствие контроля записи регистра на плате.
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
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
|
||||||
|
}
|
||||||
|
} 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
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
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);
|
||||||
|
int tmp_adr = 1;
|
||||||
|
|
||||||
|
bool isRun = false;
|
||||||
|
bool *tmp_isRun = &isRun;
|
||||||
|
auto bar = new QProgressDialog(this);
|
||||||
|
connect(bar, &QProgressDialog::canceled, this, [this, tmp_isRun]()
|
||||||
|
{
|
||||||
|
*tmp_isRun = true;
|
||||||
|
});
|
||||||
|
bar->setLabelText(tr("Поиск плат..."));
|
||||||
|
bar->setCancelButton(nullptr);
|
||||||
|
bar->setRange(0, 4);
|
||||||
|
bar->setMinimumDuration(100);
|
||||||
|
bar->setValue(i);
|
||||||
|
|
||||||
|
CurrentConnectedDevice = 0;
|
||||||
|
|
||||||
|
for(i=0; i<4;)
|
||||||
|
{
|
||||||
|
|
||||||
|
if(isRun && CurrentConnectedDevice < 1)
|
||||||
|
{
|
||||||
|
onConnectClicked();
|
||||||
|
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)
|
||||||
|
{
|
||||||
|
onConnectClicked();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
tmp_adr++;
|
||||||
|
bar->setLabelText(tr("Поиск плат... Текущий адрес: %1").arg(tmp_adr));
|
||||||
|
if(tmp_adr>=247 && (CurrentConnectedDevice<1))
|
||||||
|
{
|
||||||
|
//ERROR
|
||||||
|
//OUT OF RANGE
|
||||||
|
QMessageBox::warning(this, "Ошибка при сканировании сети.", QString("Выход за пределы допустимых адресов. Найдено %1 плат.").arg(i));
|
||||||
|
bar->setValue(4);
|
||||||
|
bar->deleteLater();
|
||||||
|
onConnectClicked();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
else if(tmp_adr>=247)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
isRun=false;
|
||||||
|
QMessageBox::warning(this, "Сканирование сети завершено.", tr("Найдено плат: %1 из 4.").arg(i));
|
||||||
|
if(isRun)
|
||||||
|
{
|
||||||
|
onConnectClicked();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
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)
|
||||||
|
{
|
||||||
|
onConnectClicked();
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
QMessageBox::warning(this, "Ошибка при получении текущих настроек.", QString("Таймаут при опросе устройства %1 по адресу %2").arg(i).arg(Boards[i].adr));
|
||||||
|
bar->setValue(CurrentConnectedDevice*3);
|
||||||
|
onConnectClicked();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
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();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
void M3KTE::firstBoardScan()
|
||||||
|
{
|
||||||
|
if (!modbusDevice)
|
||||||
|
return;
|
||||||
|
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
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));
|
||||||
|
}
|
||||||
|
|
||||||
|
void M3KTE::displayResultOfScan(QModbusReply *reply, int boardID)
|
||||||
|
{
|
||||||
|
if (!reply)
|
||||||
|
return;
|
||||||
|
|
||||||
|
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)
|
||||||
|
{
|
||||||
|
//ERROR
|
||||||
|
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)
|
||||||
|
{
|
||||||
|
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))
|
||||||
|
{
|
||||||
|
j = 1;
|
||||||
|
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))
|
||||||
|
{
|
||||||
|
j = 2;
|
||||||
|
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
|
||||||
|
{
|
||||||
|
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)));
|
||||||
|
}
|
||||||
|
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
|
||||||
|
{
|
||||||
|
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)));
|
||||||
|
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+boardID*85]->setStyleSheet(style_fc_off);
|
||||||
|
}
|
||||||
|
Boards[boardID].ModbusModelCoil->set_currentU(unit.value(i), i);
|
||||||
|
Boards[boardID].ModbusModelHoldingReg->set_currentU(unit.value(i), i);
|
||||||
|
}
|
||||||
|
if(A_Flag)
|
||||||
|
statusM3KTE.Accidents[boardID] = true;
|
||||||
|
else
|
||||||
|
statusM3KTE.Accidents[boardID] = false;
|
||||||
|
if(W_Flag)
|
||||||
|
statusM3KTE.Warnings[boardID] = true;
|
||||||
|
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])
|
||||||
|
{
|
||||||
|
ui->BSM_WorkInProgress->setChecked(false);
|
||||||
|
ui->BSM_Warning->setChecked(false);
|
||||||
|
ui->BSM_Accident->setChecked(true);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
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) {
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
reply->deleteLater();
|
||||||
|
}
|
||||||
|
|
||||||
|
void M3KTE::stepForScanCurrentSettings(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);
|
||||||
|
}
|
||||||
|
|
||||||
|
reply->deleteLater();
|
||||||
|
}
|
||||||
|
|
||||||
|
void M3KTE::slotmultipleRegWrite()
|
||||||
|
{
|
||||||
|
if (!modbusDevice)
|
||||||
|
return;
|
||||||
|
multipleRegWrite();
|
||||||
|
}
|
||||||
|
|
||||||
|
void M3KTE::slotmultipleRegWriteAndSend()
|
||||||
|
{
|
||||||
|
if (!modbusDevice)
|
||||||
|
return;
|
||||||
|
multipleRegWrite();
|
||||||
|
multipleRegSend();
|
||||||
|
}
|
||||||
|
|
||||||
|
void M3KTE::multipleRegSend()
|
||||||
|
{
|
||||||
|
QModbusDataUnit *unit_tx = nullptr;
|
||||||
|
if(m_regMultipleSettings->getTypeReg())
|
||||||
|
{
|
||||||
|
unit_tx = new QModbusDataUnit(QModbusDataUnit::HoldingRegisters, m_regMultipleSettings->getStartAdr(), m_regMultipleSettings->getCountReg());
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
unit_tx = new QModbusDataUnit(QModbusDataUnit::Coils, m_regMultipleSettings->getStartAdr(), m_regMultipleSettings->getCountReg());
|
||||||
|
}
|
||||||
|
for (unsigned i = 0; i < m_regMultipleSettings->getCountReg(); i++) {
|
||||||
|
unit_tx->setValue(i, m_regMultipleSettings->getNewValue());
|
||||||
|
if(m_regMultipleSettings->getTypeReg())
|
||||||
|
{
|
||||||
|
Boards[m_regMultipleSettings->getBoardId()].HR[i+m_regMultipleSettings->getStartAdr()] = m_regMultipleSettings->getNewValue();
|
||||||
|
}
|
||||||
|
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) {
|
||||||
|
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) {
|
||||||
|
statusBar()->showMessage(tr("Write response error: %1 (code: 0x%2)").
|
||||||
|
arg(reply->errorString()).arg(reply->error(), -1, 16), 5000);
|
||||||
|
}
|
||||||
|
reply->deleteLater();
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
// broadcast replies return immediately
|
||||||
|
reply->deleteLater();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
statusBar()->showMessage(tr("Write error: ") + modbusDevice->errorString(), 5000);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
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();
|
||||||
|
Boards[m_regMultipleSettings->getBoardId()].ModbusModelHoldingReg->m_holdingRegisters[i+m_regMultipleSettings->getStartAdr()] = m_regMultipleSettings->getNewValue();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//Boards[m_regMultipleSettings->getBoardId()].coil[i] = m_regMultipleSettings->getNewValue();
|
||||||
|
Boards[m_regMultipleSettings->getBoardId()].ModbusModelCoil->m_coils[i+m_regMultipleSettings->getStartAdr()] = (bool)m_regMultipleSettings->getNewValue();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void M3KTE::selectPositionOnTree(unsigned int index)
|
||||||
|
{
|
||||||
|
ui->boardSelectBox->setCurrentIndex(index/85);
|
||||||
|
QModelIndex selected = ui->writeValueTable->model()->index(index%85, 0);
|
||||||
|
ui->writeValueTable->selectionModel()->select(selected, QItemSelectionModel::ClearAndSelect |QItemSelectionModel::Rows);
|
||||||
|
ui->writeValueTable->scrollTo(selected);
|
||||||
|
//selection
|
||||||
|
}
|
||||||
121
M3KTE_TERM/m3kte.h
Normal file
121
M3KTE_TERM/m3kte.h
Normal file
@@ -0,0 +1,121 @@
|
|||||||
|
#ifndef M3KTE_H
|
||||||
|
#define M3KTE_H
|
||||||
|
|
||||||
|
#include <QMainWindow>
|
||||||
|
#include <QModbusDataUnit>
|
||||||
|
#include <qprogressbar.h>
|
||||||
|
|
||||||
|
#include <QtSerialBus/QModbusDataUnit>
|
||||||
|
#include "writeregistermodel.h"
|
||||||
|
#include "devicesettingsdialog.h"
|
||||||
|
#include "multiplesettings.h"
|
||||||
|
|
||||||
|
#include <QModbusTcpClient>
|
||||||
|
#include <QModbusRtuSerialMaster>
|
||||||
|
|
||||||
|
#include <QTimer>
|
||||||
|
#include <QMessageBox>
|
||||||
|
#include <QProgressDialog>
|
||||||
|
#include <QErrorMessage>
|
||||||
|
#include <QPushButton>
|
||||||
|
|
||||||
|
#include <QtSerialBus/qtserialbusglobal.h>
|
||||||
|
|
||||||
|
#if QT_CONFIG(modbus_serialport)
|
||||||
|
#include <QSerialPort>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
QT_BEGIN_NAMESPACE
|
||||||
|
namespace Ui { class M3KTE; class SettingsDialog;}
|
||||||
|
QT_END_NAMESPACE
|
||||||
|
|
||||||
|
class SettingsDialog;
|
||||||
|
class WriteRegisterModel;
|
||||||
|
|
||||||
|
class M3KTE : public QMainWindow
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
private:
|
||||||
|
void initActions();
|
||||||
|
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 displayResultOfScan(QModbusReply *reply, int boardID);
|
||||||
|
void stepForScanCurrentSettings(QModbusReply *reply);
|
||||||
|
|
||||||
|
void multipleRegWrite();
|
||||||
|
void multipleRegSend();
|
||||||
|
|
||||||
|
void selectPositionOnTree(unsigned index);
|
||||||
|
private slots:
|
||||||
|
|
||||||
|
void slotmultipleRegWrite();
|
||||||
|
void slotmultipleRegWriteAndSend();
|
||||||
|
|
||||||
|
void onConnectClicked();
|
||||||
|
|
||||||
|
void onReadButtonClicked();
|
||||||
|
void onReadReady();
|
||||||
|
|
||||||
|
void timeForPingIsGone();
|
||||||
|
|
||||||
|
void checkAdrChange();
|
||||||
|
|
||||||
|
void onWriteButtonClicked();
|
||||||
|
void onSelectedBoardChanged(int index);
|
||||||
|
void onWriteTableChanged(int index);
|
||||||
|
|
||||||
|
void onSpeedUpdate();
|
||||||
|
void onParityUpdate();
|
||||||
|
|
||||||
|
void firstBoardScan();
|
||||||
|
void secondBoardScan();
|
||||||
|
void thirdBoardScan();
|
||||||
|
void fourthBoardScan();
|
||||||
|
|
||||||
|
void firstBoardReady();
|
||||||
|
void secondBoardReady();
|
||||||
|
void thirdBoardReady();
|
||||||
|
void fourthBoardReady();
|
||||||
|
public:
|
||||||
|
M3KTE(QWidget *parent = nullptr);
|
||||||
|
~M3KTE();
|
||||||
|
|
||||||
|
private:
|
||||||
|
Ui::M3KTE *ui;
|
||||||
|
bool timerForPingSignal = false;
|
||||||
|
int CurrentConnectedDevice = 0;
|
||||||
|
//int DeviceOnNetwork[4];
|
||||||
|
QProgressBar *m_ProgressBar[320];
|
||||||
|
QPushButton *ThePhantomMenace[320];
|
||||||
|
QModbusReply *lastRequest = nullptr;
|
||||||
|
QModbusClient *modbusDevice = nullptr;
|
||||||
|
DeviceSettingsDialog *m_deviceSettingsDialog = nullptr;
|
||||||
|
SettingsDialog *m_settingsDialog = nullptr;
|
||||||
|
MultipleSettings *m_regMultipleSettings = nullptr;
|
||||||
|
//WriteRegisterModel *writeModel = nullptr;
|
||||||
|
|
||||||
|
struct StatusM3KTE{
|
||||||
|
bool Warnings[4];
|
||||||
|
bool Accidents[4];
|
||||||
|
}statusM3KTE;
|
||||||
|
|
||||||
|
struct BoardModbusRegisters
|
||||||
|
{
|
||||||
|
int adr;
|
||||||
|
int _tmp_adr;
|
||||||
|
|
||||||
|
bool coil[85];
|
||||||
|
unsigned HR[170];
|
||||||
|
|
||||||
|
WriteRegisterModel *ModbusModelCoil;
|
||||||
|
WriteRegisterModel *ModbusModelHoldingReg;
|
||||||
|
QTimer *boardScanners;
|
||||||
|
}Boards[4];
|
||||||
|
};
|
||||||
|
#endif // M3KTE_H
|
||||||
14447
M3KTE_TERM/m3kte.ui
Normal file
14447
M3KTE_TERM/m3kte.ui
Normal file
File diff suppressed because it is too large
Load Diff
75
M3KTE_TERM/multiplesettings.cpp
Normal file
75
M3KTE_TERM/multiplesettings.cpp
Normal file
@@ -0,0 +1,75 @@
|
|||||||
|
#include "multiplesettings.h"
|
||||||
|
#include "ui_multiplesettings.h"
|
||||||
|
|
||||||
|
MultipleSettings::MultipleSettings(QWidget *parent) :
|
||||||
|
QDialog(parent),
|
||||||
|
ui(new Ui::MultipleSettings)
|
||||||
|
{
|
||||||
|
ui->setupUi(this);
|
||||||
|
|
||||||
|
ui->buttonBox->button(QDialogButtonBox::Ok)->setText("Записать");
|
||||||
|
ui->buttonBox->button(QDialogButtonBox::SaveAll)->setText("Записать и установить");
|
||||||
|
}
|
||||||
|
|
||||||
|
MultipleSettings::~MultipleSettings()
|
||||||
|
{
|
||||||
|
delete ui;
|
||||||
|
}
|
||||||
|
|
||||||
|
void MultipleSettings::on_buttonBox_clicked(QAbstractButton *button)
|
||||||
|
{
|
||||||
|
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))
|
||||||
|
{
|
||||||
|
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
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void MultipleSettings::on_regTypeBox_currentIndexChanged(int index)
|
||||||
|
{
|
||||||
|
switch (index) {
|
||||||
|
case 0:
|
||||||
|
case 1:
|
||||||
|
ui->adrBox->setRange(0, 84);
|
||||||
|
ui->adrBox->setValue(0);
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
ui->adrBox->setRange(85, 170);
|
||||||
|
ui->adrBox->setValue(85);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void MultipleSettings::on_boardBox_currentIndexChanged(int index)
|
||||||
|
{
|
||||||
|
switch (index) {
|
||||||
|
case 3:
|
||||||
|
ui->countBox->setRange(1, 65-ui->adrBox->value()+85*ui->regTypeBox->currentIndex()/2);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
ui->countBox->setRange(1, 85-ui->adrBox->value()+85*ui->regTypeBox->currentIndex()/2);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void MultipleSettings::on_adrBox_valueChanged(int arg1)
|
||||||
|
{
|
||||||
|
ui->countBox->setRange(1, ((85-(20*(ui->boardBox->currentIndex()/3)))*(1+(ui->regTypeBox->currentIndex()/2))-arg1));
|
||||||
|
}
|
||||||
45
M3KTE_TERM/multiplesettings.h
Normal file
45
M3KTE_TERM/multiplesettings.h
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
#ifndef MULTIPLESETTINGS_H
|
||||||
|
#define MULTIPLESETTINGS_H
|
||||||
|
|
||||||
|
#include <QDialog>
|
||||||
|
#include <QPushButton>
|
||||||
|
|
||||||
|
namespace Ui {
|
||||||
|
class MultipleSettings;
|
||||||
|
}
|
||||||
|
|
||||||
|
class MultipleSettings : public QDialog
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
explicit MultipleSettings(QWidget *parent = nullptr);
|
||||||
|
~MultipleSettings();
|
||||||
|
quint16 getNewValue() {return newValue;}
|
||||||
|
unsigned getStartAdr() {return startAdr;}
|
||||||
|
unsigned getCountReg() {return countReg;}
|
||||||
|
short getTypeReg() {return typeReg;}
|
||||||
|
short getBoardId() {return boardId;}
|
||||||
|
signals:
|
||||||
|
void write();
|
||||||
|
void writeAndSend();
|
||||||
|
|
||||||
|
private slots:
|
||||||
|
void on_buttonBox_clicked(QAbstractButton *button);
|
||||||
|
|
||||||
|
void on_regTypeBox_currentIndexChanged(int index);
|
||||||
|
|
||||||
|
void on_boardBox_currentIndexChanged(int index);
|
||||||
|
|
||||||
|
void on_adrBox_valueChanged(int arg1);
|
||||||
|
|
||||||
|
private:
|
||||||
|
Ui::MultipleSettings *ui;
|
||||||
|
quint16 newValue = 0;
|
||||||
|
unsigned startAdr;
|
||||||
|
unsigned countReg;
|
||||||
|
short typeReg;
|
||||||
|
short boardId;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // MULTIPLESETTINGS_H
|
||||||
198
M3KTE_TERM/multiplesettings.ui
Normal file
198
M3KTE_TERM/multiplesettings.ui
Normal file
@@ -0,0 +1,198 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<ui version="4.0">
|
||||||
|
<class>MultipleSettings</class>
|
||||||
|
<widget class="QDialog" name="MultipleSettings">
|
||||||
|
<property name="geometry">
|
||||||
|
<rect>
|
||||||
|
<x>0</x>
|
||||||
|
<y>0</y>
|
||||||
|
<width>381</width>
|
||||||
|
<height>128</height>
|
||||||
|
</rect>
|
||||||
|
</property>
|
||||||
|
<property name="windowTitle">
|
||||||
|
<string>Dialog</string>
|
||||||
|
</property>
|
||||||
|
<layout class="QGridLayout" name="gridLayout_2">
|
||||||
|
<item row="0" column="0">
|
||||||
|
<widget class="QGroupBox" name="groupBox">
|
||||||
|
<property name="title">
|
||||||
|
<string>Уставка</string>
|
||||||
|
</property>
|
||||||
|
<layout class="QGridLayout" name="gridLayout">
|
||||||
|
<item row="0" column="4">
|
||||||
|
<widget class="QLabel" name="countLabel">
|
||||||
|
<property name="text">
|
||||||
|
<string>Кол-во</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="0" column="2" colspan="2">
|
||||||
|
<widget class="QLabel" name="adrLabel">
|
||||||
|
<property name="text">
|
||||||
|
<string>Стартовый</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="0" column="0">
|
||||||
|
<widget class="QLabel" name="boardLabel">
|
||||||
|
<property name="text">
|
||||||
|
<string>Плата</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="2">
|
||||||
|
<widget class="QSpinBox" name="adrBox">
|
||||||
|
<property name="sizePolicy">
|
||||||
|
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
|
||||||
|
<horstretch>0</horstretch>
|
||||||
|
<verstretch>0</verstretch>
|
||||||
|
</sizepolicy>
|
||||||
|
</property>
|
||||||
|
<property name="maximum">
|
||||||
|
<number>84</number>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="0">
|
||||||
|
<widget class="QComboBox" name="boardBox">
|
||||||
|
<property name="sizePolicy">
|
||||||
|
<sizepolicy hsizetype="Minimum" vsizetype="Fixed">
|
||||||
|
<horstretch>0</horstretch>
|
||||||
|
<verstretch>0</verstretch>
|
||||||
|
</sizepolicy>
|
||||||
|
</property>
|
||||||
|
<property name="maximumSize">
|
||||||
|
<size>
|
||||||
|
<width>40</width>
|
||||||
|
<height>16777215</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
<item>
|
||||||
|
<property name="text">
|
||||||
|
<string>1</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<property name="text">
|
||||||
|
<string>2</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<property name="text">
|
||||||
|
<string>3</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<property name="text">
|
||||||
|
<string>4</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="4">
|
||||||
|
<widget class="QSpinBox" name="countBox">
|
||||||
|
<property name="sizePolicy">
|
||||||
|
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
|
||||||
|
<horstretch>0</horstretch>
|
||||||
|
<verstretch>0</verstretch>
|
||||||
|
</sizepolicy>
|
||||||
|
</property>
|
||||||
|
<property name="minimum">
|
||||||
|
<number>1</number>
|
||||||
|
</property>
|
||||||
|
<property name="maximum">
|
||||||
|
<number>85</number>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="5">
|
||||||
|
<widget class="QLineEdit" name="regValueLine"/>
|
||||||
|
</item>
|
||||||
|
<item row="0" column="5">
|
||||||
|
<widget class="QLabel" name="regValueLabel">
|
||||||
|
<property name="text">
|
||||||
|
<string>Значение (HEX)</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="1">
|
||||||
|
<widget class="QComboBox" name="regTypeBox">
|
||||||
|
<item>
|
||||||
|
<property name="text">
|
||||||
|
<string>Coil</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<property name="text">
|
||||||
|
<string>Warning</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<property name="text">
|
||||||
|
<string>Accident</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="0" column="1">
|
||||||
|
<widget class="QLabel" name="regTypeLabel">
|
||||||
|
<property name="text">
|
||||||
|
<string>Тип Регистра</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="0">
|
||||||
|
<widget class="QDialogButtonBox" name="buttonBox">
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Horizontal</enum>
|
||||||
|
</property>
|
||||||
|
<property name="standardButtons">
|
||||||
|
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok|QDialogButtonBox::SaveAll</set>
|
||||||
|
</property>
|
||||||
|
<property name="centerButtons">
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
<resources/>
|
||||||
|
<connections>
|
||||||
|
<connection>
|
||||||
|
<sender>buttonBox</sender>
|
||||||
|
<signal>accepted()</signal>
|
||||||
|
<receiver>MultipleSettings</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>MultipleSettings</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>
|
||||||
72
M3KTE_TERM/settingsdialog.cpp
Normal file
72
M3KTE_TERM/settingsdialog.cpp
Normal file
@@ -0,0 +1,72 @@
|
|||||||
|
#include "settingsdialog.h"
|
||||||
|
#include "ui_settingsdialog.h"
|
||||||
|
|
||||||
|
SettingsDialog::SettingsDialog(QWidget *parent) :
|
||||||
|
QDialog(parent),
|
||||||
|
ui(new Ui::SettingsDialog)
|
||||||
|
{
|
||||||
|
ui->setupUi(this);
|
||||||
|
|
||||||
|
ui->parityCombo->setCurrentIndex(0);
|
||||||
|
#if QT_CONFIG(modbus_serialport)
|
||||||
|
ui->baudCombo->setCurrentText(QString::number(m_settings.baud));
|
||||||
|
ui->dataBitsCombo->setCurrentText(QString::number(m_settings.dataBits));
|
||||||
|
ui->stopBitsCombo->setCurrentText(QString::number(m_settings.stopBits));
|
||||||
|
#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.parity = ui->parityCombo->currentIndex();
|
||||||
|
if (m_settings.parity > 0)
|
||||||
|
m_settings.parity++;
|
||||||
|
m_settings.baud = ui->baudCombo->currentText().toInt();
|
||||||
|
m_settings.dataBits = ui->dataBitsCombo->currentText().toInt();
|
||||||
|
m_settings.stopBits = ui->stopBitsCombo->currentText().toInt();
|
||||||
|
#endif
|
||||||
|
m_settings.responseTime = ui->timeoutSpinner->value();
|
||||||
|
m_settings.numberOfRetries = ui->retriesSpinner->value();
|
||||||
|
|
||||||
|
hide();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
SettingsDialog::~SettingsDialog()
|
||||||
|
{
|
||||||
|
delete ui;
|
||||||
|
}
|
||||||
|
|
||||||
|
SettingsDialog::Settings SettingsDialog::settings() const
|
||||||
|
{
|
||||||
|
return m_settings;
|
||||||
|
}
|
||||||
|
|
||||||
|
int SettingsDialog::UpdateBaud(int baud)
|
||||||
|
{
|
||||||
|
ui->baudCombo->setCurrentIndex(baud);
|
||||||
|
return (m_settings.baud = ui->baudCombo->currentText().toInt());
|
||||||
|
}
|
||||||
|
|
||||||
|
int SettingsDialog::UpdateParity(int parity)
|
||||||
|
{
|
||||||
|
ui->parityCombo->setCurrentIndex(parity);
|
||||||
|
if(parity>0)
|
||||||
|
{
|
||||||
|
return (m_settings.parity = ++parity);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return (m_settings.parity = parity);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int SettingsDialog::curBaud()
|
||||||
|
{
|
||||||
|
return ui->baudCombo->currentIndex();
|
||||||
|
}
|
||||||
|
|
||||||
|
int SettingsDialog::curParity()
|
||||||
|
{
|
||||||
|
return ui->parityCombo->currentIndex();
|
||||||
|
}
|
||||||
45
M3KTE_TERM/settingsdialog.h
Normal file
45
M3KTE_TERM/settingsdialog.h
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
#ifndef SETTINGSDIALOG_H
|
||||||
|
#define SETTINGSDIALOG_H
|
||||||
|
|
||||||
|
#include <QDialog>
|
||||||
|
#include <QtSerialBus/QModbusDataUnit>
|
||||||
|
#include <QtSerialBus/qtserialbusglobal.h>
|
||||||
|
#if QT_CONFIG(modbus_serialport)
|
||||||
|
#include <QSerialPort>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
namespace Ui {
|
||||||
|
class SettingsDialog;
|
||||||
|
}
|
||||||
|
|
||||||
|
class SettingsDialog : public QDialog
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
struct Settings {
|
||||||
|
QString portName;
|
||||||
|
int parity = QSerialPort::NoParity;
|
||||||
|
int baud = 115200;
|
||||||
|
int dataBits = QSerialPort::Data8;
|
||||||
|
int stopBits = QSerialPort::OneStop;
|
||||||
|
int responseTime = 500;
|
||||||
|
int numberOfRetries = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
explicit SettingsDialog(QWidget *parent = nullptr);
|
||||||
|
~SettingsDialog();
|
||||||
|
|
||||||
|
Settings settings() const;
|
||||||
|
|
||||||
|
int UpdateBaud(int baud);
|
||||||
|
int UpdateParity(int parity);
|
||||||
|
|
||||||
|
int curBaud();
|
||||||
|
int curParity();
|
||||||
|
private:
|
||||||
|
Settings m_settings;
|
||||||
|
Ui::SettingsDialog *ui;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // SETTINGSDIALOG_H
|
||||||
285
M3KTE_TERM/settingsdialog.ui
Normal file
285
M3KTE_TERM/settingsdialog.ui
Normal file
@@ -0,0 +1,285 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<ui version="4.0">
|
||||||
|
<class>SettingsDialog</class>
|
||||||
|
<widget class="QDialog" name="SettingsDialog">
|
||||||
|
<property name="geometry">
|
||||||
|
<rect>
|
||||||
|
<x>0</x>
|
||||||
|
<y>0</y>
|
||||||
|
<width>311</width>
|
||||||
|
<height>288</height>
|
||||||
|
</rect>
|
||||||
|
</property>
|
||||||
|
<property name="windowTitle">
|
||||||
|
<string>Dialog</string>
|
||||||
|
</property>
|
||||||
|
<layout class="QGridLayout" name="gridLayout_2">
|
||||||
|
<item row="1" column="1" colspan="2">
|
||||||
|
<widget class="QSpinBox" name="timeoutSpinner">
|
||||||
|
<property name="suffix">
|
||||||
|
<string> мс</string>
|
||||||
|
</property>
|
||||||
|
<property name="minimum">
|
||||||
|
<number>-1</number>
|
||||||
|
</property>
|
||||||
|
<property name="maximum">
|
||||||
|
<number>5000</number>
|
||||||
|
</property>
|
||||||
|
<property name="singleStep">
|
||||||
|
<number>20</number>
|
||||||
|
</property>
|
||||||
|
<property name="value">
|
||||||
|
<number>200</number>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="2" column="1" rowspan="2" colspan="2">
|
||||||
|
<widget class="QSpinBox" name="retriesSpinner">
|
||||||
|
<property name="enabled">
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
<property name="value">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="0">
|
||||||
|
<widget class="QLabel" name="timeoutLabel">
|
||||||
|
<property name="text">
|
||||||
|
<string>Тайм-аут ответа:</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="4" column="1">
|
||||||
|
<spacer name="verticalSpacer">
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Vertical</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeHint" stdset="0">
|
||||||
|
<size>
|
||||||
|
<width>20</width>
|
||||||
|
<height>127</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</spacer>
|
||||||
|
</item>
|
||||||
|
<item row="0" column="0" colspan="3">
|
||||||
|
<widget class="QGroupBox" name="groupBox">
|
||||||
|
<property name="title">
|
||||||
|
<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">
|
||||||
|
<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="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">
|
||||||
|
<number>7</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>
|
||||||
|
<item row="3" column="0">
|
||||||
|
<widget class="QLabel" name="dataBitsLabel">
|
||||||
|
<property name="text">
|
||||||
|
<string>Биты данных</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="3" column="1">
|
||||||
|
<widget class="QComboBox" name="dataBitsCombo">
|
||||||
|
<property name="currentIndex">
|
||||||
|
<number>3</number>
|
||||||
|
</property>
|
||||||
|
<item>
|
||||||
|
<property name="text">
|
||||||
|
<string>5</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<property name="text">
|
||||||
|
<string>6</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<property name="text">
|
||||||
|
<string>7</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<property name="text">
|
||||||
|
<string>8</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="4" column="0">
|
||||||
|
<widget class="QLabel" name="stopBitsLabel">
|
||||||
|
<property name="text">
|
||||||
|
<string>Стоп-биты</string>
|
||||||
|
</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>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="2" column="0" rowspan="2">
|
||||||
|
<widget class="QLabel" name="retriesLabel">
|
||||||
|
<property name="text">
|
||||||
|
<string>Количество повторов:</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="5" column="1">
|
||||||
|
<widget class="QDialogButtonBox" name="AcceptOrRejectButtonBox">
|
||||||
|
<property name="minimumSize">
|
||||||
|
<size>
|
||||||
|
<width>0</width>
|
||||||
|
<height>25</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
<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>AcceptOrRejectButtonBox</sender>
|
||||||
|
<signal>accepted()</signal>
|
||||||
|
<receiver>SettingsDialog</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>AcceptOrRejectButtonBox</sender>
|
||||||
|
<signal>rejected()</signal>
|
||||||
|
<receiver>SettingsDialog</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>
|
||||||
148
M3KTE_TERM/writeregistermodel.cpp
Normal file
148
M3KTE_TERM/writeregistermodel.cpp
Normal file
@@ -0,0 +1,148 @@
|
|||||||
|
#include "writeregistermodel.h"
|
||||||
|
|
||||||
|
#include "writeregistermodel.h"
|
||||||
|
|
||||||
|
enum { NumColumn = 0, NameColumn = 1, CoilsColumn = 2, HoldingColumn = 3, ColumnCount = 5, CurrentUColumn = 4};
|
||||||
|
|
||||||
|
WriteRegisterModel::WriteRegisterModel(QObject *parent, int _tmpRC, bool _isHR)
|
||||||
|
: QAbstractTableModel(parent),
|
||||||
|
m_coils(RowCount=_tmpRC, false), m_holdingRegisters(RowCount=_tmpRC, 0u), m_currentU(RowCount=_tmpRC)
|
||||||
|
{
|
||||||
|
isHR=_isHR;
|
||||||
|
}
|
||||||
|
|
||||||
|
int WriteRegisterModel::rowCount(const QModelIndex &/*parent*/) const
|
||||||
|
{
|
||||||
|
return RowCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
int WriteRegisterModel::columnCount(const QModelIndex &/*parent*/) const
|
||||||
|
{
|
||||||
|
return ColumnCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
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());
|
||||||
|
|
||||||
|
if (index.column() == NameColumn && role == Qt::DisplayRole)
|
||||||
|
return QString("ТЭ%1").arg(index.row()%(RowCount/(1+isHR))+1);
|
||||||
|
|
||||||
|
if (index.column() == CoilsColumn && role == Qt::CheckStateRole) // coils
|
||||||
|
return m_coils.at(index.row()) ? Qt::Checked : Qt::Unchecked;
|
||||||
|
|
||||||
|
if (index.column() == HoldingColumn && role == Qt::DisplayRole) // holding registers
|
||||||
|
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 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:
|
||||||
|
return QStringLiteral("#Reg");
|
||||||
|
case NameColumn:
|
||||||
|
return QStringLiteral("Fuel Cell");
|
||||||
|
case CoilsColumn:
|
||||||
|
return QStringLiteral("Coils");
|
||||||
|
case HoldingColumn:
|
||||||
|
return QStringLiteral("Holding Registers");
|
||||||
|
case CurrentUColumn:
|
||||||
|
return QStringLiteral("Current U");
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return QVariant();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool WriteRegisterModel::setData(const QModelIndex &index, const QVariant &value, int role)
|
||||||
|
{
|
||||||
|
if (!index.isValid() || index.row() >= RowCount || index.column() >= ColumnCount)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
Q_ASSERT(m_coils.count() == RowCount);
|
||||||
|
Q_ASSERT(m_holdingRegisters.count() == RowCount);
|
||||||
|
|
||||||
|
if (index.column() == CoilsColumn && role == Qt::CheckStateRole) { // coils
|
||||||
|
auto s = static_cast<Qt::CheckState>(value.toUInt());
|
||||||
|
s == Qt::Checked ? m_coils.setBit(index.row()) : m_coils.clearBit(index.row());
|
||||||
|
emit dataChanged(index, index);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (index.column() == HoldingColumn && role == Qt::EditRole) { // holding registers
|
||||||
|
bool result = false;
|
||||||
|
quint16 newValue = value.toString().toUShort(&result, 16);
|
||||||
|
if (result)
|
||||||
|
m_holdingRegisters[index.row()] = newValue;
|
||||||
|
|
||||||
|
emit dataChanged(index, index);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
Qt::ItemFlags WriteRegisterModel::flags(const QModelIndex &index) const
|
||||||
|
{
|
||||||
|
if (!index.isValid() || index.row() >= RowCount || index.column() >= ColumnCount)
|
||||||
|
return QAbstractTableModel::flags(index);
|
||||||
|
|
||||||
|
Qt::ItemFlags flags = QAbstractTableModel::flags(index);
|
||||||
|
if ((index.row() < m_address) || (index.row() >= (m_address + m_number)))
|
||||||
|
flags &= ~Qt::ItemIsEnabled;
|
||||||
|
|
||||||
|
if (index.column() == CoilsColumn) // coils
|
||||||
|
return flags | Qt::ItemIsUserCheckable;
|
||||||
|
if (index.column() == HoldingColumn) // holding registers
|
||||||
|
return flags | Qt::ItemIsEditable;
|
||||||
|
|
||||||
|
return flags;
|
||||||
|
}
|
||||||
|
|
||||||
|
void WriteRegisterModel::setStartAddress(int address)
|
||||||
|
{
|
||||||
|
m_address = address;
|
||||||
|
//emit updateViewport();
|
||||||
|
}
|
||||||
|
|
||||||
|
void WriteRegisterModel::setNumberOfValues(const QString &number)
|
||||||
|
{
|
||||||
|
m_number = number.toInt();
|
||||||
|
//emit updateViewport();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool WriteRegisterModel::get_coil(const QModelIndex &index)
|
||||||
|
{
|
||||||
|
return m_coils.at(index.row());
|
||||||
|
}
|
||||||
|
|
||||||
|
uint WriteRegisterModel::get_holreg(const QModelIndex &index)
|
||||||
|
{
|
||||||
|
return m_holdingRegisters.at(index.row());
|
||||||
|
}
|
||||||
|
|
||||||
|
bool WriteRegisterModel::set_currentU(unsigned _tmpU, unsigned index)
|
||||||
|
{
|
||||||
|
m_currentU[index] = _tmpU;
|
||||||
|
if(isHR)
|
||||||
|
m_currentU[index + m_number] = _tmpU;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
43
M3KTE_TERM/writeregistermodel.h
Normal file
43
M3KTE_TERM/writeregistermodel.h
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
#ifndef WRITEREGISTERMODEL_H
|
||||||
|
#define WRITEREGISTERMODEL_H
|
||||||
|
|
||||||
|
#include <QAbstractItemModel>
|
||||||
|
#include <QBitArray>
|
||||||
|
#include <QObject>
|
||||||
|
|
||||||
|
class WriteRegisterModel : public QAbstractTableModel
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
bool isHR;
|
||||||
|
int RowCount;
|
||||||
|
public:
|
||||||
|
WriteRegisterModel(QObject *parent = nullptr, int _tmpRC = 85, bool _isHR = false);
|
||||||
|
bool get_coil(const QModelIndex &index);
|
||||||
|
uint get_holreg(const QModelIndex &index);
|
||||||
|
|
||||||
|
int rowCount(const QModelIndex &parent = QModelIndex()) const override;
|
||||||
|
int columnCount(const QModelIndex &parent = QModelIndex()) const override;
|
||||||
|
|
||||||
|
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
|
||||||
|
QVariant headerData(int section, Qt::Orientation orientation, int role) const override;
|
||||||
|
bool setData(const QModelIndex &index, const QVariant &value, int role) override;
|
||||||
|
|
||||||
|
Qt::ItemFlags flags(const QModelIndex &index) const override;
|
||||||
|
|
||||||
|
bool set_currentU(unsigned _tmpU, unsigned index);
|
||||||
|
|
||||||
|
public slots:
|
||||||
|
void setStartAddress(int address);
|
||||||
|
void setNumberOfValues(const QString &number);
|
||||||
|
|
||||||
|
signals:
|
||||||
|
void updateViewport();
|
||||||
|
|
||||||
|
public:
|
||||||
|
int m_number = 0;
|
||||||
|
int m_address = 0;
|
||||||
|
QBitArray m_coils;
|
||||||
|
QVector<quint16> m_holdingRegisters;
|
||||||
|
QVector<quint16> m_currentU;
|
||||||
|
};
|
||||||
|
#endif // WRITEREGISTERMODEL_H
|
||||||
15
m3kte.cpp
15
m3kte.cpp
@@ -1,15 +0,0 @@
|
|||||||
#include "m3kte.h"
|
|
||||||
#include "ui_m3kte.h"
|
|
||||||
|
|
||||||
M3KTE::M3KTE(QWidget *parent)
|
|
||||||
: QMainWindow(parent)
|
|
||||||
, ui(new Ui::M3KTE)
|
|
||||||
{
|
|
||||||
ui->setupUi(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
M3KTE::~M3KTE()
|
|
||||||
{
|
|
||||||
delete ui;
|
|
||||||
}
|
|
||||||
|
|
||||||
21
m3kte.h
21
m3kte.h
@@ -1,21 +0,0 @@
|
|||||||
#ifndef M3KTE_H
|
|
||||||
#define M3KTE_H
|
|
||||||
|
|
||||||
#include <QMainWindow>
|
|
||||||
|
|
||||||
QT_BEGIN_NAMESPACE
|
|
||||||
namespace Ui { class M3KTE; }
|
|
||||||
QT_END_NAMESPACE
|
|
||||||
|
|
||||||
class M3KTE : public QMainWindow
|
|
||||||
{
|
|
||||||
Q_OBJECT
|
|
||||||
|
|
||||||
public:
|
|
||||||
M3KTE(QWidget *parent = nullptr);
|
|
||||||
~M3KTE();
|
|
||||||
|
|
||||||
private:
|
|
||||||
Ui::M3KTE *ui;
|
|
||||||
};
|
|
||||||
#endif // M3KTE_H
|
|
||||||
22
m3kte.ui
22
m3kte.ui
@@ -1,22 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<ui version="4.0">
|
|
||||||
<class>M3KTE</class>
|
|
||||||
<widget class="QMainWindow" name="M3KTE">
|
|
||||||
<property name="geometry">
|
|
||||||
<rect>
|
|
||||||
<x>0</x>
|
|
||||||
<y>0</y>
|
|
||||||
<width>800</width>
|
|
||||||
<height>600</height>
|
|
||||||
</rect>
|
|
||||||
</property>
|
|
||||||
<property name="windowTitle">
|
|
||||||
<string>M3KTE</string>
|
|
||||||
</property>
|
|
||||||
<widget class="QWidget" name="centralwidget"/>
|
|
||||||
<widget class="QMenuBar" name="menubar"/>
|
|
||||||
<widget class="QStatusBar" name="statusbar"/>
|
|
||||||
</widget>
|
|
||||||
<resources/>
|
|
||||||
<connections/>
|
|
||||||
</ui>
|
|
||||||
373
ТЗ/modbus_data.h
Normal file
373
ТЗ/modbus_data.h
Normal file
@@ -0,0 +1,373 @@
|
|||||||
|
/**
|
||||||
|
**************************************************************************
|
||||||
|
* @file modbus_data.h
|
||||||
|
* @brief Заголовочный файл с описанием даты MODBUS.
|
||||||
|
* @details Данный файл необходимо подключается в rs_message.h. После rs_message.h
|
||||||
|
* подключается к основному проекту.
|
||||||
|
*
|
||||||
|
* @defgroup MODBUS_DATA
|
||||||
|
* @ingroup MODBUS
|
||||||
|
* @brief Modbus data description
|
||||||
|
*
|
||||||
|
*************************************************************************/
|
||||||
|
#include "stdint.h"
|
||||||
|
//--------------DEFINES FOR REGISTERS---------------
|
||||||
|
// DEFINES FOR ARRAYS
|
||||||
|
/**
|
||||||
|
* @addtogroup MODBUS_DATA_RERISTERS_DEFINES
|
||||||
|
* @ingroup MODBUS_DATA
|
||||||
|
* @brief Defines for registers
|
||||||
|
Структура дефайна адресов
|
||||||
|
@verbatim
|
||||||
|
Для массивов регистров:
|
||||||
|
R_<NAME_ARRAY>_ADDR - модбас адресс первого регистра в массиве
|
||||||
|
R_<NAME_ARRAY>_QNT - количество регистров в массиве
|
||||||
|
|
||||||
|
@endverbatim
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Скорость обмена
|
||||||
|
*/
|
||||||
|
typedef enum //MB_SpeedTypeDef
|
||||||
|
{
|
||||||
|
MB_9600bs = 0x0000, ///< Скорость 9600 б/с
|
||||||
|
MB_14400bs = 0x0001, ///< Скорость 14400 б/с
|
||||||
|
MB_19200bs = 0x0002, ///< Скорость 19200 б/с
|
||||||
|
MB_31250bs = 0x0003, ///< Скорость 31250 б/с
|
||||||
|
MB_38400bs = 0x0004, ///< Скорость 38400 б/с
|
||||||
|
MB_56000bs = 0x0005, ///< Скорость 56000 б/с
|
||||||
|
MB_57600bs = 0x0006, ///< Скорость 57600 б/с
|
||||||
|
MB_115200bs = 0x0007, ///< Скорость 115200 б/с
|
||||||
|
mb16bit = 0x1000, ///< костыль чтобы enum был 16-битный... или забить на enum, пока не определился
|
||||||
|
}MB_SpeedTypeDef;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Контроль четности
|
||||||
|
*/
|
||||||
|
typedef enum //MB_ParityCtrlTypeDef
|
||||||
|
{
|
||||||
|
NoParityCtrl = 0x0000, ///< контроля нет
|
||||||
|
EvenParityCtrl = 0x0400, ///< четный контроль
|
||||||
|
OddParityCtrl = 0x0600, ///< нечетый контроль
|
||||||
|
}MB_ParityCtrlTypeDef;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Регистры хранения для уставок параметров МКЗТЭ
|
||||||
|
*/
|
||||||
|
typedef struct //MB_DataHoldRegsTypeDef
|
||||||
|
{
|
||||||
|
|
||||||
|
uint16_t Warning_Setpoints[85]; /*!< @brief Адреса 0-84: Уставки «Предупреждение»
|
||||||
|
@details Задает пороговое напряжение, при достижении которого будет сформирован сигнал «Предупреждение».
|
||||||
|
|
||||||
|
Максимальное значение (записываемое в регистр) - 1100 (1,1 В *1000) */
|
||||||
|
|
||||||
|
uint16_t Errors_Setpoints[85]; /*!< @brief Адреса 85-169: Уставки «Авария»
|
||||||
|
@details Задает пороговое напряжение, при достижении которого будет сформирован сигнал «Авария».
|
||||||
|
|
||||||
|
Максимальное значение (записываемое в регистр) - 1100 (1,1 В *1000) */
|
||||||
|
|
||||||
|
uint16_t Commands_Mode; /*!< @brief Адрес 170: Уставка «Команды»
|
||||||
|
@details Принимаемые значения:
|
||||||
|
- 0x0000 – стандартная работа
|
||||||
|
- 0x0001 – запрет опроса ТЭ (активен только обмен с ЛСУ ЭС, ТЭ не контролируются) */
|
||||||
|
|
||||||
|
uint16_t reserved; ///< Адрес 171 зарезервирован
|
||||||
|
|
||||||
|
uint16_t MZKTE_Network_Adress; /*!< @brief Адрес 172: Уставка «Сетевой адрес МЗКТЭ»
|
||||||
|
@details При удачной записи этого регистра ответный фрейм не отправляется */
|
||||||
|
|
||||||
|
MB_SpeedTypeDef Modbus_Speed:16; /*!< @brief Адрес 173: Уставка «Скорость обмена»
|
||||||
|
@details Принимаемые значения описаны в @ref MB_SpeedTypeDef.
|
||||||
|
|
||||||
|
При удачной записи этого регистра ответный фрейм не отправляется */
|
||||||
|
|
||||||
|
MB_ParityCtrlTypeDef Parity_Control:16; /*!< @brief Адрес 174: Уставка «Команды»
|
||||||
|
@details Принимаемые значения описаны в @ref MB_ParityCtrlTypeDef.
|
||||||
|
|
||||||
|
При удачной записи этого регистра ответный фрейм не отправляется */
|
||||||
|
}MB_DataHoldRegsTypeDef;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Номер неисправности МЗКТЭ
|
||||||
|
*/
|
||||||
|
typedef enum //MB_MZKTEErrorsTypeDef
|
||||||
|
{
|
||||||
|
No_Err = 0x00, ///< Неисправность отсутствует
|
||||||
|
Err_Digit_5V_Power = 0x01, ///< Неисправность цифрового источника питания +5 В
|
||||||
|
Err_Analog_15V_5V_3V_Power = 0x02, ///< Неисправность аналогового источника питания (±15 В/+5 В/+3,3 В)
|
||||||
|
Err_SCI_5V_Power = 0x03, ///< Неисправность источника питания последовательных интерфейсов микроконтроллера +5 В
|
||||||
|
Err_24V_Power = 0x04, ///< Неисправность источника питания +24 В
|
||||||
|
Program_Err_1 = 0x05, ///< Программная ошибка 1
|
||||||
|
Program_Err_2 = 0x06, ///< Программная ошибка 2
|
||||||
|
Program_Err_3 = 0x07, ///< Программная ошибка 3
|
||||||
|
Program_Err_4 = 0x08, ///< Программная ошибка 4
|
||||||
|
Program_Err_5 = 0x09, ///< Программная ошибка 5
|
||||||
|
Program_Err_6 = 0x0A, ///< Программная ошибка 6
|
||||||
|
Program_Err_7 = 0x0B, ///< Программная ошибка 7
|
||||||
|
Program_Err_8 = 0x0C, ///< Программная ошибка 8
|
||||||
|
}MB_MZKTEErrorsTypeDef;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Сборный параметр
|
||||||
|
* @details Информация о состоянии МЗКТЭ
|
||||||
|
*/
|
||||||
|
typedef union //MB_MZKTEStatusTypeDef
|
||||||
|
{
|
||||||
|
uint16_t all; ///< Доступ к регистру целиком
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
unsigned TE_ErrActive:1; /*!< @brief Бит [0]: Авария на ТЭ
|
||||||
|
@details Состояния:
|
||||||
|
- 0 - напряжения на всех ТЭ выше аварийных порогов, задаваемых уставками «Авария»
|
||||||
|
- 1 - напряжение на одном или нескольких ТЭ достигло или ниже аварийного порога, задаваемого уставкой «Авария» */
|
||||||
|
|
||||||
|
unsigned TE_WarnActive:1; /*!< @brief Бит [1]: Предупреждения на ТЭ
|
||||||
|
@details Состояния:
|
||||||
|
- 0 - напряжения на всех ТЭ выше предупредительных порогов, задаваемых уставкой «Предупреждение»
|
||||||
|
- 1 - напряжение на одном или нескольких ТЭ достигло или ниже предупредительного порога, задаваемого уставкой «Предупреждение» */
|
||||||
|
|
||||||
|
unsigned Opros_TE:1; /*!< @brief Бит [2]: Разрешение опроса ТЭ
|
||||||
|
@details Состояния:
|
||||||
|
- 0 – опрос ТЭ разрешен
|
||||||
|
- 1 – опрос ТЭ запрещен */
|
||||||
|
|
||||||
|
unsigned MZKTE_ErrStatus:2; /*!< @brief Биты [4:3]: Состояние МЗКТЭ
|
||||||
|
@details Состояния:
|
||||||
|
- 0 - МЗКТЭ функционирует нормально. Идет опрос ТЭ.
|
||||||
|
- 1 - неисправность МЗКТЭ, при которой МЗКТЭ может выполнять свои основные функции
|
||||||
|
(некоторые программные ошибки из @ref MB_MZKTEErrorsTypeDef)
|
||||||
|
- 2 - Неисправность МЗКТЭ, при которой выполнение основных функций не представляется возможным
|
||||||
|
(ошибки 1-3 и некоторые программные ошибки из @ref MB_MZKTEErrorsTypeDef) */
|
||||||
|
|
||||||
|
unsigned reserved:3; ///< Биты [7:5] зарезервированны
|
||||||
|
|
||||||
|
MB_MZKTEErrorsTypeDef MZKTE_Error:8; /*!< @brief Биты [15:8]: Номер неисправности МЗКТЭ
|
||||||
|
@details Номера неисправностей описаны в @ref MB_MZKTEErrorsTypeDef */
|
||||||
|
}param; ///< Доступ к регистру по параметрам
|
||||||
|
}MB_MZKTEStatusTypeDef;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Входные регистры для контроля состояния МЗКТЭ
|
||||||
|
*/
|
||||||
|
typedef struct //MB_DataInRegsTypeDef
|
||||||
|
{
|
||||||
|
|
||||||
|
uint16_t U_TE[85]; /*!< @brief Адреса 0-84: Текущие значения напряжения ТЭ
|
||||||
|
@details Значения передаются умноженными на 1000 (т.е. если Uтэ = 0,625 В, то будет передано число 625) */
|
||||||
|
|
||||||
|
MB_MZKTEStatusTypeDef Status; /*!< @brief Адрес 85: Сборный параметр
|
||||||
|
@details Информация о состоянии МЗКТЭ @ref MB_MZKTEStatusTypeDef */
|
||||||
|
}MB_DataInRegsTypeDef;
|
||||||
|
|
||||||
|
|
||||||
|
// DEFINES FOR REGISTERS ARRAYS
|
||||||
|
#define R_INREG_ADDR 0
|
||||||
|
#define R_INREG_QNT 86
|
||||||
|
|
||||||
|
#define R_HOLDREG_ADDR 0
|
||||||
|
#define R_HOLDREG_QNT 175
|
||||||
|
|
||||||
|
|
||||||
|
// DEFINES FOR REGISTERS LOCAL ADDRESSES
|
||||||
|
//#define R_SET_ERROR(_te_num_) 0
|
||||||
|
|
||||||
|
|
||||||
|
/** MODBUS_DATA_RERISTERS_DEFINES
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
//----------------DEFINES FOR COILS-----------------
|
||||||
|
/**
|
||||||
|
* @addtogroup MODBUS_DATA_COILS_DEFINES
|
||||||
|
* @ingroup MODBUS_DATA
|
||||||
|
* @brief Defines for coils
|
||||||
|
@verbatim
|
||||||
|
Структура дефайна
|
||||||
|
Для массивов коилов:
|
||||||
|
C_<NAME_ARRAY>_ADDR - модбас адресс первого коила в массиве
|
||||||
|
C_<NAME_ARRAY>_QNT - количество коилов в массиве (минимум 16)
|
||||||
|
|
||||||
|
@endverbatim
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Флаги исключения ТЭ из алгоритма формирования сигналов «Предупреждение» и «Авария»
|
||||||
|
* @details В случае установки нулевого значения конкретной ячейки значение напряжения ТЭ,
|
||||||
|
* связанного с этой ячейкой, не будет учитываться при формировании сигналов «Предупреждение» и «Авария»
|
||||||
|
*/
|
||||||
|
typedef struct //MB_DataCoilsTypeDef
|
||||||
|
{
|
||||||
|
union
|
||||||
|
{
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
uint64_t TE0_63; ///< Ячейки ТЭ №0-63
|
||||||
|
uint32_t TE64_84:21; ///< Ячейки ТЭ №64-84
|
||||||
|
}all;
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
unsigned TE0_Exclude:1;
|
||||||
|
unsigned TE1_Exclude:1;
|
||||||
|
unsigned TE2_Exclude:1;
|
||||||
|
unsigned TE3_Exclude:1;
|
||||||
|
unsigned TE4_Exclude:1;
|
||||||
|
unsigned TE5_Exclude:1;
|
||||||
|
unsigned TE6_Exclude:1;
|
||||||
|
unsigned TE7_Exclude:1;
|
||||||
|
unsigned TE8_Exclude:1;
|
||||||
|
unsigned TE9_Exclude:1;
|
||||||
|
unsigned TE10_Exclude:1;
|
||||||
|
unsigned TE11_Exclude:1;
|
||||||
|
unsigned TE12_Exclude:1;
|
||||||
|
unsigned TE13_Exclude:1;
|
||||||
|
unsigned TE14_Exclude:1;
|
||||||
|
unsigned TE15_Exclude:1;
|
||||||
|
unsigned TE16_Exclude:1;
|
||||||
|
unsigned TE17_Exclude:1;
|
||||||
|
unsigned TE18_Exclude:1;
|
||||||
|
unsigned TE19_Exclude:1;
|
||||||
|
unsigned TE20_Exclude:1;
|
||||||
|
unsigned TE21_Exclude:1;
|
||||||
|
unsigned TE22_Exclude:1;
|
||||||
|
unsigned TE23_Exclude:1;
|
||||||
|
unsigned TE24_Exclude:1;
|
||||||
|
unsigned TE25_Exclude:1;
|
||||||
|
unsigned TE26_Exclude:1;
|
||||||
|
unsigned TE27_Exclude:1;
|
||||||
|
unsigned TE28_Exclude:1;
|
||||||
|
unsigned TE29_Exclude:1;
|
||||||
|
unsigned TE30_Exclude:1;
|
||||||
|
unsigned TE31_Exclude:1;
|
||||||
|
unsigned TE32_Exclude:1;
|
||||||
|
unsigned TE33_Exclude:1;
|
||||||
|
unsigned TE34_Exclude:1;
|
||||||
|
unsigned TE35_Exclude:1;
|
||||||
|
unsigned TE36_Exclude:1;
|
||||||
|
unsigned TE37_Exclude:1;
|
||||||
|
unsigned TE38_Exclude:1;
|
||||||
|
unsigned TE39_Exclude:1;
|
||||||
|
unsigned TE40_Exclude:1;
|
||||||
|
unsigned TE41_Exclude:1;
|
||||||
|
unsigned TE42_Exclude:1;
|
||||||
|
unsigned TE43_Exclude:1;
|
||||||
|
unsigned TE44_Exclude:1;
|
||||||
|
unsigned TE45_Exclude:1;
|
||||||
|
unsigned TE46_Exclude:1;
|
||||||
|
unsigned TE47_Exclude:1;
|
||||||
|
unsigned TE48_Exclude:1;
|
||||||
|
unsigned TE49_Exclude:1;
|
||||||
|
unsigned TE50_Exclude:1;
|
||||||
|
unsigned TE51_Exclude:1;
|
||||||
|
unsigned TE52_Exclude:1;
|
||||||
|
unsigned TE53_Exclude:1;
|
||||||
|
unsigned TE54_Exclude:1;
|
||||||
|
unsigned TE55_Exclude:1;
|
||||||
|
unsigned TE56_Exclude:1;
|
||||||
|
unsigned TE57_Exclude:1;
|
||||||
|
unsigned TE58_Exclude:1;
|
||||||
|
unsigned TE59_Exclude:1;
|
||||||
|
unsigned TE60_Exclude:1;
|
||||||
|
unsigned TE61_Exclude:1;
|
||||||
|
unsigned TE62_Exclude:1;
|
||||||
|
unsigned TE63_Exclude:1;
|
||||||
|
unsigned TE64_Exclude:1;
|
||||||
|
unsigned TE65_Exclude:1;
|
||||||
|
unsigned TE66_Exclude:1;
|
||||||
|
unsigned TE67_Exclude:1;
|
||||||
|
unsigned TE68_Exclude:1;
|
||||||
|
unsigned TE69_Exclude:1;
|
||||||
|
unsigned TE70_Exclude:1;
|
||||||
|
unsigned TE71_Exclude:1;
|
||||||
|
unsigned TE72_Exclude:1;
|
||||||
|
unsigned TE73_Exclude:1;
|
||||||
|
unsigned TE74_Exclude:1;
|
||||||
|
unsigned TE75_Exclude:1;
|
||||||
|
unsigned TE76_Exclude:1;
|
||||||
|
unsigned TE77_Exclude:1;
|
||||||
|
unsigned TE78_Exclude:1;
|
||||||
|
unsigned TE79_Exclude:1;
|
||||||
|
unsigned TE80_Exclude:1;
|
||||||
|
unsigned TE81_Exclude:1;
|
||||||
|
unsigned TE82_Exclude:1;
|
||||||
|
unsigned TE83_Exclude:1;
|
||||||
|
unsigned TE84_Exclude:1;
|
||||||
|
}bit; ///< Биты для доступа к каждой ячейке ТЭ
|
||||||
|
}Exclude; ///< Юнион для исключения ТЭ
|
||||||
|
}MB_DataCoilsTypeDef;
|
||||||
|
|
||||||
|
// DEFINES FOR COIL ARRAYS
|
||||||
|
#define C_TE_EXCLUDE_ADDR 0
|
||||||
|
#define C_TE_EXCLUDE_QNT 84
|
||||||
|
|
||||||
|
/** MODBUS_DATA_COILS_DEFINES
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
//-----------MODBUS DEVICE DATA SETTING-------------
|
||||||
|
// MODBUS DATA STRUCTTURE
|
||||||
|
/**
|
||||||
|
* @brief Структура со всеми регистрами и коилами модбас
|
||||||
|
* @ingroup MODBUS_DATA
|
||||||
|
*/
|
||||||
|
typedef struct // mzkt modbus data
|
||||||
|
{
|
||||||
|
MB_DataInRegsTypeDef InRegs; ///< Modbus input registers @ref MB_DataInRegsTypeDef
|
||||||
|
|
||||||
|
MB_DataCoilsTypeDef Coils; ///< Modbus coils @ref MB_DataCoilsTypeDef
|
||||||
|
|
||||||
|
MB_DataHoldRegsTypeDef HoldRegs; ///< Modbus holding registers @ref MB_DataHoldRegsTypeDef
|
||||||
|
}MB_DataStructureTypeDef;
|
||||||
|
extern MB_DataStructureTypeDef MB_DATA;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////
|
||||||
|
///////////////////////TEMP/OUTDATE/OTHER////////////////////
|
||||||
|
|
||||||
|
//typedef enum //MB_MZKTECommandsTypeDef
|
||||||
|
//{
|
||||||
|
// StandartMode = 0x00, ///< Стандартная работа
|
||||||
|
// Opros_TE_Disable = 0x01, ///< Запрет опроса ТЭ (активен только обмен с ЛСУ ЭС, ТЭ не контролируются)
|
||||||
|
//}MB_MZKTECommandsTypeDef;
|
||||||
|
|
||||||
|
///**
|
||||||
|
// * @brief Состояние МЗКТЭ
|
||||||
|
// */
|
||||||
|
//typedef enum //MB_MZKTEErrStatusTypeDef
|
||||||
|
//{
|
||||||
|
// MZKTE_OK = 0x0, ///< МЗКТЭ функционирует нормально. Идет опрос ТЭ.
|
||||||
|
// NonCritical_Err = 0x1, ///< Неисправность МЗКТЭ, при которой МЗКТЭ может выполнять свои основные функции (некоторые программные ошибки из @ref MB_MZKTEErrorsTypeDef).
|
||||||
|
// Critical_Err = 0x2, ///< Неисправность МЗКТЭ, при которой выполнение основных функций не представляется возможным (ошибки 1-3 и некоторые программные ошибки из @ref MB_MZKTEErrorsTypeDef)
|
||||||
|
//
|
||||||
|
//}MB_MZKTEErrStatusTypeDef;
|
||||||
|
//typedef enum
|
||||||
|
//{
|
||||||
|
// TE_No_Err = 0x0, ///< Напряжения на всех ТЭ выше аварийных порогов, задаваемых уставками «Авария»
|
||||||
|
// TE_Err = 0x1, ///< Напряжение на одном или нескольких ТЭ достигло или ниже аварийного порога, задаваемого уставкой «Авария»
|
||||||
|
//}MB_TEErrActiveTypeDef;
|
||||||
|
//typedef enum
|
||||||
|
//{
|
||||||
|
// TE_No_Warn = 0x0, ///< Напряжения на всех ТЭ выше предупредительных порогов, задаваемых уставкой «Предупреждение»
|
||||||
|
// TE_Warn = 0x1, ///< Напряжение на одном или нескольких ТЭ достигло или ниже предупредительного порога, задаваемого уставкой «Предупреждение»
|
||||||
|
//}MB_TEWarnActiveTypeDef;
|
||||||
|
//typedef enum
|
||||||
|
//{
|
||||||
|
// OprosTE_Enable = 0x0, ///< Опрос ТЭ разрешен
|
||||||
|
// OprosTE_Disable = 0x1, ///< Опрос ТЭ запрещен (см. регистр хранения 170)
|
||||||
|
//}MB_OprosTETypeDef;
|
||||||
37
ТЗ/неофтз.txt
Normal file
37
ТЗ/неофтз.txt
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
По модбасу: нужна терминалка для общения с МЗКТЭ. Вот краткое ТЗ
|
||||||
|
|
||||||
|
Команды:
|
||||||
|
0x01 Read Coils
|
||||||
|
0x03 Read Holding Registers
|
||||||
|
0x04 Read Input Registers
|
||||||
|
0x05 Write Single Coil
|
||||||
|
0x06 Write Single Register
|
||||||
|
0x0F Write Multiple Coils
|
||||||
|
0x10 Write Multiple Registers
|
||||||
|
|
||||||
|
Т.е. обращение будет к следующим типам данных:
|
||||||
|
- Входные регистры (MB_DataInRegsTypeDef),
|
||||||
|
- Регистры хранения (MB_DataHoldRegsTypeDef),
|
||||||
|
- Коилы (MB_DataCoilsTypeDef).
|
||||||
|
|
||||||
|
Там некоторые регистры еще парсяться, поэтому скидываю файл с структурой данных, который я сделал. В скобках указал имя typedef соответствующего типа данных в файле. Можешь его использовать, заодно мб придумаешь че можно улучшить.
|
||||||
|
|
||||||
|
|
||||||
|
По программе:
|
||||||
|
Там идет управление и контроль ТЭ (топливные элементы), которых всего 85 штук. С них снимается задаются две уставки: предупреждение и авария. Коилами можно исключать ТЭ из работы.
|
||||||
|
Также есть пару управляющих настроек и статус-регистр.
|
||||||
|
|
||||||
|
Соответственно можно сделать два окна:
|
||||||
|
- одно небольшое - для статуса МЗКТЭ
|
||||||
|
- второе большое - для ТЭ. Можно сделать 4 вкладки, в каждой 85 ячеек:
|
||||||
|
- Напряжение на ТЭ,
|
||||||
|
- Уставки "Предупреждение",
|
||||||
|
- Уставки "Авария",
|
||||||
|
- Исключения ТЭ
|
||||||
|
|
||||||
|
И можно сделать одно открываемое окно для настроек. Типа по кнопке "Настройки МЗКТЭ". Это для регистров хранения 170-174. И если что их запись должна быть только по команде 0x06 (сингл). Остальные уставки поддерживают запись 0x10 (мультипл).
|
||||||
|
|
||||||
|
Статус МКЗТЭ и Напряжения на ТЭ только считывается (команда 0x04)
|
||||||
|
Уставки "Предупреждение" и "Авария" можно считать и записать всеми способами (0x03, 0x06, 0x10)
|
||||||
|
Настройки МЗКТЭ можно считывать и записать только по одному регистру (0x03, 0x06)
|
||||||
|
Исключения ТЭ можно считывать и записывать всеми способами (0x01, 0x05, 0x0F)
|
||||||
BIN
ТЗ/прил.MODBUS.pdf
Normal file
BIN
ТЗ/прил.MODBUS.pdf
Normal file
Binary file not shown.
Reference in New Issue
Block a user