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 |
继承于 |
公共类型
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) |
成员类型文档
enum QModbusPdu::ExceptionCode
该枚举描述了 Modbus 异常代码所定义的所有可能的错误条件。服务器在检查请求回复中的相应错误条件后会设置它们,客户端必须对它们进行解码,才能对异常代码进行操作。
常量 | 值 | 说明 |
---|---|---|
QModbusPdu::IllegalFunction | 0x01 | 设备不支持功能代码。 |
QModbusPdu::IllegalDataAddress | 0x02 | 查询中接收的数据地址不是 Modbus 服务器允许的地址。 |
QModbusPdu::IllegalDataValue | 0x03 | 请求数据字段中包含的值不是 Modbus 服务器允许的值。 |
QModbusPdu::ServerDeviceFailure | 0x04 | 服务器在尝试执行请求的操作时发生了不可恢复的错误。 |
QModbusPdu::Acknowledge | 0x05 | 与编程命令结合使用。 |
QModbusPdu::ServerDeviceBusy | 0x06 | 服务器正在处理持续时间较长的程序命令。 |
QModbusPdu::NegativeAcknowledge | 0x07 | 服务器无法执行查询中收到的程序功能。编程请求不成功时会返回此代码。客户端应请求服务器提供诊断或错误信息。 |
QModbusPdu::MemoryParityError | 0x08 | 表示扩展文件区未能通过一致性检查。与功能代码 20 和 21 结合使用。异常代码不涉及传输线路的奇偶校验设置,而只涉及服务器内部的文件记录存储器。 |
QModbusPdu::GatewayPathUnavailable | 0x0A | 表示网关无法为处理请求分配从输入端口到输出端口的内部通信路径。 |
QModbusPdu::GatewayTargetDeviceFailedToRespond | 0x0B | 表示未从网关后面的目标设备获得响应。通常这意味着目标设备在网络上不在线。 |
QModbusPdu::ExtendedException | 0xFF | 根据 Modbus 规范,这是一种扩展异常。一般情况下,该代码用于描述另有说明的异常。 |
enum QModbusPdu::FunctionCode
定义服务器要求的功能代码和隐式操作类型。并非所有 Modbus 设备都能处理同一组功能代码。
常数 | 值 | 说明 |
---|---|---|
QModbusPdu::Invalid | 0x00 | 由默认构造函数设置,请勿使用。 |
QModbusPdu::ReadCoils | 0x01 | 要求设备提供一个或多个线圈的状态。 |
QModbusPdu::ReadDiscreteInputs | 0x02 | 要求设备提供一个或多个输入寄存器的状态。 |
QModbusPdu::ReadHoldingRegisters | 0x03 | 要求设备提供一个或多个保持寄存器值的状态。 |
QModbusPdu::ReadInputRegisters | 0x04 | 要求设备提供一个或多个输入寄存器值的状态。 |
QModbusPdu::WriteSingleCoil | 0x05 | 请求在设备上写入单个线圈。 |
QModbusPdu::WriteSingleRegister | 0x06 | 要求在设备上写入单个保持寄存器。 |
QModbusPdu::ReadExceptionStatus | 0x07 | 请求设备上八个异常状态输出的状态。 |
QModbusPdu::Diagnostics | 0x08 | 用于提供一系列测试,以检查客户服务器通信系统,或检查内部系统。 |
QModbusPdu::GetCommEventCounter | 0x0B | 从设备的通信事件计数器请求状态字和事件计数。 |
QModbusPdu::GetCommEventLog | 0x0C | 从设备请求状态字、事件计数、报文计数和一个事件字节字段。 |
QModbusPdu::WriteMultipleCoils | 0x0F | 请求在设备上写入一个或多个线圈。 |
QModbusPdu::WriteMultipleRegisters | 0x10 | 请求写入设备上的一个或多个保持寄存器。 |
QModbusPdu::ReportServerId | 0x11 | 请求描述设备的类型、当前状态和其他特定信息。 |
QModbusPdu::ReadFileRecord | 0x14 | 请求读取文件记录。 |
QModbusPdu::WriteFileRecord | 0x15 | 请求写入文件记录。 |
QModbusPdu::MaskWriteRegister | 0x16 | 使用 AND 或 OR 掩码组合以及寄存器的当前内容,请求修改指定保持寄存器的内容。 |
QModbusPdu::ReadWriteMultipleRegisters | 0x17 | 请求查看一个或多个保持寄存器的状态,同时写入设备上的一个或多个保持寄存器。 |
QModbusPdu::ReadFifoQueue | 0x18 | 请求读取远程设备中先进先出(FIFO)寄存器队列的内容。 |
QModbusPdu::EncapsulatedInterfaceTransport | 0x2B | 请参阅 Modbus 规范附件 A。 |
QModbusPdu::UndefinedFunctionCode | 0x100 | 请勿使用。 |
成员函数文档
[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);
注意: 使用范围仅限于quint8
和quint16
。这是因为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));
注: 使用范围仅限于quint8
和quint16
。这是因为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.