Revision control
++ // Copyright (C) 2023 The Qt Company Ltd.
++ // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
++
++ /*! \example modbus/server
++ \title Modbus Server
++ \ingroup qtserialbus-examples
++ \examplecategory Connectivity
++
++ \brief The example implements a Modbus server application.
++
++ The example acts as Modbus server. It receives standard Modbus requests,
++ adjusts its internal states based on the request and responds with the
++ appropriate reply.
++
++ This example must be used in conjunction with the
++ \l {modbus/client}{Modbus Client example}.
++ This example should be started and put into the listen state before the
++ Modbus client example is started. Subsequent interactions between the two
++ examples use the Modbus protocol.
++
++ Key classes used in this example:
++
++ \list
++ \li \l QModbusServer
++ \li \l QModbusDataUnit
++ \endlist
++
++ \image ../images/modbusserver.png
++ {Modbus Server with connection settings, Coils and Discrete Inputs
++ checkboxes, Input Registers and Holding Registers columns}
++
++ \section1 Creating a QModbusServer
++
++ An instance of \l QModbusServer is required to perform any communication.
++ Depending on the specified connection type, the example can instantiate a
++ \l QModbusRtuSerialServer (for serial communication) or a
++ \l QModbusTcpServer (for TCP-based communication).
++
++ \snippet modbus/server/mainwindow.cpp create_server_0
++
++ Once the server is created, the register map is set using
++ \l QModbusServer::setMap() method. This register map is used by client
++ applications to read and write server data.
++
++ \snippet modbus/server/mainwindow.cpp create_server_1
++
++ After that the communication parameters and the server address are
++ specified. The communication parameters depend on the communication type:
++
++ \snippet modbus/server/mainwindow.cpp create_server_2
++
++ After the server is created and all the parameters are specified, use
++ \l QModbusServer::connectDevice() to connect to Modbus network.
++
++ \section1 Changing Local Values
++
++ The example allows to change values of all supported
++ \l {QModbusDataUnit::RegisterType}{register types} by using the provided
++ combo boxes or line edits. Once the value is updated in the UI, the
++ \l QModbusServer::setData() method is used to update the actual value on
++ the server:
++
++ \snippet modbus/server/mainwindow.cpp update_data_locally
++
++ \section1 Handling Remote Writes
++
++ The Modbus clients are capable of updating \l {QModbusDataUnit::}{Coils}
++ and \l {QModbusDataUnit::}{HoldingRegisters} by sending write requests.
++ Once the value is updated on the server side using such request, a
++ \l QModbusServer::dataWritten() signal is emitted.
++
++ \snippet modbus/server/mainwindow.cpp connect_data_written
++
++ The Modbus server example connects to this signal, extracts the updated
++ values and updates the UI accordingly:
++
++ \snippet modbus/server/mainwindow.cpp update_data_from_remote
++
++ \include examples-run.qdocinc
++ */