【Qt】QModbusPdu类

00. 目录

01. 概述

QModbusPdu是一个抽象的容器类,其中包含存储在Modbus ADU中的功能代码和数据。

该类提供对Modbus应用协议规范1.1b所定义的原始Modbus协议数据包的访问。

Header: #include
qmake: QT += serialbus

Since: 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。    
 如果消息代码在1255的十进制范围内,并且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
喜欢就支持一下吧
点赞740 分享
Happiness isn't about getting what you want all the time, it's about loving what you have.
幸福并不是一味得到自己想要的,而是珍爱自己拥有的
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容