Алексей: сделал определение плат по char, а не hex
т.е. не 0x1-0x4, а "1"-"4" (0x31-0x34)
This commit is contained in:
parent
9071eb4322
commit
e402334153
@ -761,8 +761,7 @@ void M3KTE::onWriteButtonClicked()
|
|||||||
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()].coil[i+writeUnit.startAddress()] =
|
||||||
Boards[ui->boardSelectBox->currentIndex()].ModbusModelCoil->m_coils[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()]);
|
||||||
@ -1230,7 +1229,6 @@ 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);
|
||||||
//Запрос типа устройства.
|
//Запрос типа устройства.
|
||||||
if(reply == nullptr) {
|
if(reply == nullptr) {
|
||||||
@ -1279,27 +1277,9 @@ bool M3KTE::pingNetworkDevices()
|
|||||||
}
|
}
|
||||||
int plata_ind = 0;
|
int plata_ind = 0;
|
||||||
if(subreply->rawResult().data().size() >= MODBUS_REQUEST_PROTOCOL_INFO_LENGTH) // ответ принят
|
if(subreply->rawResult().data().size() >= MODBUS_REQUEST_PROTOCOL_INFO_LENGTH) // ответ принят
|
||||||
plata_ind = subreply->rawResult().data().at(MODBUS_REQUEST_PROTOCOL_INFO_LENGTH); // парс ответа
|
plata_ind = subreply->rawResult().data().at(MODBUS_REQUEST_PROTOCOL_INFO_LENGTH) - 0x30; // парс ответа
|
||||||
if(plata_ind == 0) // если номер = 0 повторяем всё еще раз
|
|
||||||
{
|
|
||||||
qDebug() << "Reqest plata_ind again for address " << tmp_adr;
|
|
||||||
subreply = modbusDevice->sendRawRequest(requestOfBoardID, tmp_adr);
|
|
||||||
|
|
||||||
while(!subreply->isFinished()) {
|
if(plata_ind < 1 || plata_ind > 4) {
|
||||||
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)
|
|
||||||
{
|
|
||||||
QMessageBox::warning(this, "Ошибка при сканировании сети.",
|
QMessageBox::warning(this, "Ошибка при сканировании сети.",
|
||||||
QString("Не удалось получить порядковый номер платы по адресу %1").arg(tmp_adr));
|
QString("Не удалось получить порядковый номер платы по адресу %1").arg(tmp_adr));
|
||||||
onConnectClicked();
|
onConnectClicked();
|
||||||
@ -1307,7 +1287,6 @@ bool M3KTE::pingNetworkDevices()
|
|||||||
bar->deleteLater();
|
bar->deleteLater();
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
int board_ind = plata_ind-1;
|
int board_ind = plata_ind-1;
|
||||||
if(isRun && CurrentConnectedDevice < 1) {
|
if(isRun && CurrentConnectedDevice < 1) {
|
||||||
onConnectClicked();
|
onConnectClicked();
|
||||||
@ -1329,8 +1308,6 @@ bool M3KTE::pingNetworkDevices()
|
|||||||
}
|
}
|
||||||
CurrentConnectedDevice++;
|
CurrentConnectedDevice++;
|
||||||
Boards[board_ind].adr = Boards[board_ind]._tmp_adr = tmp_adr;
|
Boards[board_ind].adr = Boards[board_ind]._tmp_adr = tmp_adr;
|
||||||
|
|
||||||
|
|
||||||
Boards[board_ind].isActive = true;
|
Boards[board_ind].isActive = true;
|
||||||
bar->setValue(CurrentConnectedDevice);
|
bar->setValue(CurrentConnectedDevice);
|
||||||
}
|
}
|
||||||
@ -1459,24 +1436,19 @@ void M3KTE::boardScan(unsigned boardID)
|
|||||||
|
|
||||||
if (auto *reply = modbusDevice->sendReadRequest(statusUnit, Boards[boardID].adr)) {
|
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)
|
if(!Boards[boardID].isActive)
|
||||||
return;
|
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);
|
||||||
|
|
||||||
// Запрос полных данных
|
// Запрос полных данных
|
||||||
QModbusDataUnit dataUnit(QModbusDataUnit::InputRegisters, 0, 85-(boardID/3*20));
|
QModbusDataUnit dataUnit(QModbusDataUnit::InputRegisters, 0, 85-(boardID/3*20));
|
||||||
if (auto *dataReply = modbusDevice->sendReadRequest(dataUnit, Boards[boardID].adr)) {
|
if (auto *dataReply = modbusDevice->sendReadRequest(dataUnit, Boards[boardID].adr)) {
|
||||||
Boards[boardID].timerToDataResponse.start();
|
Boards[boardID].timerToDataResponse.start();
|
||||||
|
|
||||||
if (!dataReply->isFinished()) {
|
if (!dataReply->isFinished()) {
|
||||||
connect(dataReply, &QModbusReply::finished, this, [this, boardID, dataReply, StatusReg]() {
|
connect(dataReply, &QModbusReply::finished, this, [this, boardID, dataReply, StatusReg]() {
|
||||||
if(!Boards[boardID].isActive)
|
if(!Boards[boardID].isActive)
|
||||||
@ -1508,7 +1480,6 @@ void M3KTE::boardScan(unsigned boardID)
|
|||||||
unsigned timerInterval = m_deviceSettingsDialog->currentBoardTimer(boardID);
|
unsigned timerInterval = m_deviceSettingsDialog->currentBoardTimer(boardID);
|
||||||
Boards[boardID].boardScanners->start(timerInterval);
|
Boards[boardID].boardScanners->start(timerInterval);
|
||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
// Ошибка в ответе статуса
|
// Ошибка в ответе статуса
|
||||||
if (Boards[boardID].isActive && !(reply->error() == QModbusDevice::ReplyAbortedError)) {
|
if (Boards[boardID].isActive && !(reply->error() == QModbusDevice::ReplyAbortedError)) {
|
||||||
@ -1518,7 +1489,6 @@ void M3KTE::boardScan(unsigned boardID)
|
|||||||
unsigned timerInterval = m_deviceSettingsDialog->currentBoardTimer(boardID);
|
unsigned timerInterval = m_deviceSettingsDialog->currentBoardTimer(boardID);
|
||||||
Boards[boardID].boardScanners->start(timerInterval);
|
Boards[boardID].boardScanners->start(timerInterval);
|
||||||
}
|
}
|
||||||
|
|
||||||
reply->deleteLater();
|
reply->deleteLater();
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
@ -1552,7 +1522,6 @@ void M3KTE::displayResultOfScan(QModbusReply *reply, int boardID, int status)
|
|||||||
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() != (unsigned)(85-(boardID/3*20))) {
|
if(unit.startAddress() != 0 || unit.valueCount() != (unsigned)(85-(boardID/3*20))) {
|
||||||
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_RX,
|
"Ошибка при приёме.", ++Boards[boardID].error_RX,
|
||||||
@ -1560,10 +1529,8 @@ void M3KTE::displayResultOfScan(QModbusReply *reply, int boardID, int status)
|
|||||||
reply->deleteLater();
|
reply->deleteLater();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
statusreg StatusReg;
|
statusreg StatusReg;
|
||||||
StatusReg.AllReg = status;
|
StatusReg.AllReg = status;
|
||||||
|
|
||||||
// Обрабатываем статус MZKT
|
// Обрабатываем статус MZKT
|
||||||
QString statusText;
|
QString statusText;
|
||||||
int state = StatusReg.ParsingReg.mzkte_status;
|
int state = StatusReg.ParsingReg.mzkte_status;
|
||||||
@ -1608,7 +1575,7 @@ void M3KTE::displayResultOfScan(QModbusReply *reply, int boardID, int status)
|
|||||||
statusText += QString(" (EEPROM Error)");
|
statusText += QString(" (EEPROM Error)");
|
||||||
break;
|
break;
|
||||||
case 11:
|
case 11:
|
||||||
statusText += QString(" (Unstable discharge level)");
|
statusText += QString(" (Unstable discharge)");
|
||||||
break;
|
break;
|
||||||
case 12:
|
case 12:
|
||||||
statusText += QString(" (RS/UART Errors)");
|
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].localError->setText(statusText);
|
||||||
|
|
||||||
|
|
||||||
Boards[boardID].localState[LOCAL_STATE_POLL]->setChecked(StatusReg.ParsingReg.poll_allowed);
|
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_WARN]->setChecked(StatusReg.ParsingReg.warning);
|
||||||
Boards[boardID].localState[LOCAL_STATE_ERR]->setChecked(StatusReg.ParsingReg.accident);
|
Boards[boardID].localState[LOCAL_STATE_ERR]->setChecked(StatusReg.ParsingReg.accident);
|
||||||
|
|
||||||
|
|
||||||
QString W_Adr;
|
QString W_Adr;
|
||||||
QString A_Adr;
|
QString A_Adr;
|
||||||
int total_qnt;
|
int total_qnt;
|
||||||
if(boardID == 3)
|
if(boardID == 3) {
|
||||||
{
|
|
||||||
total_qnt = 65;
|
total_qnt = 65;
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
total_qnt = 85;
|
total_qnt = 85;
|
||||||
}
|
}
|
||||||
for(int i = unit.startAddress(), total = total_qnt; i < total; ++i) {
|
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)
|
if (!modbusDevice || !Boards[boardId].isActive)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
QModbusDataUnit unit(QModbusDataUnit::Coils, coilAddress, 1);
|
QModbusDataUnit unit(QModbusDataUnit::Coils, coilAddress, 1);
|
||||||
unit.setValue(0, value ? 1 : 0);
|
unit.setValue(0, value ? 1 : 0);
|
||||||
|
|
||||||
if (auto *reply = modbusDevice->sendWriteRequest(unit, Boards[boardId].adr)) {
|
if (auto *reply = modbusDevice->sendWriteRequest(unit, Boards[boardId].adr)) {
|
||||||
if (!reply->isFinished()) {
|
if (!reply->isFinished()) {
|
||||||
connect(reply, &QModbusReply::finished, this, [this, boardId, reply]() {
|
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)
|
if (!modbusDevice || !Boards[boardID].isActive)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
QModbusDataUnit unit(QModbusDataUnit::HoldingRegisters, regAddress, 1);
|
QModbusDataUnit unit(QModbusDataUnit::HoldingRegisters, regAddress, 1);
|
||||||
unit.setValue(0, value);
|
unit.setValue(0, value);
|
||||||
|
|
||||||
if (auto *reply = modbusDevice->sendWriteRequest(unit, Boards[boardID].adr)) {
|
if (auto *reply = modbusDevice->sendWriteRequest(unit, Boards[boardID].adr)) {
|
||||||
if (!reply->isFinished()) {
|
if (!reply->isFinished()) {
|
||||||
connect(reply, &QModbusReply::finished, this, [this, boardID, reply]() {
|
connect(reply, &QModbusReply::finished, this, [this, boardID, reply]() {
|
||||||
@ -1886,9 +1842,7 @@ QModbusReply* M3KTE::readSingleCoil(int boardID, int coilAddress)
|
|||||||
{
|
{
|
||||||
if (!modbusDevice || !Boards[boardID].isActive)
|
if (!modbusDevice || !Boards[boardID].isActive)
|
||||||
return nullptr;
|
return nullptr;
|
||||||
|
|
||||||
QModbusDataUnit unit(QModbusDataUnit::Coils, coilAddress, 1);
|
QModbusDataUnit unit(QModbusDataUnit::Coils, coilAddress, 1);
|
||||||
|
|
||||||
auto *reply = modbusDevice->sendReadRequest(unit, Boards[boardID].adr);
|
auto *reply = modbusDevice->sendReadRequest(unit, Boards[boardID].adr);
|
||||||
return reply;
|
return reply;
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user