Hot Fix 2.

>Некорректная индикация напряжения ТЭ была устранена.
>Исправлена ошибка с некорректным определением модели регистров.
>Исправлено некорректное визуальное отображение статуса работы МЗКТЕ

Примечание:
Необходимо отвязать индикацию ТЭ от панели управления, передав уставки и коилы на внутренние таблицы
This commit is contained in:
Вячеслав Штейбезандт 2024-12-11 16:55:48 +03:00
parent d7063703b6
commit 49083ca06d
7 changed files with 112 additions and 62 deletions

View File

@ -480,7 +480,14 @@ M3KTE::M3KTE(QWidget *parent)
ui->BST_Off->setChecked(true); ui->BST_Off->setChecked(true);
changeTable(ui->boardSelectBox->currentIndex(), ui->writeTable->currentIndex()); 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;
}
for(int i = 0; i<320; i++) for(int i = 0; i<320; i++)
{ {
@ -488,7 +495,7 @@ M3KTE::M3KTE(QWidget *parent)
QString style_fc_off = "QProgressBar {border: 2px solid black; font: bold 10px} QProgressBar::chunk {background: hsva(" + QString::number(30) + ", 30, 30, 30%);} "; QString style_fc_off = "QProgressBar {border: 2px solid black; font: bold 10px} QProgressBar::chunk {background: hsva(" + QString::number(30) + ", 30, 30, 30%);} ";
m[i]->setStyleSheet(style_fc_off); m[i]->setStyleSheet(style_fc_off);
} }
//debug(); debug();
//Вызов окна настройки подключения //Вызов окна настройки подключения
@ -511,36 +518,36 @@ void M3KTE::debug()
m[i]->setMaximumSize(25, 25); m[i]->setMaximumSize(25, 25);
m[i]->resize(25, 25); m[i]->resize(25, 25);
m[i]->setAlignment(Qt::AlignCenter); m[i]->setAlignment(Qt::AlignCenter);
m[i]->setFormat(QString("%1").arg((i%85))); m[i]->setFormat(QString("%1").arg((i%85+1)));
int j = rand()%4; // int j = rand()%4;
if(j!=3) j=rand()%4; // if(j!=3) j=rand()%4;
m[i]->setValue(j); // m[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 = "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%);} "; // QString style_fc_off = "QProgressBar {border: 2px solid black; font: bold 10px} QProgressBar::chunk {background: hsva(" + QString::number(30) + ", 30, 30, 30%);} ";
m[i]->setStyleSheet(style_fc); // m[i]->setStyleSheet(style_fc);
switch (j) { // switch (j) {
case 1: // case 1:
{ // {
m[i]->setStatusTip(QString("П%1 ТЭ%2: Аварийный уровень напряжения.").arg(QString::number(i/85+1), QString::number(i%85))); // m[i]->setStatusTip(QString("П%1 ТЭ%2: Аварийный уровень напряжения.").arg(QString::number(i/85+1), QString::number(i%85)));
break; // break;
} // }
case 2: // case 2:
{ // {
m[i]->setStatusTip(QString("П%1 ТЭ%2: Предупредительный уровень напряжения.").arg(QString::number(i/85+1), QString::number(i%85))); // m[i]->setStatusTip(QString("П%1 ТЭ%2: Предупредительный уровень напряжения.").arg(QString::number(i/85+1), QString::number(i%85)));
break; // break;
} // }
case 3: // case 3:
{ // {
m[i]->setStatusTip(QString("П%1 ТЭ%2: Уровень напряжения в норме.").arg(QString::number(i/85+1), QString::number(i%85))); // m[i]->setStatusTip(QString("П%1 ТЭ%2: Уровень напряжения в норме.").arg(QString::number(i/85+1), QString::number(i%85)));
break; // break;
} // }
case 0: // case 0:
m[i]->setStatusTip(QString("П%1 ТЭ%2: Топливный Элемент не учитывается.").arg(QString::number(i/85+1), QString::number(i%85))); // m[i]->setStatusTip(QString("П%1 ТЭ%2: Топливный Элемент не учитывается.").arg(QString::number(i/85+1), QString::number(i%85)));
m[i]->setStyleSheet(style_fc_off); // m[i]->setStyleSheet(style_fc_off);
m[i]->setValue(3); // m[i]->setValue(3);
break; // break;
} // }
} }
} }
@ -562,7 +569,7 @@ void M3KTE::initActions()
connect(ui->boardSelectBox, QOverload<int>::of(&QComboBox::currentIndexChanged), connect(ui->boardSelectBox, QOverload<int>::of(&QComboBox::currentIndexChanged),
this, &M3KTE::onSelectedBoardChanged); this, &M3KTE::onSelectedBoardChanged);
connect(ui->writeTable, QOverload<int>::of(&QComboBox::currentIndexChanged), connect(ui->writeTable, QOverload<int>::of(&QComboBox::currentIndexChanged),
this, &M3KTE::onSelectedBoardChanged); this, &M3KTE::onWriteTableChanged);
connect(ui->ConnectionMenuSettings, &QAction::triggered, m_settingsDialog, &QDialog::show); connect(ui->ConnectionMenuSettings, &QAction::triggered, m_settingsDialog, &QDialog::show);
connect(ui->M3kteMenuSettings, &QAction::triggered, m_deviceSettingsDialog, &QDialog::show); connect(ui->M3kteMenuSettings, &QAction::triggered, m_deviceSettingsDialog, &QDialog::show);
@ -595,14 +602,6 @@ void M3KTE::onConnectClicked()
ui->ConnectionMenuConnect->setEnabled(false); ui->ConnectionMenuConnect->setEnabled(false);
ui->ConnectionMenuDisconnect->setEnabled(true); ui->ConnectionMenuDisconnect->setEnabled(true);
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);
if(pingNetworkDevices()) if(pingNetworkDevices())
{ {
unsigned tmp_adr[4]; unsigned tmp_adr[4];
@ -611,6 +610,18 @@ void M3KTE::onConnectClicked()
} }
m_deviceSettingsDialog->updateSettingsAfterConnection(m_settingsDialog->settings().baud, m_settingsDialog->settings().parity, tmp_adr); m_deviceSettingsDialog->updateSettingsAfterConnection(m_settingsDialog->settings().baud, m_settingsDialog->settings().parity, tmp_adr);
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);
} }
//Опрос устройств //Опрос устройств
} }
@ -624,6 +635,7 @@ void M3KTE::onConnectClicked()
ui->BSM_Warning->setChecked(false); ui->BSM_Warning->setChecked(false);
ui->BSM_Accident->setChecked(false); ui->BSM_Accident->setChecked(false);
ui->BSM_WorkInProgress->setChecked(false); ui->BSM_WorkInProgress->setChecked(false);
ui->BSM_Warning->setEnabled(false); ui->BSM_Warning->setEnabled(false);
ui->BSM_Accident->setEnabled(false); ui->BSM_Accident->setEnabled(false);
ui->BSM_WorkInProgress->setEnabled(false); ui->BSM_WorkInProgress->setEnabled(false);
@ -951,7 +963,7 @@ bool M3KTE::pingNetworkDevices()
bar->setValue(i); bar->setValue(i);
for(i=0; i<4;) for(i=0; i<1;)
{ {
bar->setValue(i); bar->setValue(i);
timerForPingSignal = false; timerForPingSignal = false;
@ -981,6 +993,7 @@ bool M3KTE::pingNetworkDevices()
//ERROR //ERROR
//OUT OF RANGE //OUT OF RANGE
QMessageBox::warning(this, "Ошибка при сканировании сети.", QString("Выход за пределы допустимых адресов. Найдено %1 плат.").arg(i)); QMessageBox::warning(this, "Ошибка при сканировании сети.", QString("Выход за пределы допустимых адресов. Найдено %1 плат.").arg(i));
bar->setValue(4);
bar->deleteLater(); bar->deleteLater();
onConnectClicked(); onConnectClicked();
return false; return false;
@ -994,7 +1007,7 @@ bool M3KTE::pingNetworkDevices()
_unit_settings[1] = new QModbusDataUnit(QModbusDataUnit::HoldingRegisters, 0, 85); _unit_settings[1] = new QModbusDataUnit(QModbusDataUnit::HoldingRegisters, 0, 85);
_unit_settings[2] = new QModbusDataUnit(QModbusDataUnit::HoldingRegisters, 85, 85); _unit_settings[2] = new QModbusDataUnit(QModbusDataUnit::HoldingRegisters, 85, 85);
for(i=0; i<4; i++) for(i=0; i<1; i++)
{ {
for (int j = 0; j<3; j++) for (int j = 0; j<3; j++)
{ {
@ -1022,6 +1035,7 @@ bool M3KTE::pingNetworkDevices()
else else
{ {
QMessageBox::warning(this, "Ошибка при получении текущих настроек.", QString("Таймаут при опросе устройства %1 по адресу %2").arg(i).arg(Boards[i].adr)); QMessageBox::warning(this, "Ошибка при получении текущих настроек.", QString("Таймаут при опросе устройства %1 по адресу %2").arg(i).arg(Boards[i].adr));
bar->setValue(12);
onConnectClicked(); onConnectClicked();
return false; return false;
} }
@ -1042,9 +1056,9 @@ void M3KTE::timeForPingIsGone()
void M3KTE::beginScanBoards() void M3KTE::beginScanBoards()
{ {
firstBoardScan(); firstBoardScan();
secondBoardScan(); //secondBoardScan();
thirdBoardScan(); //thirdBoardScan();
fourthBoardScan(); //fourthBoardScan();
return; return;
} }
@ -1177,25 +1191,30 @@ void M3KTE::displayResultOfScan(QModbusReply *reply, int boardID)
for(int i = unit.startAddress(), total = int(unit.valueCount()); i < total; ++i) for(int i = unit.startAddress(), total = int(unit.valueCount()); i < total; ++i)
{ {
if(Boards[boardID].ModbusModelCoil->data(Boards[boardID].ModbusModelCoil->index(i, 2)).Int) //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)
{ {
int j = 0; int j = 0;
if(Boards[boardID].ModbusModelHoldingReg->data(Boards[boardID].ModbusModelHoldingReg->index(85+i, 3)).Int > unit.value(i)) if(Boards[boardID].ModbusModelHoldingReg->get_holreg(Boards[boardID].ModbusModelHoldingReg->index(85+i, 3)) > unit.value(i))
{ {
j = 1; j = 1;
m[i+boardID*85]->setStatusTip(QString("П%1 ТЭ%2: Аварийный уровень напряжения.").arg(QString::number(boardID+1), QString::number(i%85))); m[i+boardID*85]->setStatusTip(QString("П%1 ТЭ%2: Аварийный уровень напряжения.").arg(QString::number(boardID+1), QString::number(i%85)));
m[i+boardID*85]->setWhatsThis(QString("П%1 ТЭ%2: Аварийный уровень напряжения.").arg(QString::number(boardID+1), QString::number(i%85)));
A_Flag = true; A_Flag = true;
} }
else if(Boards[boardID].ModbusModelHoldingReg->data(Boards[boardID].ModbusModelHoldingReg->index(i, 3)).Int > unit.value(i)) else if(Boards[boardID].ModbusModelHoldingReg->get_holreg(Boards[boardID].ModbusModelHoldingReg->index(i, 3)) > unit.value(i))
{ {
j = 2; j = 2;
m[i+boardID*85]->setStatusTip(QString("П%1 ТЭ%2: Предупредительный уровень напряжения.").arg(QString::number(boardID+1), QString::number(i%85))); m[i+boardID*85]->setStatusTip(QString("П%1 ТЭ%2: Предупредительный уровень напряжения.").arg(QString::number(boardID+1), QString::number(i%85)));
m[i+boardID*85]->setWhatsThis(QString("П%1 ТЭ%2: Предупредительный уровень напряжения.").arg(QString::number(boardID+1), QString::number(i%85)));
W_Flag = true; W_Flag = true;
} }
else else
{ {
j = 3; j = 3;
m[i+boardID*85]->setStatusTip(QString("П%1 ТЭ%2: Уровень напряжения в норме.").arg(QString::number(boardID+1), QString::number(i%85))); m[i+boardID*85]->setStatusTip(QString("П%1 ТЭ%2: Уровень напряжения в норме.").arg(QString::number(boardID+1), QString::number(i%85)));
m[i+boardID*85]->setWhatsThis(QString("П%1 ТЭ%2: Уровень напряжения в норме.").arg(QString::number(boardID+1), QString::number(i%85)));
} }
m[i+boardID*85]->setValue(j); m[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%);} "; QString style_fc = "QProgressBar {border: 2px solid black; font: bold 10px} QProgressBar::chunk {background: hsva(" + QString::number(j*50-50) + ", 255, 255, 100%);} ";
@ -1204,33 +1223,37 @@ void M3KTE::displayResultOfScan(QModbusReply *reply, int boardID)
else else
{ {
m[i+boardID*85]->setStatusTip(QString("П%1 ТЭ%2: Топливный Элемент не учитывается.").arg(QString::number(boardID+1), QString::number(i%85))); m[i+boardID*85]->setStatusTip(QString("П%1 ТЭ%2: Топливный Элемент не учитывается.").arg(QString::number(boardID+1), QString::number(i%85)));
m[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%);} "; QString style_fc_off = "QProgressBar {border: 2px solid black; font: bold 10px} QProgressBar::chunk {background: hsva(" + QString::number(30) + ", 30, 30, 30%);} ";
m[i+boardID*85]->setStyleSheet(style_fc_off); m[i+boardID*85]->setStyleSheet(style_fc_off);
} }
} }
if(A_Flag) if(A_Flag)
statusM3KTE.Accidents[boardID] = true; statusM3KTE.Accidents[boardID] = true;
else
statusM3KTE.Accidents[boardID] = false;
if(W_Flag) if(W_Flag)
statusM3KTE.Warnings[boardID] = true; statusM3KTE.Warnings[boardID] = true;
else
statusM3KTE.Warnings[boardID] = false;
ui->BSM_Warning->setChecked(false);
ui->BSM_Warning->setEnabled(false); ui->BSM_Accident->setChecked(false);
ui->BSM_Accident->setEnabled(false); ui->BSM_WorkInProgress->setChecked(true);
ui->BSM_WorkInProgress->setEnabled(true);
for(int i = 0; i < 4; i++) for(int i = 0; i < 4; i++)
{ {
if(statusM3KTE.Accidents[i]) if(statusM3KTE.Accidents[i])
{ {
ui->BSM_WorkInProgress->setEnabled(false); ui->BSM_WorkInProgress->setChecked(false);
ui->BSM_Warning->setEnabled(false); ui->BSM_Warning->setChecked(false);
ui->BSM_Accident->setEnabled(true); ui->BSM_Accident->setChecked(true);
break; break;
} }
if(statusM3KTE.Warnings[i]) if(statusM3KTE.Warnings[i])
{ {
ui->BSM_WorkInProgress->setEnabled(false); ui->BSM_WorkInProgress->setChecked(false);
ui->BSM_Accident->setEnabled(false); ui->BSM_Accident->setChecked(false);
ui->BSM_Warning->setEnabled(true); ui->BSM_Warning->setChecked(true);
} }
} }
} else if (reply->error() == QModbusDevice::ProtocolError) { } else if (reply->error() == QModbusDevice::ProtocolError) {

View File

@ -14204,6 +14204,9 @@
<property name="text"> <property name="text">
<string>Отключено</string> <string>Отключено</string>
</property> </property>
<property name="checkable">
<bool>true</bool>
</property>
</widget> </widget>
</item> </item>
<item row="1" column="1"> <item row="1" column="1">
@ -14211,6 +14214,9 @@
<property name="text"> <property name="text">
<string>Подключено</string> <string>Подключено</string>
</property> </property>
<property name="checkable">
<bool>true</bool>
</property>
</widget> </widget>
</item> </item>
</layout> </layout>
@ -14239,6 +14245,9 @@
<property name="text"> <property name="text">
<string>Работа</string> <string>Работа</string>
</property> </property>
<property name="checkable">
<bool>true</bool>
</property>
</widget> </widget>
</item> </item>
<item row="1" column="0"> <item row="1" column="0">
@ -14246,6 +14255,9 @@
<property name="text"> <property name="text">
<string>Предупреждение</string> <string>Предупреждение</string>
</property> </property>
<property name="checkable">
<bool>true</bool>
</property>
</widget> </widget>
</item> </item>
<item row="2" column="0"> <item row="2" column="0">

View File

@ -7,7 +7,7 @@ SettingsDialog::SettingsDialog(QWidget *parent) :
{ {
ui->setupUi(this); ui->setupUi(this);
ui->parityCombo->setCurrentIndex(1); ui->parityCombo->setCurrentIndex(0);
#if QT_CONFIG(modbus_serialport) #if QT_CONFIG(modbus_serialport)
ui->baudCombo->setCurrentText(QString::number(m_settings.baud)); ui->baudCombo->setCurrentText(QString::number(m_settings.baud));
ui->dataBitsCombo->setCurrentText(QString::number(m_settings.dataBits)); ui->dataBitsCombo->setCurrentText(QString::number(m_settings.dataBits));

View File

@ -20,7 +20,7 @@ public:
struct Settings { struct Settings {
QString portName; QString portName;
int parity = QSerialPort::NoParity; int parity = QSerialPort::NoParity;
int baud = 31250; int baud = 115200;
int dataBits = QSerialPort::Data8; int dataBits = QSerialPort::Data8;
int stopBits = QSerialPort::OneStop; int stopBits = QSerialPort::OneStop;
int responseTime = 1000; int responseTime = 1000;

View File

@ -112,7 +112,7 @@
<item row="2" column="1"> <item row="2" column="1">
<widget class="QComboBox" name="baudCombo"> <widget class="QComboBox" name="baudCombo">
<property name="currentIndex"> <property name="currentIndex">
<number>5</number> <number>8</number>
</property> </property>
<item> <item>
<property name="text"> <property name="text">
@ -170,6 +170,9 @@
</item> </item>
<item row="3" column="1"> <item row="3" column="1">
<widget class="QComboBox" name="dataBitsCombo"> <widget class="QComboBox" name="dataBitsCombo">
<property name="currentIndex">
<number>3</number>
</property>
<item> <item>
<property name="text"> <property name="text">
<string>5</string> <string>5</string>

View File

@ -33,7 +33,7 @@ QVariant WriteRegisterModel::data(const QModelIndex &index, int role) const
return QString::number(index.row()); return QString::number(index.row());
if (index.column() == NameColumn && role == Qt::DisplayRole) if (index.column() == NameColumn && role == Qt::DisplayRole)
return QString("ТЭ%1").arg(index.row()%(RowCount/(1+isHR))); return QString("ТЭ%1").arg(index.row()%(RowCount/(1+isHR))+1);
if (index.column() == CoilsColumn && role == Qt::CheckStateRole) // coils if (index.column() == CoilsColumn && role == Qt::CheckStateRole) // coils
return m_coils.at(index.row()) ? Qt::Checked : Qt::Unchecked; return m_coils.at(index.row()) ? Qt::Checked : Qt::Unchecked;
@ -123,3 +123,13 @@ void WriteRegisterModel::setNumberOfValues(const QString &number)
m_number = number.toInt(); m_number = number.toInt();
//emit updateViewport(); //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());
}

View File

@ -12,6 +12,8 @@ private:
int RowCount; int RowCount;
public: public:
WriteRegisterModel(QObject *parent = nullptr, int _tmpRC = 85, bool _isHR = false); 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 rowCount(const QModelIndex &parent = QModelIndex()) const override;
int columnCount(const QModelIndex &parent = QModelIndex()) const override; int columnCount(const QModelIndex &parent = QModelIndex()) const override;