@@ -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);
}
}
@@ -446,7 +446,7 @@ M3KTE::M3KTE(QWidget *parent)
ThePhantomMenace[i]->setFlat(true);
ThePhantomMenace[i]->setFlat(true);
ThePhantomMenace[i]->setPalette(QPalette(tb, tb, tb, tb, tb, tb, tb, tb, tb));
ThePhantomMenace[i]->setPalette(QPalette(tb, tb, tb, tb, tb, tb, tb, tb, tb));
connect(ThePhantomMenace[i], &QPushButton::clicked, this, [this, i]() {
connect(ThePhantomMenace[i], &QPushButton::clicked, this, [this, i]() {
selectPositionOnTree(i);
selectPositionOnTree(i);
});
});
}
}
connect(m_deviceSettingsDialog, &DeviceSettingsDialog::parityChanged, this, &M3KTE::onParityUpdate);
connect(m_deviceSettingsDialog, &DeviceSettingsDialog::parityChanged, this, &M3KTE::onParityUpdate);
@@ -456,10 +456,10 @@ M3KTE::M3KTE(QWidget *parent)
ui->loggerWidget->layout()->addWidget(loggerTable);
ui->loggerWidget->layout()->addWidget(loggerTable);
loggerTable->setColumnCount(5);
loggerTable->setColumnCount(5);
QStringList headers;
QStringList headers;
headers << "Время" << "Плата" << "Тип ошибки" << "Счётчик" << "Примечание";
headers << "Время" << "Плата" << "Тип ошибки" << "Счётчик" << "Примечание";
loggerTable->setHorizontalHeaderLabels(headers);
loggerTable->setHorizontalHeaderLabels(headers);
loggerTable->setSortingEnabled(true);
loggerTable->setSortingEnabled(true);
loggerTable->setAutoScroll(true);
loggerTable->setAutoScroll(true);
}
}
M3KTE::~M3KTE()
M3KTE::~M3KTE()
@@ -498,25 +498,25 @@ 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)
modbusDevice->setConnectionParameter(QModbusDevice::SerialParityParameter,
modbusDevice->setConnectionParameter(QModbusDevice::SerialParityParameter,
m_settingsDialog->settings().parity);
m_settingsDialog->settings().parity);
modbusDevice->setConnectionParameter(QModbusDevice::SerialBaudRateParameter,
modbusDevice->setConnectionParameter(QModbusDevice::SerialBaudRateParameter,
m_settingsDialog->settings().baud);
m_settingsDialog->settings().baud);
modbusDevice->setConnectionParameter(QModbusDevice::SerialDataBitsParameter,
modbusDevice->setConnectionParameter(QModbusDevice::SerialDataBitsParameter,
m_settingsDialog->settings().dataBits);
m_settingsDialog->settings().dataBits);
modbusDevice->setConnectionParameter(QModbusDevice::SerialStopBitsParameter,
modbusDevice->setConnectionParameter(QModbusDevice::SerialStopBitsParameter,
m_settingsDialog->settings().stopBits);
m_settingsDialog->settings().stopBits);
#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,16 +617,16 @@ 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);
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)
{
{
@@ -633,10 +634,22 @@ 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);
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"))));
@@ -649,8 +662,8 @@ void M3KTE::onReadReady()
loggerTable->verticalScrollBar()->setSliderPosition(loggerTable->verticalScrollBar()->maximum());
loggerTable->verticalScrollBar()->setSliderPosition(loggerTable->verticalScrollBar()->maximum());
} else {
} else {
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"))));
@@ -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,14 +697,14 @@ 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);
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"))));
@@ -702,9 +715,9 @@ 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();
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"))));
@@ -715,7 +728,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());
}
}
reply->deleteLater();
reply->deleteLater();
});
});
} else {
} else {
@@ -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);
}
}
}
}
@@ -797,9 +802,9 @@ void M3KTE::changeTable(int board, int tabletype)
QModbusDataUnit M3KTE::readRequest() const
QModbusDataUnit M3KTE::readRequest() const
{
{
const auto table =
const auto table =
static_cast<QModbusDataUnit::RegisterType>(ui->writeTable->currentData().toInt());
static_cast<QModbusDataUnit::RegisterType>(ui->writeTable->currentData().toInt());
int startAddress = 85 * (ui->writeTable->currentIndex()/2);
int startAddress = 85 * (ui->writeTable->currentIndex()/2);
Q_ASSERT(startAddress >= 0 && startAddress < 340);
Q_ASSERT(startAddress >= 0 && startAddress < 340);
quint16 numberOfEntries = qMin((ushort)(85 - (ui->boardSelectBox->currentIndex()/3*20)), quint16(340 - startAddress));
quint16 numberOfEntries = qMin((ushort)(85 - (ui->boardSelectBox->currentIndex()/3*20)), quint16(340 - startAddress));
return QModbusDataUnit(table, startAddress, numberOfEntries);
return QModbusDataUnit(table, startAddress, numberOfEntries);
}
}
@@ -807,7 +812,7 @@ QModbusDataUnit M3KTE::readRequest() const
QModbusDataUnit M3KTE::writeRequest() const
QModbusDataUnit M3KTE::writeRequest() const
{
{
const auto table =
const auto table =
static_cast<QModbusDataUnit::RegisterType>(ui->writeTable->currentData().toInt());
static_cast<QModbusDataUnit::RegisterType>(ui->writeTable->currentData().toInt());
int startAddress = 85 * (ui->writeTable->currentIndex()/2);
int startAddress = 85 * (ui->writeTable->currentIndex()/2);
Q_ASSERT(startAddress >= 0 && startAddress < 340);
Q_ASSERT(startAddress >= 0 && startAddress < 340);
quint16 numberOfEntries = qMin((ushort)(85 - (ui->boardSelectBox->currentIndex()/3*20)), quint16(340 - startAddress));
quint16 numberOfEntries = qMin((ushort)(85 - (ui->boardSelectBox->currentIndex()/3*20)), quint16(340 - startAddress));
@@ -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
{
Boards[boardNum].adr = Boards[boardNum]._tmp_adr;
//OK
reply->deleteLater();
Boards[boardNum].adr = Boards[boardNum]._tmp_adr;
}
reply->deleteLater();
else {
return ;
unsigned newRow = loggerTable->rowCount() ;
}
loggerTable->insertRow(newRow);
//ERROR
loggerTable->setItem(newRow, 0, new QTableWidgetItem((QTime::currentTime().toString("HH:mm:ss"))));
else{
loggerTable->setItem(newRow, 1, new QTableWidgetItem(tr("Плата %1 (ID %2)").arg(boardNum+1).arg(Boards[boardNum].adr)));
Boards[boardNum]._tmp_adr = Boards[boardNum].adr ;
loggerTable->setItem(newRow, 2, new QTableWidgetItem(reply->errorString())) ;
unsigned newRow = loggerTable->rowCount( );
loggerTable->setItem(newRow, 3, new QTableWidgetItem(QString::number(++Boards[boardNum].error_adr_change, 10)) );
loggerTable->insertRow(newRow );
loggerTable->setItem(newRow, 4, new QTableWidgetItem("Ошибка при подтверждении изменения адреса устройства.") );
loggerTable->setItem(newRow, 0, new QTableWidgetItem((QTime::currentTime().toString("HH:mm:ss"))) );
loggerTable->resizeColumnsToContents( );
loggerTable->setItem(newRow, 1, new QTableWidgetItem(tr("Плата %1 (ID %2)").arg(boardNum+1).arg(Boards[boardNum].adr)));
if(! loggerTable->verticalScrollBar()->isSliderDown())
loggerTable->setItem(newRow, 2, new QTableWidgetItem(reply ->errorString() ));
loggerTable->verticalScrollBar()->setSliderPosition(loggerTable ->v erticalScrollBar()->maximum( ));
loggerTable->setItem(newRow, 3, new QTableWidgetItem(QString::number(++Boards[boardNum].error_adr_change, 10)) );
reply->deleteLater( );
loggerTable->setItem(newRow, 4, new QTableWidgetItem("Н е удалось изменить адрес устройства."));
loggerTable->resizeColumnsToContents();
if(!loggerTable->verticalScrollBar()->isSliderDown())
loggerTable->verticalScrollBar()->setSliderPosition(loggerTable->verticalScrollBar()->maximum());
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"))));
@@ -1202,7 +1391,7 @@ void M3KTE::onParityUpdate()
}
}
modbusDevice->disconnectDevice();
modbusDevice->disconnectDevice();
modbusDevice->setConnectionParameter(QModbusDevice::SerialParityParameter,
modbusDevice->setConnectionParameter(QModbusDevice::SerialParityParameter,
m_settingsDialog->UpdateParity(m_deviceSettingsDialog->currentParity()));
m_settingsDialog->UpdateParity(m_deviceSettingsDialog->currentParity()));
modbusDevice->connectDevice();
modbusDevice->connectDevice();
beginScanBoards();
beginScanBoards();
}
}
@@ -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
e lse
statusM3KTE.Accidents[boardID] = fa lse;
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,33 +1922,27 @@ 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);
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"))));
@@ -1843,9 +1953,9 @@ 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();
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"))));
@@ -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;