diff --git a/README.md b/README.md index f83920d..78daf6c 100644 --- a/README.md +++ b/README.md @@ -4,8 +4,7 @@ Open ModScan is a free implimentation of modbus master (client) utility for modb ![image](https://github.com/sanny32/OpenModScan/assets/13627951/c2df0ea1-0f27-4d4b-8cc0-b6268caf8f11) - -![image](https://github.com/sanny32/OpenModScan/assets/13627951/2e24982e-3b32-4434-928e-6518505e48ae) +![image](https://github.com/user-attachments/assets/aeae5869-b0a1-469f-9e30-3e68a85b23e1) diff --git a/omodscan/connectiondetails.h b/omodscan/connectiondetails.h index 8ee0f06..35f6708 100644 --- a/omodscan/connectiondetails.h +++ b/omodscan/connectiondetails.h @@ -102,7 +102,7 @@ struct SerialConnectionParams void normalize() { - BaudRate = qBound(QSerialPort::Baud1200, BaudRate, QSerialPort::Baud115200); + BaudRate = qMax(QSerialPort::Baud1200, BaudRate); WordLength = qBound(QSerialPort::Data5, WordLength, QSerialPort::Data8); Parity = qBound(QSerialPort::NoParity, Parity, QSerialPort::MarkParity); FlowControl = qBound(QSerialPort::NoFlowControl, FlowControl, QSerialPort::SoftwareControl); diff --git a/omodscan/controls/modbusmessagewidget.cpp b/omodscan/controls/modbusmessagewidget.cpp index e89df8d..d7d187e 100644 --- a/omodscan/controls/modbusmessagewidget.cpp +++ b/omodscan/controls/modbusmessagewidget.cpp @@ -176,7 +176,7 @@ void ModbusMessageWidget::update() addItem(tr("Protocol ID: %1").arg(protocolId)); addItem(tr("Length: %1").arg(length)); } - + addItem(tr("Device ID: %1").arg(formatUInt8Value(_dataDisplayMode, _mm->deviceId()))); if(_mm->isException()) @@ -193,6 +193,7 @@ void ModbusMessageWidget::update() QString("%1 (%2)").arg(formatUInt8Value(_dataDisplayMode, func), func) : formatUInt8Value(_dataDisplayMode, func); addItem(tr("Function Code: %1").arg(function)); + const auto addrBase = tr("(0-based)"); switch(_mm->function()) { @@ -200,9 +201,9 @@ void ModbusMessageWidget::update() if(_mm->isRequest()) { auto req = reinterpret_cast(_mm); - const auto startAddress = req->isValid() ? formatUInt16Value(_dataDisplayMode, req->startAddress()) : "??"; + const auto startAddress = req->isValid() ? formatUInt16Value(_dataDisplayMode, req->startAddress()) : "??"; const auto length = req->isValid() ? formatUInt16Value(_dataDisplayMode, req->length()): "??"; - addItem(tr("Start Address: %1").arg(startAddress)); + addItem(tr("Start Address: %1 %2").arg(startAddress, addrBase)); addItem(tr("Length: %1").arg(length)); } else @@ -219,9 +220,9 @@ void ModbusMessageWidget::update() if(_mm->isRequest()) { auto req = reinterpret_cast(_mm); - const auto startAddress = req->isValid() ? formatUInt16Value(_dataDisplayMode, req->startAddress()) : "??"; + const auto startAddress = req->isValid() ? formatUInt16Value(_dataDisplayMode, req->startAddress()) : "??"; const auto length = req->isValid() ? formatUInt16Value(_dataDisplayMode, req->length()): "??"; - addItem(tr("Start Address: %1").arg(startAddress)); + addItem(tr("Start Address: %1 %2").arg(startAddress, addrBase)); addItem(tr("Length: %1").arg(length)); } else @@ -238,9 +239,9 @@ void ModbusMessageWidget::update() if(_mm->isRequest()) { auto req = reinterpret_cast(_mm); - const auto startAddress = req->isValid() ? formatUInt16Value(_dataDisplayMode, req->startAddress()) : "??"; + const auto startAddress = req->isValid() ? formatUInt16Value(_dataDisplayMode, req->startAddress()) : "??"; const auto length = req->isValid() ? formatUInt16Value(_dataDisplayMode, req->length()): "??"; - addItem(tr("Start Address: %1").arg(startAddress)); + addItem(tr("Start Address: %1 %2").arg(startAddress, addrBase)); addItem(tr("Length: %1").arg(length)); } else @@ -257,9 +258,9 @@ void ModbusMessageWidget::update() if(_mm->isRequest()) { auto req = reinterpret_cast(_mm); - const auto startAddress = req->isValid() ? formatUInt16Value(_dataDisplayMode, req->startAddress()) : "??"; + const auto startAddress = req->isValid() ? formatUInt16Value(_dataDisplayMode, req->startAddress()) : "??"; const auto length = req->isValid() ? formatUInt16Value(_dataDisplayMode, req->length()): "??"; - addItem(tr("Start Address: %1").arg(startAddress)); + addItem(tr("Start Address: %1 %2").arg(startAddress, addrBase)); addItem(tr("Length: %1").arg(length)); } else @@ -276,9 +277,9 @@ void ModbusMessageWidget::update() if(_mm->isRequest()) { auto req = reinterpret_cast(_mm); - const auto outputAddress = req->isValid() ? formatUInt16Value(_dataDisplayMode, req->address()) : "??"; + const auto outputAddress = req->isValid() ? formatUInt16Value(_dataDisplayMode, req->address()) : "??"; const auto outputValue = req->isValid() ? formatUInt16Value(_dataDisplayMode, req->value()) : "??"; - addItem(tr("Output Address: %1").arg(outputAddress)); + addItem(tr("Output Address: %1 %2").arg(outputAddress, addrBase)); addItem(tr("Output Value: %1").arg(outputValue)); } else @@ -286,7 +287,7 @@ void ModbusMessageWidget::update() auto resp = reinterpret_cast(_mm); const auto outputAddress = resp->isValid() ? formatUInt16Value(_dataDisplayMode, resp->address()) : "??"; const auto outputValue = resp->isValid() ? formatUInt16Value(_dataDisplayMode, resp->value()) : "??"; - addItem(tr("Output Address: %1").arg(outputAddress)); + addItem(tr("Output Address: %1 %2").arg(outputAddress, addrBase)); addItem(tr("Output Value: %1").arg(outputValue)); } break; @@ -295,9 +296,9 @@ void ModbusMessageWidget::update() if(_mm->isRequest()) { auto req = reinterpret_cast(_mm); - const auto registerAddress = req->isValid() ? formatUInt16Value(_dataDisplayMode, req->address()) : "??"; + const auto registerAddress = req->isValid() ? formatUInt16Value(_dataDisplayMode, req->address()) : "??"; const auto registerValue = req->isValid() ? formatUInt16Value(_dataDisplayMode, req->value()) : "??"; - addItem(tr("Register Address: %1").arg(registerAddress)); + addItem(tr("Register Address: %1 %2").arg(registerAddress, addrBase)); addItem(tr("Register Value: %1").arg(registerValue)); } else @@ -305,7 +306,7 @@ void ModbusMessageWidget::update() auto resp = reinterpret_cast(_mm); const auto registerAddress = resp->isValid() ? formatUInt16Value(_dataDisplayMode, resp->address()) : "??"; const auto registerValue = resp->isValid() ? formatUInt16Value(_dataDisplayMode, resp->value()) : "??"; - addItem(tr("Register Address: %1").arg(registerAddress)); + addItem(tr("Register Address: %1 %2").arg(registerAddress, addrBase)); addItem(tr("Register Value: %1").arg(registerValue)); } break; @@ -374,7 +375,7 @@ void ModbusMessageWidget::update() const auto quantity = req->isValid() ? formatUInt16Value(_dataDisplayMode, req->quantity()) : "??"; const auto byteCount = req->isValid() ? formatUInt8Value(_dataDisplayMode, req->byteCount()) : "?"; const auto values = req->isValid() ? formatUInt8Array(_dataDisplayMode, req->values()) : "???"; - addItem(tr("Starting Address: %1").arg(startAddr)); + addItem(tr("Starting Address: %1 %2").arg(startAddr, addrBase)); addItem(tr("Quantity of Outputs: %1").arg(quantity)); addItem(tr("Byte Count: %1").arg(byteCount)); addItem(tr("Output Value: %1").arg(values)); @@ -384,7 +385,7 @@ void ModbusMessageWidget::update() auto resp = reinterpret_cast(_mm); const auto startAddr = resp->isValid() ? formatUInt16Value(_dataDisplayMode, resp->startAddress()) : "??"; const auto quantity = resp->isValid() ? formatUInt16Value(_dataDisplayMode, resp->quantity()) : "??"; - addItem(tr("Starting Address: %1").arg(startAddr)); + addItem(tr("Starting Address: %1 %2").arg(startAddr, addrBase)); addItem(tr("Quantity of Outputs: %1").arg(quantity)); } break; @@ -397,7 +398,7 @@ void ModbusMessageWidget::update() const auto quantity = req->isValid() ? formatUInt16Value(_dataDisplayMode, req->quantity()) : "??"; const auto byteCount = req->isValid() ? formatUInt8Value(_dataDisplayMode, req->byteCount()) : "?"; const auto values = req->isValid() ? formatUInt16Array(_dataDisplayMode, req->values(), _byteOrder) : "???"; - addItem(tr("Starting Address: %1").arg(startAddr)); + addItem(tr("Starting Address: %1 %2").arg(startAddr, addrBase)); addItem(tr("Quantity of Registers: %1").arg(quantity)); addItem(tr("Byte Count: %1").arg(byteCount)); addItem(tr("Registers Value: %1").arg(values)); @@ -407,7 +408,7 @@ void ModbusMessageWidget::update() auto resp = reinterpret_cast(_mm); const auto startAddr = resp->isValid() ? formatUInt16Value(_dataDisplayMode, resp->startAddress()) : "??"; const auto quantity = resp->isValid() ? formatUInt16Value(_dataDisplayMode, resp->quantity()) : "??"; - addItem(tr("Starting Address: %1").arg(startAddr)); + addItem(tr("Starting Address: %1 %2").arg(startAddr, addrBase)); addItem(tr("Quantity of Registers: %1").arg(quantity)); } break; @@ -416,7 +417,7 @@ void ModbusMessageWidget::update() if(!_mm->isRequest()) { auto resp = reinterpret_cast(_mm); - const auto byteCount = resp->isValid() ? formatUInt8Value(_dataDisplayMode, resp->byteCount()) : "?"; + const auto byteCount = resp->isValid() ? formatUInt8Value(_dataDisplayMode, resp->byteCount()) : "?"; const auto data = resp->isValid() ? formatUInt8Array(_dataDisplayMode, resp->data()) : "?"; addItem(tr("Byte Count: %1").arg(byteCount)); addItem(tr("Data: %1").arg(data)); @@ -427,7 +428,7 @@ void ModbusMessageWidget::update() if(_mm->isRequest()) { auto req = reinterpret_cast(_mm); - const auto byteCount = req->isValid() ? formatUInt8Value(_dataDisplayMode, req->byteCount()) : "?"; + const auto byteCount = req->isValid() ? formatUInt8Value(_dataDisplayMode, req->byteCount()) : "?"; const auto data = req->isValid() ? formatUInt8Array(_dataDisplayMode, req->data()) : "?"; addItem(tr("Byte Count: %1").arg(byteCount)); addItem(tr("Data: %1").arg(data)); @@ -446,7 +447,7 @@ void ModbusMessageWidget::update() if(_mm->isRequest()) { auto req = reinterpret_cast(_mm); - const auto length = req->isValid() ? formatUInt8Value(_dataDisplayMode, req->length()) : "?"; + const auto length = req->isValid() ? formatUInt8Value(_dataDisplayMode, req->length()) : "?"; const auto data = req->isValid() ? formatUInt8Array(_dataDisplayMode, req->data()) : "???"; addItem(tr("Request Data Length: %1").arg(length)); addItem(tr("Data: %1").arg(data)); @@ -465,10 +466,10 @@ void ModbusMessageWidget::update() if(_mm->isRequest()) { auto req = reinterpret_cast(_mm); - const auto address = req->isValid() ? formatUInt16Value(_dataDisplayMode, req->address()) : "??"; + const auto address = req->isValid() ? formatUInt16Value(_dataDisplayMode, req->address()) : "??"; const auto andMask = req->isValid() ? formatUInt16Value(_dataDisplayMode, req->andMask()) : "??"; - const auto orMask = req->isValid() ? formatUInt16Value(_dataDisplayMode, req->orMask()) : "??"; - addItem(tr("Address: %1").arg(address)); + const auto orMask = req->isValid() ? formatUInt16Value(_dataDisplayMode, req->orMask()) : "??"; + addItem(tr("Address: %1 %2").arg(address, addrBase)); addItem(tr("And Mask: %1").arg(andMask)); addItem(tr("Or Mask: %1").arg(orMask)); } @@ -478,7 +479,7 @@ void ModbusMessageWidget::update() const auto address = resp->isValid() ? formatUInt16Value(_dataDisplayMode, resp->address()) : "??"; const auto andMask = resp->isValid() ? formatUInt16Value(_dataDisplayMode, resp->andMask()) : "??"; const auto orMask = resp->isValid() ? formatUInt16Value(_dataDisplayMode, resp->orMask()) : "??"; - addItem(tr("Address: %1").arg(address)); + addItem(tr("Address: %1 %2").arg(address, addrBase)); addItem(tr("And Mask: %1").arg(andMask)); addItem(tr("Or Mask: %1").arg(orMask)); } @@ -488,15 +489,15 @@ void ModbusMessageWidget::update() if(_mm->isRequest()) { auto req = reinterpret_cast(_mm); - const auto readStartAddr = req->isValid() ? formatUInt16Value(_dataDisplayMode, req->readStartAddress()) : "??"; + const auto readStartAddr = req->isValid() ? formatUInt16Value(_dataDisplayMode, req->readStartAddress()) : "??"; const auto readLength = req->isValid() ? formatUInt16Value(_dataDisplayMode, req->readLength()) : "??"; - const auto writeStartAddr = req->isValid() ? formatUInt16Value(_dataDisplayMode, req->writeStartAddress()) : "??"; + const auto writeStartAddr = req->isValid() ? formatUInt16Value(_dataDisplayMode, req->writeStartAddress()) : "??"; const auto writeLength = req->isValid() ? formatUInt16Value(_dataDisplayMode, req->writeLength()) : "??"; const auto writeByteCount = req->isValid() ? formatUInt8Value(_dataDisplayMode, req->writeByteCount()) : "?"; const auto writeValues = req->isValid() ? formatUInt16Array(_dataDisplayMode, req->writeValues(), _byteOrder) : "???"; - addItem(tr("Read Starting Address: %1").arg(readStartAddr)); + addItem(tr("Read Starting Address: %1 %2").arg(readStartAddr, addrBase)); addItem(tr("Quantity to Read: %1").arg(readLength)); - addItem(tr("Write Starting Address: %1").arg(writeStartAddr)); + addItem(tr("Write Starting Address: %1 %2").arg(writeStartAddr, addrBase)); addItem(tr("Quantity to Write: %1").arg(writeLength)); addItem(tr("Write Byte Count: %1").arg(writeByteCount)); addItem(tr("Write Registers Value: %1").arg(writeValues)); @@ -515,8 +516,8 @@ void ModbusMessageWidget::update() if(_mm->isRequest()) { auto req = reinterpret_cast(_mm); - const auto fifoAddr = req->isValid() ? formatUInt16Value(_dataDisplayMode, req->fifoAddress()) : "??"; - addItem(tr("FIFO Point Address: %1").arg(fifoAddr)); + const auto fifoAddr = req->isValid() ? formatUInt16Value(_dataDisplayMode, req->fifoAddress()) : "??"; + addItem(tr("FIFO Point Address: %1 %2").arg(fifoAddr, addrBase)); } else { diff --git a/omodscan/controls/numericcombobox.cpp b/omodscan/controls/numericcombobox.cpp index b972986..1b12455 100644 --- a/omodscan/controls/numericcombobox.cpp +++ b/omodscan/controls/numericcombobox.cpp @@ -34,5 +34,12 @@ int NumericComboBox::currentValue() const void NumericComboBox::setCurrentValue(int value) { const auto idx = findText(QString::number(value)); - setCurrentIndex(idx); + if(idx != -1) + { + setCurrentIndex(idx); + } + else if(isEditable()) + { + setCurrentText(QString::number(value)); + } } diff --git a/omodscan/dialogs/dialogabout.ui b/omodscan/dialogs/dialogabout.ui index f887087..6fd7f26 100644 --- a/omodscan/dialogs/dialogabout.ui +++ b/omodscan/dialogs/dialogabout.ui @@ -138,7 +138,7 @@ - © Alexandr Ananev, 2024 + © Alexandr Ananev, 2024 @@ -161,7 +161,7 @@ - <html><head/><body><p><a href="https://github.com/sanny32/OpenModScan"><span style=" text-decoration: underline; color:#0000ff;">https://github.com/sanny32/OpenModScan</span></a></p></body></html> + <html><head/><body><p><a href="https://github.com/sanny32/OpenModScan"><span style=" text-decoration: underline; color:#0000ff;">https://github.com/sanny32/OpenModScan</span></a></p></body></html> true diff --git a/omodscan/dialogs/dialogconnectiondetails.cpp b/omodscan/dialogs/dialogconnectiondetails.cpp index 09aee4f..7e80c26 100644 --- a/omodscan/dialogs/dialogconnectiondetails.cpp +++ b/omodscan/dialogs/dialogconnectiondetails.cpp @@ -68,7 +68,7 @@ void DialogConnectionDetails::accept() else { _connectionDetails.SerialParams.PortName = ui->comboBoxConnectUsing->currentPortName(); - _connectionDetails.SerialParams.BaudRate = (QSerialPort::BaudRate)ui->comboBoxBaudRate->currentValue(); + _connectionDetails.SerialParams.BaudRate = qMax(QSerialPort::Baud1200, (QSerialPort::BaudRate)ui->comboBoxBaudRate->currentValue()); _connectionDetails.SerialParams.WordLength = (QSerialPort::DataBits)ui->comboBoxWordLength->currentValue(); _connectionDetails.SerialParams.Parity = ui->comboBoxParity->currentParity(); _connectionDetails.SerialParams.StopBits = (QSerialPort::StopBits)ui->comboBoxStopBits->currentValue(); diff --git a/omodscan/dialogs/dialogconnectiondetails.ui b/omodscan/dialogs/dialogconnectiondetails.ui index e2c5d0f..b39404f 100644 --- a/omodscan/dialogs/dialogconnectiondetails.ui +++ b/omodscan/dialogs/dialogconnectiondetails.ui @@ -31,10 +31,10 @@ - Qt::Horizontal + Qt::Orientation::Horizontal - QSizePolicy::Fixed + QSizePolicy::Policy::Fixed @@ -57,10 +57,10 @@ - Qt::Horizontal + Qt::Orientation::Horizontal - QSizePolicy::Fixed + QSizePolicy::Policy::Fixed @@ -77,10 +77,10 @@ - Qt::Horizontal + Qt::Orientation::Horizontal - QSizePolicy::Fixed + QSizePolicy::Policy::Fixed @@ -93,7 +93,7 @@ - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter @@ -152,10 +152,10 @@ - Qt::Horizontal + Qt::Orientation::Horizontal - QSizePolicy::Fixed + QSizePolicy::Policy::Fixed @@ -190,10 +190,10 @@ - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + Qt::AlignmentFlag::AlignLeading|Qt::AlignmentFlag::AlignLeft|Qt::AlignmentFlag::AlignVCenter 3 @@ -216,6 +216,9 @@ 25 + + true + 3 @@ -353,7 +356,7 @@ - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter @@ -432,7 +435,7 @@ - Qt::Horizontal + Qt::Orientation::Horizontal @@ -458,7 +461,7 @@ - Qt::Horizontal + Qt::Orientation::Horizontal @@ -473,10 +476,10 @@ - Qt::Horizontal + Qt::Orientation::Horizontal - QDialogButtonBox::Cancel|QDialogButtonBox::Ok + QDialogButtonBox::StandardButton::Cancel|QDialogButtonBox::StandardButton::Ok true diff --git a/omodscan/dialogs/dialogdisplaydefinition.ui b/omodscan/dialogs/dialogdisplaydefinition.ui index bde2209..9080979 100644 --- a/omodscan/dialogs/dialogdisplaydefinition.ui +++ b/omodscan/dialogs/dialogdisplaydefinition.ui @@ -7,7 +7,7 @@ 0 0 350 - 277 + 304 @@ -17,10 +17,10 @@ - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter - Qt::AlignHCenter|Qt::AlignTop + Qt::AlignmentFlag::AlignHCenter|Qt::AlignmentFlag::AlignTop 40 @@ -129,7 +129,7 @@ - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter 12 @@ -196,36 +196,14 @@ - - - - - 0 - 0 - - - - - 0 - 25 - - - - - 60 - 16777215 - - - - - + Length: - + @@ -247,16 +225,65 @@ + + + + 8 + + + + + + 0 + 0 + + + + + 0 + 25 + + + + + 60 + 16777215 + + + + + + + + (1-based) + + + + + + + Qt::Orientation::Horizontal + + + + 40 + 20 + + + + + + - Qt::Horizontal + Qt::Orientation::Horizontal - QDialogButtonBox::Cancel|QDialogButtonBox::Ok + QDialogButtonBox::StandardButton::Cancel|QDialogButtonBox::StandardButton::Ok true @@ -281,7 +308,6 @@ lineEditScanRate lineEditSlaveAddress comboBoxPointType - lineEditPointAddress lineEditLength diff --git a/omodscan/omodscan.pro b/omodscan/omodscan.pro index c01c2b8..b64c1c5 100644 --- a/omodscan/omodscan.pro +++ b/omodscan/omodscan.pro @@ -4,7 +4,7 @@ CONFIG += c++17 CONFIG -= debug_and_release CONFIG -= debug_and_release_target -VERSION = 1.7.0 +VERSION = 1.7.1 QMAKE_TARGET_PRODUCT = "Open ModScan" QMAKE_TARGET_DESCRIPTION = "An Open Source Modbus Master (Client) Utility" diff --git a/omodscan/translations/omodscan_ru.qm b/omodscan/translations/omodscan_ru.qm index f38d3c4..1c1637c 100644 Binary files a/omodscan/translations/omodscan_ru.qm and b/omodscan/translations/omodscan_ru.qm differ diff --git a/omodscan/translations/omodscan_ru.ts b/omodscan/translations/omodscan_ru.ts index 43eb1be..d15a06d 100644 --- a/omodscan/translations/omodscan_ru.ts +++ b/omodscan/translations/omodscan_ru.ts @@ -90,16 +90,6 @@ An Open Source Modbus Master (Client) Utility Утилита Modbus Master (клиент) с открытым исходным кодом - - - © Alexandr Ananev, 2023 - - - - - <html><head/><body><p><a href="https://github.com/sanny32/OpenModScan"><span style=" text-decoration: underline; color:#0000ff;">https://github.com/sanny32/OpenModScan</span></a></p></body></html> - - <html><head/><body><a href=""><span style=" text-decoration: underline; color:#0000ff;">Lecense: The MIT License<span></a></body></html> @@ -781,7 +771,7 @@ Адрес: порт (Узел) - + Clear previous scan results? Очистить результаты предыдущего сканирования? @@ -2002,10 +1992,10 @@ Valid Slave Responses: %2 - - - - + + + + <b>Length:</b> %1 <b>Длина:</b> %1 @@ -2030,211 +2020,248 @@ Valid Slave Responses: %2 <b>Код функции:</b> %1 - - - - + + (0-based) + + + + + + + + <b>Start Address:</b> %1 %2 + <b>Адрес:</b> %1 %2 + + + + + <b>Output Address:</b> %1 %2 + <b>Адрес:</b> %1 %2 + + + + + <b>Register Address:</b> %1 %2 + <b>Адрес:</b> %1 %2 + + + + + + + <b>Starting Address:</b> %1 %2 + <b>Начальный адрес:</b> %1 %2 + + + + + <b>Address:</b> %1 %2 + <b>Адрес:</b> %1 %2 + + + + <b>Read Starting Address:</b> %1 %2 + <b>Адрес чтения регистров:</b> %1 %2 + + + + <b>Write Starting Address:</b> %1 %2 + <b>Адрес записи регистров:</b> %1 %2 + + + + <b>FIFO Point Address:</b> %1 %2 + <b>Адрес точки FIFO:</b> %1 %2 + + <b>Start Address:</b> %1 - <b>Адрес:</b> %1 + <b>Адрес:</b> %1 - - - - - - - - - - - - + + + + + + + + + + + + <b>Byte Count:</b> %1 <b>Количество байт:</b> %1 - + <b>Coil Status:</b> %1 <b>Статусы coil:</b> %1 - + <b>Input Status:</b> %1 <b>Статусы input:</b> %1 - - - + + + <b>Register Value:</b> %1 <b>Значения регистров:</b> %1 - + <b>Input Registers:</b> %1 <b>Значения реистров:</b> %1 - - <b>Output Address:</b> %1 - <b>Адрес:</b> %1 + <b>Адрес:</b> %1 - - - + + + <b>Output Value:</b> %1 <b>Значение:</b> %1 - - <b>Register Address:</b> %1 - <b>Адрес:</b> %1 + <b>Адрес:</b> %1 - + <b>Output Data:</b> %1 <b>Данные:</b> %1 - - + + <b>Sub-function:</b> %1 <b>Подфункция:</b> %1 - - - - - - - - + + + + + + + + <b>Data:</b> %1 <b>Данные:</b> %1 - - + + <b>Status:</b> %1 <b>Статус:</b> %1 - - + + <b>Event Count:</b> %1 <b>Количество событий:</b> %1 - + <b>Message Count:</b> %1 <b>Количество сообщений:</b> %1 - + <b>Events:</b> %1 <b>События:</b> %1 - - - - <b>Starting Address:</b> %1 - <b>Начальный адрес:</b> %1 + <b>Начальный адрес:</b> %1 - - + + <b>Quantity of Outputs:</b> %1 <b>Количество:</b> %1 - - + + <b>Quantity of Registers:</b> %1 <b>Количество регистров:</b> %1 - - + + <b>Registers Value:</b> %1 <b>Значения регистров:</b> %1 - + <b>Request Data Length:</b> %1 <b>Длина данных запроса:</b> %1 - + <b>Response Data Length:</b> %1 <b>Длина данных ответа:</b> %1 - - <b>Address:</b> %1 - <b>Адрес:</b> %1 + <b>Адрес:</b> %1 - - + + <b>And Mask:</b> %1 <b>Маска «И»:</b> %1 - - + + <b>Or Mask:</b> %1 <b>Маска «ИЛИ»:</b> %1 - <b>Read Starting Address:</b> %1 - <b>Адрес чтения регистров:</b> %1 + <b>Адрес чтения регистров:</b> %1 - + <b>Quantity to Read:</b> %1 <b>Количество регистров для чтения:</b> %1 - <b>Write Starting Address:</b> %1 - <b>Адрес записи регистров:</b> %1 + <b>Адрес записи регистров:</b> %1 - + <b>Quantity to Write:</b> %1 <b>Количество регистров для записи:</b> %1 - + <b>Write Byte Count:</b> %1 <b>Количество байт записи:</b> %1 - + <b>Write Registers Value:</b> %1 <b>Значения регистров записи:</b> %1 - <b>FIFO Point Address:</b> %1 - <b>Адрес точки FIFO:</b> %1 + <b>Адрес точки FIFO:</b> %1 - + <b>FIFO Count:</b> %1 <b>Количество FIFO:</b> %1 - + <b>FIFO Value Register:</b> %1 <b>Значения регистров FIFO:</b> %1 @@ -2247,7 +2274,7 @@ Valid Slave Responses: %2 %1: Введите описание - + Data Uninitialized Данные не инициализированы