QModbusRequest Class

QModbusRequest is a container class containing the function code and payload that is stored inside a Modbus ADU. More...

Header: #include <QModbusRequest>
CMake: find_package(Qt6 REQUIRED COMPONENTS SerialBus)
target_link_libraries(mytarget PRIVATE Qt6::SerialBus)
qmake: QT += serialbus
Inherits: QModbusPdu

Public Types

Public Functions

QModbusRequest()
QModbusRequest(const QModbusPdu &pdu)
QModbusRequest(QModbusPdu::FunctionCode code, Args... data)
QModbusRequest(QModbusPdu::FunctionCode code, const QByteArray &data = QByteArray())

Static Public Members

int calculateDataSize(const QModbusRequest &request)
int minimumDataSize(const QModbusRequest &request)
void registerDataSizeCalculator(QModbusPdu::FunctionCode fc, QModbusRequest::CalcFuncPtr calculator)
QDataStream &operator>>(QDataStream &stream, QModbusRequest &pdu)

Detailed Description

A Modbus request usually consists of a single byte describing the FunctionCode and N bytes of payload

A typical Modbus request can looks like this:

 QModbusRequest request(QModbusRequest::WriteMultipleCoils,
     QByteArray::fromHex("0013000a02cd01"));

Note: When using the constructor taking the QByteArray, please make sure to convert the containing data to big-endian byte order before creating the request.

The same request can be created like this, if the values are known at compile time:

 quint16 startAddress = 19, numberOfCoils = 10;
 quint8 payloadInBytes = 2, outputHigh = 0xcd, outputLow = 0x01;
 QModbusRequest request(QModbusRequest::WriteMultipleCoils, startAddress, numberOfCoils,
     payloadInBytes, outputHigh, outputLow);

Member Type Documentation

[alias] QModbusRequest::CalcFuncPtr

Typedef for a pointer to a custom calculator function with the same signature as QModbusRequest::calculateDataSize.

Member Function Documentation

[constexpr noexcept] QModbusRequest::QModbusRequest()

Constructs an invalid QModbusRequest.

QModbusRequest::QModbusRequest(const QModbusPdu &pdu)

Constructs a copy of pdu.

template <typename... Args> QModbusRequest::QModbusRequest(QModbusPdu::FunctionCode code, Args... data)

Constructs a QModbusRequest with function code set to code and payload set to data. The data is converted and stored in big-endian byte order.

Note: Usage is limited quint8 and quint16 only. This is because QDataStream stream operators will not only append raw data, but also e.g. size, count, etc. for complex types.

[explicit] QModbusRequest::QModbusRequest(QModbusPdu::FunctionCode code, const QByteArray &data = QByteArray())

Constructs a QModbusResponse with function code set to code and payload set to data. The data is expected to be stored in big-endian byte order already.

[static] int QModbusRequest::calculateDataSize(const QModbusRequest &request)

Calculates the expected data size for request based on the request's function code and data. Returns the full size of the request's data part; -1 if the size could not be properly calculated.

See also minimumDataSize and registerDataSizeCalculator.

[static] int QModbusRequest::minimumDataSize(const QModbusRequest &request)

Returns the expected minimum data size for request based on the request's function code; -1 if the function code is not known.

[static] void QModbusRequest::registerDataSizeCalculator(QModbusPdu::FunctionCode fc, QModbusRequest::CalcFuncPtr calculator)

This function registers a user-defined implementation to calculate the request data size for function code fc. It can be used to extend or override the implementation inside QModbusRequest::calculateDataSize().

The CalcFuncPtr is a typedef for a pointer to a custom calculator function with the following signature:

 int myCalculateDataSize(const QModbusRequest &pdu);

Related Non-Members

QDataStream &operator>>(QDataStream &stream, QModbusRequest &pdu)

Reads a pdu from the stream and returns a reference to the stream.

Note: The function might fail to properly stream PDU's with function code QModbusPdu::Diagnostics or QModbusPdu::EncapsulatedInterfaceTransport because of the missing size indicator inside the PDU. In particular this may happen when the PDU is embedded into a stream that doesn't end with the diagnostic/encapsulated request itself.