новый алг иправлен

+ исправлен нахождение плат с костылем
+ исправлен вылет приложения при опросе 4 платы (из-за того, что в ней 65, а не 85 регистров) сделал чтобы везде было 85, просто отображатся будет 65
This commit is contained in:
Вячеслав Штейбезандт 2025-10-06 17:01:18 +03:00
parent c9b44e5dab
commit 726d8d24ef
11 changed files with 263 additions and 510 deletions

View File

@ -1,26 +1,23 @@
#include "devicesettingsdialog.h" #include "devicesettingsdialog.h"
#include "ui_devicesettingsdialog.h" #include "ui_devicesettingsdialog.h"
#include <QDebug>
#include <QProcess>
#include <QCoreApplication>
DeviceSettingsDialog::DeviceSettingsDialog(QWidget *parent) : DeviceSettingsDialog::DeviceSettingsDialog(QWidget *parent) :
QDialog(parent), QDialog(parent),
ui(new Ui::DeviceSettingsDialog) ui(new Ui::DeviceSettingsDialog)
{ {
ui->setupUi(this); ui->setupUi(this);
on_buttonApplyChangeTimer_clicked();
_currentBoardTimers[0] = ui->spinTimerBoard_1->value(); {
_currentBoardTimers[1] = ui->spinTimerBoard_2->value(); _m_timer[0] = ui->spinTimerBoard_1;
_currentBoardTimers[2] = ui->spinTimerBoard_3->value(); _m_timer[1] = ui->spinTimerBoard_2;
_currentBoardTimers[3] = ui->spinTimerBoard_4->value(); _m_timer[2] = ui->spinTimerBoard_3;
_m_timer[3] = ui->spinTimerBoard_4;
_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(); _currentSpeed = ui->speedBox->currentText().toUInt();
_currentParity = ui->parityBox->currentIndex(); _currentParity = ui->parityBox->currentIndex();
for(int i = 0; i < 4; i++) { for(int i = 0; i < 4; i++) {
_currentAdrs[i] = i+1; _currentAdrs[i] = i+1;
} }
@ -105,17 +102,11 @@ void DeviceSettingsDialog::on_buttonBox_clicked(QAbstractButton *button)
ui->spinTimerBoard_2->setValue(1000); ui->spinTimerBoard_2->setValue(1000);
ui->spinTimerBoard_3->setValue(1000); ui->spinTimerBoard_3->setValue(1000);
ui->spinTimerBoard_4->setValue(1000); ui->spinTimerBoard_4->setValue(1000);
_currentBoardTimers[0] = ui->spinTimerBoard_1->value(); on_buttonApplyChangeTimer_clicked();
_currentBoardTimers[1] = ui->spinTimerBoard_2->value();
_currentBoardTimers[2] = ui->spinTimerBoard_3->value();
_currentBoardTimers[3] = ui->spinTimerBoard_4->value();
ui->speedBox->setCurrentText("31250"); ui->speedBox->setCurrentText("31250");
_currentSpeed = ui->speedBox->currentText().toUInt(); _currentSpeed = ui->speedBox->currentText().toUInt();
ui->parityBox->setCurrentIndex(0); ui->parityBox->setCurrentIndex(0);
_currentParity = ui->parityBox->currentIndex(); _currentParity = ui->parityBox->currentIndex();
for(int i = 0; i < 4; i++) { for(int i = 0; i < 4; i++) {
_currentAdrs[i] = i+1; _currentAdrs[i] = i+1;
} }
@ -131,7 +122,7 @@ void DeviceSettingsDialog::on_buttonBox_clicked(QAbstractButton *button)
void DeviceSettingsDialog::initPollForBoard(unsigned boardID, unsigned boardAdr) void DeviceSettingsDialog::initPollForBoard(unsigned boardID, unsigned boardAdr)
{ {
ui->idPollComboBox->addItem(QString("Плата №%1 (ID %2)").arg(boardID).arg(boardAdr), QVariant(boardID)); ui->idPollComboBox->addItem(QString("Плата №%1 (ID %2)").arg(boardID+1).arg(boardAdr), QVariant(boardID));
} }
void DeviceSettingsDialog::updatePollStatus(unsigned boardID, bool status) void DeviceSettingsDialog::updatePollStatus(unsigned boardID, bool status)

View File

@ -11,23 +11,25 @@ LineRinger::LineRinger(QWidget *parent) :
for (const auto& port: listPorts) { for (const auto& port: listPorts) {
ui->comBox->addItem(QString(port.portName() + ": " + port.manufacturer()), QVariant(port.portName())); ui->comBox->addItem(QString(port.portName() + ": " + port.manufacturer()), QVariant(port.portName()));
} }
{
ui->parityControlBox->addItem("No", QVariant(QSerialPort::NoParity)); ui->parityControlBox->addItem("No", QVariant(QSerialPort::NoParity));
ui->parityControlBox->addItem("Even", QVariant(QSerialPort::EvenParity)); ui->parityControlBox->addItem("Even", QVariant(QSerialPort::EvenParity));
ui->parityControlBox->addItem("Odd", QVariant(QSerialPort::OddParity)); ui->parityControlBox->addItem("Odd", QVariant(QSerialPort::OddParity));
ui->parityControlBox->addItem("Space", QVariant(QSerialPort::SpaceParity)); ui->parityControlBox->addItem("Space", QVariant(QSerialPort::SpaceParity));
ui->parityControlBox->addItem("Mark", QVariant(QSerialPort::MarkParity)); ui->parityControlBox->addItem("Mark", QVariant(QSerialPort::MarkParity));
}
ui->dataBox->addItem("Data5", QVariant(QSerialPort::Data5)); {
ui->dataBox->addItem("Data6", QVariant(QSerialPort::Data6)); ui->dataBox->addItem("Data5", QVariant(QSerialPort::Data5));
ui->dataBox->addItem("Data7", QVariant(QSerialPort::Data7)); ui->dataBox->addItem("Data6", QVariant(QSerialPort::Data6));
ui->dataBox->addItem("Data8", QVariant(QSerialPort::Data8)); ui->dataBox->addItem("Data7", QVariant(QSerialPort::Data7));
ui->dataBox->setCurrentIndex(3); ui->dataBox->addItem("Data8", QVariant(QSerialPort::Data8));
ui->dataBox->setCurrentIndex(3);
ui->stopBox->addItem("One", QVariant(QSerialPort::OneStop)); }
ui->stopBox->addItem("OneAndHalf", QVariant(QSerialPort::OneAndHalfStop)); {
ui->stopBox->addItem("Two", QVariant(QSerialPort::TwoStop)); ui->stopBox->addItem("One", QVariant(QSerialPort::OneStop));
ui->stopBox->addItem("OneAndHalf", QVariant(QSerialPort::OneAndHalfStop));
ui->stopBox->addItem("Two", QVariant(QSerialPort::TwoStop));
}
ui->deviceOnlineView->horizontalHeader()->setVisible(true); ui->deviceOnlineView->horizontalHeader()->setVisible(true);
syncColumnHeaders(); syncColumnHeaders();
ui->deviceOnlineView->setColumnHidden(1, true); ui->deviceOnlineView->setColumnHidden(1, true);
@ -93,10 +95,10 @@ LineRinger::callStatus LineRinger::lineCall()
bool *tmp_isRun = &isRun; bool *tmp_isRun = &isRun;
uint tmp_adr = 1; uint tmp_adr = 1;
auto bar = new QProgressDialog(this); auto bar = new QProgressDialog(this);
connect(bar, &QProgressDialog::canceled, this, [this, tmp_isRun]() { connect(bar, &QProgressDialog::canceled, this, [tmp_isRun]() {
*tmp_isRun = true; *tmp_isRun = true;
}); });
connect(this, &LineRinger::stopLineCall, this, [this, tmp_isRun]() { connect(this, &LineRinger::stopLineCall, this, [tmp_isRun]() {
*tmp_isRun = true; *tmp_isRun = true;
}); });
bar->setLabelText(tr("Поиск устройств... Текущий адрес: %1").arg(tmp_adr)); bar->setLabelText(tr("Поиск устройств... Текущий адрес: %1").arg(tmp_adr));
@ -107,7 +109,6 @@ LineRinger::callStatus LineRinger::lineCall()
bar->setValue(tmp_adr); bar->setValue(tmp_adr);
bar->setLabelText(tr("Поиск устройств... Текущий адрес: %1/247").arg(tmp_adr)); bar->setLabelText(tr("Поиск устройств... Текущий адрес: %1/247").arg(tmp_adr));
auto *reply = modbusDevice->sendRawRequest(readDeviceBasicIdentification, tmp_adr); auto *reply = modbusDevice->sendRawRequest(readDeviceBasicIdentification, tmp_adr);
//auto *reply = modbusDevice->sendReadRequest(*_unit, tmp_adr);
//Запрос типа устройства. //Запрос типа устройства.
if(reply == nullptr) { if(reply == nullptr) {
QMessageBox::warning(this, "Ошибка при сканировании.", QString("%1").arg(modbusDevice->errorString())); QMessageBox::warning(this, "Ошибка при сканировании.", QString("%1").arg(modbusDevice->errorString()));
@ -171,10 +172,6 @@ LineRinger::callStatus LineRinger::lineCall()
return callStatus::INTERRUPT; return callStatus::INTERRUPT;
} else if(!isRun) { } else if(!isRun) {
if(regularReply->error()!=QModbusDevice::NoError) { if(regularReply->error()!=QModbusDevice::NoError) {
// QMessageBox::warning(this, "Ошибка при сканировании.", QString("%1: %2").arg(regularReply->error()).arg(regularReply->errorString()));
// bar->close();
// bar->deleteLater();
// return callStatus::ERROR;
regularReplyError = true; regularReplyError = true;
regularReplyErrorString = QString("%1: %2").arg(regularReply->error()).arg(regularReply->errorString()); regularReplyErrorString = QString("%1: %2").arg(regularReply->error()).arg(regularReply->errorString());
} }
@ -237,12 +234,10 @@ void LineRinger::on_ringButton_clicked()
emit stopLineCall(); emit stopLineCall();
}); });
bar->setValue(0); bar->setValue(0);
ui->deviceOnlineView->setColumnHidden(1, false); ui->deviceOnlineView->setColumnHidden(1, false);
modbusDevice->disconnectDevice(); modbusDevice->disconnectDevice();
for (int i = 0; i < ui->baudRateBox->count(); i++) { for (int i = 0; i < ui->baudRateBox->count(); i++) {
bar->setValue(i+1); bar->setValue(i+1);
modbusDevice->setConnectionParameter(QModbusDevice::SerialBaudRateParameter, modbusDevice->setConnectionParameter(QModbusDevice::SerialBaudRateParameter,
ui->baudRateBox->itemText(i).toInt(nullptr, 10)); ui->baudRateBox->itemText(i).toInt(nullptr, 10));
if (!modbusDevice->connectDevice()) { if (!modbusDevice->connectDevice()) {

File diff suppressed because it is too large Load Diff

View File

@ -56,52 +56,36 @@ private:
void stopScanBoard(); void stopScanBoard();
void displayResultOfScan(QModbusReply *reply, int boardID); void displayResultOfScan(QModbusReply *reply, int boardID);
void applySettingsFromScan(QModbusReply *reply); void applySettingsFromScan(QModbusReply *reply);
void multipleRegWrite(); void multipleRegWrite();
void multipleRegSend(); void multipleRegSend();
bool autoBaudRateScan(); bool autoBaudRateScan();
void selectPositionOnTree(unsigned index); void selectPositionOnTree(unsigned index);
signals: signals:
void successAtCheckBoards(); void successAtCheckBoards();
void errorAtCheckBoards(); void errorAtCheckBoards();
private slots: private slots:
void logError(const QString &errorPlace, const QString &errorString, unsigned errorCount, const QString &description); void logError(const QString &errorPlace, const QString &errorString, unsigned errorCount, const QString &description);
void slotmultipleRegWrite(); void slotmultipleRegWrite();
void slotmultipleRegWriteAndSend(); void slotmultipleRegWriteAndSend();
void onConnectClicked(); void onConnectClicked();
void onReadButtonClicked(); void onReadButtonClicked();
void onReadReady(); void onReadReady();
void checkAdrChange(QModbusReply *reply, unsigned boardNum); void checkAdrChange(QModbusReply *reply, unsigned boardNum);
void onWriteButtonClicked(); void onWriteButtonClicked();
void onSelectedBoardChanged(int index); void onSelectedBoardChanged(int index);
void onWriteTableChanged(int index); void onWriteTableChanged(int index);
void checkBoards(); void checkBoards();
void onSpeedUpdate(); void onSpeedUpdate();
void revertToOldSpeedAndRestart(); void revertToOldSpeedAndRestart();
void onParityUpdate(); void onParityUpdate();
void boardScan(unsigned boardID); void boardScan(unsigned boardID);
public: public:
M3KTE(QWidget *parent = nullptr); M3KTE(QWidget *parent = nullptr);
~M3KTE(); ~M3KTE();
private: private:
Ui::M3KTE *ui; Ui::M3KTE *ui;
QTableWidget *loggerTable = nullptr; QTableWidget *loggerTable = nullptr;
int CurrentConnectedDevice = 0; int CurrentConnectedDevice = 0;
//int DeviceOnNetwork[4];
QProgressBar *m_ProgressBar[320]; QProgressBar *m_ProgressBar[320];
QPushButton *ThePhantomMenace[320]; QPushButton *ThePhantomMenace[320];
QModbusReply *lastRequest = nullptr; QModbusReply *lastRequest = nullptr;
@ -110,28 +94,20 @@ private:
SettingsDialog *m_settingsDialog = nullptr; SettingsDialog *m_settingsDialog = nullptr;
MultipleSettings *m_regMultipleSettings = nullptr; MultipleSettings *m_regMultipleSettings = nullptr;
ScanBoard *m_scanBoard = nullptr; ScanBoard *m_scanBoard = nullptr;
LineRinger *m_lineRinger = nullptr; LineRinger *m_lineRinger = nullptr;
QGroupBox *Boards_Fields[4]; QGroupBox *Boards_Fields[4];
//WriteRegisterModel *writeModel = nullptr;
struct StatusM3KTE{ struct StatusM3KTE{
bool Warnings[4]; bool Warnings[4];
bool Accidents[4]; bool Accidents[4];
}statusM3KTE; }statusM3KTE;
unsigned error_terminal; unsigned error_terminal;
struct BoardModbusRegisters { struct BoardModbusRegisters {
bool isActive = false; bool isActive = false;
bool pollIsActive = true; bool pollIsActive = true;
int adr; int adr;
int _tmp_adr; int _tmp_adr;
bool coil[85]; bool coil[85];
unsigned HR[170]; unsigned HR[170];
unsigned error_W = 0; unsigned error_W = 0;
unsigned error_A = 0; unsigned error_A = 0;
unsigned error_modbus = 0; unsigned error_modbus = 0;
@ -141,19 +117,15 @@ private:
unsigned error_TX = 0; unsigned error_TX = 0;
unsigned error_adr_change = 0; unsigned error_adr_change = 0;
unsigned error_cmd_change = 0; unsigned error_cmd_change = 0;
QLabel *timerData = nullptr; QLabel *timerData = nullptr;
QLabel *timerStatus = nullptr; QLabel *timerStatus = nullptr;
WriteRegisterModel *ModbusModelCoil; WriteRegisterModel *ModbusModelCoil;
WriteRegisterModel *ModbusModelHoldingReg; WriteRegisterModel *ModbusModelHoldingReg;
QTimer *boardScanners; QTimer *boardScanners;
bool isScan = false; bool isScan = false;
QElapsedTimer timerToStatusResponse; QElapsedTimer timerToStatusResponse;
QElapsedTimer timerToDataResponse; QElapsedTimer timerToDataResponse;
}Boards[4]; }Boards[4];
union statusreg { union statusreg {
struct parsingFields { struct parsingFields {
unsigned accident:1; unsigned accident:1;

View File

@ -4,6 +4,7 @@
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
qputenv("QT_FATAL_WARNINGS", "0"); // отключает падение от ASSERT
QApplication a(argc, argv); QApplication a(argc, argv);
M3KTE w; M3KTE w;
w.show(); w.show();

View File

@ -6,7 +6,6 @@ MultipleSettings::MultipleSettings(QWidget *parent) :
ui(new Ui::MultipleSettings) ui(new Ui::MultipleSettings)
{ {
ui->setupUi(this); ui->setupUi(this);
ui->buttonBox->button(QDialogButtonBox::Ok)->setText("Записать"); ui->buttonBox->button(QDialogButtonBox::Ok)->setText("Записать");
ui->buttonBox->button(QDialogButtonBox::SaveAll)->setText("Записать и установить"); ui->buttonBox->button(QDialogButtonBox::SaveAll)->setText("Записать и установить");
} }
@ -58,7 +57,6 @@ void MultipleSettings::on_boardBox_currentIndexChanged(int index)
break; break;
default: default:
ui->countBox->setRange(1, 85-ui->adrBox->value()+85*ui->regTypeBox->currentIndex()/2); ui->countBox->setRange(1, 85-ui->adrBox->value()+85*ui->regTypeBox->currentIndex()/2);
} }
} }

View File

@ -6,7 +6,6 @@ SettingsDialog::SettingsDialog(QWidget *parent) :
ui(new Ui::SettingsDialog) ui(new Ui::SettingsDialog)
{ {
ui->setupUi(this); ui->setupUi(this);
ui->parityCombo->setCurrentIndex(0); 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));
@ -16,8 +15,6 @@ SettingsDialog::SettingsDialog(QWidget *parent) :
#endif #endif
ui->timeoutSpinner->setValue(m_settings.responseTime); ui->timeoutSpinner->setValue(m_settings.responseTime);
ui->retriesSpinner->setValue(m_settings.numberOfRetries); ui->retriesSpinner->setValue(m_settings.numberOfRetries);
connect(ui->AcceptOrRejectButtonBox, &QDialogButtonBox::accepted, [this]() { connect(ui->AcceptOrRejectButtonBox, &QDialogButtonBox::accepted, [this]() {
#if QT_CONFIG(modbus_serialport) #if QT_CONFIG(modbus_serialport)
m_settings.portName = ui->comBox->currentData().toString(); m_settings.portName = ui->comBox->currentData().toString();
@ -30,7 +27,6 @@ SettingsDialog::SettingsDialog(QWidget *parent) :
#endif #endif
m_settings.responseTime = ui->timeoutSpinner->value(); m_settings.responseTime = ui->timeoutSpinner->value();
m_settings.numberOfRetries = ui->retriesSpinner->value(); m_settings.numberOfRetries = ui->retriesSpinner->value();
hide(); hide();
}); });
} }

View File

@ -24,7 +24,7 @@ public:
int baud = 115200; int baud = 115200;
int dataBits = QSerialPort::Data8; int dataBits = QSerialPort::Data8;
int stopBits = QSerialPort::OneStop; int stopBits = QSerialPort::OneStop;
int responseTime = 50; int responseTime = 1000;
int numberOfRetries = 0; int numberOfRetries = 0;
}; };

View File

@ -29,16 +29,12 @@ QVariant WriteRegisterModel::data(const QModelIndex &index, int role) const
Q_ASSERT(m_holdingRegisters.count() == RowCount); Q_ASSERT(m_holdingRegisters.count() == RowCount);
if (index.column() == NumColumn && role == Qt::DisplayRole) if (index.column() == NumColumn && role == Qt::DisplayRole)
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))+1); 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;
if (index.column() == HoldingColumn && role == Qt::DisplayRole) // holding registers if (index.column() == HoldingColumn && role == Qt::DisplayRole) // holding registers
return QString("0x%1").arg(QString::number(m_holdingRegisters.at(index.row()), 16)); return QString("0x%1").arg(QString::number(m_holdingRegisters.at(index.row()), 16));
if(index.column() == CurrentUColumn && role == Qt::DisplayRole) if(index.column() == CurrentUColumn && role == Qt::DisplayRole)
return QString("%1 В").arg(QString::number((double)((double)m_currentU.at(index.row())/(double)1000), 'f', 3)); return QString("%1 В").arg(QString::number((double)((double)m_currentU.at(index.row())/(double)1000), 'f', 3));
return QVariant(); return QVariant();
@ -73,7 +69,6 @@ bool WriteRegisterModel::setData(const QModelIndex &index, const QVariant &value
return false; return false;
Q_ASSERT(m_coils.count() == RowCount); Q_ASSERT(m_coils.count() == RowCount);
Q_ASSERT(m_holdingRegisters.count() == RowCount); Q_ASSERT(m_holdingRegisters.count() == RowCount);
if (index.column() == CoilsColumn && role == Qt::CheckStateRole) { // coils if (index.column() == CoilsColumn && role == Qt::CheckStateRole) { // coils
auto s = static_cast<Qt::CheckState>(value.toUInt()); auto s = static_cast<Qt::CheckState>(value.toUInt());
s == Qt::Checked ? m_coils.setBit(index.row()) : m_coils.clearBit(index.row()); s == Qt::Checked ? m_coils.setBit(index.row()) : m_coils.clearBit(index.row());
@ -85,7 +80,6 @@ bool WriteRegisterModel::setData(const QModelIndex &index, const QVariant &value
quint16 newValue = value.toString().toUShort(&result, 16); quint16 newValue = value.toString().toUShort(&result, 16);
if (result) if (result)
m_holdingRegisters[index.row()] = newValue; m_holdingRegisters[index.row()] = newValue;
emit dataChanged(index, index); emit dataChanged(index, index);
return result; return result;
} }
@ -96,16 +90,13 @@ Qt::ItemFlags WriteRegisterModel::flags(const QModelIndex &index) const
{ {
if (!index.isValid() || index.row() >= RowCount || index.column() >= ColumnCount) if (!index.isValid() || index.row() >= RowCount || index.column() >= ColumnCount)
return QAbstractTableModel::flags(index); return QAbstractTableModel::flags(index);
Qt::ItemFlags flags = QAbstractTableModel::flags(index); Qt::ItemFlags flags = QAbstractTableModel::flags(index);
if ((index.row() < m_address) || (index.row() >= (m_address + m_number))) if ((index.row() < m_address) || (index.row() >= (m_address + m_number)))
flags &= ~Qt::ItemIsEnabled; flags &= ~Qt::ItemIsEnabled;
if (index.column() == CoilsColumn) // coils if (index.column() == CoilsColumn) // coils
return flags | Qt::ItemIsUserCheckable; return flags | Qt::ItemIsUserCheckable;
if (index.column() == HoldingColumn) // holding registers if (index.column() == HoldingColumn) // holding registers
return flags | Qt::ItemIsEditable; return flags | Qt::ItemIsEditable;
return flags; return flags;
} }

BIN
MZKT_Test_Terminal.exe Normal file

Binary file not shown.

Binary file not shown.