Алексей: сделал определение плат по char, а не hex

т.е. не 0x1-0x4, а "1"-"4" (0x31-0x34)
This commit is contained in:
Вячеслав Штейбезандт 2025-10-16 17:32:52 +03:00
parent 9071eb4322
commit e402334153

View File

@ -761,8 +761,7 @@ void M3KTE::onWriteButtonClicked()
QModbusDataUnit writeUnit = writeRequest();
QModbusDataUnit::RegisterType table = writeUnit.registerType();
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()];
writeUnit.setValue(i, Boards[ui->boardSelectBox->currentIndex()].ModbusModelCoil->m_coils[i + writeUnit.startAddress()]);
@ -1230,7 +1229,6 @@ bool M3KTE::pingNetworkDevices()
QModbusRequest requestOfBoardID(QModbusRequest::EncapsulatedInterfaceTransport, QByteArray::fromHex("0E0401"));
modbusDevice->setTimeout(50);
for(CurrentConnectedDevice=0; CurrentConnectedDevice<4;) {
auto *reply = modbusDevice->sendRawRequest(requestOfDeviceType, tmp_adr);
//Запрос типа устройства.
if(reply == nullptr) {
@ -1279,27 +1277,9 @@ bool M3KTE::pingNetworkDevices()
}
int plata_ind = 0;
if(subreply->rawResult().data().size() >= MODBUS_REQUEST_PROTOCOL_INFO_LENGTH) // ответ принят
plata_ind = subreply->rawResult().data().at(MODBUS_REQUEST_PROTOCOL_INFO_LENGTH); // парс ответа
if(plata_ind == 0) // если номер = 0 повторяем всё еще раз
{
qDebug() << "Reqest plata_ind again for address " << tmp_adr;
subreply = modbusDevice->sendRawRequest(requestOfBoardID, tmp_adr);
plata_ind = subreply->rawResult().data().at(MODBUS_REQUEST_PROTOCOL_INFO_LENGTH) - 0x30; // парс ответа
while(!subreply->isFinished()) {
if(isRun && CurrentConnectedDevice < 1) {
onConnectClicked();
bar->close();
bar->deleteLater();
return false;
} else if(isRun) {
break;
}
QCoreApplication::processEvents();
}
plata_ind = subreply->rawResult().data().at(MODBUS_REQUEST_PROTOCOL_INFO_LENGTH);
}
if(plata_ind == 0)
{
if(plata_ind < 1 || plata_ind > 4) {
QMessageBox::warning(this, "Ошибка при сканировании сети.",
QString("Не удалось получить порядковый номер платы по адресу %1").arg(tmp_adr));
onConnectClicked();
@ -1307,7 +1287,6 @@ bool M3KTE::pingNetworkDevices()
bar->deleteLater();
return false;
}
int board_ind = plata_ind-1;
if(isRun && CurrentConnectedDevice < 1) {
onConnectClicked();
@ -1329,8 +1308,6 @@ bool M3KTE::pingNetworkDevices()
}
CurrentConnectedDevice++;
Boards[board_ind].adr = Boards[board_ind]._tmp_adr = tmp_adr;
Boards[board_ind].isActive = true;
bar->setValue(CurrentConnectedDevice);
}
@ -1459,24 +1436,19 @@ void M3KTE::boardScan(unsigned boardID)
if (auto *reply = modbusDevice->sendReadRequest(statusUnit, Boards[boardID].adr)) {
Boards[boardID].timerToStatusResponse.start();
if (!reply->isFinished()) {
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()));
if (reply->error() == QModbusDevice::NoError) {
statusreg StatusReg;
StatusReg.AllReg = reply->result().value(0);
// Запрос полных данных
QModbusDataUnit dataUnit(QModbusDataUnit::InputRegisters, 0, 85-(boardID/3*20));
if (auto *dataReply = modbusDevice->sendReadRequest(dataUnit, Boards[boardID].adr)) {
Boards[boardID].timerToDataResponse.start();
if (!dataReply->isFinished()) {
connect(dataReply, &QModbusReply::finished, this, [this, boardID, dataReply, StatusReg]() {
if(!Boards[boardID].isActive)
@ -1508,7 +1480,6 @@ void M3KTE::boardScan(unsigned boardID)
unsigned timerInterval = m_deviceSettingsDialog->currentBoardTimer(boardID);
Boards[boardID].boardScanners->start(timerInterval);
}
} else {
// Ошибка в ответе статуса
if (Boards[boardID].isActive && !(reply->error() == QModbusDevice::ReplyAbortedError)) {
@ -1518,7 +1489,6 @@ void M3KTE::boardScan(unsigned boardID)
unsigned timerInterval = m_deviceSettingsDialog->currentBoardTimer(boardID);
Boards[boardID].boardScanners->start(timerInterval);
}
reply->deleteLater();
});
} else {
@ -1552,7 +1522,6 @@ void M3KTE::displayResultOfScan(QModbusReply *reply, int boardID, int status)
const QModbusDataUnit unit = reply->result();
bool W_Flag = false;
bool A_Flag = false;
if(unit.startAddress() != 0 || unit.valueCount() != (unsigned)(85-(boardID/3*20))) {
logError(tr("Плата %1 (ID %2)").arg(boardID+1).arg(Boards[boardID].adr),
"Ошибка при приёме.", ++Boards[boardID].error_RX,
@ -1560,10 +1529,8 @@ void M3KTE::displayResultOfScan(QModbusReply *reply, int boardID, int status)
reply->deleteLater();
return;
}
statusreg StatusReg;
StatusReg.AllReg = status;
// Обрабатываем статус MZKT
QString statusText;
int state = StatusReg.ParsingReg.mzkte_status;
@ -1608,7 +1575,7 @@ void M3KTE::displayResultOfScan(QModbusReply *reply, int boardID, int status)
statusText += QString(" (EEPROM Error)");
break;
case 11:
statusText += QString(" (Unstable discharge level)");
statusText += QString(" (Unstable discharge)");
break;
case 12:
statusText += QString(" (RS/UART Errors)");
@ -1619,22 +1586,15 @@ void M3KTE::displayResultOfScan(QModbusReply *reply, int boardID, int status)
}
}
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 A_Adr;
int total_qnt;
if(boardID == 3)
{
if(boardID == 3) {
total_qnt = 65;
}
else
{
} else {
total_qnt = 85;
}
for(int i = unit.startAddress(), total = total_qnt; i < total; ++i) {
@ -1838,10 +1798,8 @@ void M3KTE::writeSingleCoil(int boardId, int coilAddress, bool value)
{
if (!modbusDevice || !Boards[boardId].isActive)
return;
QModbusDataUnit unit(QModbusDataUnit::Coils, coilAddress, 1);
unit.setValue(0, value ? 1 : 0);
if (auto *reply = modbusDevice->sendWriteRequest(unit, Boards[boardId].adr)) {
if (!reply->isFinished()) {
connect(reply, &QModbusReply::finished, this, [this, boardId, reply]() {
@ -1862,10 +1820,8 @@ void M3KTE::writeSingleRegister(int boardID, int regAddress, quint16 value)
{
if (!modbusDevice || !Boards[boardID].isActive)
return;
QModbusDataUnit unit(QModbusDataUnit::HoldingRegisters, regAddress, 1);
unit.setValue(0, value);
if (auto *reply = modbusDevice->sendWriteRequest(unit, Boards[boardID].adr)) {
if (!reply->isFinished()) {
connect(reply, &QModbusReply::finished, this, [this, boardID, reply]() {
@ -1886,9 +1842,7 @@ QModbusReply* M3KTE::readSingleCoil(int boardID, int coilAddress)
{
if (!modbusDevice || !Boards[boardID].isActive)
return nullptr;
QModbusDataUnit unit(QModbusDataUnit::Coils, coilAddress, 1);
auto *reply = modbusDevice->sendReadRequest(unit, Boards[boardID].adr);
return reply;
}