00. 目录
01. 概述
QModbusPdu是一个抽象的容器类,其中包含存储在Modbus ADU中的功能代码和数据。
该类提供对Modbus应用协议规范1.1b所定义的原始Modbus协议数据包的访问。
Header: #include
qmake: QT += serialbusSince: Qt 5.8
Inherited By: QModbusRequest and QModbusResponse
02. 开发环境
Windows系统:Windows10
Qt版本:Qt5.15或者Qt6
03. 公有类型
enum ExceptionCode { IllegalFunction, IllegalDataAddress, IllegalDataValue, ServerDeviceFailure, Acknowledge, …,
ExtendedException }
enum FunctionCode { Invalid, ReadCoils, ReadDiscreteInputs, ReadHoldingRegisters, ReadInputRegisters, …,
UndefinedFunctionCode }
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 |
不使用。 |
04. 成员方法
公有成员方法
QModbusPdu()
构造一个无效的QModbusPdu。
virtual ~QModbusPdu()
析构函数
QByteArray data() const
返回PDU的有效数据,不包括功能代码。有效数据以大端字节顺序存储。
qint16 dataSize() const
返回PDU的数据大小,不包括功能码。
void 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);
void encodeData(Args... data)
将有效数据设置为data。数据被转换并以大端字节顺序存储。
QModbusRequestPdu request(QModbusPdu::ReadCoils);
// starting address and quantity of coils
request.encodeData(quint16(0x0c), quint16(0x0a));
QModbusPdu::ExceptionCode exceptionCode() const
返回响应的异常代码。
QModbusPdu::FunctionCode functionCode() const
返回PDU的功能码。
bool isException() const
如果PDU包含异常代码,则返回true;否则,返回false。
bool isValid() const
如果PDU有效,则返回true;否则,返回true。
如果消息代码在1到255的十进制范围内,并且PDU的复合大小(功能代码+数据)不超过253个字节,则认为PDU有效。默认构造的PDU无效。
void setData(const QByteArray &data)
将PDU的功能有效数据设置为data。数据应该已经按大端字节顺序存储。
virtual void setFunctionCode(QModbusPdu::FunctionCode code)
将PDU的功能代码设置为code。
qint16 size() const
返回PDU的完整大小,包括功能代码和数据大小。
受保护成员方法
QModbusPdu(const QModbusPdu &other)
构造一个QModbusPdu是副本等。
QModbusPdu(QModbusPdu::FunctionCode code, const QByteArray &data)
构造一个QModbusPdu,其功能码设置为code,数据设置为data。数据应该已经按大端字节顺序存储。
QModbusPdu &operator=(const QModbusPdu &other)
使得副本等,并为其指派该QModbusPdu对象。
05. 成员变量
const quint8 QModbusPdu::ExceptionByte
该变量初始化为0x80。
异常以定义的数据包格式报告。除了设置了最高有效位以外,其他功能代码均与原始功能代码一样返回给请求的客户端。这等效于在原始功能代码的值上加上0x80。
该字段可用于屏蔽原始Modbus数据包功能字段中的异常位。
06. 附录
6.1 Qt教程汇总
网址:https://dengjin.blog.csdn.net/article/details/115174639
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END
暂无评论内容