From ad2c782e3b65c476007446ec76098ae36ed1e855 Mon Sep 17 00:00:00 2001 From: sanny32 Date: Wed, 4 Dec 2024 08:59:24 +0300 Subject: [PATCH 01/10] fix #21 --- omodsim/formmodsim.cpp | 3 ++- omodsim/mainwindow.cpp | 11 ++++++----- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/omodsim/formmodsim.cpp b/omodsim/formmodsim.cpp index 555fc0a..1201dc0 100644 --- a/omodsim/formmodsim.cpp +++ b/omodsim/formmodsim.cpp @@ -69,7 +69,6 @@ FormModSim::FormModSim(int id, ModbusMultiServer& server, QSharedPointermdiArea->closeAllSubWindows(); - for(auto&& filename: listFilename) - { - if(!filename.isEmpty()) - openFile(filename); - } auto menu = qobject_cast(ui->actionConnect->menu()); menu->updateConnectionDetails(conns); @@ -1269,6 +1264,12 @@ void MainWindow::loadConfig(const QString& filename) if(menu->canConnect(cd)) _mbMultiServer.connectDevice(cd); } + + for(auto&& filename: listFilename) + { + if(!filename.isEmpty()) + openFile(filename); + } } /// From 615753887012b5c7a0d016c09a7a26b200998b00 Mon Sep 17 00:00:00 2001 From: sanny32 Date: Wed, 4 Dec 2024 09:06:59 +0300 Subject: [PATCH 02/10] correct recording negative values --- omodsim/controls/numericlineedit.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/omodsim/controls/numericlineedit.cpp b/omodsim/controls/numericlineedit.cpp index f9d51d0..4ce2b11 100644 --- a/omodsim/controls/numericlineedit.cpp +++ b/omodsim/controls/numericlineedit.cpp @@ -441,7 +441,7 @@ void NumericLineEdit::on_rangeChanged(const QVariant& bottom, const QVariant& to { const int nums = QString::number(top.toInt()).length(); _paddingZeroWidth = qMax(1, nums); - setMaxLength(qMax(1, nums)); + setMaxLength(qMax(2, nums + 1)); setValidator(new QIntValidator(bottom.toInt(), top.toInt(), this)); } @@ -475,7 +475,7 @@ void NumericLineEdit::on_rangeChanged(const QVariant& bottom, const QVariant& to { const int nums = QString::number(top.toLongLong()).length(); _paddingZeroWidth = qMax(1, nums); - setMaxLength(qMax(1, nums)); + setMaxLength(qMax(2, nums + 1)); setValidator(new QInt64Validator(bottom.toLongLong(), top.toLongLong(), this)); } break; From 1d17bb9f172feb40b6481e377bb25253be37d14b Mon Sep 17 00:00:00 2001 From: sanny32 Date: Wed, 4 Dec 2024 10:45:37 +0300 Subject: [PATCH 03/10] fix serial ports sorting --- omodsim/menuconnect.cpp | 8 ++++---- omodsim/omodsim.pro | 1 + omodsim/serialportutils.h | 26 ++++++++++++++++++++++++++ 3 files changed, 31 insertions(+), 4 deletions(-) create mode 100644 omodsim/serialportutils.h diff --git a/omodsim/menuconnect.cpp b/omodsim/menuconnect.cpp index ccb9fbb..a036d4a 100644 --- a/omodsim/menuconnect.cpp +++ b/omodsim/menuconnect.cpp @@ -1,5 +1,5 @@ #include -#include +#include "serialportutils.h" #include "menuconnect.h" /// @@ -15,10 +15,10 @@ MenuConnect::MenuConnect(MenuType type, ModbusMultiServer& server, QWidget *pare { addAction(tr("Modbus/TCP Srv"), ConnectionType::Tcp, QString()); - for(auto&& port: QSerialPortInfo::availablePorts()) + for(auto&& port: getAvailableSerialPorts()) { - const auto text = QString(tr("Port %1")).arg(port.portName()); - addAction(text, ConnectionType::Serial, port.portName()); + const auto text = QString(tr("Port %1")).arg(port); + addAction(text, ConnectionType::Serial, port); } connect(&_mbMultiServer, &ModbusMultiServer::connected, this, [&](const ConnectionDetails&) diff --git a/omodsim/omodsim.pro b/omodsim/omodsim.pro index 59a12da..2075fb1 100644 --- a/omodsim/omodsim.pro +++ b/omodsim/omodsim.pro @@ -178,6 +178,7 @@ HEADERS += \ quintvalidator.h \ recentfileactionlist.h \ scriptsettings.h \ + serialportutils.h \ windowactionlist.h FORMS += \ diff --git a/omodsim/serialportutils.h b/omodsim/serialportutils.h new file mode 100644 index 0000000..96c52b5 --- /dev/null +++ b/omodsim/serialportutils.h @@ -0,0 +1,26 @@ +#ifndef SERIALPORTUTILS_H +#define SERIALPORTUTILS_H + +#include +#include + +/// +/// \brief getAvailableSerialPorts +/// \return +/// +inline QStringList getAvailableSerialPorts() +{ + QStringList ports; + for(auto&& port: QSerialPortInfo::availablePorts()) + ports << port.portName(); + + static QRegularExpression re( "[^\\d]"); + std::sort(ports.begin(), ports.end(), [](QString p1, QString p2) + { + return p1.remove(re).toInt() < p2.remove(re).toInt(); + }); + + return ports; +} + +#endif // SERIALPORTUTILS_H From e4bd0a2cedc9f2e13ad9186c457ce816d5257f8f Mon Sep 17 00:00:00 2001 From: sanny32 Date: Wed, 4 Dec 2024 11:26:25 +0300 Subject: [PATCH 04/10] Adding modbus tcp connection address --- omodsim/connectiondetails.h | 7 ++- omodsim/controls/mainstatusbar.cpp | 2 +- omodsim/dialogs/dialogselectserviceport.cpp | 33 ++++++++++-- omodsim/dialogs/dialogselectserviceport.h | 5 +- omodsim/dialogs/dialogselectserviceport.ui | 59 ++++++++------------- omodsim/mainwindow.cpp | 2 +- omodsim/menuconnect.cpp | 2 +- 7 files changed, 64 insertions(+), 46 deletions(-) diff --git a/omodsim/connectiondetails.h b/omodsim/connectiondetails.h index 337aa33..3aeeab3 100644 --- a/omodsim/connectiondetails.h +++ b/omodsim/connectiondetails.h @@ -14,15 +14,18 @@ struct TcpConnectionParams { quint16 ServicePort = 502; - const QString IPAddress = "0.0.0.0"; + QString IPAddress = "0.0.0.0"; void normalize() { + const auto addr = QHostAddress(IPAddress); + IPAddress = addr.isNull() ? "0.0.0.0" : addr.toString(); ServicePort = qMax(1, ServicePort); } TcpConnectionParams& operator=(const TcpConnectionParams& params) { + IPAddress = params.IPAddress; ServicePort = params.ServicePort; return *this; } @@ -43,6 +46,7 @@ Q_DECLARE_METATYPE(TcpConnectionParams) inline QDataStream& operator <<(QDataStream& out, const TcpConnectionParams& params) { out << params.ServicePort; + out << params.IPAddress; return out; } @@ -55,6 +59,7 @@ inline QDataStream& operator <<(QDataStream& out, const TcpConnectionParams& par inline QDataStream& operator >>(QDataStream& in, TcpConnectionParams& params) { in >> params.ServicePort; + in >> params.IPAddress; params.normalize(); return in; } diff --git a/omodsim/controls/mainstatusbar.cpp b/omodsim/controls/mainstatusbar.cpp index 10d0e89..379e1da 100644 --- a/omodsim/controls/mainstatusbar.cpp +++ b/omodsim/controls/mainstatusbar.cpp @@ -107,7 +107,7 @@ void MainStatusBar::updateConnectionInfo(QLabel* label, const ConnectionDetails& switch(cd.Type) { case ConnectionType::Tcp: - label->setText(QString(tr("Modbus/TCP Srv: %1")).arg(cd.TcpParams.ServicePort)); + label->setText(QString(tr("TCP/IP %1:%2")).arg(cd.TcpParams.IPAddress, QString::number(cd.TcpParams.ServicePort))); break; case ConnectionType::Serial: diff --git a/omodsim/dialogs/dialogselectserviceport.cpp b/omodsim/dialogs/dialogselectserviceport.cpp index 8e33d9c..6da7bb4 100644 --- a/omodsim/dialogs/dialogselectserviceport.cpp +++ b/omodsim/dialogs/dialogselectserviceport.cpp @@ -1,3 +1,4 @@ +#include #include "dialogselectserviceport.h" #include "ui_dialogselectserviceport.h" @@ -6,14 +7,37 @@ /// \param port /// \param parent /// -DialogSelectServicePort::DialogSelectServicePort(quint16& port, QWidget *parent) +DialogSelectServicePort::DialogSelectServicePort(TcpConnectionParams& params, QWidget *parent) : QFixedSizeDialog(parent) , ui(new Ui::DialogSelectServicePort) - ,_port(port) + ,_params(params) { ui->setupUi(this); ui->lineEditPort->setInputRange(0, 65535); - ui->lineEditPort->setValue(_port); + ui->lineEditPort->setValue(params.ServicePort); + + ui->comboBoxIp->addItem("0.0.0.0"); + for(auto&& nic : QNetworkInterface::allInterfaces()) + { + if(!(nic.flags() & QNetworkInterface::IsRunning)) + { + continue; + } + + for(auto&& entry : nic.addressEntries()) + { + const auto addr = entry.ip(); + + if(addr.isNull() || addr.isMulticast() || addr.protocol() != QAbstractSocket::IPv4Protocol) + { + continue; + } + + ui->comboBoxIp->addItem(addr.toString()); + } + } + + ui->comboBoxIp->setCurrentText(_params.IPAddress); } /// @@ -29,6 +53,7 @@ DialogSelectServicePort::~DialogSelectServicePort() /// void DialogSelectServicePort::accept() { - _port = ui->lineEditPort->value(); + _params.ServicePort = ui->lineEditPort->value(); + _params.IPAddress = ui->comboBoxIp->currentText(); QFixedSizeDialog::accept(); } diff --git a/omodsim/dialogs/dialogselectserviceport.h b/omodsim/dialogs/dialogselectserviceport.h index 27ef3de..fcb89c6 100644 --- a/omodsim/dialogs/dialogselectserviceport.h +++ b/omodsim/dialogs/dialogselectserviceport.h @@ -2,6 +2,7 @@ #define DIALOGSELECTSERVICEPORT_H #include "qfixedsizedialog.h" +#include "connectiondetails.h" namespace Ui { class DialogSelectServicePort; @@ -12,14 +13,14 @@ class DialogSelectServicePort : public QFixedSizeDialog Q_OBJECT public: - explicit DialogSelectServicePort(quint16& port, QWidget *parent = nullptr); + explicit DialogSelectServicePort(TcpConnectionParams& params, QWidget *parent = nullptr); ~DialogSelectServicePort(); void accept() override; private: Ui::DialogSelectServicePort *ui; - quint16& _port; + TcpConnectionParams& _params; }; #endif // DIALOGSELECTSERVICEPORT_H diff --git a/omodsim/dialogs/dialogselectserviceport.ui b/omodsim/dialogs/dialogselectserviceport.ui index 2282a94..e88cfc7 100644 --- a/omodsim/dialogs/dialogselectserviceport.ui +++ b/omodsim/dialogs/dialogselectserviceport.ui @@ -6,40 +6,20 @@ 0 0 - 240 + 328 116 - Select Service Port + Select Service IP Address and Port - - - Modbus/TCP Service Port + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - Qt::AlignCenter - - - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - + @@ -58,18 +38,25 @@ - - - - Qt::Horizontal + + + + Modbus/TCP Service Port - - - 40 - 20 - + + Qt::AlignCenter - + + + + + + + + + Service IP Address + + diff --git a/omodsim/mainwindow.cpp b/omodsim/mainwindow.cpp index 3b01e77..1b294ee 100644 --- a/omodsim/mainwindow.cpp +++ b/omodsim/mainwindow.cpp @@ -453,7 +453,7 @@ void MainWindow::on_connectAction(ConnectionDetails& cd) { case ConnectionType::Tcp: { - DialogSelectServicePort dlg(cd.TcpParams.ServicePort, this); + DialogSelectServicePort dlg(cd.TcpParams, this); if(dlg.exec() == QDialog::Accepted) _mbMultiServer.connectDevice(cd); } break; diff --git a/omodsim/menuconnect.cpp b/omodsim/menuconnect.cpp index a036d4a..558e319 100644 --- a/omodsim/menuconnect.cpp +++ b/omodsim/menuconnect.cpp @@ -79,7 +79,7 @@ bool MenuConnect::canConnect(const ConnectionDetails& cd) { if(c.Type != cd.Type) continue; if(c.Type == ConnectionType::Tcp || - (c.Type == ConnectionType::Serial && c.SerialParams.PortName == cd.SerialParams.PortName)) + (c.Type == ConnectionType::Serial && c.SerialParams.PortName == cd.SerialParams.PortName)) { return true; } From 149dbb250a5d90cea4f6a7691f8191bae856138a Mon Sep 17 00:00:00 2001 From: sanny32 Date: Wed, 4 Dec 2024 14:39:01 +0300 Subject: [PATCH 05/10] Multiserver with some modbus tcp servers --- omodsim/controls/mainstatusbar.cpp | 17 ++++---- omodsim/menuconnect.cpp | 62 +++++++++++++++++++++++------- omodsim/modbusmultiserver.cpp | 4 +- 3 files changed, 58 insertions(+), 25 deletions(-) diff --git a/omodsim/controls/mainstatusbar.cpp b/omodsim/controls/mainstatusbar.cpp index 379e1da..ae2585a 100644 --- a/omodsim/controls/mainstatusbar.cpp +++ b/omodsim/controls/mainstatusbar.cpp @@ -45,7 +45,7 @@ MainStatusBar::MainStatusBar(const ModbusMultiServer& server, QWidget* parent) auto label = new QLabel(this); label->setFrameShadow(QFrame::Sunken); label->setFrameShape(QFrame::Panel); - label->setMinimumWidth(120); + label->setMinimumWidth(80); label->setProperty("ConnectionDetails", QVariant::fromValue(cd)); updateConnectionInfo(label, cd); @@ -60,9 +60,8 @@ MainStatusBar::MainStatusBar(const ModbusMultiServer& server, QWidget* parent) { if(cd == label->property("ConnectionDetails").value()) { - _labels.removeOne(label); removeWidget(label); - delete label; + _labels.removeOne(label); break; } @@ -107,15 +106,15 @@ void MainStatusBar::updateConnectionInfo(QLabel* label, const ConnectionDetails& switch(cd.Type) { case ConnectionType::Tcp: - label->setText(QString(tr("TCP/IP %1:%2")).arg(cd.TcpParams.IPAddress, QString::number(cd.TcpParams.ServicePort))); + label->setText(QString(tr("Modbus/TCP Srv %1:%2")).arg(cd.TcpParams.IPAddress, QString::number(cd.TcpParams.ServicePort))); break; case ConnectionType::Serial: - label->setText(QString(tr("Port %1:%2:%3:%4:%5 ")).arg(cd.SerialParams.PortName, - QString::number(cd.SerialParams.BaudRate), - QString::number(cd.SerialParams.WordLength), - Parity_toString(cd.SerialParams.Parity), - QString::number(cd.SerialParams.StopBits))); + label->setText(QString(tr("Port %1:%2:%3:%4:%5")).arg(cd.SerialParams.PortName, + QString::number(cd.SerialParams.BaudRate), + QString::number(cd.SerialParams.WordLength), + Parity_toString(cd.SerialParams.Parity), + QString::number(cd.SerialParams.StopBits))); break; } } diff --git a/omodsim/menuconnect.cpp b/omodsim/menuconnect.cpp index 558e319..3372a6b 100644 --- a/omodsim/menuconnect.cpp +++ b/omodsim/menuconnect.cpp @@ -13,31 +13,66 @@ MenuConnect::MenuConnect(MenuType type, ModbusMultiServer& server, QWidget *pare ,_menuType(type) ,_mbMultiServer(server) { - addAction(tr("Modbus/TCP Srv"), ConnectionType::Tcp, QString()); - - for(auto&& port: getAvailableSerialPorts()) + if(type == MenuType::ConnectMenu) { - const auto text = QString(tr("Port %1")).arg(port); - addAction(text, ConnectionType::Serial, port); + addAction(tr("Modbus/TCP Srv"), ConnectionType::Tcp, QString()); + for(auto&& port: getAvailableSerialPorts()) + { + const auto text = QString(tr("Port %1")).arg(port); + addAction(text, ConnectionType::Serial, port); + } } - connect(&_mbMultiServer, &ModbusMultiServer::connected, this, [&](const ConnectionDetails&) + connect(&_mbMultiServer, &ModbusMultiServer::connected, this, [&](const ConnectionDetails& cd) { - for(auto&& a : actions()) + if(_menuType == MenuType::DisconnectMenu) { - const auto data = a->data().value>(); - const bool isConnected = _mbMultiServer.isConnected(data.first, data.second); - a->setEnabled(_menuType == ConnectMenu ? !isConnected : isConnected); + switch(cd.Type) + { + case ConnectionType::Tcp: + { + const auto port = QString("%1:%2").arg(cd.TcpParams.IPAddress, QString::number(cd.TcpParams.ServicePort)); + addAction(QString(tr("Modbus/TCP Srv %1")).arg(port), ConnectionType::Tcp, port); + } + break; + + case ConnectionType::Serial: + addAction(QString(tr("Port %1")).arg(cd.SerialParams.PortName), ConnectionType::Serial, cd.SerialParams.PortName); + break; + } + } + else + { + for(auto&& a : actions()) + { + const auto data = a->data().value>(); + const bool isConnected = _mbMultiServer.isConnected(data.first, data.second); + a->setEnabled(_menuType == ConnectMenu ? !isConnected : isConnected); + } } }); - connect(&_mbMultiServer, &ModbusMultiServer::disconnected, this, [&](const ConnectionDetails&) + connect(&_mbMultiServer, &ModbusMultiServer::disconnected, this, [&](const ConnectionDetails& cd) { for(auto&& a : actions()) { const auto data = a->data().value>(); - const bool isConnected = _mbMultiServer.isConnected(data.first, data.second); - a->setEnabled(_menuType == ConnectMenu ? !isConnected : isConnected); + if(_menuType == MenuType::DisconnectMenu) + { + const auto port = (data.first == ConnectionType::Tcp) ? + QString("%1:%2").arg(cd.TcpParams.IPAddress, QString::number(cd.TcpParams.ServicePort)) : + cd.SerialParams.PortName; + + if(data.first == cd.Type && data.second == port) + { + removeAction(a); + } + } + else + { + const bool isConnected = _mbMultiServer.isConnected(data.first, data.second); + a->setEnabled(_menuType == ConnectMenu ? !isConnected : isConnected); + } } }); } @@ -140,5 +175,4 @@ void MenuConnect::addAction(const QString& text, ConnectionType type, const QStr const auto data = QPair(type, port); action->setData(QVariant::fromValue(data)); - action->setEnabled(_menuType == ConnectMenu); } diff --git a/omodsim/modbusmultiserver.cpp b/omodsim/modbusmultiserver.cpp index b3ca682..66f4ee9 100644 --- a/omodsim/modbusmultiserver.cpp +++ b/omodsim/modbusmultiserver.cpp @@ -94,8 +94,8 @@ QSharedPointer ModbusMultiServer::findModbusServer(ConnectionType for(auto&& s : _modbusServerList) { const auto cd = s->property("ConnectionDetails").value(); - if((cd.Type == ConnectionType::Tcp && type == ConnectionType::Tcp) || - (cd.Type == ConnectionType::Serial && type == ConnectionType::Serial && cd.SerialParams.PortName == port)) + if((cd.Type == ConnectionType::Tcp && type == ConnectionType::Tcp && port == QString("%1:%2").arg(cd.TcpParams.IPAddress, QString::number(cd.TcpParams.ServicePort))) || + (cd.Type == ConnectionType::Serial && type == ConnectionType::Serial && port == cd.SerialParams.PortName)) { return s; } From d009b7e874a3e0532708a8211c8a0df165c71ec6 Mon Sep 17 00:00:00 2001 From: sanny32 Date: Wed, 4 Dec 2024 14:39:40 +0300 Subject: [PATCH 06/10] Update version --- omodsim/omodsim.pro | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/omodsim/omodsim.pro b/omodsim/omodsim.pro index 2075fb1..115eb04 100644 --- a/omodsim/omodsim.pro +++ b/omodsim/omodsim.pro @@ -4,7 +4,7 @@ CONFIG += c++17 CONFIG -= debug_and_release CONFIG -= debug_and_release_target -VERSION = 1.6.0 +VERSION = 1.7.0 QMAKE_TARGET_PRODUCT = "Open ModSim" QMAKE_TARGET_DESCRIPTION = "An Open Source Modbus Slave (Server) Utility" From 8deee7b784191f5d6b18049cb974f0d780c13f47 Mon Sep 17 00:00:00 2001 From: sanny32 Date: Wed, 4 Dec 2024 16:33:56 +0300 Subject: [PATCH 07/10] update translation --- omodsim/translations/omodsim_ru.ts | 55 ++++++++++++++++++++++-------- 1 file changed, 40 insertions(+), 15 deletions(-) diff --git a/omodsim/translations/omodsim_ru.ts b/omodsim/translations/omodsim_ru.ts index 27095c3..ec3bc54 100644 --- a/omodsim/translations/omodsim_ru.ts +++ b/omodsim/translations/omodsim_ru.ts @@ -4,12 +4,14 @@ AddressBaseComboBox - + + 0-based 0-первый - + + 1-based 1-первый @@ -588,17 +590,26 @@ DialogSelectServicePort - Select Service Port - Установка порта + Установка порта - + + Select Service IP Address and Port + + + + Modbus/TCP Service Port Modbus/TCP порт + Service IP Address + + + + 502 @@ -920,7 +931,7 @@ Length: %2 Указана недопустимая длина данных - + Address Base: %1 Start Address: %2 Length: %3 @@ -929,7 +940,7 @@ Length: %3 Количество: %3 - + Device Id: %1 MODBUS Point Type: %2 @@ -980,14 +991,22 @@ MODBUS Point Type: Маркер - + + Modbus/TCP Srv %1:%2 + + + + + Port %1:%2:%3:%4:%5 + Порт %1:%2:%3:%4:%5 + + Modbus/TCP Srv: %1 - Modbus/TCP сервер: %1 + Modbus/TCP сервер: %1 - Port %1:%2:%3:%4:%5 - Порт %1:%2:%3:%4:%5 + Порт %1:%2:%3:%4:%5 Port %1: %2 @@ -1458,17 +1477,23 @@ MODBUS Point Type: MenuConnect - - + + Modbus/TCP Srv Modbus/TCP сервер - - + + + Port %1 Порт %1 + + + Modbus/TCP Srv %1 + + ModbusMessageWidget From 904dfe9ce92d95874a8b67f4355579f4e5c8c08c Mon Sep 17 00:00:00 2001 From: sanny32 Date: Wed, 4 Dec 2024 16:34:31 +0300 Subject: [PATCH 08/10] Update menu translation --- omodsim/menuconnect.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/omodsim/menuconnect.cpp b/omodsim/menuconnect.cpp index 3372a6b..161ec7e 100644 --- a/omodsim/menuconnect.cpp +++ b/omodsim/menuconnect.cpp @@ -91,7 +91,10 @@ void MenuConnect::changeEvent(QEvent* event) switch(data.first) { case ConnectionType::Tcp: - a->setText(tr("Modbus/TCP Srv")); + if(data.second.isEmpty()) + a->setText(tr("Modbus/TCP Srv")); + else + a->setText(QString(tr("Modbus/TCP Srv %1").arg(data.second))); break; case ConnectionType::Serial: a->setText(QString(tr("Port %1")).arg(data.second)); From 7a58fdf5898c44182674ac8baaffd502bd21e711 Mon Sep 17 00:00:00 2001 From: sanny32 Date: Wed, 4 Dec 2024 16:35:00 +0300 Subject: [PATCH 09/10] update translation --- omodsim/translations/omodsim_ru.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/omodsim/translations/omodsim_ru.ts b/omodsim/translations/omodsim_ru.ts index ec3bc54..9010c33 100644 --- a/omodsim/translations/omodsim_ru.ts +++ b/omodsim/translations/omodsim_ru.ts @@ -1478,19 +1478,20 @@ MODBUS Point Type: MenuConnect - + Modbus/TCP Srv Modbus/TCP сервер - + Port %1 Порт %1 + Modbus/TCP Srv %1 From 3eae75bce1b41f5aab7c81fa44abca6e2050ed7c Mon Sep 17 00:00:00 2001 From: sanny32 Date: Wed, 4 Dec 2024 16:38:32 +0300 Subject: [PATCH 10/10] Update translation --- omodsim/translations/omodsim_ru.qm | Bin 29019 -> 29241 bytes omodsim/translations/omodsim_ru.ts | 10 +++++----- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/omodsim/translations/omodsim_ru.qm b/omodsim/translations/omodsim_ru.qm index 0a7748981f882ec476e441b66b21e81bddc7fbc6..c5413b9978a70ad175b5173076b73400f3cf3587 100644 GIT binary patch delta 2478 zcmZWrYgAKL7XI$dJxOkELO_L}NC;>UMBWbrq6kz_-mg}zj|u@1K^=i;6*a!!Z|Styl&H9i0d`7OVBq+B&s5Rcl>E)bX`k)3NPr%&I@8Kawx!+_U%D``h2% zH&<_R9p7`CjP?rv!U5GIC;Gih7y%5MOc)KQhdNQyOgI`C9#3c?ECtw1U}XQ2&Ks`) zY29=r7RdS(81osBzm{CtooGD-6r2X)?*gy>0|@MaVnP^T_xlNo$@F8`YA9;@@n2B% z5Du@0PS&{>h2fYzW5$x}2V$Cyd<);er{6(?R&EfN&**KJqi> zFJKNQ-G8|LdF> zeHR(qiiQK8F34ymhxwb48NHSww;+FBCop&jUgH(OI3M}%oWWj$DHCi!B*T;=9e~#c zO#RFOBuSXQri}^_g{n&ffJARJ52AhLIot{O9`KoiyFZ--rn}%jmM>|o;yCveK#@PE z38nK#UhBOI$h^p#6DWuul1EH<_jZTU@FP*=| z<^tMjP7E2&_kOb*2x@cUsKfHFyup4|VT`A6(;F2dVrqd&T7{*SSOyfYyhUa5JEM60 z426+*R59cBCBQvVvG9T$rR7kpZ<$J>HYn=d-y$8BDC8zOm;HlcdkbOuC`BV^-~G0t zC*=_FyI676NKG@oQ5bla!k#iqcyW&%2}1r?o5|2aDA;>~!rdoqnn;93Jr{ zXv%m-m?0eQAiY`k3LR%|6OXCF35^TwcM07~Xdj1!(<$M=e>M7w^16!Xy11SA~)z?tMxfj{?P1Tfe zA8Y*JA=R^$y*rB53B7EWn*4ipvgQpGU(yrSwv7r9&a<}bW+bDumv!XcCtcUF<5#|* zLJx9c;!@@q_8v8kgE>+PfaLkiF^3#^i>zxM2`tIRdVU~bWmm}$1cSJb-L~zew1>)i z=40dP!5U8P)`Z6r~ZE4Mt%C7+4P z9cw7)A*+;~&DViZ)0Lk#&LWX#C@*{V0p@ec=PrqWRZuZYe>WUZ>B2YD2-~O1{3rPx zU!ckxSwt#|4p3R!N$rsqRawzRlG#nw+*LPeS`1cgJVfjKf%19g!>yDbFhlr3b<{DM z94;TL6Zq96vDxaBeanF0e4$WfZ3m`H+2vp{$cWHSPsjRP5i?JWA0rUsNxD^X&`i>T@?NramPO-v9=Y^x<`fHIit=q-gcj$a{ zo4EVgBVfV=u_Gs(BCQpFTuPK_%EewYt+RHD_Z(G}l39F^zM1-Sr$*X89+0moJ?&{d zn!^7^5r18pl60y`Os%H;@lL?i?!*DIW?|iPnnpIwhOT}d>oj#0gGe-QXzD8Ie5pax z$f$-hlQb=7NqhlgHFr})s>^&ynGr!#+*1;llmJ*EdC*`*LcNsyXdq3kJ}F~E7KVWv zCt2Hx*U074?0`!&ozF|jT}wSQW4nfA)Ii@@uty5T7|NM-)IpdDMOM6tTa=N!F2 z3w5(5(X?Zn45k}udM7(u|r>Uk5m}?Kwq)k3>a$k z>r@m}rdBWCBGraG*Ec*aqdDQL-}*68mYSvC)8I=ll2rXiS=E%`-}H_aqE6+m@AfIA zpik{?sH}D#i8DvWnWN&&(XEB?J3P36-!3t|xa6gU N+wa`B-pQ*r{tvariu3>g delta 2341 zcmX|CX;c(v7QJ0vU++zevbZ(~voO>GbXL0oV{1kt#U0y1i}k5Mx^U&+;@6~^G~1|>SY}`8|t&fpk9#64*)** zAlEHn;PsH}KOxtyZp>c^`2>SIiXopT4(<-Q-A1f|{QVdp#t8W#;|%Ew;WLNlQXrzZ zZollt{6i4atKmX{FGLw%6!#y9no~f(bT`J=Lp1P!(+1JTb!Q#Kd1jDeKrdr&K=U!| z`;P-*7Z7!dFA8Wx^wEw4hQP6}18b1Hu?>(TkQ(|SAdNt3bT#99x^d8Aq;1X*0=jx2 zt)2l#w<3MeYG%-i?0GFfx9%7xse$+El`mAjE)8;qmr&3OXY-XE^9z)m*? zYuy-9r;2acMg7*Q(jzw07$vF_&*^|NMbf#(|EfB6U>}gTPxa{0Z6GRM^{e#-Q}~l) z>a`L`S4*~dQqPs8f!^&vpG>J#>}Bpg(yEF9A4F!_me zEa_vqXui~(^o&MZC$-(b512c-F)U8H(ejkV%33bn60-r*BsUH?Al<)O3xp=Pv45iU zV(SE;SEBT0KGD=o-Fa&x;6FocjonF$o>%vcUdJMCQajdBYd}404T}{pRz2}663cq1 zo^s~`;GL*m*zUMHLwF50nBt<-VjsIKZQ4aC%3^){^GfjjE6&V!VD zpZW*uc$T4`+~ol?8DAy4UlcEAe_zSoNRh|vK1pJG<%$%_8?{2Ni&ofbd*!;c*ThTm zktVv%5hgc%b%)9(%O?#Uw10-&w#3B+9F$Kx?ZCL1@;T%0nVCkux~vuG9WLL;b)avM z&^%=Q{98n5Ci}qeec_n&0o{}>VoMn?Zik59&p6%Ii-f3VD%C2Sj|15!TSSV3_ubBl z*(*B($#G(C)(N0stC-h5nvH7{MXrm#&{zec=p`|>R;(R41(cx7 zRV3YgrKY9+8hv$Fb7or}&@)YQvFk&?mZN#=kqG2RYlVX<$2hcRdnHHPRc-ne#*P0; zJ31tveu`?;793+IM6_yW<$ps1d1+^_yh&MiYyW(Z_oIg^KM6mTQF$kP?J>Hj6PzR- zpX=hK54pES=iJMZ4bbT_4!vY)Ug>7uJxQgZt7xJkwi8OSrtjcjy;!`0y3N#!{hZ7_ zM(ORBSm2@W^n*WJ1z7&7k6E#hJvmFCbRmIE!t@2lSlGyPWxK{VI6+_g`WY~+U4L&W z1v1Rh-?!PhyIudNxrlaZ&_5Yj$xdxo?rN;A5kDKI{T#){%rF#=r1sHXhB?na0Xn(d z*jX_wEPo4xz);rOp;x(~e6ANMR~pI}asP}FhHZkino?|NICqgQJ!5#_)RW8`qb4na zcHd>xFDV4D!srv8OdWd})5=&MRh+Tl*iH06q|P{_-vv(LiN-l!av>$pxO^!2Wo}aT zXss^4Q^xWed~d%tH-_Z7F?5@8!#z(<{iVj**Ag&1$GGcXCf0eZ@pvttXPS-8H~BoN z!T9Y?c0nJN@zKdP*7ddt&+HsP^(N_SwrT%blg_DT{+CSVl6;D6H-)C2V!Z370p8aU zh@c&&a7P!`?1?G4>IKK@V>cRCn=-=rZFIa)rs{m8kx5Fa&T0sGWvVWiPW5Lf+jV_X zqh6RUZ~g|Du*4kXyg@hRm_xU2WRh*>$hRtfKoxV|@X;JP>&(U8R6V!GTv>aFGvJ-M zdP4xuy*1bE-@w^^M6u|7x~J89$VVC}M!AQ%q>5x~Ji2~LvnHh|@p`Ki^jev!x4I_( z#iQ%a5CKfvF!@9%u4g-c2VX5g~^? zRUuWuzRJ5Hrob5Z!v_0rCpxDun4Vu!6gFmPrhoRL#WDUiyOI~%O-YX(s|rze#r6s0 s0sr5&duJ|KRLngwwul&8WQ;8;#x}^`UuhrW+xScDYM;id*;B3m1I77p00000 diff --git a/omodsim/translations/omodsim_ru.ts b/omodsim/translations/omodsim_ru.ts index 9010c33..3a056e5 100644 --- a/omodsim/translations/omodsim_ru.ts +++ b/omodsim/translations/omodsim_ru.ts @@ -596,7 +596,7 @@ Select Service IP Address and Port - + Установка IP адреса и порта @@ -606,7 +606,7 @@ Service IP Address - + IP адрес @@ -993,12 +993,12 @@ MODBUS Point Type: Modbus/TCP Srv %1:%2 - + Modbus/TCP сервер %1:%2 Port %1:%2:%3:%4:%5 - Порт %1:%2:%3:%4:%5 + Порт %1:%2:%3:%4:%5 Modbus/TCP Srv: %1 @@ -1493,7 +1493,7 @@ MODBUS Point Type: Modbus/TCP Srv %1 - + Modbus/TCP сервер %1