QModbusPdu Class

QModbusPdu 是一个抽象容器类,其中包含存储在 Modbus ADU 中的功能代码和有效载荷。更多

头文件: #include <QModbusPdu>
CMake.QModbusPdu find_package(Qt6 REQUIRED COMPONENTS SerialBus)
target_link_libraries(mytarget PRIVATE Qt6::SerialBus)
qmake: QT += serialbus
继承于

QModbusRequestQModbusResponse

公共类型

enum ExceptionCode { IllegalFunction, IllegalDataAddress, IllegalDataValue, ServerDeviceFailure, Acknowledge, …, ExtendedException }
enum FunctionCode { Invalid, ReadCoils, ReadDiscreteInputs, ReadHoldingRegisters, ReadInputRegisters, …, UndefinedFunctionCode }

公共函数

QModbusPdu()
virtual ~QModbusPdu()
QByteArray data() const
qint16 dataSize() const
void decodeData(Args &&... data) const
void encodeData(Args... data)
QModbusPdu::ExceptionCode exceptionCode() const
QModbusPdu::FunctionCode functionCode() const
bool isException() const
bool isValid() const
void setData(const QByteArray &data)
virtual void setFunctionCode(QModbusPdu::FunctionCode code)
qint16 size() const

静态公共成员

const quint8 ExceptionByte

保护函数

QModbusPdu(QModbusPdu::FunctionCode code, const QByteArray &data)
QModbusPdu(const QModbusPdu &other)
QModbusPdu &operator=(const QModbusPdu &other)
QDataStream &operator<<(QDataStream &stream, const QModbusPdu &pdu)
QDebug operator<<(QDebug debug, const QModbusPdu &pdu)

详细说明

该类可访问 Modbus 应用协议规范 1.1b 中定义的原始 Modbus 协议数据包。

成员类型文档

enum QModbusPdu::ExceptionCode

该枚举描述了 Modbus 异常代码所定义的所有可能的错误条件。服务器在检查请求回复中的相应错误条件后会设置它们,客户端必须对它们进行解码,才能对异常代码进行操作。

常量说明
QModbusPdu::IllegalFunction0x01设备不支持功能代码。
QModbusPdu::IllegalDataAddress0x02查询中接收的数据地址不是 Modbus 服务器允许的地址。
QModbusPdu::IllegalDataValue0x03请求数据字段中包含的值不是 Modbus 服务器允许的值。
QModbusPdu::ServerDeviceFailure0x04服务器在尝试执行请求的操作时发生了不可恢复的错误。
QModbusPdu::Acknowledge0x05与编程命令结合使用。
QModbusPdu::ServerDeviceBusy0x06服务器正在处理持续时间较长的程序命令。
QModbusPdu::NegativeAcknowledge0x07服务器无法执行查询中收到的程序功能。编程请求不成功时会返回此代码。客户端应请求服务器提供诊断或错误信息。
QModbusPdu::MemoryParityError0x08表示扩展文件区未能通过一致性检查。与功能代码 20 和 21 结合使用。异常代码不涉及传输线路的奇偶校验设置,而只涉及服务器内部的文件记录存储器。
QModbusPdu::GatewayPathUnavailable0x0A表示网关无法为处理请求分配从输入端口到输出端口的内部通信路径。
QModbusPdu::GatewayTargetDeviceFailedToRespond0x0B表示未从网关后面的目标设备获得响应。通常这意味着目标设备在网络上不在线。
QModbusPdu::ExtendedException0xFF根据 Modbus 规范,这是一种扩展异常。一般情况下,该代码用于描述另有说明的异常。

enum QModbusPdu::FunctionCode

定义服务器要求的功能代码和隐式操作类型。并非所有 Modbus 设备都能处理同一组功能代码。

常数说明
QModbusPdu::Invalid0x00由默认构造函数设置,请勿使用。
QModbusPdu::ReadCoils0x01要求设备提供一个或多个线圈的状态。
QModbusPdu::ReadDiscreteInputs0x02要求设备提供一个或多个输入寄存器的状态。
QModbusPdu::ReadHoldingRegisters0x03要求设备提供一个或多个保持寄存器值的状态。
QModbusPdu::ReadInputRegisters0x04要求设备提供一个或多个输入寄存器值的状态。
QModbusPdu::WriteSingleCoil0x05请求在设备上写入单个线圈。
QModbusPdu::WriteSingleRegister0x06要求在设备上写入单个保持寄存器。
QModbusPdu::ReadExceptionStatus0x07请求设备上八个异常状态输出的状态。
QModbusPdu::Diagnostics0x08用于提供一系列测试,以检查客户服务器通信系统,或检查内部系统。
QModbusPdu::GetCommEventCounter0x0B从设备的通信事件计数器请求状态字和事件计数。
QModbusPdu::GetCommEventLog0x0C从设备请求状态字、事件计数、报文计数和一个事件字节字段。
QModbusPdu::WriteMultipleCoils0x0F请求在设备上写入一个或多个线圈。
QModbusPdu::WriteMultipleRegisters0x10请求写入设备上的一个或多个保持寄存器。
QModbusPdu::ReportServerId0x11请求描述设备的类型、当前状态和其他特定信息。
QModbusPdu::ReadFileRecord0x14请求读取文件记录。
QModbusPdu::WriteFileRecord0x15请求写入文件记录。
QModbusPdu::MaskWriteRegister0x16使用 AND 或 OR 掩码组合以及寄存器的当前内容,请求修改指定保持寄存器的内容。
QModbusPdu::ReadWriteMultipleRegisters0x17请求查看一个或多个保持寄存器的状态,同时写入设备上的一个或多个保持寄存器。
QModbusPdu::ReadFifoQueue0x18请求读取远程设备中先进先出(FIFO)寄存器队列的内容。
QModbusPdu::EncapsulatedInterfaceTransport0x2B请参阅 Modbus 规范附件 A。
QModbusPdu::UndefinedFunctionCode0x100请勿使用。

成员函数文档

[constexpr noexcept] QModbusPdu::QModbusPdu()

构造一个无效的 QModbusPdu。

[protected] QModbusPdu::QModbusPdu(QModbusPdu::FunctionCode code, const QByteArray &data)

构造一个 QModbusPdu,其功能代码设置为code ,有效载荷设置为data 。预计数据已按大二进制字节顺序存储。

[noexcept protected] QModbusPdu::QModbusPdu(const QModbusPdu &other)

构造一个 QModbusPdu,它是other 的副本。

[virtual noexcept] QModbusPdu::~QModbusPdu()

销毁QModbusPdu.

QByteArray QModbusPdu::data() const

返回 PDU 的有效负载(不包括功能代码)。有效负载以大字节顺序存储。

另请参阅 setData()。

qint16 QModbusPdu::dataSize() const

返回 PDU 的数据大小(不包括功能代码)。

template <typename... Args> void QModbusPdu::decodeData(Args &&... data) const

将有效载荷转换为主机内码并读入data 。数据可以是长度可变的参数列表。

QModbusResponsePdu response(QModbusPdu::ReportServerId);
response.encodeData(quint8(0x02), quint8(0x01), quint8(0xff));
quint8 count, id, run;
response.decodeData(&count, &id, &run);

注意: 使用范围仅限于quint8quint16 。这是因为QDataStream 流操作符不仅会追加原始数据,还会追加复杂类型的数据,如大小、计数等。

template <typename... Args> void QModbusPdu::encodeData(Args... data)

将有效载荷设置为data 。数据按大字节顺序转换和存储。

QModbusRequestPdu request(QModbusPdu::ReadCoils);
// starting address and quantity of coils
request.encodeData(quint16(0x0c), quint16(0x0a));

注: 使用范围仅限于quint8quint16 。这是因为QDataStream 流操作符不仅会追加原始数据,还会追加复杂类型的数据,如大小、计数等。

QModbusPdu::ExceptionCode QModbusPdu::exceptionCode() const

返回响应的异常代码。

QModbusPdu::FunctionCode QModbusPdu::functionCode() const

返回 PDU 的功能代码。

另请参阅 setFunctionCode()。

bool QModbusPdu::isException() const

如果 PDU 包含异常代码,则返回 true;否则返回 false。

bool QModbusPdu::isValid() const

如果 PDU 有效,则返回 true;否则返回 false。

如果消息代码在十进制 1 到 255 之间,且 PDU 的复合大小(功能代码 + 数据)不超过 253 字节,则认为 PDU 有效。默认构造的 PDU 无效。

void QModbusPdu::setData(const QByteArray &data)

将 PDU 的函数有效载荷设置为data 。预计数据已按大字节顺序存储。

另请参阅 data() 。

[virtual] void QModbusPdu::setFunctionCode(QModbusPdu::FunctionCode code)

将 PDU 的功能代码设置为code

另请参阅 functionCode() 。

qint16 QModbusPdu::size() const

返回 PDU 的完整大小,包括功能代码和数据大小。

[noexcept protected] QModbusPdu &QModbusPdu::operator=(const QModbusPdu &other)

复制other 并将其赋值给QModbusPdu 对象。

成员变量文档

const quint8 QModbusPdu::ExceptionByte

变量初始化为 0x80。

异常以规定的数据包格式报告。返回给请求客户端的功能代码等于原始功能代码,只是设置了其最显著位。这相当于在原始功能代码的基础上增加了 0x80。

该字段可用于屏蔽原始 Modbus 数据包功能字段中的异常位。

相关非成员

QDataStream &operator<<(QDataStream &stream, const QModbusPdu &pdu)

pdu 写入stream ,并返回对数据流的引用。

QDebug operator<<(QDebug debug, const QModbusPdu &pdu)

将 Modbuspdu 写入debug 数据流。

© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.