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

+ исправлен нахождение плат с костылем
+ исправлен вылет приложения при опросе 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 "ui_devicesettingsdialog.h"
#include <QDebug>
#include <QProcess>
#include <QCoreApplication>
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;
on_buttonApplyChangeTimer_clicked();
{
_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;
}
@ -105,17 +102,11 @@ void DeviceSettingsDialog::on_buttonBox_clicked(QAbstractButton *button)
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();
on_buttonApplyChangeTimer_clicked();
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;
}
@ -131,7 +122,7 @@ void DeviceSettingsDialog::on_buttonBox_clicked(QAbstractButton *button)
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)

View File

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

File diff suppressed because it is too large Load Diff

View File

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

View File

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

View File

@ -6,7 +6,6 @@ MultipleSettings::MultipleSettings(QWidget *parent) :
ui(new Ui::MultipleSettings)
{
ui->setupUi(this);
ui->buttonBox->button(QDialogButtonBox::Ok)->setText("Записать");
ui->buttonBox->button(QDialogButtonBox::SaveAll)->setText("Записать и установить");
}
@ -58,7 +57,6 @@ void MultipleSettings::on_boardBox_currentIndexChanged(int index)
break;
default:
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->setupUi(this);
ui->parityCombo->setCurrentIndex(0);
#if QT_CONFIG(modbus_serialport)
ui->baudCombo->setCurrentText(QString::number(m_settings.baud));
@ -16,8 +15,6 @@ SettingsDialog::SettingsDialog(QWidget *parent) :
#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->comBox->currentData().toString();
@ -30,7 +27,6 @@ SettingsDialog::SettingsDialog(QWidget *parent) :
#endif
m_settings.responseTime = ui->timeoutSpinner->value();
m_settings.numberOfRetries = ui->retriesSpinner->value();
hide();
});
}

View File

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

View File

@ -29,16 +29,12 @@ QVariant WriteRegisterModel::data(const QModelIndex &index, int role) const
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), 'f', 3));
return QVariant();
@ -73,7 +69,6 @@ bool WriteRegisterModel::setData(const QModelIndex &index, const QVariant &value
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());
@ -85,7 +80,6 @@ bool WriteRegisterModel::setData(const QModelIndex &index, const QVariant &value
quint16 newValue = value.toString().toUShort(&result, 16);
if (result)
m_holdingRegisters[index.row()] = newValue;
emit dataChanged(index, index);
return result;
}
@ -96,16 +90,13 @@ 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;
}

BIN
MZKT_Test_Terminal.exe Normal file

Binary file not shown.

Binary file not shown.