добавлен локальный статус для каждого мзктэ
This commit is contained in:
parent
190f3337ed
commit
4ae15d8c01
@ -132,8 +132,13 @@ void DeviceSettingsDialog::updatePollStatus(unsigned boardID, bool status)
|
|||||||
|
|
||||||
void DeviceSettingsDialog::on_buttonApplyChangePoll_clicked()
|
void DeviceSettingsDialog::on_buttonApplyChangePoll_clicked()
|
||||||
{
|
{
|
||||||
updatePollStatus(ui->idPollComboBox->currentData().toUInt(), (bool)ui->pollStatusBox->currentIndex());
|
sendPollCommand(ui->idPollComboBox->currentData().toUInt(), (bool)ui->pollStatusBox->currentIndex());
|
||||||
pollStatusChange* _pollStatusChanged = new pollStatusChange(ui->idPollComboBox->currentData().toUInt(), _currentPollStatus[ui->idPollComboBox->currentData().toUInt()]);
|
}
|
||||||
|
|
||||||
|
void DeviceSettingsDialog::sendPollCommand(unsigned boardID, bool status)
|
||||||
|
{
|
||||||
|
updatePollStatus(boardID, status);
|
||||||
|
pollStatusChange* _pollStatusChanged = new pollStatusChange(boardID, status);
|
||||||
QCoreApplication::postEvent(parent(), _pollStatusChanged);
|
QCoreApplication::postEvent(parent(), _pollStatusChanged);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -51,6 +51,7 @@ public:
|
|||||||
unsigned currentSpeed();
|
unsigned currentSpeed();
|
||||||
unsigned short currentParity();
|
unsigned short currentParity();
|
||||||
void updateSettingsAfterConnection(unsigned tmp_speed, unsigned tmp_parity, unsigned *tmp_adr, bool *ActiveDevices);
|
void updateSettingsAfterConnection(unsigned tmp_speed, unsigned tmp_parity, unsigned *tmp_adr, bool *ActiveDevices);
|
||||||
|
void sendPollCommand(unsigned boardID, bool status);
|
||||||
void updatePollStatus(unsigned boardID, bool status);
|
void updatePollStatus(unsigned boardID, bool status);
|
||||||
void initPollForBoard(unsigned boardID, unsigned boardAdr);
|
void initPollForBoard(unsigned boardID, unsigned boardAdr);
|
||||||
void onDisconnect();
|
void onDisconnect();
|
||||||
@ -64,6 +65,7 @@ signals:
|
|||||||
void fourthBoardAdrHasBeenChanged();
|
void fourthBoardAdrHasBeenChanged();
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
|
|
||||||
void on_buttonApplyChangeTimer_clicked();
|
void on_buttonApplyChangeTimer_clicked();
|
||||||
|
|
||||||
void on_buttonApplyChangeSpeed_clicked();
|
void on_buttonApplyChangeSpeed_clicked();
|
||||||
|
@ -176,7 +176,7 @@
|
|||||||
<item row="0" column="1">
|
<item row="0" column="1">
|
||||||
<widget class="QSpinBox" name="adrSpinBox">
|
<widget class="QSpinBox" name="adrSpinBox">
|
||||||
<property name="minimum">
|
<property name="minimum">
|
||||||
<number>1</number>
|
<number>0</number>
|
||||||
</property>
|
</property>
|
||||||
<property name="maximum">
|
<property name="maximum">
|
||||||
<number>247</number>
|
<number>247</number>
|
||||||
|
@ -423,12 +423,54 @@ 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;
|
||||||
}
|
}
|
||||||
|
{
|
||||||
|
Boards[0].localError = ui->localErrorEdit_1;
|
||||||
|
Boards[1].localError = ui->localErrorEdit_2;
|
||||||
|
Boards[2].localError = ui->localErrorEdit_3;
|
||||||
|
Boards[3].localError = ui->localErrorEdit_4;
|
||||||
|
}
|
||||||
|
{
|
||||||
|
Boards[0].localState[LOCAL_STATE_POLL] = ui->localPollChkBox_1;
|
||||||
|
Boards[1].localState[LOCAL_STATE_POLL] = ui->localPollChkBox_2;
|
||||||
|
Boards[2].localState[LOCAL_STATE_POLL] = ui->localPollChkBox_3;
|
||||||
|
Boards[3].localState[LOCAL_STATE_POLL] = ui->localPollChkBox_4;
|
||||||
|
|
||||||
|
|
||||||
|
Boards[0].localState[LOCAL_STATE_WARN] = ui->localWarnChkBox_1;
|
||||||
|
Boards[1].localState[LOCAL_STATE_WARN] = ui->localWarnChkBox_2;
|
||||||
|
Boards[2].localState[LOCAL_STATE_WARN] = ui->localWarnChkBox_3;
|
||||||
|
Boards[3].localState[LOCAL_STATE_WARN] = ui->localWarnChkBox_4;
|
||||||
|
|
||||||
|
Boards[0].localState[LOCAL_STATE_ERR] = ui->localErrChkBox_1;
|
||||||
|
Boards[1].localState[LOCAL_STATE_ERR] = ui->localErrChkBox_2;
|
||||||
|
Boards[2].localState[LOCAL_STATE_ERR] = ui->localErrChkBox_3;
|
||||||
|
Boards[3].localState[LOCAL_STATE_ERR] = ui->localErrChkBox_4;
|
||||||
|
|
||||||
|
}
|
||||||
|
{ // не кликабельные чекбоксы и радиобоксы
|
||||||
|
for(int i = 0; i < 4; i++)
|
||||||
|
{
|
||||||
|
connect(Boards[i].localState[LOCAL_STATE_POLL], &QCheckBox::clicked,
|
||||||
|
this, [i, this](bool checked) {
|
||||||
|
m_deviceSettingsDialog->sendPollCommand(i, checked);
|
||||||
|
});
|
||||||
|
Boards[i].localState[LOCAL_STATE_WARN]->setAttribute(Qt::WA_TransparentForMouseEvents, true);
|
||||||
|
Boards[i].localState[LOCAL_STATE_ERR]->setAttribute(Qt::WA_TransparentForMouseEvents, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
ui->BSM_Warning->setAttribute(Qt::WA_TransparentForMouseEvents, true);
|
||||||
|
ui->BSM_Accident->setAttribute(Qt::WA_TransparentForMouseEvents, true);
|
||||||
|
ui->BSM_WorkInProgress->setAttribute(Qt::WA_TransparentForMouseEvents, true);
|
||||||
|
ui->BST_On->setAttribute(Qt::WA_TransparentForMouseEvents, true);
|
||||||
|
ui->BST_Off->setAttribute(Qt::WA_TransparentForMouseEvents, true);
|
||||||
|
}
|
||||||
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(" ");;
|
||||||
|
Boards[i].localError->setText(" ");;
|
||||||
}
|
}
|
||||||
for(int i = 0; i < 5; i++) {
|
for(int i = 0; i < 5; i++) {
|
||||||
ui->writeValueTable->resizeColumnToContents(i);
|
ui->writeValueTable->resizeColumnToContents(i);
|
||||||
@ -484,6 +526,8 @@ void M3KTE::initActions()
|
|||||||
this, &M3KTE::onReadButtonClicked);
|
this, &M3KTE::onReadButtonClicked);
|
||||||
connect(ui->writeButton, &QPushButton::clicked,
|
connect(ui->writeButton, &QPushButton::clicked,
|
||||||
this, &M3KTE::onWriteButtonClicked);
|
this, &M3KTE::onWriteButtonClicked);
|
||||||
|
connect(ui->clearLoggerBtn, &QPushButton::clicked,
|
||||||
|
this, &M3KTE::clearLogger);
|
||||||
connect(ui->boardSelectBox, QOverload<int>::of(&QComboBox::currentIndexChanged),
|
connect(ui->boardSelectBox, QOverload<int>::of(&QComboBox::currentIndexChanged),
|
||||||
this, &M3KTE::onSelectedBoardChanged);
|
this, &M3KTE::onSelectedBoardChanged);
|
||||||
connect(ui->writeTable, QOverload<int>::of(&QComboBox::currentIndexChanged),
|
connect(ui->writeTable, QOverload<int>::of(&QComboBox::currentIndexChanged),
|
||||||
@ -509,6 +553,19 @@ void M3KTE::logError(const QString &errorPlace, const QString &errorString, unsi
|
|||||||
if(!loggerTable->verticalScrollBar()->isSliderDown())
|
if(!loggerTable->verticalScrollBar()->isSliderDown())
|
||||||
loggerTable->verticalScrollBar()->setSliderPosition(loggerTable->verticalScrollBar()->maximum());
|
loggerTable->verticalScrollBar()->setSliderPosition(loggerTable->verticalScrollBar()->maximum());
|
||||||
}
|
}
|
||||||
|
void M3KTE::clearLogger()
|
||||||
|
{
|
||||||
|
// Проверяем, что таблица инициализирована
|
||||||
|
if (!loggerTable) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// Отключаем обновление UI для повышения производительности
|
||||||
|
loggerTable->setUpdatesEnabled(false);
|
||||||
|
// Очищаем все строки таблицы
|
||||||
|
loggerTable->setRowCount(0);
|
||||||
|
// Включаем обновление UI
|
||||||
|
loggerTable->setUpdatesEnabled(true);
|
||||||
|
}
|
||||||
|
|
||||||
void M3KTE::onConnectClicked()
|
void M3KTE::onConnectClicked()
|
||||||
{
|
{
|
||||||
@ -575,6 +632,7 @@ void M3KTE::onConnectClicked()
|
|||||||
Boards_Fields[i]->setTitle(QString("Плата №%1").arg(i+1));
|
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(" ");;
|
||||||
|
Boards[i].localError->setText(" ");;
|
||||||
}
|
}
|
||||||
for(int i = 0; i < 320; i++) {
|
for(int i = 0; i < 320; i++) {
|
||||||
m_ProgressBar[i]->setStatusTip(QString("П%1 ТЭ%2: Топливный Элемент не учитывается.").arg(QString::number(i/85+1), QString::number(i%85)));
|
m_ProgressBar[i]->setStatusTip(QString("П%1 ТЭ%2: Топливный Элемент не учитывается.").arg(QString::number(i/85+1), QString::number(i%85)));
|
||||||
@ -1155,6 +1213,7 @@ bool M3KTE::pingNetworkDevices()
|
|||||||
QModbusRequest requestOfBoardID(QModbusRequest::EncapsulatedInterfaceTransport, QByteArray::fromHex("0E0401"));
|
QModbusRequest requestOfBoardID(QModbusRequest::EncapsulatedInterfaceTransport, QByteArray::fromHex("0E0401"));
|
||||||
|
|
||||||
for(CurrentConnectedDevice=0; CurrentConnectedDevice<4;) {
|
for(CurrentConnectedDevice=0; CurrentConnectedDevice<4;) {
|
||||||
|
modbusDevice->setTimeout(1000);
|
||||||
auto *reply = modbusDevice->sendRawRequest(requestOfDeviceType, tmp_adr);
|
auto *reply = modbusDevice->sendRawRequest(requestOfDeviceType, tmp_adr);
|
||||||
//Запрос типа устройства.
|
//Запрос типа устройства.
|
||||||
if(reply == nullptr) {
|
if(reply == nullptr) {
|
||||||
@ -1187,6 +1246,7 @@ bool M3KTE::pingNetworkDevices()
|
|||||||
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));
|
||||||
if(result == QString("KTE")) {
|
if(result == QString("KTE")) {
|
||||||
|
modbusDevice->setTimeout(1000);
|
||||||
auto *subreply = modbusDevice->sendRawRequest(requestOfBoardID, tmp_adr);
|
auto *subreply = modbusDevice->sendRawRequest(requestOfBoardID, tmp_adr);
|
||||||
|
|
||||||
while(!subreply->isFinished()) {
|
while(!subreply->isFinished()) {
|
||||||
@ -1355,90 +1415,102 @@ 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);
|
}
|
||||||
|
|
||||||
statusBar()->clearMessage();
|
statusBar()->clearMessage();
|
||||||
if(auto *reply = modbusDevice->sendReadRequest(*_unit, Boards[boardID].adr)) {
|
|
||||||
|
QModbusDataUnit statusUnit(QModbusDataUnit::InputRegisters, 85, 1);
|
||||||
|
|
||||||
|
if (auto *reply = modbusDevice->sendReadRequest(statusUnit, 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]() {
|
||||||
|
if(!Boards[boardID].isActive)
|
||||||
|
return;
|
||||||
|
|
||||||
|
// Обработка ответа статуса
|
||||||
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) {
|
|
||||||
Boards[boardID].boardScanners->start(m_deviceSettingsDialog->currentBoardTimer(boardID));
|
// Запрос полных данных
|
||||||
return;
|
QModbusDataUnit dataUnit(QModbusDataUnit::InputRegisters, 0, 85);
|
||||||
}
|
if (auto *dataReply = modbusDevice->sendReadRequest(dataUnit, Boards[boardID].adr)) {
|
||||||
if(StatusReg.ParsingReg.mzkte_status) {
|
|
||||||
switch(StatusReg.ParsingReg.mzkte_error) {
|
|
||||||
case 1:
|
|
||||||
Boards[boardID].boardScanners->start(m_deviceSettingsDialog->currentBoardTimer(boardID));
|
|
||||||
return;
|
|
||||||
case 2:
|
|
||||||
Boards[boardID].boardScanners->start(m_deviceSettingsDialog->currentBoardTimer(boardID));
|
|
||||||
return;
|
|
||||||
case 3:
|
|
||||||
Boards[boardID].boardScanners->start(m_deviceSettingsDialog->currentBoardTimer(boardID));
|
|
||||||
return;
|
|
||||||
case 4:
|
|
||||||
break;
|
|
||||||
case 5:
|
|
||||||
break;
|
|
||||||
case 6:
|
|
||||||
break;
|
|
||||||
case 7:
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
QModbusDataUnit* _unit = new QModbusDataUnit(QModbusDataUnit::InputRegisters, 0, 85);
|
|
||||||
if(auto *subreply = modbusDevice->sendReadRequest(*_unit, Boards[boardID].adr)) {
|
|
||||||
Boards[boardID].timerToDataResponse.start();
|
Boards[boardID].timerToDataResponse.start();
|
||||||
if(!subreply->isFinished()) {
|
|
||||||
connect(subreply, &QModbusReply::finished, this, [this, boardID]() {
|
if (!dataReply->isFinished()) {
|
||||||
Boards[boardID].timerData->setText(QString("Data: %1 ms").arg(Boards[boardID].timerToStatusResponse.elapsed()));
|
connect(dataReply, &QModbusReply::finished, this, [this, boardID, dataReply, StatusReg]() {
|
||||||
auto subreply = qobject_cast<QModbusReply *>(sender());
|
if(!Boards[boardID].isActive)
|
||||||
displayResultOfScan(subreply, boardID);
|
return;
|
||||||
subreply->deleteLater();
|
Boards[boardID].timerData->setText(QString("Data: %1 ms").arg(Boards[boardID].timerToDataResponse.elapsed()));
|
||||||
Boards[boardID].boardScanners->start(m_deviceSettingsDialog->currentBoardTimer(boardID));
|
displayResultOfScan(dataReply, boardID, StatusReg.AllReg);
|
||||||
|
dataReply->deleteLater();
|
||||||
|
unsigned timerInterval = m_deviceSettingsDialog->currentBoardTimer(boardID);
|
||||||
|
Boards[boardID].boardScanners->start(timerInterval);
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
|
// Мгновенно завершенный запрос данных
|
||||||
Boards[boardID].timerToDataResponse.elapsed();
|
Boards[boardID].timerToDataResponse.elapsed();
|
||||||
logError(tr("Плата %1 (ID %2)").arg(boardID+1).arg(Boards[boardID].adr),
|
// shouldLog для dataReply должен определяться здесь, но используем тот же принцип
|
||||||
modbusDevice->errorString(), ++Boards[boardID].error_TX, "");
|
if (Boards[boardID].isActive && !(reply->error() == QModbusDevice::ReplyAbortedError)) {
|
||||||
Boards[boardID].boardScanners->start(m_deviceSettingsDialog->currentBoardTimer(boardID));
|
logError(tr("Плата %1 (ID %2)").arg(boardID + 1).arg(Boards[boardID].adr),
|
||||||
delete subreply;
|
modbusDevice->errorString(), ++Boards[boardID].error_TX, "");
|
||||||
|
}
|
||||||
|
dataReply->deleteLater();
|
||||||
|
unsigned timerInterval = m_deviceSettingsDialog->currentBoardTimer(boardID);
|
||||||
|
Boards[boardID].boardScanners->start(timerInterval);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
logError(tr("Плата %1 (ID %2)").arg(boardID+1).arg(Boards[boardID].adr),
|
// Ошибка отправки запроса данных
|
||||||
modbusDevice->errorString(), ++Boards[boardID].error_TX, "");
|
if (Boards[boardID].isActive && !(reply->error() == QModbusDevice::ReplyAbortedError)) {
|
||||||
Boards[boardID].boardScanners->start(m_deviceSettingsDialog->currentBoardTimer(boardID));
|
logError(tr("Плата %1 (ID %2)").arg(boardID + 1).arg(Boards[boardID].adr),
|
||||||
delete subreply;
|
modbusDevice->errorString(), ++Boards[boardID].error_TX, "");
|
||||||
|
}
|
||||||
|
unsigned timerInterval = m_deviceSettingsDialog->currentBoardTimer(boardID);
|
||||||
|
Boards[boardID].boardScanners->start(timerInterval);
|
||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
logError(tr("Плата %1 (ID %2)").arg(boardID+1).arg(Boards[boardID].adr),
|
// Ошибка в ответе статуса
|
||||||
reply->errorString(), ++Boards[boardID].error_TX, "");
|
if (Boards[boardID].isActive && !(reply->error() == QModbusDevice::ReplyAbortedError)) {
|
||||||
Boards[boardID].boardScanners->start(m_deviceSettingsDialog->currentBoardTimer(boardID));
|
logError(tr("Плата %1 (ID %2)").arg(boardID + 1).arg(Boards[boardID].adr),
|
||||||
|
reply->errorString(), ++Boards[boardID].error_TX, "");
|
||||||
|
}
|
||||||
|
unsigned timerInterval = m_deviceSettingsDialog->currentBoardTimer(boardID);
|
||||||
|
Boards[boardID].boardScanners->start(timerInterval);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
reply->deleteLater();
|
||||||
});
|
});
|
||||||
else {
|
} else {
|
||||||
|
// Мгновенно завершенный запрос статуса
|
||||||
Boards[boardID].timerToStatusResponse.elapsed();
|
Boards[boardID].timerToStatusResponse.elapsed();
|
||||||
logError(tr("Плата %1 (ID %2)").arg(boardID+1).arg(Boards[boardID].adr),
|
// Для мгновенно завершенных запросов определяем shouldLog здесь
|
||||||
modbusDevice->errorString(), ++Boards[boardID].error_TX, "");
|
if (Boards[boardID].isActive && !(reply->error() == QModbusDevice::ReplyAbortedError)) {
|
||||||
Boards[boardID].boardScanners->start(m_deviceSettingsDialog->currentBoardTimer(boardID));
|
logError(tr("Плата %1 (ID %2)").arg(boardID + 1).arg(Boards[boardID].adr),
|
||||||
delete reply; // broadcast replies return immediately
|
modbusDevice->errorString(), ++Boards[boardID].error_TX, "");
|
||||||
|
}
|
||||||
|
reply->deleteLater();
|
||||||
|
unsigned timerInterval = m_deviceSettingsDialog->currentBoardTimer(boardID);
|
||||||
|
Boards[boardID].boardScanners->start(timerInterval);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
logError(tr("Плата %1 (ID %2)").arg(boardID+1).arg(Boards[boardID].adr),
|
// Ошибка отправки запроса статуса
|
||||||
modbusDevice->errorString(), ++Boards[boardID].error_TX, "");
|
if (Boards[boardID].isActive) {
|
||||||
Boards[boardID].boardScanners->start(m_deviceSettingsDialog->currentBoardTimer(boardID));
|
logError(tr("Плата %1 (ID %2)").arg(boardID + 1).arg(Boards[boardID].adr),
|
||||||
|
modbusDevice->errorString(), ++Boards[boardID].error_TX, "");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void M3KTE::displayResultOfScan(QModbusReply *reply, int boardID)
|
|
||||||
|
|
||||||
|
void M3KTE::displayResultOfScan(QModbusReply *reply, int boardID, int status)
|
||||||
{
|
{
|
||||||
if(!reply)
|
if(!reply)
|
||||||
return;
|
return;
|
||||||
@ -1453,6 +1525,60 @@ void M3KTE::displayResultOfScan(QModbusReply *reply, int boardID)
|
|||||||
reply->deleteLater();
|
reply->deleteLater();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
statusreg StatusReg;
|
||||||
|
StatusReg.AllReg = status;
|
||||||
|
|
||||||
|
// Обрабатываем статус MZKT
|
||||||
|
QString statusText;
|
||||||
|
int state = StatusReg.ParsingReg.mzkte_status;
|
||||||
|
int numb_err = StatusReg.ParsingReg.mzkte_error;
|
||||||
|
if (state == 0) {
|
||||||
|
statusText = "Ok";
|
||||||
|
} else if (state == 1) {
|
||||||
|
statusText = "Non-Critical";
|
||||||
|
} else if (state == 2) {
|
||||||
|
statusText = "Critical";
|
||||||
|
}
|
||||||
|
if (state) {
|
||||||
|
switch (numb_err) {
|
||||||
|
case 1:
|
||||||
|
statusText += QString(" (Err 5 VD)");
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
statusText += QString(" (Err 5 VA)");
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
statusText += QString(" (Err 5 Vsci)");
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
statusText += QString(" (Err 24 V)");
|
||||||
|
break;
|
||||||
|
case 5:
|
||||||
|
statusText += QString(" (Hardfault)");
|
||||||
|
break;
|
||||||
|
case 6:
|
||||||
|
statusText += QString(" (ADC Error)");
|
||||||
|
break;
|
||||||
|
case 7:
|
||||||
|
statusText += QString(" (UART Error)");
|
||||||
|
break;
|
||||||
|
case 8:
|
||||||
|
statusText += QString(" (Measure Error)");
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
statusText += QString(" (Program Err %1)").arg(numb_err - 4);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Boards[boardID].localError->setText(statusText);
|
||||||
|
|
||||||
|
|
||||||
|
Boards[boardID].localState[LOCAL_STATE_POLL]->setChecked(StatusReg.ParsingReg.poll_allowed);
|
||||||
|
Boards[boardID].localState[LOCAL_STATE_WARN]->setChecked(StatusReg.ParsingReg.warning);
|
||||||
|
Boards[boardID].localState[LOCAL_STATE_ERR]->setChecked(StatusReg.ParsingReg.accident);
|
||||||
|
|
||||||
|
|
||||||
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) {
|
||||||
@ -1498,13 +1624,13 @@ void M3KTE::displayResultOfScan(QModbusReply *reply, int boardID)
|
|||||||
ui->writeValueTable->model()->index(unit.startAddress() + unit.valueCount() -1, 2));
|
ui->writeValueTable->model()->index(unit.startAddress() + unit.valueCount() -1, 2));
|
||||||
Boards[boardID].ModbusModelHoldingReg->dataChanged(ui->writeValueTable->model()->index(unit.startAddress(), 3),
|
Boards[boardID].ModbusModelHoldingReg->dataChanged(ui->writeValueTable->model()->index(unit.startAddress(), 3),
|
||||||
ui->writeValueTable->model()->index(unit.startAddress() + unit.valueCount() -1, 3));
|
ui->writeValueTable->model()->index(unit.startAddress() + unit.valueCount() -1, 3));
|
||||||
if(A_Flag) {
|
if(A_Flag && !A_Adr.isEmpty()) {
|
||||||
statusM3KTE.Accidents[boardID] = true;
|
statusM3KTE.Accidents[boardID] = true;
|
||||||
logError(tr("Плата %1 (ID %2)").arg(boardID+1).arg(Boards[boardID].adr),
|
logError(tr("Плата %1 (ID %2)").arg(boardID+1).arg(Boards[boardID].adr),
|
||||||
"Авария", Boards[boardID].error_A, A_Adr);
|
"Авария", Boards[boardID].error_A, A_Adr);
|
||||||
} else
|
} else
|
||||||
statusM3KTE.Accidents[boardID] = false;
|
statusM3KTE.Accidents[boardID] = false;
|
||||||
if(W_Flag) {
|
if(W_Flag && !W_Adr.isEmpty()) {
|
||||||
statusM3KTE.Warnings[boardID] = true;
|
statusM3KTE.Warnings[boardID] = true;
|
||||||
logError(tr("Плата %1 (ID %2)").arg(boardID+1).arg(Boards[boardID].adr),
|
logError(tr("Плата %1 (ID %2)").arg(boardID+1).arg(Boards[boardID].adr),
|
||||||
"Предупреждение", Boards[boardID].error_W, W_Adr);
|
"Предупреждение", Boards[boardID].error_W, W_Adr);
|
||||||
|
@ -15,6 +15,7 @@
|
|||||||
#include <QModbusTcpClient>
|
#include <QModbusTcpClient>
|
||||||
#include <QModbusRtuSerialMaster>
|
#include <QModbusRtuSerialMaster>
|
||||||
|
|
||||||
|
#include <QHBoxLayout>
|
||||||
#include <QTimer>
|
#include <QTimer>
|
||||||
#include <QMessageBox>
|
#include <QMessageBox>
|
||||||
#include <QProgressDialog>
|
#include <QProgressDialog>
|
||||||
@ -39,6 +40,10 @@ QT_BEGIN_NAMESPACE
|
|||||||
namespace Ui { class M3KTE; class SettingsDialog;}
|
namespace Ui { class M3KTE; class SettingsDialog;}
|
||||||
QT_END_NAMESPACE
|
QT_END_NAMESPACE
|
||||||
|
|
||||||
|
#define LOCAL_STATE_POLL 0
|
||||||
|
#define LOCAL_STATE_WARN 1
|
||||||
|
#define LOCAL_STATE_ERR 2
|
||||||
|
|
||||||
class SettingsDialog;
|
class SettingsDialog;
|
||||||
class WriteRegisterModel;
|
class WriteRegisterModel;
|
||||||
|
|
||||||
@ -54,7 +59,7 @@ private:
|
|||||||
bool pingNetworkDevices();
|
bool pingNetworkDevices();
|
||||||
void beginScanBoards();
|
void beginScanBoards();
|
||||||
void stopScanBoard();
|
void stopScanBoard();
|
||||||
void displayResultOfScan(QModbusReply *reply, int boardID);
|
void displayResultOfScan(QModbusReply *reply, int boardID, int status);
|
||||||
void applySettingsFromScan(QModbusReply *reply);
|
void applySettingsFromScan(QModbusReply *reply);
|
||||||
void multipleRegWrite();
|
void multipleRegWrite();
|
||||||
void multipleRegSend();
|
void multipleRegSend();
|
||||||
@ -64,6 +69,7 @@ signals:
|
|||||||
void successAtCheckBoards();
|
void successAtCheckBoards();
|
||||||
void errorAtCheckBoards();
|
void errorAtCheckBoards();
|
||||||
private slots:
|
private slots:
|
||||||
|
void clearLogger();
|
||||||
void logError(const QString &errorPlace, const QString &errorString, unsigned errorCount, const QString &description);
|
void logError(const QString &errorPlace, const QString &errorString, unsigned errorCount, const QString &description);
|
||||||
void slotmultipleRegWrite();
|
void slotmultipleRegWrite();
|
||||||
void slotmultipleRegWriteAndSend();
|
void slotmultipleRegWriteAndSend();
|
||||||
@ -119,6 +125,8 @@ private:
|
|||||||
unsigned error_cmd_change = 0;
|
unsigned error_cmd_change = 0;
|
||||||
QLabel *timerData = nullptr;
|
QLabel *timerData = nullptr;
|
||||||
QLabel *timerStatus = nullptr;
|
QLabel *timerStatus = nullptr;
|
||||||
|
QLabel *localError = nullptr;
|
||||||
|
QCheckBox *localState[3] = {nullptr, nullptr, nullptr};
|
||||||
WriteRegisterModel *ModbusModelCoil;
|
WriteRegisterModel *ModbusModelCoil;
|
||||||
WriteRegisterModel *ModbusModelHoldingReg;
|
WriteRegisterModel *ModbusModelHoldingReg;
|
||||||
QTimer *boardScanners;
|
QTimer *boardScanners;
|
||||||
|
16594
M3KTE_TERM/m3kte.ui
16594
M3KTE_TERM/m3kte.ui
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue
Block a user