Compare commits

...

2 Commits

12 changed files with 590 additions and 454 deletions

2
.gitignore vendored
View File

@@ -54,3 +54,5 @@ compile_commands.json
*_qmlcache.qrc *_qmlcache.qrc
/Debug/debug/M3KTE_TERM.exe

Binary file not shown.

View File

@@ -16,8 +16,8 @@ CONFIG += c++11
# deprecated API in order to know how to port your code away from it. # deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS DEFINES += QT_DEPRECATED_WARNINGS
TEMPLATE = lib #TEMPLATE = lib
DEFINES += M3KTE_LIBRARY #DEFINES += M3KTE_LIBRARY
# You can also make your code fail to compile if it uses deprecated APIs. # You can also make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line. # In order to do so, uncomment the following line.
@@ -52,11 +52,11 @@ FORMS += \
settingsdialog.ui settingsdialog.ui
# Default rules for deployment. # Default rules for deployment.
#qnx: target.path = /tmp/$${TARGET}/bin qnx: target.path = /tmp/$${TARGET}/bin
#else: unix:!android: target.path = /opt/$${TARGET}/bin else: unix:!android: target.path = /opt/$${TARGET}/bin
#!isEmpty(target.path): INSTALLS += target
unix {
target.path = /usr/lib
}
!isEmpty(target.path): INSTALLS += target !isEmpty(target.path): INSTALLS += target
#unix {
# target.path = /usr/lib
#}
#!isEmpty(target.path): INSTALLS += target

View File

@@ -130,6 +130,8 @@ void DeviceSettingsDialog::on_buttonBox_clicked(QAbstractButton *button)
case QDialogButtonBox::AcceptRole: case QDialogButtonBox::AcceptRole:
close(); close();
break; break;
default:
break;
} }
} }
@@ -152,5 +154,12 @@ void DeviceSettingsDialog::on_buttonApplyChangePoll_clicked()
void DeviceSettingsDialog::on_idPollComboBox_currentIndexChanged(int index) void DeviceSettingsDialog::on_idPollComboBox_currentIndexChanged(int index)
{ {
Q_UNUSED(index);
ui->pollStatusBox->setCurrentIndex(_currentPollStatus[ui->idPollComboBox->currentData().toUInt()]); ui->pollStatusBox->setCurrentIndex(_currentPollStatus[ui->idPollComboBox->currentData().toUInt()]);
} }
void DeviceSettingsDialog::onDisconnect()
{
ui->idComboBox->clear();
ui->idPollComboBox->clear();
}

View File

@@ -53,6 +53,7 @@ public:
void updateSettingsAfterConnection(unsigned tmp_speed, unsigned tmp_parity, unsigned *tmp_adr, bool *ActiveDevices); void updateSettingsAfterConnection(unsigned tmp_speed, unsigned tmp_parity, unsigned *tmp_adr, bool *ActiveDevices);
void updatePollStatus(unsigned boardID, bool status); void updatePollStatus(unsigned boardID, bool status);
void initPollForBoard(unsigned boardID, unsigned boardAdr); void initPollForBoard(unsigned boardID, unsigned boardAdr);
void onDisconnect();
signals: signals:
void parityChanged(); void parityChanged();
void speedChanged(); void speedChanged();

View File

@@ -279,12 +279,12 @@
<widget class="QComboBox" name="pollStatusBox"> <widget class="QComboBox" name="pollStatusBox">
<item> <item>
<property name="text"> <property name="text">
<string>Вкл</string> <string>Выкл</string>
</property> </property>
</item> </item>
<item> <item>
<property name="text"> <property name="text">
<string>Выкл</string> <string>Вкл</string>
</property> </property>
</item> </item>
</widget> </widget>

View File

@@ -282,6 +282,7 @@ void LineRinger::on_ringButton_clicked()
break; break;
} }
currentBaudRate = ui->baudRateBox->itemText(i).toUInt(nullptr, 10); currentBaudRate = ui->baudRateBox->itemText(i).toUInt(nullptr, 10);
bar->setLabelText(tr("Поиск устройств... Текущая скорость: %1").arg(currentBaudRate));
if(lineCall() == callStatus::INTERRUPT) if(lineCall() == callStatus::INTERRUPT)
{ {
QMessageBox::warning(this, "Уведомление", QString("Досрочное завершение опроса. Найдено %1 устройств.").arg(devicesList.count())); QMessageBox::warning(this, "Уведомление", QString("Досрочное завершение опроса. Найдено %1 устройств.").arg(devicesList.count()));

View File

@@ -419,14 +419,14 @@ M3KTE::M3KTE(QWidget *parent)
Boards[2].timerData = ui->timeData_3; Boards[2].timerData = ui->timeData_3;
Boards[3].timerData = ui->timeData_4; Boards[3].timerData = ui->timeData_4;
for (int i = 0; i < 4; i++) { for(int i = 0; i < 4; i++) {
statusM3KTE.Warnings[i] = false; statusM3KTE.Warnings[i] = false;
statusM3KTE.Accidents[i] = false; statusM3KTE.Accidents[i] = false;
Boards_Fields[i]->setEnabled(false); Boards_Fields[i]->setEnabled(false);
Boards[i].timerData->setText(" "); Boards[i].timerData->setText(" ");
Boards[i].timerStatus->setText(" ");; Boards[i].timerStatus->setText(" ");;
} }
for (int i = 0; i < 5; i++) for(int i = 0; i < 5; i++)
{ {
ui->writeValueTable->resizeColumnToContents(i); ui->writeValueTable->resizeColumnToContents(i);
} }
@@ -498,10 +498,10 @@ void M3KTE::initActions()
void M3KTE::onConnectClicked() void M3KTE::onConnectClicked()
{ {
if (!modbusDevice) if(!modbusDevice)
return; return;
statusBar()->clearMessage(); statusBar()->clearMessage();
if (modbusDevice->state() != QModbusDevice::ConnectedState) { if(modbusDevice->state() != QModbusDevice::ConnectedState) {
modbusDevice->setConnectionParameter(QModbusDevice::SerialPortNameParameter, modbusDevice->setConnectionParameter(QModbusDevice::SerialPortNameParameter,
m_settingsDialog->settings().portName); m_settingsDialog->settings().portName);
#if QT_CONFIG(modbus_serialport) #if QT_CONFIG(modbus_serialport)
@@ -516,7 +516,7 @@ void M3KTE::onConnectClicked()
#endif #endif
modbusDevice->setTimeout(m_settingsDialog->settings().responseTime); modbusDevice->setTimeout(m_settingsDialog->settings().responseTime);
modbusDevice->setNumberOfRetries(m_settingsDialog->settings().numberOfRetries); modbusDevice->setNumberOfRetries(m_settingsDialog->settings().numberOfRetries);
if (!modbusDevice->connectDevice()) { if(!modbusDevice->connectDevice()) {
statusBar()->showMessage(tr("Connect failed: ") + modbusDevice->errorString(), 5000); statusBar()->showMessage(tr("Connect failed: ") + modbusDevice->errorString(), 5000);
} else { } else {
ui->ConnectionMenuConnect->setEnabled(false); ui->ConnectionMenuConnect->setEnabled(false);
@@ -525,7 +525,7 @@ void M3KTE::onConnectClicked()
{ {
unsigned tmp_adr[4]; unsigned tmp_adr[4];
bool ActiveDevices[4]; bool ActiveDevices[4];
for (int i = 0; i < 4; i++) { for(int i = 0; i < 4; i++) {
tmp_adr[i] = Boards[i].adr; tmp_adr[i] = Boards[i].adr;
ActiveDevices[i] = Boards[i].isActive; ActiveDevices[i] = Boards[i].isActive;
} }
@@ -559,7 +559,7 @@ void M3KTE::onConnectClicked()
Boards[i].ModbusModelHoldingReg->m_holdingRegisters[j] = 0; Boards[i].ModbusModelHoldingReg->m_holdingRegisters[j] = 0;
Boards[i].ModbusModelHoldingReg->m_holdingRegisters[j + (85 - (i/3*20))] = 0; Boards[i].ModbusModelHoldingReg->m_holdingRegisters[j + (85 - (i/3*20))] = 0;
} }
Boards_Fields[i]->setTitle(QString("Плата №%1").arg(i)); Boards_Fields[i]->setTitle(QString("Плата №%1").arg(i+1));
Boards[i].timerData->setText(" ");; Boards[i].timerData->setText(" ");;
Boards[i].timerStatus->setText(" ");; Boards[i].timerStatus->setText(" ");;
} }
@@ -584,16 +584,17 @@ void M3KTE::onConnectClicked()
ui->BSM_Accident->setEnabled(false); ui->BSM_Accident->setEnabled(false);
ui->BSM_WorkInProgress->setEnabled(false); ui->BSM_WorkInProgress->setEnabled(false);
ui->M3kteRegSettings->setEnabled(false); ui->M3kteRegSettings->setEnabled(false);
m_deviceSettingsDialog->onDisconnect();
} }
} }
void M3KTE::onReadButtonClicked() void M3KTE::onReadButtonClicked()
{ {
if (!modbusDevice) if(!modbusDevice)
return; return;
statusBar()->clearMessage(); statusBar()->clearMessage();
if (auto *reply = modbusDevice->sendReadRequest(readRequest(), Boards[ui->boardSelectBox->currentIndex()].adr)) { if(auto *reply = modbusDevice->sendReadRequest(readRequest(), Boards[ui->boardSelectBox->currentIndex()].adr)) {
if (!reply->isFinished()) if(!reply->isFinished())
connect(reply, &QModbusReply::finished, this, &M3KTE::onReadReady); connect(reply, &QModbusReply::finished, this, &M3KTE::onReadReady);
else else
delete reply; // broadcast replies return immediately delete reply; // broadcast replies return immediately
@@ -605,7 +606,7 @@ void M3KTE::onReadButtonClicked()
void M3KTE::onReadReady() void M3KTE::onReadReady()
{ {
auto reply = qobject_cast<QModbusReply *>(sender()); auto reply = qobject_cast<QModbusReply *>(sender());
if (!reply) if(!reply)
return; return;
int Adr = 255; int Adr = 255;
for(int i = 0; i < 4; i++) for(int i = 0; i < 4; i++)
@@ -616,9 +617,9 @@ void M3KTE::onReadReady()
break; break;
} }
} }
if (reply->error() == QModbusDevice::NoError) { if(reply->error() == QModbusDevice::NoError) {
const QModbusDataUnit unit = reply->result(); const QModbusDataUnit unit = reply->result();
for (int i = 0, total = int(unit.valueCount()); i < total; ++i) { for(int i = 0, total = int(unit.valueCount()); i < total; ++i) {
if(unit.registerType() == QModbusDataUnit::Coils) if(unit.registerType() == QModbusDataUnit::Coils)
{ {
Boards[Adr].coil[i + unit.startAddress()] = unit.value(i); Boards[Adr].coil[i + unit.startAddress()] = unit.value(i);
@@ -633,7 +634,19 @@ void M3KTE::onReadReady()
Boards[Adr].ModbusModelHoldingReg->setData(ui->writeValueTable->model()->index(i + unit.startAddress(), 3), QString::number(unit.value(i), 16), Qt::EditRole); Boards[Adr].ModbusModelHoldingReg->setData(ui->writeValueTable->model()->index(i + unit.startAddress(), 3), QString::number(unit.value(i), 16), Qt::EditRole);
} }
} }
} else if (reply->error() == QModbusDevice::ProtocolError) { switch(unit.registerType()) {
case QModbusDataUnit::Coils:
Boards[Adr].ModbusModelCoil->dataChanged(ui->writeValueTable->model()->index(unit.startAddress(), 2),
ui->writeValueTable->model()->index(unit.startAddress() + unit.valueCount() -1, 2));
break;
case QModbusDataUnit::HoldingRegisters:
Boards[Adr].ModbusModelHoldingReg->dataChanged(ui->writeValueTable->model()->index(unit.startAddress(), 3),
ui->writeValueTable->model()->index(unit.startAddress() + unit.valueCount() -1, 3));
break;
default:
break;
}
} else if(reply->error() == QModbusDevice::ProtocolError) {
statusBar()->showMessage(tr("Read response error: %1 (Mobus exception: 0x%2)"). statusBar()->showMessage(tr("Read response error: %1 (Mobus exception: 0x%2)").
arg(reply->errorString()). arg(reply->errorString()).
arg(reply->rawResult().exceptionCode(), -1, 16), 5000); arg(reply->rawResult().exceptionCode(), -1, 16), 5000);
@@ -667,13 +680,13 @@ void M3KTE::onReadReady()
void M3KTE::onWriteButtonClicked() void M3KTE::onWriteButtonClicked()
{ {
if (!modbusDevice) if(!modbusDevice)
return; return;
statusBar()->clearMessage(); statusBar()->clearMessage();
QModbusDataUnit writeUnit = writeRequest(); QModbusDataUnit writeUnit = writeRequest();
QModbusDataUnit::RegisterType table = writeUnit.registerType(); QModbusDataUnit::RegisterType table = writeUnit.registerType();
for (int i = 0, total = int(writeUnit.valueCount()); i < total; ++i) { for(int i = 0, total = int(writeUnit.valueCount()); i < total; ++i) {
if (table == QModbusDataUnit::Coils) if(table == QModbusDataUnit::Coils)
{ {
Boards[ui->boardSelectBox->currentIndex()].coil[i+writeUnit.startAddress()] = Boards[ui->boardSelectBox->currentIndex()].ModbusModelCoil->m_coils[i + writeUnit.startAddress()]; 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()]); writeUnit.setValue(i, Boards[ui->boardSelectBox->currentIndex()].ModbusModelCoil->m_coils[i + writeUnit.startAddress()]);
@@ -684,11 +697,11 @@ void M3KTE::onWriteButtonClicked()
writeUnit.setValue(i, 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(auto *reply = modbusDevice->sendWriteRequest(writeUnit, Boards[ui->boardSelectBox->currentIndex()].adr)) {
if (!reply->isFinished()) { if(!reply->isFinished()) {
unsigned tmp_id = ui->boardSelectBox->currentIndex(); unsigned tmp_id = ui->boardSelectBox->currentIndex();
connect(reply, &QModbusReply::finished, this, [this, reply, tmp_id]() { connect(reply, &QModbusReply::finished, this, [this, reply, tmp_id]() {
if (reply->error() == QModbusDevice::ProtocolError) { if(reply->error() == QModbusDevice::ProtocolError) {
statusBar()->showMessage(tr("Write response error: %1 (Mobus exception: 0x%2)") statusBar()->showMessage(tr("Write response error: %1 (Mobus exception: 0x%2)")
.arg(reply->errorString()).arg(reply->rawResult().exceptionCode(), -1, 16), .arg(reply->errorString()).arg(reply->rawResult().exceptionCode(), -1, 16),
5000); 5000);
@@ -702,7 +715,7 @@ void M3KTE::onWriteButtonClicked()
loggerTable->resizeColumnsToContents(); loggerTable->resizeColumnsToContents();
if(!loggerTable->verticalScrollBar()->isSliderDown()) if(!loggerTable->verticalScrollBar()->isSliderDown())
loggerTable->verticalScrollBar()->setSliderPosition(loggerTable->verticalScrollBar()->maximum()); loggerTable->verticalScrollBar()->setSliderPosition(loggerTable->verticalScrollBar()->maximum());
} else if (reply->error() != QModbusDevice::NoError) { } else if(reply->error() != QModbusDevice::NoError) {
statusBar()->showMessage(tr("Write response error: %1 (code: 0x%2)"). statusBar()->showMessage(tr("Write response error: %1 (code: 0x%2)").
arg(reply->errorString()).arg(reply->error(), -1, 16), 5000); arg(reply->errorString()).arg(reply->error(), -1, 16), 5000);
unsigned newRow = loggerTable->rowCount(); unsigned newRow = loggerTable->rowCount();
@@ -747,49 +760,41 @@ void M3KTE::onWriteTableChanged(int index)
void M3KTE::changeTable(int board, int tabletype) void M3KTE::changeTable(int board, int tabletype)
{ {
if(tabletype==0) if(tabletype==0) {
{
ui->writeValueTable->setModel(Boards[board].ModbusModelCoil); ui->writeValueTable->setModel(Boards[board].ModbusModelCoil);
int i = 0; int i = 0;
for(;i<Boards[board].ModbusModelHoldingReg->rowCount();i++) for(;i<Boards[board].ModbusModelHoldingReg->rowCount();i++) {
{
ui->writeValueTable->setRowHidden(i, ui->writeValueTable->model()->index(i, 0).parent(), false); ui->writeValueTable->setRowHidden(i, ui->writeValueTable->model()->index(i, 0).parent(), false);
} }
ui->writeValueTable->hideColumn(3); ui->writeValueTable->hideColumn(3);
ui->writeValueTable->showColumn(2); ui->writeValueTable->showColumn(2);
} }
else else {
{
ui->writeValueTable->setModel(Boards[board].ModbusModelHoldingReg); ui->writeValueTable->setModel(Boards[board].ModbusModelHoldingReg);
if(tabletype==1) if(tabletype==1) {
{
Boards[board].ModbusModelHoldingReg->setStartAddress(0); Boards[board].ModbusModelHoldingReg->setStartAddress(0);
int i = 0; int i = 0;
for (;i<Boards[board].ModbusModelHoldingReg->rowCount()/2;i++) { for(;i<Boards[board].ModbusModelHoldingReg->rowCount()/2;i++) {
ui->writeValueTable->setRowHidden(i, ui->writeValueTable->model()->index(i, 0).parent(), false); ui->writeValueTable->setRowHidden(i, ui->writeValueTable->model()->index(i, 0).parent(), false);
} }
for(;i<Boards[board].ModbusModelHoldingReg->rowCount();i++) for(;i<Boards[board].ModbusModelHoldingReg->rowCount();i++) {
{
ui->writeValueTable->setRowHidden(i, ui->writeValueTable->model()->index(i, 0).parent(), true); ui->writeValueTable->setRowHidden(i, ui->writeValueTable->model()->index(i, 0).parent(), true);
} }
} }
else else {
{
Boards[board].ModbusModelHoldingReg->setStartAddress(Boards[board].ModbusModelHoldingReg->rowCount()/2); Boards[board].ModbusModelHoldingReg->setStartAddress(Boards[board].ModbusModelHoldingReg->rowCount()/2);
int i = 0; int i = 0;
for (;i<Boards[board].ModbusModelHoldingReg->rowCount()/2;i++) { for(;i<Boards[board].ModbusModelHoldingReg->rowCount()/2;i++) {
ui->writeValueTable->setRowHidden(i, ui->writeValueTable->model()->index(i, 0).parent(), true); ui->writeValueTable->setRowHidden(i, ui->writeValueTable->model()->index(i, 0).parent(), true);
} }
for(;i<Boards[board].ModbusModelHoldingReg->rowCount();i++) for(;i<Boards[board].ModbusModelHoldingReg->rowCount();i++) {
{
ui->writeValueTable->setRowHidden(i, ui->writeValueTable->model()->index(i, 0).parent(), false); ui->writeValueTable->setRowHidden(i, ui->writeValueTable->model()->index(i, 0).parent(), false);
} }
} }
ui->writeValueTable->hideColumn(2); ui->writeValueTable->hideColumn(2);
ui->writeValueTable->showColumn(3); ui->writeValueTable->showColumn(3);
} }
for (int i = 0; i < 5; i++) for(int i = 0; i < 5; i++) {
{
ui->writeValueTable->resizeColumnToContents(i); ui->writeValueTable->resizeColumnToContents(i);
} }
} }
@@ -816,35 +821,28 @@ QModbusDataUnit M3KTE::writeRequest() const
bool M3KTE::event(QEvent *event) bool M3KTE::event(QEvent *event)
{ {
if (event->type() == QEvent::User) if(event->type() == QEvent::User) {
{
BoardIdHasBeenChanged* _event = static_cast<BoardIdHasBeenChanged*>(event); BoardIdHasBeenChanged* _event = static_cast<BoardIdHasBeenChanged*>(event);
QModbusDataUnit* _unit = new QModbusDataUnit(QModbusDataUnit::HoldingRegisters, 172, 1); QModbusDataUnit* _unit = new QModbusDataUnit(QModbusDataUnit::HoldingRegisters, 172, 1);
_unit->setValue(0, _event->BoardNewID()); _unit->setValue(0, _event->BoardNewID());
Boards[_event->BoardNum()]._tmp_adr = _event->BoardNewID(); Boards[_event->BoardNum()]._tmp_adr = _event->BoardNewID();
if (auto *reply = modbusDevice->sendWriteRequest(*_unit, Boards[_event->BoardNum()].adr)) if(auto *reply = modbusDevice->sendWriteRequest(*_unit, Boards[_event->BoardNum()].adr)) {
{
if(!reply->isFinished()) if(!reply->isFinished())
connect(reply, &QModbusReply::finished, this, [reply, this, _event, _unit]() connect(reply, &QModbusReply::finished, this, [reply, this, _event, _unit]() {
{ if(reply->error()==QModbusDevice::TimeoutError) {
if(reply->error()==QModbusDevice::TimeoutError) if(auto *subreply = modbusDevice->sendReadRequest(*_unit, Boards[_event->BoardNum()]._tmp_adr)) {
{ if(!subreply->isFinished())
if (auto *subreply = modbusDevice->sendReadRequest(*_unit, Boards[_event->BoardNum()]._tmp_adr)) connect(subreply, &QModbusReply::finished, this, [subreply, this, _event]() {
{
if (!subreply->isFinished())
connect(subreply, &QModbusReply::finished, this, [subreply, this, _event]()
{
checkAdrChange(subreply, _event->BoardNum()); checkAdrChange(subreply, _event->BoardNum());
}); });
else else {
{
unsigned newRow = loggerTable->rowCount(); unsigned newRow = loggerTable->rowCount();
loggerTable->insertRow(newRow); loggerTable->insertRow(newRow);
loggerTable->setItem(newRow, 0, new QTableWidgetItem((QTime::currentTime().toString("HH:mm:ss")))); loggerTable->setItem(newRow, 0, new QTableWidgetItem((QTime::currentTime().toString("HH:mm:ss"))));
loggerTable->setItem(newRow, 1, new QTableWidgetItem(tr("Плата %1 (ID %2)").arg(_event->BoardNum()+1).arg(Boards[_event->BoardNum()].adr))); loggerTable->setItem(newRow, 1, new QTableWidgetItem(tr("Плата %1 (ID %2)").arg(_event->BoardNum()+1).arg(Boards[_event->BoardNum()].adr)));
loggerTable->setItem(newRow, 2, new QTableWidgetItem(subreply->errorString())); loggerTable->setItem(newRow, 2, new QTableWidgetItem(subreply->errorString()));
loggerTable->setItem(newRow, 3, new QTableWidgetItem(QString::number(++Boards[_event->BoardNum()].error_adr_change, 10))); loggerTable->setItem(newRow, 3, new QTableWidgetItem(QString::number(++Boards[_event->BoardNum()].error_adr_change, 10)));
loggerTable->setItem(newRow, 4, new QTableWidgetItem("Не удалось изменить адрес устройства.")); loggerTable->setItem(newRow, 4, new QTableWidgetItem("Не удалось изменить адрес устройства. [1]"));
loggerTable->resizeColumnsToContents(); loggerTable->resizeColumnsToContents();
if(!loggerTable->verticalScrollBar()->isSliderDown()) if(!loggerTable->verticalScrollBar()->isSliderDown())
loggerTable->verticalScrollBar()->setSliderPosition(loggerTable->verticalScrollBar()->maximum()); loggerTable->verticalScrollBar()->setSliderPosition(loggerTable->verticalScrollBar()->maximum());
@@ -858,37 +856,35 @@ bool M3KTE::event(QEvent *event)
loggerTable->setItem(newRow, 1, new QTableWidgetItem(tr("Плата %1 (ID %2)").arg(_event->BoardNum()+1).arg(Boards[_event->BoardNum()].adr))); loggerTable->setItem(newRow, 1, new QTableWidgetItem(tr("Плата %1 (ID %2)").arg(_event->BoardNum()+1).arg(Boards[_event->BoardNum()].adr)));
loggerTable->setItem(newRow, 2, new QTableWidgetItem(modbusDevice->errorString())); loggerTable->setItem(newRow, 2, new QTableWidgetItem(modbusDevice->errorString()));
loggerTable->setItem(newRow, 3, new QTableWidgetItem(QString::number(++Boards[_event->BoardNum()].error_adr_change, 10))); loggerTable->setItem(newRow, 3, new QTableWidgetItem(QString::number(++Boards[_event->BoardNum()].error_adr_change, 10)));
loggerTable->setItem(newRow, 4, new QTableWidgetItem("Не удалось изменить адрес устройства.")); loggerTable->setItem(newRow, 4, new QTableWidgetItem("Не удалось изменить адрес устройства. [2]"));
loggerTable->resizeColumnsToContents(); loggerTable->resizeColumnsToContents();
if(!loggerTable->verticalScrollBar()->isSliderDown()) if(!loggerTable->verticalScrollBar()->isSliderDown())
loggerTable->verticalScrollBar()->setSliderPosition(loggerTable->verticalScrollBar()->maximum()); loggerTable->verticalScrollBar()->setSliderPosition(loggerTable->verticalScrollBar()->maximum());
reply->deleteLater(); reply->deleteLater();
} }
} }
else else {
{
unsigned newRow = loggerTable->rowCount(); unsigned newRow = loggerTable->rowCount();
loggerTable->insertRow(newRow); loggerTable->insertRow(newRow);
loggerTable->setItem(newRow, 0, new QTableWidgetItem((QTime::currentTime().toString("HH:mm:ss")))); loggerTable->setItem(newRow, 0, new QTableWidgetItem((QTime::currentTime().toString("HH:mm:ss"))));
loggerTable->setItem(newRow, 1, new QTableWidgetItem(tr("Плата %1 (ID %2)").arg(_event->BoardNum()+1).arg(Boards[_event->BoardNum()].adr))); loggerTable->setItem(newRow, 1, new QTableWidgetItem(tr("Плата %1 (ID %2)").arg(_event->BoardNum()+1).arg(Boards[_event->BoardNum()].adr)));
loggerTable->setItem(newRow, 2, new QTableWidgetItem(reply->errorString())); loggerTable->setItem(newRow, 2, new QTableWidgetItem(reply->errorString()));
loggerTable->setItem(newRow, 3, new QTableWidgetItem(QString::number(++Boards[_event->BoardNum()].error_adr_change, 10))); loggerTable->setItem(newRow, 3, new QTableWidgetItem(QString::number(++Boards[_event->BoardNum()].error_adr_change, 10)));
loggerTable->setItem(newRow, 4, new QTableWidgetItem("Не удалось изменить адрес устройства.")); loggerTable->setItem(newRow, 4, new QTableWidgetItem("Не удалось изменить адрес устройства. [3]"));
loggerTable->resizeColumnsToContents(); loggerTable->resizeColumnsToContents();
if(!loggerTable->verticalScrollBar()->isSliderDown()) if(!loggerTable->verticalScrollBar()->isSliderDown())
loggerTable->verticalScrollBar()->setSliderPosition(loggerTable->verticalScrollBar()->maximum()); loggerTable->verticalScrollBar()->setSliderPosition(loggerTable->verticalScrollBar()->maximum());
reply->deleteLater(); reply->deleteLater();
} }
}); });
else else {
{
unsigned newRow = loggerTable->rowCount(); unsigned newRow = loggerTable->rowCount();
loggerTable->insertRow(newRow); loggerTable->insertRow(newRow);
loggerTable->setItem(newRow, 0, new QTableWidgetItem((QTime::currentTime().toString("HH:mm:ss")))); loggerTable->setItem(newRow, 0, new QTableWidgetItem((QTime::currentTime().toString("HH:mm:ss"))));
loggerTable->setItem(newRow, 1, new QTableWidgetItem(tr("Плата %1 (ID %2)").arg(_event->BoardNum()+1).arg(Boards[_event->BoardNum()].adr))); loggerTable->setItem(newRow, 1, new QTableWidgetItem(tr("Плата %1 (ID %2)").arg(_event->BoardNum()+1).arg(Boards[_event->BoardNum()].adr)));
loggerTable->setItem(newRow, 2, new QTableWidgetItem(reply->errorString())); loggerTable->setItem(newRow, 2, new QTableWidgetItem(reply->errorString()));
loggerTable->setItem(newRow, 3, new QTableWidgetItem(QString::number(++Boards[_event->BoardNum()].error_adr_change, 10))); loggerTable->setItem(newRow, 3, new QTableWidgetItem(QString::number(++Boards[_event->BoardNum()].error_adr_change, 10)));
loggerTable->setItem(newRow, 4, new QTableWidgetItem("Не удалось изменить адрес устройства.")); loggerTable->setItem(newRow, 4, new QTableWidgetItem("Не удалось изменить адрес устройства. [4]"));
loggerTable->resizeColumnsToContents(); loggerTable->resizeColumnsToContents();
if(!loggerTable->verticalScrollBar()->isSliderDown()) if(!loggerTable->verticalScrollBar()->isSliderDown())
loggerTable->verticalScrollBar()->setSliderPosition(loggerTable->verticalScrollBar()->maximum()); loggerTable->verticalScrollBar()->setSliderPosition(loggerTable->verticalScrollBar()->maximum());
@@ -896,15 +892,14 @@ bool M3KTE::event(QEvent *event)
delete reply; delete reply;
} }
} }
else else {
{
unsigned newRow = loggerTable->rowCount(); unsigned newRow = loggerTable->rowCount();
loggerTable->insertRow(newRow); loggerTable->insertRow(newRow);
loggerTable->setItem(newRow, 0, new QTableWidgetItem((QTime::currentTime().toString("HH:mm:ss")))); loggerTable->setItem(newRow, 0, new QTableWidgetItem((QTime::currentTime().toString("HH:mm:ss"))));
loggerTable->setItem(newRow, 1, new QTableWidgetItem(tr("Плата %1 (ID %2)").arg(_event->BoardNum()+1).arg(Boards[_event->BoardNum()].adr))); loggerTable->setItem(newRow, 1, new QTableWidgetItem(tr("Плата %1 (ID %2)").arg(_event->BoardNum()+1).arg(Boards[_event->BoardNum()].adr)));
loggerTable->setItem(newRow, 2, new QTableWidgetItem(modbusDevice->errorString())); loggerTable->setItem(newRow, 2, new QTableWidgetItem(modbusDevice->errorString()));
loggerTable->setItem(newRow, 3, new QTableWidgetItem(QString::number(++Boards[_event->BoardNum()].error_adr_change, 10))); loggerTable->setItem(newRow, 3, new QTableWidgetItem(QString::number(++Boards[_event->BoardNum()].error_adr_change, 10)));
loggerTable->setItem(newRow, 4, new QTableWidgetItem("Не удалось изменить адрес устройства.")); loggerTable->setItem(newRow, 4, new QTableWidgetItem("Не удалось изменить адрес устройства. [5]"));
loggerTable->resizeColumnsToContents(); loggerTable->resizeColumnsToContents();
if(!loggerTable->verticalScrollBar()->isSliderDown()) if(!loggerTable->verticalScrollBar()->isSliderDown())
loggerTable->verticalScrollBar()->setSliderPosition(loggerTable->verticalScrollBar()->maximum()); loggerTable->verticalScrollBar()->setSliderPosition(loggerTable->verticalScrollBar()->maximum());
@@ -913,18 +908,14 @@ bool M3KTE::event(QEvent *event)
m_deviceSettingsDialog->show(); m_deviceSettingsDialog->show();
return true; return true;
} }
else if (event->type() == (QEvent::Type)1001) else if(event->type() == (QEvent::Type)1001) {
{
pollStatusChange* _event = static_cast<pollStatusChange*>(event); pollStatusChange* _event = static_cast<pollStatusChange*>(event);
QModbusDataUnit* _unit = new QModbusDataUnit(QModbusDataUnit::HoldingRegisters, 170, 1); QModbusDataUnit* _unit = new QModbusDataUnit(QModbusDataUnit::HoldingRegisters, 170, 1);
_unit->setValue(0, _event->Status()); _unit->setValue(0, _event->Status());
if (auto *reply = modbusDevice->sendWriteRequest(*_unit, Boards[_event->BoardID()].adr)) if(auto *reply = modbusDevice->sendWriteRequest(*_unit, Boards[_event->BoardID()].adr)) {
{
if(!reply->isFinished()) if(!reply->isFinished())
connect(reply, &QModbusReply::finished, this, [reply, this, _event]() connect(reply, &QModbusReply::finished, this, [reply, this, _event]() {
{ if(reply->error()!=QModbusDevice::NoError) {
if(reply->error()!=QModbusDevice::NoError)
{
unsigned newRow = loggerTable->rowCount(); unsigned newRow = loggerTable->rowCount();
loggerTable->insertRow(newRow); loggerTable->insertRow(newRow);
loggerTable->setItem(newRow, 0, new QTableWidgetItem((QTime::currentTime().toString("HH:mm:ss")))); loggerTable->setItem(newRow, 0, new QTableWidgetItem((QTime::currentTime().toString("HH:mm:ss"))));
@@ -938,8 +929,7 @@ bool M3KTE::event(QEvent *event)
} }
}); });
} }
else else {
{
unsigned newRow = loggerTable->rowCount(); unsigned newRow = loggerTable->rowCount();
loggerTable->insertRow(newRow); loggerTable->insertRow(newRow);
loggerTable->setItem(newRow, 0, new QTableWidgetItem((QTime::currentTime().toString("HH:mm:ss")))); loggerTable->setItem(newRow, 0, new QTableWidgetItem((QTime::currentTime().toString("HH:mm:ss"))));
@@ -958,102 +948,125 @@ bool M3KTE::event(QEvent *event)
void M3KTE::checkAdrChange(QModbusReply *reply, unsigned boardNum) void M3KTE::checkAdrChange(QModbusReply *reply, unsigned boardNum)
{ {
if (!reply) if(!reply) {
{
unsigned newRow = loggerTable->rowCount(); unsigned newRow = loggerTable->rowCount();
loggerTable->insertRow(newRow); loggerTable->insertRow(newRow);
loggerTable->setItem(newRow, 0, new QTableWidgetItem((QTime::currentTime().toString("HH:mm:ss")))); loggerTable->setItem(newRow, 0, new QTableWidgetItem((QTime::currentTime().toString("HH:mm:ss"))));
loggerTable->setItem(newRow, 1, new QTableWidgetItem(tr("Плата %1 (ID %2)").arg(boardNum+1).arg(Boards[boardNum].adr))); loggerTable->setItem(newRow, 1, new QTableWidgetItem(tr("Плата %1 (ID %2)").arg(boardNum+1).arg(Boards[boardNum].adr)));
loggerTable->setItem(newRow, 2, new QTableWidgetItem(modbusDevice->errorString())); loggerTable->setItem(newRow, 2, new QTableWidgetItem(modbusDevice->errorString()));
loggerTable->setItem(newRow, 3, new QTableWidgetItem(QString::number(++Boards[boardNum].error_adr_change, 10))); loggerTable->setItem(newRow, 3, new QTableWidgetItem(QString::number(++Boards[boardNum].error_adr_change, 10)));
loggerTable->setItem(newRow, 4, new QTableWidgetItem("Не удалось изменить адрес устройства.")); loggerTable->setItem(newRow, 4, new QTableWidgetItem("Не удалось проверить изменение адреса устройства."));
loggerTable->resizeColumnsToContents(); loggerTable->resizeColumnsToContents();
if(!loggerTable->verticalScrollBar()->isSliderDown()) if(!loggerTable->verticalScrollBar()->isSliderDown())
loggerTable->verticalScrollBar()->setSliderPosition(loggerTable->verticalScrollBar()->maximum()); loggerTable->verticalScrollBar()->setSliderPosition(loggerTable->verticalScrollBar()->maximum());
reply->deleteLater(); reply->deleteLater();
return; return;
} }
if (reply->error() == QModbusDevice::NoError) { if(reply->error() == QModbusDevice::NoError) {
if(Boards[boardNum]._tmp_adr == reply->serverAddress())
{
//OK //OK
Boards[boardNum].adr = Boards[boardNum]._tmp_adr; Boards[boardNum].adr = Boards[boardNum]._tmp_adr;
reply->deleteLater(); reply->deleteLater();
return;
} }
//ERROR else {
else{
Boards[boardNum]._tmp_adr = Boards[boardNum].adr;
unsigned newRow = loggerTable->rowCount(); unsigned newRow = loggerTable->rowCount();
loggerTable->insertRow(newRow); loggerTable->insertRow(newRow);
loggerTable->setItem(newRow, 0, new QTableWidgetItem((QTime::currentTime().toString("HH:mm:ss")))); loggerTable->setItem(newRow, 0, new QTableWidgetItem((QTime::currentTime().toString("HH:mm:ss"))));
loggerTable->setItem(newRow, 1, new QTableWidgetItem(tr("Плата %1 (ID %2)").arg(boardNum+1).arg(Boards[boardNum].adr))); loggerTable->setItem(newRow, 1, new QTableWidgetItem(tr("Плата %1 (ID %2)").arg(boardNum+1).arg(Boards[boardNum].adr)));
loggerTable->setItem(newRow, 2, new QTableWidgetItem(reply->errorString())); loggerTable->setItem(newRow, 2, new QTableWidgetItem(reply->errorString()));
loggerTable->setItem(newRow, 3, new QTableWidgetItem(QString::number(++Boards[boardNum].error_adr_change, 10))); loggerTable->setItem(newRow, 3, new QTableWidgetItem(QString::number(++Boards[boardNum].error_adr_change, 10)));
loggerTable->setItem(newRow, 4, new QTableWidgetItem("Не удалось изменить адрес устройства.")); loggerTable->setItem(newRow, 4, new QTableWidgetItem("Ошибка при подтверждении изменения адреса устройства."));
loggerTable->resizeColumnsToContents(); loggerTable->resizeColumnsToContents();
if(!loggerTable->verticalScrollBar()->isSliderDown()) if(!loggerTable->verticalScrollBar()->isSliderDown())
loggerTable->verticalScrollBar()->setSliderPosition(loggerTable->verticalScrollBar()->maximum()); loggerTable->verticalScrollBar()->setSliderPosition(loggerTable->verticalScrollBar()->maximum());
reply->deleteLater(); reply->deleteLater();
return;
} }
}
unsigned newRow = loggerTable->rowCount();
loggerTable->insertRow(newRow);
loggerTable->setItem(newRow, 0, new QTableWidgetItem((QTime::currentTime().toString("HH:mm:ss"))));
loggerTable->setItem(newRow, 1, new QTableWidgetItem(tr("Плата %1 (ID %2)").arg(boardNum+1).arg(Boards[boardNum].adr)));
loggerTable->setItem(newRow, 2, new QTableWidgetItem(reply->errorString()));
loggerTable->setItem(newRow, 3, new QTableWidgetItem(QString::number(++Boards[boardNum].error_adr_change, 10)));
loggerTable->setItem(newRow, 4, new QTableWidgetItem("Не удалось изменить адрес устройства."));
loggerTable->resizeColumnsToContents();
if(!loggerTable->verticalScrollBar()->isSliderDown())
loggerTable->verticalScrollBar()->setSliderPosition(loggerTable->verticalScrollBar()->maximum());
reply->deleteLater();
} }
/*
void M3KTE::onSpeedUpdate() void M3KTE::onSpeedUpdate()
{ {
stopScanBoard(); stopScanBoard();
QModbusDataUnit* _unit = new QModbusDataUnit(QModbusDataUnit::HoldingRegisters, 173, 1); QModbusDataUnit* _unit = new QModbusDataUnit(QModbusDataUnit::HoldingRegisters, 173, 1);
QModbusDataUnit* _unitcheck = new QModbusDataUnit(QModbusDataUnit::InputRegisters, 85, 1); QModbusDataUnit* _unitcheck = new QModbusDataUnit(QModbusDataUnit::InputRegisters, 85, 1);
_unit->setValue(0, m_deviceSettingsDialog->currentSpeed()); _unit->setValue(0, m_deviceSettingsDialog->currentSpeed());
unsigned tmp_speed = m_deviceSettingsDialog->currentSpeed(); unsigned tmp_speed = 0;
for (int i = 0; i < 4; i++) { switch(m_deviceSettingsDialog->currentSpeed()) {
if (!Boards[i].isActive) case 0:
{ tmp_speed = 9600;
break;
case 1:
tmp_speed = 14400;
break;
case 2:
tmp_speed = 19200;
break;
case 3:
tmp_speed = 31250;
break;
case 4:
tmp_speed = 38400;
break;
case 5:
tmp_speed = 56000;
break;
case 6:
tmp_speed = 57600;
break;
case 7:
tmp_speed = 115200;
break;
}
if(tmp_speed == 0) {
unsigned newRow = loggerTable->rowCount();
loggerTable->insertRow(newRow);
loggerTable->setItem(newRow, 0, new QTableWidgetItem((QTime::currentTime().toString("HH:mm:ss"))));
loggerTable->setItem(newRow, 1, new QTableWidgetItem(tr("Программная ошибка")));
loggerTable->setItem(newRow, 2, new QTableWidgetItem("Неожиданное значение скорости"));
loggerTable->setItem(newRow, 3, new QTableWidgetItem(0));
loggerTable->setItem(newRow, 4, new QTableWidgetItem("Ошибка при изменении скорости обмена."));
loggerTable->resizeColumnsToContents();
if(!loggerTable->verticalScrollBar()->isSliderDown())
loggerTable->verticalScrollBar()->setSliderPosition(loggerTable->verticalScrollBar()->maximum());
beginScanBoards();
return;
}
modbusDevice->setTimeout(500);
for(int i = 0; i < 4; i++) {
if(!Boards[i].isActive) {
continue; continue;
} }
if (auto *reply = modbusDevice->sendWriteRequest(*_unit, Boards[i].adr)) if(auto *reply = modbusDevice->sendWriteRequest(*_unit, Boards[i].adr)) {
{ QEventLoop loop;
while(!reply->isFinished()) connect(reply, &QModbusReply::finished, &loop, &QEventLoop::quit);
{ loop.exec();
QCoreApplication::processEvents(); if(reply->error()==QModbusDevice::TimeoutError) {
}
if(reply->error()==QModbusDevice::TimeoutError)
{
modbusDevice->disconnectDevice(); modbusDevice->disconnectDevice();
modbusDevice->setConnectionParameter(QModbusDevice::SerialBaudRateParameter, modbusDevice->setConnectionParameter(QModbusDevice::SerialBaudRateParameter,
tmp_speed); tmp_speed);
modbusDevice->connectDevice(); modbusDevice->connectDevice();
if(auto *subreply = modbusDevice->sendReadRequest(*_unitcheck, Boards[i].adr)) if(auto *subreply = modbusDevice->sendReadRequest(*_unitcheck, Boards[i].adr)) {
{ QEventLoop subloop;
while (!subreply->isFinished()) connect(subreply, &QModbusReply::finished, &subloop, &QEventLoop::quit);
{ subloop.exec();
QCoreApplication::processEvents(); if(subreply->error() != QModbusDevice::NoError) {
}
if(subreply->error() != QModbusDevice::NoError)
{
unsigned newRow = loggerTable->rowCount(); unsigned newRow = loggerTable->rowCount();
loggerTable->insertRow(newRow); loggerTable->insertRow(newRow);
loggerTable->setItem(newRow, 0, new QTableWidgetItem((QTime::currentTime().toString("HH:mm:ss")))); loggerTable->setItem(newRow, 0, new QTableWidgetItem((QTime::currentTime().toString("HH:mm:ss"))));
loggerTable->setItem(newRow, 1, new QTableWidgetItem(tr("Плата %1 (ID %2)").arg(i+1).arg(Boards[i].adr))); loggerTable->setItem(newRow, 1, new QTableWidgetItem(tr("Плата %1 (ID %2)").arg(i+1).arg(Boards[i].adr)));
loggerTable->setItem(newRow, 2, new QTableWidgetItem(subreply->errorString())); loggerTable->setItem(newRow, 2, new QTableWidgetItem(subreply->errorString()));
loggerTable->setItem(newRow, 3, new QTableWidgetItem(QString::number(++Boards[i].error_baud_change, 10))); loggerTable->setItem(newRow, 3, new QTableWidgetItem(QString::number(++Boards[i].error_baud_change, 10)));
loggerTable->setItem(newRow, 4, new QTableWidgetItem("Ошибка при изменении скорости обмена.")); loggerTable->setItem(newRow, 4, new QTableWidgetItem("Ошибка при подтверждении изменения скорости обмена."));
loggerTable->resizeColumnsToContents(); loggerTable->resizeColumnsToContents();
if(!loggerTable->verticalScrollBar()->isSliderDown()) if(!loggerTable->verticalScrollBar()->isSliderDown())
loggerTable->verticalScrollBar()->setSliderPosition(loggerTable->verticalScrollBar()->maximum()); loggerTable->verticalScrollBar()->setSliderPosition(loggerTable->verticalScrollBar()->maximum());
subreply->deleteLater(); subreply->deleteLater();
} else {
modbusDevice->disconnectDevice();
modbusDevice->setConnectionParameter(QModbusDevice::SerialBaudRateParameter,
m_settingsDialog->UpdateBaud(m_deviceSettingsDialog->currentSpeed()));
modbusDevice->connectDevice();
modbusDevice->setTimeout(m_settingsDialog->settings().responseTime);
beginScanBoards();
return;
} }
} else { } else {
unsigned newRow = loggerTable->rowCount(); unsigned newRow = loggerTable->rowCount();
@@ -1062,18 +1075,12 @@ void M3KTE::onSpeedUpdate()
loggerTable->setItem(newRow, 1, new QTableWidgetItem(tr("Плата %1 (ID %2)").arg(i+1).arg(Boards[i].adr))); loggerTable->setItem(newRow, 1, new QTableWidgetItem(tr("Плата %1 (ID %2)").arg(i+1).arg(Boards[i].adr)));
loggerTable->setItem(newRow, 2, new QTableWidgetItem(modbusDevice->errorString())); loggerTable->setItem(newRow, 2, new QTableWidgetItem(modbusDevice->errorString()));
loggerTable->setItem(newRow, 3, new QTableWidgetItem(QString::number(++Boards[i].error_baud_change, 10))); loggerTable->setItem(newRow, 3, new QTableWidgetItem(QString::number(++Boards[i].error_baud_change, 10)));
loggerTable->setItem(newRow, 4, new QTableWidgetItem("Ошибка при изменении скорости обмена.")); loggerTable->setItem(newRow, 4, new QTableWidgetItem("Ошибка при отправке подтверждения изменения скорости обмена."));
loggerTable->resizeColumnsToContents(); loggerTable->resizeColumnsToContents();
if(!loggerTable->verticalScrollBar()->isSliderDown()) if(!loggerTable->verticalScrollBar()->isSliderDown())
loggerTable->verticalScrollBar()->setSliderPosition(loggerTable->verticalScrollBar()->maximum()); loggerTable->verticalScrollBar()->setSliderPosition(loggerTable->verticalScrollBar()->maximum());
} }
modbusDevice->disconnectDevice(); } else {
modbusDevice->setConnectionParameter(QModbusDevice::SerialBaudRateParameter,
m_settingsDialog->curBaud());
modbusDevice->connectDevice();
}
else
{
unsigned newRow = loggerTable->rowCount(); unsigned newRow = loggerTable->rowCount();
loggerTable->insertRow(newRow); loggerTable->insertRow(newRow);
loggerTable->setItem(newRow, 0, new QTableWidgetItem((QTime::currentTime().toString("HH:mm:ss")))); loggerTable->setItem(newRow, 0, new QTableWidgetItem((QTime::currentTime().toString("HH:mm:ss"))));
@@ -1090,59 +1097,244 @@ void M3KTE::onSpeedUpdate()
} }
modbusDevice->disconnectDevice(); modbusDevice->disconnectDevice();
modbusDevice->setConnectionParameter(QModbusDevice::SerialBaudRateParameter, modbusDevice->setConnectionParameter(QModbusDevice::SerialBaudRateParameter,
m_settingsDialog->UpdateBaud(tmp_speed)); m_settingsDialog->curBaud());
modbusDevice->connectDevice(); modbusDevice->connectDevice();
modbusDevice->setTimeout(m_settingsDialog->settings().responseTime);
beginScanBoards(); beginScanBoards();
} }
*/
void M3KTE::onSpeedUpdate()
{
stopScanBoard();
modbusDevice->setTimeout(500);
switch(m_deviceSettingsDialog->currentSpeed()) {
case 0:
tmp_speed = 9600;
break;
case 1:
tmp_speed = 14400;
break;
case 2:
tmp_speed = 19200;
break;
case 3:
tmp_speed = 31250;
break;
case 4:
tmp_speed = 38400;
break;
case 5:
tmp_speed = 56000;
break;
case 6:
tmp_speed = 57600;
break;
case 7:
tmp_speed = 115200;
break;
}
if(tmp_speed == 0) {
unsigned newRow = loggerTable->rowCount();
loggerTable->insertRow(newRow);
loggerTable->setItem(newRow, 0, new QTableWidgetItem((QTime::currentTime().toString("HH:mm:ss"))));
loggerTable->setItem(newRow, 1, new QTableWidgetItem(tr("Программная ошибка")));
loggerTable->setItem(newRow, 2, new QTableWidgetItem("Неожиданное значение скорости"));
loggerTable->setItem(newRow, 3, new QTableWidgetItem(0));
loggerTable->setItem(newRow, 4, new QTableWidgetItem("Ошибка при изменении скорости обмена."));
loggerTable->resizeColumnsToContents();
if(!loggerTable->verticalScrollBar()->isSliderDown())
loggerTable->verticalScrollBar()->setSliderPosition(loggerTable->verticalScrollBar()->maximum());
beginScanBoards();
return;
}
speedChangeRequests.clear();
pendingSpeedChangeRequestsCount = 0;
for(int i = 0; i < 4; i++) {
speedChangeRequests[i].errorOccurred = false;
speedChangeRequests[i].finished = false;
speedChangeRequests[i].confirmationReceived = false;
}
for(int i = 0; i < 4; i++) {
if(!Boards[i].isActive)
continue;
QModbusDataUnit unit(QModbusDataUnit::HoldingRegisters, 173, 1);
unit.setValue(0, m_deviceSettingsDialog->currentSpeed());
auto *reply = modbusDevice->sendWriteRequest(unit, Boards[i].adr);
if (reply) {
SpeedChangeRequest req;
req.boardIndex = i;
speedChangeRequests.append(req);
pendingSpeedChangeRequestsCount++;
connect(reply, &QModbusReply::finished, this, [this, reply, i]() {
this->handleSpeedChangeReply(reply, i);
});
}
else
{
}
}
}
void M3KTE::handleSpeedChangeReply(QModbusReply *reply, int boardIndex)
{
auto it = std::find_if(speedChangeRequests.begin(), speedChangeRequests.end(),
[boardIndex](const SpeedChangeRequest &r) { return r.boardIndex == boardIndex; });
if (it == speedChangeRequests.end()) {
reply->deleteLater();
return;
}
// Обновление состояния
it->finished = true;
if (reply->error() != QModbusDevice::TimeoutError) {
// Произошла ошибка
it->errorOccurred = true; // флаг ошибки
}
reply->deleteLater();
// Отслеживание завершения всех запросов
pendingSpeedChangeRequestsCount--;
// Проверяем, все ли запросы завершены
if (pendingSpeedChangeRequestsCount == 0) {
// Проверяем, был ли хоть один сбой (кроме тайм-аутов)
bool hasError = false;
for (const auto &req : speedChangeRequests) {
if (req.errorOccurred) {
hasError = true;
break;
}
}
if (hasError) {
// Был сбой — отменяем переход и восстанавливаем старую скорость
// Восстановим старую скорость порта
revertToOldSpeedAndRestart();
modbusDevice->setTimeout(m_settingsDialog->settings().responseTime);
beginScanBoards();
} else {
onAllSpeedChangeRepliesReceived();
}
}
}
void M3KTE::onAllSpeedChangeRepliesReceived()
{
// Переключаемся на tmp_speed
modbusDevice->disconnectDevice();
modbusDevice->setConnectionParameter(QModbusDevice::SerialBaudRateParameter, tmp_speed);
if (!modbusDevice->connectDevice()) {
return;
}
QModbusDataUnit unitCheck(QModbusDataUnit::InputRegisters, 85, 1);
int totalActiveBoards = 0;
int confirmedBoards = 0;
QSet<int> pendingBoards;
for (int i = 0; i < 4; ++i) {
if (!Boards[i].isActive)
continue;
totalActiveBoards++;
int slaveAddress = Boards[i].adr;
QModbusReply *reply = modbusDevice->sendReadRequest(unitCheck, slaveAddress);
if (!reply) {
revertToOldSpeedAndRestart();
return;
}
pendingBoards.insert(slaveAddress);
connect(reply, &QModbusReply::finished, this, [this, reply, slaveAddress, &confirmedBoards, &pendingBoards, totalActiveBoards]() mutable {
if (reply->error() == QModbusDevice::NoError) {
// Проверяем что пришел валидный ответ
QModbusDataUnit unit = reply->result();
if (unit.valueCount() > 0) {
confirmedBoards++;
} else {
}
} else {
}
pendingBoards.remove(slaveAddress);
reply->deleteLater();
if (pendingBoards.isEmpty()) {
if (confirmedBoards != totalActiveBoards) {
revertToOldSpeedAndRestart();
beginScanBoards();
} else {
modbusDevice->setTimeout(m_settingsDialog->settings().responseTime);
beginScanBoards();
}
}
});
}
// Если нет ни одной активной платы — сразу запускаем сканирование
if (totalActiveBoards == 0) {
modbusDevice->setTimeout(m_settingsDialog->settings().responseTime);
beginScanBoards();
}
}
// Вспомогательная функция восстановления старой скорости
void M3KTE::revertToOldSpeedAndRestart()
{
modbusDevice->disconnectDevice();
modbusDevice->setConnectionParameter(QModbusDevice::SerialBaudRateParameter,
m_settingsDialog->curBaud());
modbusDevice->setTimeout(m_settingsDialog->settings().responseTime);
modbusDevice->connectDevice();
}
void M3KTE::onParityUpdate() void M3KTE::onParityUpdate()
{ {
stopScanBoard(); stopScanBoard();
QModbusDataUnit* _unit = new QModbusDataUnit(QModbusDataUnit::HoldingRegisters, 174, 1); QModbusDataUnit* _unit = new QModbusDataUnit(QModbusDataUnit::HoldingRegisters, 174, 1);
switch (m_deviceSettingsDialog->currentParity()) switch(m_deviceSettingsDialog->currentParity()) {
{
case 0: //Нет контроля case 0: //Нет контроля
{
_unit->setValue(0, 0x000); _unit->setValue(0, 0x000);
break; break;
}
case 1: //Четный case 1: //Четный
{
_unit->setValue(0, 0x0400); _unit->setValue(0, 0x0400);
break; break;
}
case 2: //Нечетный case 2: //Нечетный
{
_unit->setValue(0, 0x0600); _unit->setValue(0, 0x0600);
break; break;
} }
} for(int i = 0; i < 4; i++) {
for (int i = 0; i < 4; i++) { if(!Boards[i].isActive) {
if (!Boards[i].isActive)
{
continue; continue;
} }
if(auto *reply = modbusDevice->sendWriteRequest(*_unit, Boards[i].adr)) if(auto *reply = modbusDevice->sendWriteRequest(*_unit, Boards[i].adr)) {
{ QEventLoop loop;
while (!reply->isFinished()) connect(reply, &QModbusReply::finished, &loop, &QEventLoop::quit);
{ loop.exec(); // Ожидает завершения reply без блокировки интерфейса
QCoreApplication::processEvents(); if(reply->error()==QModbusDevice::TimeoutError) {
}
if(reply->error()==QModbusDevice::TimeoutError)
{
modbusDevice->disconnectDevice(); modbusDevice->disconnectDevice();
modbusDevice->setConnectionParameter(QModbusDevice::SerialParityParameter, modbusDevice->setConnectionParameter(QModbusDevice::SerialParityParameter,
m_deviceSettingsDialog->currentParity()); m_deviceSettingsDialog->currentParity());
modbusDevice->connectDevice(); modbusDevice->connectDevice();
QModbusDataUnit* _unit = new QModbusDataUnit(QModbusDataUnit::InputRegisters, 85, 1); QModbusDataUnit* _unit = new QModbusDataUnit(QModbusDataUnit::InputRegisters, 85, 1);
if (auto *subreply = modbusDevice->sendReadRequest(*_unit, Boards[i].adr)) if(auto *subreply = modbusDevice->sendReadRequest(*_unit, Boards[i].adr)) {
{ QEventLoop subloop;
while (!subreply->isFinished()) connect(subreply, &QModbusReply::finished, &subloop, &QEventLoop::quit);
{ subloop.exec(); // Ожидает завершения subreply без блокировки интерфейса
QCoreApplication::processEvents(); if(subreply->error() != QModbusDevice::NoError) {
}
if(subreply->error() != QModbusDevice::NoError)
{
unsigned newRow = loggerTable->rowCount(); unsigned newRow = loggerTable->rowCount();
loggerTable->insertRow(newRow); loggerTable->insertRow(newRow);
loggerTable->setItem(newRow, 0, new QTableWidgetItem((QTime::currentTime().toString("HH:mm:ss")))); loggerTable->setItem(newRow, 0, new QTableWidgetItem((QTime::currentTime().toString("HH:mm:ss"))));
@@ -1171,8 +1363,7 @@ void M3KTE::onParityUpdate()
m_settingsDialog->curParity()); m_settingsDialog->curParity());
modbusDevice->connectDevice(); modbusDevice->connectDevice();
} }
else else {
{
unsigned newRow = loggerTable->rowCount(); unsigned newRow = loggerTable->rowCount();
loggerTable->insertRow(newRow); loggerTable->insertRow(newRow);
loggerTable->setItem(newRow, 0, new QTableWidgetItem((QTime::currentTime().toString("HH:mm:ss")))); loggerTable->setItem(newRow, 0, new QTableWidgetItem((QTime::currentTime().toString("HH:mm:ss"))));
@@ -1184,9 +1375,7 @@ void M3KTE::onParityUpdate()
if(!loggerTable->verticalScrollBar()->isSliderDown()) if(!loggerTable->verticalScrollBar()->isSliderDown())
loggerTable->verticalScrollBar()->setSliderPosition(loggerTable->verticalScrollBar()->maximum()); loggerTable->verticalScrollBar()->setSliderPosition(loggerTable->verticalScrollBar()->maximum());
} }
} } else {
else
{
unsigned newRow = loggerTable->rowCount(); unsigned newRow = loggerTable->rowCount();
loggerTable->insertRow(newRow); loggerTable->insertRow(newRow);
loggerTable->setItem(newRow, 0, new QTableWidgetItem((QTime::currentTime().toString("HH:mm:ss")))); loggerTable->setItem(newRow, 0, new QTableWidgetItem((QTime::currentTime().toString("HH:mm:ss"))));
@@ -1210,13 +1399,11 @@ void M3KTE::onParityUpdate()
bool M3KTE::pingNetworkDevices() bool M3KTE::pingNetworkDevices()
{ {
CurrentConnectedDevice = 0; CurrentConnectedDevice = 0;
QModbusDataUnit* _unit = new QModbusDataUnit(QModbusDataUnit::InputRegisters, 85, 1);
int tmp_adr = 1; int tmp_adr = 1;
bool isRun = false; bool isRun = false;
bool *tmp_isRun = &isRun; bool *tmp_isRun = &isRun;
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;
}); });
bar->setLabelText(tr("Поиск плат... Текущий адрес: %1").arg(tmp_adr)); bar->setLabelText(tr("Поиск плат... Текущий адрес: %1").arg(tmp_adr));
@@ -1230,87 +1417,65 @@ bool M3KTE::pingNetworkDevices()
QModbusRequest requestOfBoardID(QModbusRequest::EncapsulatedInterfaceTransport, QByteArray::fromHex("0E0401")); QModbusRequest requestOfBoardID(QModbusRequest::EncapsulatedInterfaceTransport, QByteArray::fromHex("0E0401"));
modbusDevice->setTimeout(50); modbusDevice->setTimeout(50);
for(CurrentConnectedDevice=0; CurrentConnectedDevice<4;) for(CurrentConnectedDevice=0; CurrentConnectedDevice<4;) {
{
auto *reply = modbusDevice->sendRawRequest(requestOfDeviceType, tmp_adr); auto *reply = modbusDevice->sendRawRequest(requestOfDeviceType, tmp_adr);
//auto *reply = modbusDevice->sendReadRequest(*_unit, tmp_adr); //auto *reply = modbusDevice->sendReadRequest(*_unit, tmp_adr);
//Запрос типа устройства. //Запрос типа устройства.
if(reply == nullptr) if(reply == nullptr) {
{
onConnectClicked(); onConnectClicked();
bar->close(); bar->close();
bar->deleteLater(); bar->deleteLater();
return false; return false;
} }
while(!reply->isFinished()) while(!reply->isFinished()) {
{ if(isRun && CurrentConnectedDevice < 1) {
if(isRun && CurrentConnectedDevice < 1)
{
onConnectClicked(); onConnectClicked();
bar->close(); bar->close();
bar->deleteLater(); bar->deleteLater();
return false; return false;
} }
else if(isRun) else if(isRun) {
{
break; break;
} }
QCoreApplication::processEvents(); QCoreApplication::processEvents();
} }
if(isRun && CurrentConnectedDevice < 1) if(isRun && CurrentConnectedDevice < 1) {
{
onConnectClicked(); onConnectClicked();
bar->close(); bar->close();
bar->deleteLater(); bar->deleteLater();
return false; return false;
} } else if(isRun) {
else if(isRun)
{
break; break;
} } else if(!isRun) {
else if (!isRun)
{
//Нужна проверка типа устройства //Нужна проверка типа устройства
if(reply->error()==QModbusDevice::NoError) if(reply->error()==QModbusDevice::NoError) {
{
QModbusResponse resp = reply->rawResult(); QModbusResponse resp = reply->rawResult();
QString result = QString(resp.data().remove(0, MODBUS_REQUEST_PROTOCOL_INFO_LENGTH)); QString result = QString(resp.data().remove(0, MODBUS_REQUEST_PROTOCOL_INFO_LENGTH));
//result.remove(0, MODBUS_REQUEST_PROTOCOL_INFO_LENGTH); //result.remove(0, MODBUS_REQUEST_PROTOCOL_INFO_LENGTH);
if(result == QString("KTE")) if(result == QString("KTE")) {
{
auto *subreply = modbusDevice->sendRawRequest(requestOfBoardID, tmp_adr); auto *subreply = modbusDevice->sendRawRequest(requestOfBoardID, tmp_adr);
while(!subreply->isFinished()) while(!subreply->isFinished()) {
{ if(isRun && CurrentConnectedDevice < 1) {
if(isRun && CurrentConnectedDevice < 1)
{
onConnectClicked(); onConnectClicked();
bar->close(); bar->close();
bar->deleteLater(); bar->deleteLater();
return false; return false;
} } else if(isRun) {
else if(isRun)
{
break; break;
} }
QCoreApplication::processEvents(); QCoreApplication::processEvents();
} }
if(isRun && CurrentConnectedDevice < 1) if(isRun && CurrentConnectedDevice < 1) {
{
onConnectClicked(); onConnectClicked();
bar->close(); bar->close();
bar->deleteLater(); bar->deleteLater();
return false; return false;
} } else if(isRun) {
else if(isRun)
{
break; break;
} } else {
else
{
//QString boardID(subreply->rawResult().data()); //QString boardID(subreply->rawResult().data());
//boardID.remove(0, MODBUS_REQUEST_PROTOCOL_INFO_LENGTH); //boardID.remove(0, MODBUS_REQUEST_PROTOCOL_INFO_LENGTH);
if(Boards[(int)(subreply->rawResult().data().at(MODBUS_REQUEST_PROTOCOL_INFO_LENGTH))-1].isActive) if(Boards[(int)(subreply->rawResult().data().at(MODBUS_REQUEST_PROTOCOL_INFO_LENGTH))-1].isActive) {
{
QMessageBox::warning(this, "Ошибка при сканировании сети.", QString("Платы по адресам %1 и %2 имеют одинаковый ID %3").arg(Boards[(int)subreply->rawResult().data().at(MODBUS_REQUEST_PROTOCOL_INFO_LENGTH)].adr).arg(tmp_adr).arg((int)subreply->rawResult().data().at(MODBUS_REQUEST_PROTOCOL_INFO_LENGTH))); QMessageBox::warning(this, "Ошибка при сканировании сети.", QString("Платы по адресам %1 и %2 имеют одинаковый ID %3").arg(Boards[(int)subreply->rawResult().data().at(MODBUS_REQUEST_PROTOCOL_INFO_LENGTH)].adr).arg(tmp_adr).arg((int)subreply->rawResult().data().at(MODBUS_REQUEST_PROTOCOL_INFO_LENGTH)));
onConnectClicked(); onConnectClicked();
bar->close(); bar->close();
@@ -1328,8 +1493,7 @@ bool M3KTE::pingNetworkDevices()
} }
tmp_adr++; tmp_adr++;
bar->setLabelText(tr("Поиск плат... Текущий адрес: %1").arg(tmp_adr)); bar->setLabelText(tr("Поиск плат... Текущий адрес: %1").arg(tmp_adr));
if(tmp_adr>=247 && (CurrentConnectedDevice<1)) if(tmp_adr>=247 && (CurrentConnectedDevice<1)) {
{
//ERROR //ERROR
//OUT OF RANGE //OUT OF RANGE
QMessageBox::warning(this, "Ошибка при сканировании сети.", QString("Выход за пределы допустимых адресов. Найдено %1 плат.").arg(CurrentConnectedDevice)); QMessageBox::warning(this, "Ошибка при сканировании сети.", QString("Выход за пределы допустимых адресов. Найдено %1 плат.").arg(CurrentConnectedDevice));
@@ -1338,16 +1502,13 @@ bool M3KTE::pingNetworkDevices()
bar->deleteLater(); bar->deleteLater();
onConnectClicked(); onConnectClicked();
return false; return false;
} } else if(tmp_adr>=247) {
else if(tmp_adr>=247)
{
break; break;
} }
} }
isRun=false; isRun=false;
QMessageBox::warning(this, "Сканирование сети завершено.", tr("Найдено плат: %1 из 4.").arg(CurrentConnectedDevice)); QMessageBox::warning(this, "Сканирование сети завершено.", tr("Найдено плат: %1 из 4.").arg(CurrentConnectedDevice));
if(isRun) if(isRun) {
{
QMessageBox::warning(this, "Ошибка при получении текущих настроек.", QString("Прерывание по запросу пользователя.")); QMessageBox::warning(this, "Ошибка при получении текущих настроек.", QString("Прерывание по запросу пользователя."));
onConnectClicked(); onConnectClicked();
bar->close(); bar->close();
@@ -1361,33 +1522,26 @@ bool M3KTE::pingNetworkDevices()
_unit_settings[0] = new QModbusDataUnit(QModbusDataUnit::Coils, 0, 85); _unit_settings[0] = new QModbusDataUnit(QModbusDataUnit::Coils, 0, 85);
_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(int i=0; i<4; i++) for(int i=0; i<4; i++) {
{ if(Boards[i].isActive) {
if(Boards[i].isActive)
{
Boards_Fields[i]->setEnabled(true); Boards_Fields[i]->setEnabled(true);
for (int j = 0; j<3; j++) for(int j = 0; j<3; j++) {
{
bar->setValue(i*3+j); bar->setValue(i*3+j);
if(isRun) if(isRun) {
{
onConnectClicked(); onConnectClicked();
bar->close(); bar->close();
bar->deleteLater(); bar->deleteLater();
return false; return false;
} }
auto *reply = modbusDevice->sendReadRequest(*_unit_settings[j], Boards[i].adr); auto *reply = modbusDevice->sendReadRequest(*_unit_settings[j], Boards[i].adr);
if(!reply) if(!reply) {
{
onConnectClicked(); onConnectClicked();
bar->close(); bar->close();
bar->deleteLater(); bar->deleteLater();
return false; return false;
} }
while(!reply->isFinished()) while(!reply->isFinished()) {
{ if(isRun) {
if(isRun)
{
QMessageBox::warning(this, "Ошибка при получении текущих настроек.", QString("Прерывание по запросу пользователя.")); QMessageBox::warning(this, "Ошибка при получении текущих настроек.", QString("Прерывание по запросу пользователя."));
onConnectClicked(); onConnectClicked();
bar->close(); bar->close();
@@ -1396,12 +1550,9 @@ bool M3KTE::pingNetworkDevices()
} }
QCoreApplication::processEvents(); QCoreApplication::processEvents();
} }
if(reply->error()==QModbusDevice::NoError) if(reply->error()==QModbusDevice::NoError) {
{
applySettingsFromScan(reply); applySettingsFromScan(reply);
} } else {
else
{
QMessageBox::warning(this, "Ошибка при получении текущих настроек.", QString("Таймаут при опросе устройства %1 по адресу %2").arg(i+1).arg(Boards[i].adr)); QMessageBox::warning(this, "Ошибка при получении текущих настроек.", QString("Таймаут при опросе устройства %1 по адресу %2").arg(i+1).arg(Boards[i].adr));
bar->setValue(CurrentConnectedDevice*3); bar->setValue(CurrentConnectedDevice*3);
bar->close(); bar->close();
@@ -1410,7 +1561,7 @@ bool M3KTE::pingNetworkDevices()
return false; return false;
} }
} }
Boards_Fields[i]->setTitle(QString("Плата №%1 (ID %2)").arg(i).arg(Boards[i].adr)); Boards_Fields[i]->setTitle(QString("Плата №%1 (ID %2)").arg(i+1).arg(Boards[i].adr));
} }
} }
modbusDevice->setNumberOfRetries(m_settingsDialog->settings().numberOfRetries); modbusDevice->setNumberOfRetries(m_settingsDialog->settings().numberOfRetries);
@@ -1421,10 +1572,9 @@ bool M3KTE::pingNetworkDevices()
void M3KTE::beginScanBoards() void M3KTE::beginScanBoards()
{ {
for (int i = 0; i < 4; i++) { for(int i = 0; i < 4; i++) {
if(Boards[i].isActive) if(Boards[i].isActive) {
{ m_deviceSettingsDialog->initPollForBoard(i+1, Boards[i].adr);
m_deviceSettingsDialog->initPollForBoard(i, Boards[i].adr);
boardScan(i); boardScan(i);
} }
} }
@@ -1433,28 +1583,25 @@ void M3KTE::beginScanBoards()
void M3KTE::boardScan(unsigned boardID) void M3KTE::boardScan(unsigned boardID)
{ {
if (!modbusDevice) if(!modbusDevice)
return; return;
QModbusDataUnit* _unit = new QModbusDataUnit(QModbusDataUnit::InputRegisters, 85, 1); QModbusDataUnit* _unit = new QModbusDataUnit(QModbusDataUnit::InputRegisters, 85, 1);
statusBar()->clearMessage(); statusBar()->clearMessage();
if (auto *reply = modbusDevice->sendReadRequest(*_unit, Boards[boardID].adr)) { if(auto *reply = modbusDevice->sendReadRequest(*_unit, Boards[boardID].adr)) {
Boards[boardID].timerToStatusResponse.start(); Boards[boardID].timerToStatusResponse.start();
if (!reply->isFinished()) if(!reply->isFinished())
connect(reply, &QModbusReply::finished, this, [this, boardID, reply]() connect(reply, &QModbusReply::finished, this, [this, boardID, reply]() {
{
Boards[boardID].timerStatus->setText(QString("Status: %1 ms").arg(Boards[boardID].timerToStatusResponse.elapsed())); Boards[boardID].timerStatus->setText(QString("Status: %1 ms").arg(Boards[boardID].timerToStatusResponse.elapsed()));
if(reply->error()==QModbusDevice::NoError) { if(reply->error()==QModbusDevice::NoError) {
statusreg StatusReg; statusreg StatusReg;
StatusReg.AllReg = reply->result().value(0); StatusReg.AllReg = reply->result().value(0);
if(StatusReg.ParsingReg.poll_allowed) if(StatusReg.ParsingReg.poll_allowed) {
{
Boards[boardID].boardScanners->start(m_deviceSettingsDialog->currentBoardTimer(boardID)); Boards[boardID].boardScanners->start(m_deviceSettingsDialog->currentBoardTimer(boardID));
return; return;
} }
if(StatusReg.ParsingReg.mzkte_status) if(StatusReg.ParsingReg.mzkte_status) {
{ switch(StatusReg.ParsingReg.mzkte_error) {
switch (StatusReg.ParsingReg.mzkte_error) {
case 1: case 1:
Boards[boardID].boardScanners->start(m_deviceSettingsDialog->currentBoardTimer(boardID)); Boards[boardID].boardScanners->start(m_deviceSettingsDialog->currentBoardTimer(boardID));
return; return;
@@ -1477,13 +1624,10 @@ void M3KTE::boardScan(unsigned boardID)
} }
} }
QModbusDataUnit* _unit = new QModbusDataUnit(QModbusDataUnit::InputRegisters, 0, 85); QModbusDataUnit* _unit = new QModbusDataUnit(QModbusDataUnit::InputRegisters, 0, 85);
if(auto *subreply = modbusDevice->sendReadRequest(*_unit, Boards[boardID].adr)) {
if (auto *subreply = modbusDevice->sendReadRequest(*_unit, Boards[boardID].adr)) {
Boards[boardID].timerToDataResponse.start(); Boards[boardID].timerToDataResponse.start();
if (!subreply->isFinished()) if(!subreply->isFinished()) {
{ connect(subreply, &QModbusReply::finished, this, [this, boardID]() {
connect(subreply, &QModbusReply::finished, this, [this, boardID]()
{
Boards[boardID].timerData->setText(QString("Data: %1 ms").arg(Boards[boardID].timerToStatusResponse.elapsed())); Boards[boardID].timerData->setText(QString("Data: %1 ms").arg(Boards[boardID].timerToStatusResponse.elapsed()));
auto subreply = qobject_cast<QModbusReply *>(sender()); auto subreply = qobject_cast<QModbusReply *>(sender());
displayResultOfScan(subreply, boardID); displayResultOfScan(subreply, boardID);
@@ -1529,8 +1673,7 @@ void M3KTE::boardScan(unsigned boardID)
loggerTable->verticalScrollBar()->setSliderPosition(loggerTable->verticalScrollBar()->maximum()); loggerTable->verticalScrollBar()->setSliderPosition(loggerTable->verticalScrollBar()->maximum());
} }
}); });
else else {
{
Boards[boardID].timerToStatusResponse.elapsed(); Boards[boardID].timerToStatusResponse.elapsed();
unsigned newRow = loggerTable->rowCount(); unsigned newRow = loggerTable->rowCount();
loggerTable->insertRow(newRow); loggerTable->insertRow(newRow);
@@ -1545,8 +1688,8 @@ void M3KTE::boardScan(unsigned boardID)
delete reply; // broadcast replies return immediately delete reply; // broadcast replies return immediately
} }
} else { } else {
// QMessageBox::warning(this, QString("Ошибка при опросе платы #%1").arg(boardID+1), QString(tr("Read error: ") + modbusDevice->errorString())); // QMessageBox::warning(this, QString("Ошибка при опросе платы #%1").arg(boardID+1), QString(tr("Read error: ") + modbusDevice->errorString()));
// statusBar()->showMessage(tr("Read error: ") + modbusDevice->errorString(), 5000); // statusBar()->showMessage(tr("Read error: ") + modbusDevice->errorString(), 5000);
unsigned newRow = loggerTable->rowCount(); unsigned newRow = loggerTable->rowCount();
loggerTable->insertRow(newRow); loggerTable->insertRow(newRow);
loggerTable->setItem(newRow, 0, new QTableWidgetItem((QTime::currentTime().toString("HH:mm:ss")))); loggerTable->setItem(newRow, 0, new QTableWidgetItem((QTime::currentTime().toString("HH:mm:ss"))));
@@ -1561,14 +1704,13 @@ void M3KTE::boardScan(unsigned boardID)
void M3KTE::displayResultOfScan(QModbusReply *reply, int boardID) void M3KTE::displayResultOfScan(QModbusReply *reply, int boardID)
{ {
if (!reply) if(!reply)
return; return;
if (reply->error() == QModbusDevice::NoError) { if(reply->error() == QModbusDevice::NoError) {
const QModbusDataUnit unit = reply->result(); const QModbusDataUnit unit = reply->result();
bool W_Flag = false; bool W_Flag = false;
bool A_Flag = false; bool A_Flag = false;
if(unit.startAddress() != 0 || unit.valueCount() != 85) if(unit.startAddress() != 0 || unit.valueCount() != 85) {
{
//ERROR //ERROR
//QMessageBox::warning(this, QString("Ошибка при опросе платы #%1").arg(boardID), QString("Принятый ответ: Стартовый адрес %1, Количество элементов %2").arg(unit.startAddress()).arg(unit.valueCount())); //QMessageBox::warning(this, QString("Ошибка при опросе платы #%1").arg(boardID), QString("Принятый ответ: Стартовый адрес %1, Количество элементов %2").arg(unit.startAddress()).arg(unit.valueCount()));
unsigned newRow = loggerTable->rowCount(); unsigned newRow = loggerTable->rowCount();
@@ -1586,38 +1728,28 @@ void M3KTE::displayResultOfScan(QModbusReply *reply, int boardID)
} }
QString W_Adr; QString W_Adr;
QString A_Adr; QString A_Adr;
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].coil[i]==true) {
if(Boards[boardID].coil[i]==true)
{
int j = 0; int j = 0;
if(Boards[boardID].HR[i + 85] > unit.value(i)) if(Boards[boardID].HR[i + 85] > unit.value(i)) {
{
j = 1; j = 1;
if(j != m_ProgressBar[i+boardID*85]->value()) if(j != m_ProgressBar[i+boardID*85]->value()) {
{
A_Adr += tr("ТЭ%1 ").arg(i); A_Adr += tr("ТЭ%1 ").arg(i);
Boards[boardID].error_A++; Boards[boardID].error_A++;
} }
m_ProgressBar[i+boardID*85]->setStatusTip(QString("П%1 ТЭ%2: Аварийный уровень напряжения.").arg(QString::number(boardID+1), QString::number(i%85))); m_ProgressBar[i+boardID*85]->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]->setWhatsThis(QString("П%1 ТЭ%2: Аварийный уровень напряжения.").arg(QString::number(boardID+1), QString::number(i%85)));
A_Flag = true; A_Flag = true;
} } else if(Boards[boardID].HR[i] > unit.value(i)) {
else if(Boards[boardID].HR[i] > unit.value(i))
{
j = 2; j = 2;
if(j != m_ProgressBar[i+boardID*85]->value()) if(j != m_ProgressBar[i+boardID*85]->value()) {
{
W_Adr += tr("ТЭ%1 ").arg(i); W_Adr += tr("ТЭ%1 ").arg(i);
Boards[boardID].error_W++; Boards[boardID].error_W++;
} }
m_ProgressBar[i+boardID*85]->setStatusTip(QString("П%1 ТЭ%2: Предупредительный уровень напряжения.").arg(QString::number(boardID+1), QString::number(i%85))); m_ProgressBar[i+boardID*85]->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]->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_ProgressBar[i+boardID*85]->setStatusTip(QString("П%1 ТЭ%2: Уровень напряжения в норме.").arg(QString::number(boardID+1), QString::number(i%85))); 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]->setWhatsThis(QString("П%1 ТЭ%2: Уровень напряжения в норме.").arg(QString::number(boardID+1), QString::number(i%85)));
@@ -1625,9 +1757,7 @@ void M3KTE::displayResultOfScan(QModbusReply *reply, int boardID)
m_ProgressBar[i+boardID*85]->setValue(j); 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%);} "; 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); m_ProgressBar[i+boardID*85]->setStyleSheet(style_fc);
} } else {
else
{
m_ProgressBar[i+boardID*85]->setValue(3); 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]->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]->setWhatsThis(QString("П%1 ТЭ%2: Топливный Элемент не учитывается.").arg(QString::number(boardID+1), QString::number(i%85)));
@@ -1637,8 +1767,11 @@ void M3KTE::displayResultOfScan(QModbusReply *reply, int boardID)
Boards[boardID].ModbusModelCoil->set_currentU(unit.value(i), i); Boards[boardID].ModbusModelCoil->set_currentU(unit.value(i), i);
Boards[boardID].ModbusModelHoldingReg->set_currentU(unit.value(i), i); Boards[boardID].ModbusModelHoldingReg->set_currentU(unit.value(i), i);
} }
if(A_Flag) Boards[boardID].ModbusModelCoil->dataChanged(ui->writeValueTable->model()->index(unit.startAddress(), 2),
{ ui->writeValueTable->model()->index(unit.startAddress() + unit.valueCount() -1, 2));
Boards[boardID].ModbusModelHoldingReg->dataChanged(ui->writeValueTable->model()->index(unit.startAddress(), 3),
ui->writeValueTable->model()->index(unit.startAddress() + unit.valueCount() -1, 3));
if(A_Flag) {
statusM3KTE.Accidents[boardID] = true; statusM3KTE.Accidents[boardID] = true;
unsigned newRow = loggerTable->rowCount(); unsigned newRow = loggerTable->rowCount();
loggerTable->insertRow(newRow); loggerTable->insertRow(newRow);
@@ -1650,11 +1783,9 @@ void M3KTE::displayResultOfScan(QModbusReply *reply, int boardID)
loggerTable->resizeColumnsToContents(); loggerTable->resizeColumnsToContents();
if(!loggerTable->verticalScrollBar()->isSliderDown()) if(!loggerTable->verticalScrollBar()->isSliderDown())
loggerTable->verticalScrollBar()->setSliderPosition(loggerTable->verticalScrollBar()->maximum()); loggerTable->verticalScrollBar()->setSliderPosition(loggerTable->verticalScrollBar()->maximum());
} } else
else
statusM3KTE.Accidents[boardID] = false; statusM3KTE.Accidents[boardID] = false;
if(W_Flag) if(W_Flag) {
{
statusM3KTE.Warnings[boardID] = true; statusM3KTE.Warnings[boardID] = true;
unsigned newRow = loggerTable->rowCount(); unsigned newRow = loggerTable->rowCount();
loggerTable->insertRow(newRow); loggerTable->insertRow(newRow);
@@ -1666,33 +1797,28 @@ void M3KTE::displayResultOfScan(QModbusReply *reply, int boardID)
loggerTable->resizeColumnsToContents(); loggerTable->resizeColumnsToContents();
if(!loggerTable->verticalScrollBar()->isSliderDown()) if(!loggerTable->verticalScrollBar()->isSliderDown())
loggerTable->verticalScrollBar()->setSliderPosition(loggerTable->verticalScrollBar()->maximum()); loggerTable->verticalScrollBar()->setSliderPosition(loggerTable->verticalScrollBar()->maximum());
} } else
else
statusM3KTE.Warnings[boardID] = false; statusM3KTE.Warnings[boardID] = false;
ui->BSM_Warning->setChecked(false); ui->BSM_Warning->setChecked(false);
ui->BSM_Accident->setChecked(false); ui->BSM_Accident->setChecked(false);
ui->BSM_WorkInProgress->setChecked(true); ui->BSM_WorkInProgress->setChecked(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->setChecked(false); ui->BSM_WorkInProgress->setChecked(false);
ui->BSM_Warning->setChecked(false); ui->BSM_Warning->setChecked(false);
ui->BSM_Accident->setChecked(true); ui->BSM_Accident->setChecked(true);
break; break;
} }
if(statusM3KTE.Warnings[i]) if(statusM3KTE.Warnings[i]) {
{
ui->BSM_WorkInProgress->setChecked(false); ui->BSM_WorkInProgress->setChecked(false);
ui->BSM_Accident->setChecked(false); ui->BSM_Accident->setChecked(false);
ui->BSM_Warning->setChecked(true); ui->BSM_Warning->setChecked(true);
} }
} }
} else if (reply->error() == QModbusDevice::ProtocolError) { } else if(reply->error() == QModbusDevice::ProtocolError) {
statusBar()->showMessage(tr("Read response error: %1 (Mobus exception: 0x%2)"). statusBar()->showMessage(tr("Read response error: %1 (Mobus exception: 0x%2)").
arg(reply->errorString()). arg(reply->errorString()).
arg(reply->rawResult().exceptionCode(), -1, 16), 5000); arg(reply->rawResult().exceptionCode(), -1, 16), 5000);
unsigned newRow = loggerTable->rowCount(); unsigned newRow = loggerTable->rowCount();
loggerTable->insertRow(newRow); loggerTable->insertRow(newRow);
loggerTable->setItem(newRow, 0, new QTableWidgetItem((QTime::currentTime().toString("HH:mm:ss")))); loggerTable->setItem(newRow, 0, new QTableWidgetItem((QTime::currentTime().toString("HH:mm:ss"))));
@@ -1708,7 +1834,6 @@ void M3KTE::displayResultOfScan(QModbusReply *reply, int boardID)
statusBar()->showMessage(tr("Read response error: %1 (code: 0x%2)"). statusBar()->showMessage(tr("Read response error: %1 (code: 0x%2)").
arg(reply->errorString()). arg(reply->errorString()).
arg(reply->error(), -1, 16), 5000); arg(reply->error(), -1, 16), 5000);
unsigned newRow = loggerTable->rowCount(); unsigned newRow = loggerTable->rowCount();
loggerTable->insertRow(newRow); loggerTable->insertRow(newRow);
loggerTable->setItem(newRow, 0, new QTableWidgetItem((QTime::currentTime().toString("HH:mm:ss")))); loggerTable->setItem(newRow, 0, new QTableWidgetItem((QTime::currentTime().toString("HH:mm:ss"))));
@@ -1726,37 +1851,28 @@ void M3KTE::displayResultOfScan(QModbusReply *reply, int boardID)
void M3KTE::applySettingsFromScan(QModbusReply *reply) void M3KTE::applySettingsFromScan(QModbusReply *reply)
{ {
int Adr = 255; int Adr = 255;
for(int i = 0; i < 4; i++) for(int i = 0; i < 4; i++) {
{ if(Boards[i].adr==reply->serverAddress() &&Boards[i].isActive) {
if(Boards[i].adr==reply->serverAddress() &&Boards[i].isActive)
{
Adr = i; Adr = i;
break; break;
} }
} }
if (reply->error() == QModbusDevice::NoError) { if(reply->error() == QModbusDevice::NoError) {
const QModbusDataUnit unit = reply->result(); const QModbusDataUnit unit = reply->result();
for (int i = 0, total = int(unit.valueCount()); i < (total); ++i) { for(int i = 0, total = int(unit.valueCount()); i < (total); ++i) {
if(unit.registerType() == QModbusDataUnit::Coils) if(unit.registerType() == QModbusDataUnit::Coils) {
{
Boards[Adr].coil[i + unit.startAddress()] = unit.value(i); Boards[Adr].coil[i + unit.startAddress()] = unit.value(i);
if(unit.value(i)==1) if(unit.value(i)==1) {
{
Boards[Adr].ModbusModelCoil->setData(ui->writeValueTable->model()->index(i + unit.startAddress(), 2), Qt::Checked, Qt::CheckStateRole); Boards[Adr].ModbusModelCoil->setData(ui->writeValueTable->model()->index(i + unit.startAddress(), 2), Qt::Checked, Qt::CheckStateRole);
} } else {
else
{
Boards[Adr].ModbusModelCoil->setData(ui->writeValueTable->model()->index(i + unit.startAddress(), 2), Qt::Unchecked, Qt::CheckStateRole); Boards[Adr].ModbusModelCoil->setData(ui->writeValueTable->model()->index(i + unit.startAddress(), 2), Qt::Unchecked, Qt::CheckStateRole);
} }
} } else if(unit.registerType() == QModbusDataUnit::HoldingRegisters) {
else if(unit.registerType() == QModbusDataUnit::HoldingRegisters)
{
Boards[Adr].HR[i + unit.startAddress()] = unit.value(i); 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); 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) { } else if(reply->error() == QModbusDevice::ProtocolError) {
statusBar()->showMessage(tr("Read response error: %1 (Mobus exception: 0x%2)"). statusBar()->showMessage(tr("Read response error: %1 (Mobus exception: 0x%2)").
arg(reply->errorString()). arg(reply->errorString()).
arg(reply->rawResult().exceptionCode(), -1, 16), 5000); arg(reply->rawResult().exceptionCode(), -1, 16), 5000);
@@ -1790,14 +1906,14 @@ void M3KTE::applySettingsFromScan(QModbusReply *reply)
void M3KTE::slotmultipleRegWrite() void M3KTE::slotmultipleRegWrite()
{ {
if (!modbusDevice) if(!modbusDevice)
return; return;
multipleRegWrite(); multipleRegWrite();
} }
void M3KTE::slotmultipleRegWriteAndSend() void M3KTE::slotmultipleRegWriteAndSend()
{ {
if (!modbusDevice) if(!modbusDevice)
return; return;
multipleRegWrite(); multipleRegWrite();
multipleRegSend(); multipleRegSend();
@@ -1806,30 +1922,24 @@ void M3KTE::slotmultipleRegWriteAndSend()
void M3KTE::multipleRegSend() void M3KTE::multipleRegSend()
{ {
QModbusDataUnit *unit_tx = nullptr; QModbusDataUnit *unit_tx = nullptr;
if(m_regMultipleSettings->getTypeReg()) if(m_regMultipleSettings->getTypeReg()) {
{
unit_tx = new QModbusDataUnit(QModbusDataUnit::HoldingRegisters, m_regMultipleSettings->getStartAdr(), m_regMultipleSettings->getCountReg()); unit_tx = new QModbusDataUnit(QModbusDataUnit::HoldingRegisters, m_regMultipleSettings->getStartAdr(), m_regMultipleSettings->getCountReg());
} } else {
else
{
unit_tx = new QModbusDataUnit(QModbusDataUnit::Coils, m_regMultipleSettings->getStartAdr(), m_regMultipleSettings->getCountReg()); unit_tx = new QModbusDataUnit(QModbusDataUnit::Coils, m_regMultipleSettings->getStartAdr(), m_regMultipleSettings->getCountReg());
} }
for (unsigned i = 0; i < m_regMultipleSettings->getCountReg(); i++) { for(unsigned i = 0; i < m_regMultipleSettings->getCountReg(); i++) {
unit_tx->setValue(i, m_regMultipleSettings->getNewValue()); unit_tx->setValue(i, m_regMultipleSettings->getNewValue());
if(m_regMultipleSettings->getTypeReg()) if(m_regMultipleSettings->getTypeReg()) {
{
Boards[m_regMultipleSettings->getBoardId()].HR[i+m_regMultipleSettings->getStartAdr()] = m_regMultipleSettings->getNewValue(); Boards[m_regMultipleSettings->getBoardId()].HR[i+m_regMultipleSettings->getStartAdr()] = m_regMultipleSettings->getNewValue();
} } else {
else
{
Boards[m_regMultipleSettings->getBoardId()].coil[i+m_regMultipleSettings->getStartAdr()] = m_regMultipleSettings->getNewValue(); 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(auto *reply = modbusDevice->sendWriteRequest(*unit_tx, Boards[m_regMultipleSettings->getBoardId()].adr)) {
unsigned Adr = m_regMultipleSettings->getBoardId(); unsigned Adr = m_regMultipleSettings->getBoardId();
if (!reply->isFinished()) { if(!reply->isFinished()) {
connect(reply, &QModbusReply::finished, this, [this, reply, Adr]() { connect(reply, &QModbusReply::finished, this, [this, reply, Adr]() {
if (reply->error() == QModbusDevice::ProtocolError) { if(reply->error() == QModbusDevice::ProtocolError) {
statusBar()->showMessage(tr("Write response error: %1 (Mobus exception: 0x%2)") statusBar()->showMessage(tr("Write response error: %1 (Mobus exception: 0x%2)")
.arg(reply->errorString()).arg(reply->rawResult().exceptionCode(), -1, 16), .arg(reply->errorString()).arg(reply->rawResult().exceptionCode(), -1, 16),
5000); 5000);
@@ -1843,7 +1953,7 @@ void M3KTE::multipleRegSend()
loggerTable->resizeColumnsToContents(); loggerTable->resizeColumnsToContents();
if(!loggerTable->verticalScrollBar()->isSliderDown()) if(!loggerTable->verticalScrollBar()->isSliderDown())
loggerTable->verticalScrollBar()->setSliderPosition(loggerTable->verticalScrollBar()->maximum()); loggerTable->verticalScrollBar()->setSliderPosition(loggerTable->verticalScrollBar()->maximum());
} else if (reply->error() != QModbusDevice::NoError) { } else if(reply->error() != QModbusDevice::NoError) {
statusBar()->showMessage(tr("Write response error: %1 (code: 0x%2)"). statusBar()->showMessage(tr("Write response error: %1 (code: 0x%2)").
arg(reply->errorString()).arg(reply->error(), -1, 16), 5000); arg(reply->errorString()).arg(reply->error(), -1, 16), 5000);
unsigned newRow = loggerTable->rowCount(); unsigned newRow = loggerTable->rowCount();
@@ -1870,13 +1980,10 @@ void M3KTE::multipleRegSend()
void M3KTE::multipleRegWrite() void M3KTE::multipleRegWrite()
{ {
for (unsigned i = 0; i < m_regMultipleSettings->getCountReg(); i++) { for(unsigned i = 0; i < m_regMultipleSettings->getCountReg(); i++) {
if(m_regMultipleSettings->getTypeReg()) if(m_regMultipleSettings->getTypeReg()) {
{
Boards[m_regMultipleSettings->getBoardId()].ModbusModelHoldingReg->m_holdingRegisters[i+m_regMultipleSettings->getStartAdr()] = m_regMultipleSettings->getNewValue(); Boards[m_regMultipleSettings->getBoardId()].ModbusModelHoldingReg->m_holdingRegisters[i+m_regMultipleSettings->getStartAdr()] = m_regMultipleSettings->getNewValue();
} } else {
else
{
Boards[m_regMultipleSettings->getBoardId()].ModbusModelCoil->m_coils[i+m_regMultipleSettings->getStartAdr()] = (bool)m_regMultipleSettings->getNewValue(); Boards[m_regMultipleSettings->getBoardId()].ModbusModelCoil->m_coils[i+m_regMultipleSettings->getStartAdr()] = (bool)m_regMultipleSettings->getNewValue();
} }
} }
@@ -1914,8 +2021,7 @@ bool M3KTE::autoBaudRateScan()
bool isRun = false; bool isRun = false;
bool *tmp_isRun = &isRun; bool *tmp_isRun = &isRun;
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;
}); });
@@ -1926,33 +2032,26 @@ bool M3KTE::autoBaudRateScan()
QModbusRequest requestOfDeviceType(QModbusRequest::EncapsulatedInterfaceTransport, QByteArray::fromHex("0E0404")); QModbusRequest requestOfDeviceType(QModbusRequest::EncapsulatedInterfaceTransport, QByteArray::fromHex("0E0404"));
for(int i = 0; i < 8; i++) for(int i = 0; i < 8; i++) {
{
bar->setValue(i); bar->setValue(i);
bar->setLabelText(tr("Поиск плат... Текущая скорость: %1").arg(m_baud[i])); bar->setLabelText(tr("Поиск плат... Текущая скорость: %1").arg(m_baud[i]));
modbusDevice->setConnectionParameter(QModbusDevice::SerialBaudRateParameter, modbusDevice->setConnectionParameter(QModbusDevice::SerialBaudRateParameter,
m_baud[i]); m_baud[i]);
if (!modbusDevice->connectDevice()) { if(!modbusDevice->connectDevice()) {
statusBar()->showMessage(tr("Connect failed: ") + modbusDevice->errorString(), 5000); statusBar()->showMessage(tr("Connect failed: ") + modbusDevice->errorString(), 5000);
} }
for(int tmp_adr = 1; tmp_adr < 248; tmp_adr++) for(int tmp_adr = 1; tmp_adr < 248; tmp_adr++) {
{
auto *reply = modbusDevice->sendRawRequest(requestOfDeviceType, tmp_adr); auto *reply = modbusDevice->sendRawRequest(requestOfDeviceType, tmp_adr);
//auto *reply = modbusDevice->sendReadRequest(*_unit, tmp_adr); //auto *reply = modbusDevice->sendReadRequest(*_unit, tmp_adr);
//Запрос типа устройства. //Запрос типа устройства.
if(reply == nullptr) if(reply == nullptr) {
{
onConnectClicked(); onConnectClicked();
bar->close(); bar->close();
bar->deleteLater(); bar->deleteLater();
return false; return false;
} }
while(!reply->isFinished()) while(!reply->isFinished()) {
{ if(isRun) {
if(isRun)
{
onConnectClicked(); onConnectClicked();
bar->close(); bar->close();
bar->deleteLater(); bar->deleteLater();
@@ -1960,23 +2059,18 @@ bool M3KTE::autoBaudRateScan()
} }
QCoreApplication::processEvents(); QCoreApplication::processEvents();
} }
if(isRun) if(isRun) {
{
onConnectClicked(); onConnectClicked();
bar->close(); bar->close();
bar->deleteLater(); bar->deleteLater();
return false; return false;
} } else if(!isRun) {
else if (!isRun)
{
//Нужна проверка типа устройства //Нужна проверка типа устройства
if(reply->error()==QModbusDevice::NoError) if(reply->error()==QModbusDevice::NoError) {
{
QModbusResponse resp = reply->rawResult(); QModbusResponse resp = reply->rawResult();
QString result = QString(resp.data().remove(0, MODBUS_REQUEST_PROTOCOL_INFO_LENGTH)); QString result = QString(resp.data().remove(0, MODBUS_REQUEST_PROTOCOL_INFO_LENGTH));
//result.remove(0, MODBUS_REQUEST_PROTOCOL_INFO_LENGTH); //result.remove(0, MODBUS_REQUEST_PROTOCOL_INFO_LENGTH);
if(result == QString("KTE")) if(result == QString("KTE")) {
{
countOfDeviceOnLine++; countOfDeviceOnLine++;
KTE[i].append(tmp_adr); KTE[i].append(tmp_adr);
} }
@@ -1988,17 +2082,12 @@ bool M3KTE::autoBaudRateScan()
countOfDeviceOnLine = 0; countOfDeviceOnLine = 0;
modbusDevice->disconnectDevice(); modbusDevice->disconnectDevice();
} }
if(m_scanBoard->exec()==QDialog::Accepted) if(m_scanBoard->exec()==QDialog::Accepted) {
{ if(m_scanBoard->getCheckState()==Qt::Checked) {
if(m_scanBoard->getCheckState()==Qt::Checked) for(int i = 0; i < 8; i++) {
{ for(int j = 0; j < KTE[i].size(); j++) {
for(int i = 0; i < 8; i++) for(int l = i; l < 8; l++) {
{ if(KTE[l].indexOf(KTE[i].at(j))==-1) {
for (int j = 0; j < KTE[i].size(); j++)
{
for (int l = i; l < 8; l++) {
if(KTE[l].indexOf(KTE[i].at(j))==-1)
{
QMessageBox::warning(this, "Error", QString("Несколько устройств по адресу %1, работающих на скоростях %2 и %3.").arg(KTE[i].at(j)).arg(m_baud[i]).arg(m_baud[l])); QMessageBox::warning(this, "Error", QString("Несколько устройств по адресу %1, работающих на скоростях %2 и %3.").arg(KTE[i].at(j)).arg(m_baud[i]).arg(m_baud[l]));
return false; return false;
} }
@@ -2008,28 +2097,24 @@ bool M3KTE::autoBaudRateScan()
QModbusDataUnit* _unit = new QModbusDataUnit(QModbusDataUnit::HoldingRegisters, 173, 1); QModbusDataUnit* _unit = new QModbusDataUnit(QModbusDataUnit::HoldingRegisters, 173, 1);
_unit->setValue(0, m_scanBoard->getBaud()); _unit->setValue(0, m_scanBoard->getBaud());
for (int i = 0; i < 8; i++) { for(int i = 0; i < 8; i++) {
bar->setValue(i); bar->setValue(i);
bar->setLabelText(tr("Синхронизация плат на скорости %1").arg(m_baud[i])); bar->setLabelText(tr("Синхронизация плат на скорости %1").arg(m_baud[i]));
for(int j = 0; j < KTE[i].size(); j++) for(int j = 0; j < KTE[i].size(); j++) {
{
modbusDevice->setConnectionParameter(QModbusDevice::SerialBaudRateParameter, modbusDevice->setConnectionParameter(QModbusDevice::SerialBaudRateParameter,
m_baud[i]); m_baud[i]);
if (!modbusDevice->connectDevice()) { if(!modbusDevice->connectDevice()) {
statusBar()->showMessage(tr("Connect failed: ") + modbusDevice->errorString(), 5000); statusBar()->showMessage(tr("Connect failed: ") + modbusDevice->errorString(), 5000);
} }
auto *reply = modbusDevice->sendWriteRequest(*_unit, KTE[i].at(j)); auto *reply = modbusDevice->sendWriteRequest(*_unit, KTE[i].at(j));
if(!reply) if(!reply) {
{
onConnectClicked(); onConnectClicked();
bar->close(); bar->close();
bar->deleteLater(); bar->deleteLater();
return false; return false;
} }
while(!reply->isFinished()) while(!reply->isFinished()) {
{ if(isRun) {
if(isRun)
{
//dfQMessageBox::warning(this, "Ошибка при синхронизации скоростей.", QString("Прерывание по запросу пользователя.")); //dfQMessageBox::warning(this, "Ошибка при синхронизации скоростей.", QString("Прерывание по запросу пользователя."));
onConnectClicked(); onConnectClicked();
bar->close(); bar->close();
@@ -2038,19 +2123,15 @@ bool M3KTE::autoBaudRateScan()
} }
QCoreApplication::processEvents(); QCoreApplication::processEvents();
} }
if(reply->error()==QModbusDevice::TimeoutError) if(reply->error()==QModbusDevice::TimeoutError) {
{
modbusDevice->disconnectDevice(); modbusDevice->disconnectDevice();
modbusDevice->setConnectionParameter(QModbusDevice::SerialBaudRateParameter, modbusDevice->setConnectionParameter(QModbusDevice::SerialBaudRateParameter,
m_settingsDialog->UpdateBaud(m_scanBoard->getBaud())); m_settingsDialog->UpdateBaud(m_scanBoard->getBaud()));
modbusDevice->connectDevice(); modbusDevice->connectDevice();
QModbusDataUnit* _unit = new QModbusDataUnit(QModbusDataUnit::InputRegisters, 85, 1); QModbusDataUnit* _unit = new QModbusDataUnit(QModbusDataUnit::InputRegisters, 85, 1);
if (auto *subreply = modbusDevice->sendReadRequest(*_unit, Boards[i].adr)) if(auto *subreply = modbusDevice->sendReadRequest(*_unit, Boards[i].adr)) {
{ while(!subreply->isFinished()) {
while(!subreply->isFinished()) if(isRun) {
{
if(isRun)
{
//dfQMessageBox::warning(this, "Ошибка при получении текущих настроек.", QString("Прерывание по запросу пользователя.")); //dfQMessageBox::warning(this, "Ошибка при получении текущих настроек.", QString("Прерывание по запросу пользователя."));
onConnectClicked(); onConnectClicked();
bar->close(); bar->close();
@@ -2059,8 +2140,7 @@ bool M3KTE::autoBaudRateScan()
} }
QCoreApplication::processEvents(); QCoreApplication::processEvents();
} }
if(subreply->error()!=QModbusDevice::NoError) if(subreply->error()!=QModbusDevice::NoError) {
{
//QMessageBox::warning(); //QMessageBox::warning();
onConnectClicked(); onConnectClicked();
bar->close(); bar->close();
@@ -2069,8 +2149,7 @@ bool M3KTE::autoBaudRateScan()
} }
} }
} }
else if(reply->error()!=QModbusDevice::NoError) else if(reply->error()!=QModbusDevice::NoError) {
{
return false; return false;
} }
modbusDevice->disconnectDevice(); modbusDevice->disconnectDevice();
@@ -2085,7 +2164,7 @@ bool M3KTE::autoBaudRateScan()
void M3KTE::stopScanBoard() void M3KTE::stopScanBoard()
{ {
for (int i = 0; i < 4; i++) { for(int i = 0; i < 4; i++) {
Boards[i].boardScanners->stop(); Boards[i].boardScanners->stop();
} }
return; return;

View File

@@ -84,6 +84,10 @@ private slots:
void boardScan(unsigned boardID); void boardScan(unsigned boardID);
void handleSpeedChangeReply(QModbusReply *reply, int boardIndex);
void onAllSpeedChangeRepliesReceived();
void revertToOldSpeedAndRestart();
public: public:
M3KTE(QWidget *parent = nullptr); M3KTE(QWidget *parent = nullptr);
~M3KTE(); ~M3KTE();
@@ -140,6 +144,7 @@ private:
WriteRegisterModel *ModbusModelCoil; WriteRegisterModel *ModbusModelCoil;
WriteRegisterModel *ModbusModelHoldingReg; WriteRegisterModel *ModbusModelHoldingReg;
QTimer *boardScanners; QTimer *boardScanners;
bool isScan = false;
QElapsedTimer timerToStatusResponse; QElapsedTimer timerToStatusResponse;
QElapsedTimer timerToDataResponse; QElapsedTimer timerToDataResponse;
@@ -158,5 +163,17 @@ private:
}ParsingReg; }ParsingReg;
unsigned AllReg:16; unsigned AllReg:16;
}; };
// Структура для отслеживания состояния запроса смены скорости
struct SpeedChangeRequest {
int boardIndex;
bool errorOccurred = false;
bool finished = false;
bool confirmationReceived = false;
};
QVector<SpeedChangeRequest> speedChangeRequests;
int pendingSpeedChangeRequestsCount = 0;
int pendingConfirmationsCount = 0;
unsigned tmp_speed = 0;
}; };
#endif // M3KTE_H #endif // M3KTE_H

View File

@@ -161,6 +161,9 @@
</item> </item>
<item row="1" column="4"> <item row="1" column="4">
<widget class="QGroupBox" name="BoxStatusTerm"> <widget class="QGroupBox" name="BoxStatusTerm">
<property name="enabled">
<bool>true</bool>
</property>
<property name="sizePolicy"> <property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed"> <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch> <horstretch>0</horstretch>
@@ -170,6 +173,9 @@
<property name="title"> <property name="title">
<string>Статус Терминала</string> <string>Статус Терминала</string>
</property> </property>
<property name="checkable">
<bool>false</bool>
</property>
<layout class="QGridLayout" name="gridLayout_8"> <layout class="QGridLayout" name="gridLayout_8">
<property name="leftMargin"> <property name="leftMargin">
<number>3</number> <number>3</number>

21
Release/.qmake.stash Normal file
View File

@@ -0,0 +1,21 @@
QMAKE_CXX.QT_COMPILER_STDCXX = 201402L
QMAKE_CXX.QMAKE_GCC_MAJOR_VERSION = 7
QMAKE_CXX.QMAKE_GCC_MINOR_VERSION = 3
QMAKE_CXX.QMAKE_GCC_PATCH_VERSION = 0
QMAKE_CXX.COMPILER_MACROS = \
QT_COMPILER_STDCXX \
QMAKE_GCC_MAJOR_VERSION \
QMAKE_GCC_MINOR_VERSION \
QMAKE_GCC_PATCH_VERSION
QMAKE_CXX.INCDIRS = \
C:/Qt/Qt5.14.2/Tools/mingw730_32/lib/gcc/i686-w64-mingw32/7.3.0/include/c++ \
C:/Qt/Qt5.14.2/Tools/mingw730_32/lib/gcc/i686-w64-mingw32/7.3.0/include/c++/i686-w64-mingw32 \
C:/Qt/Qt5.14.2/Tools/mingw730_32/lib/gcc/i686-w64-mingw32/7.3.0/include/c++/backward \
C:/Qt/Qt5.14.2/Tools/mingw730_32/lib/gcc/i686-w64-mingw32/7.3.0/include \
C:/Qt/Qt5.14.2/Tools/mingw730_32/lib/gcc/i686-w64-mingw32/7.3.0/include-fixed \
C:/Qt/Qt5.14.2/Tools/mingw730_32/i686-w64-mingw32/include
QMAKE_CXX.LIBDIRS = \
C:/Qt/Qt5.14.2/Tools/mingw730_32/lib/gcc/i686-w64-mingw32/7.3.0 \
C:/Qt/Qt5.14.2/Tools/mingw730_32/lib/gcc \
C:/Qt/Qt5.14.2/Tools/mingw730_32/i686-w64-mingw32/lib \
C:/Qt/Qt5.14.2/Tools/mingw730_32/lib

Binary file not shown.