QtQModbusServer类
Posted 沧海一笑-dj
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了QtQModbusServer类相关的知识,希望对你有一定的参考价值。
00. 目录
01. 概述
QModbusServer类是用于接收和处理Modbus请求的接口。
Header: #include <QModbusServer>
qmake: QT += serialbus
Since: Qt 5.8
Inherits: QModbusDevice
Inherited By: QModbusRtuSerialSlave and QModbusTcpServer
Modbus网络可以具有多个Modbus服务器。Modbus服务器由QModbusClient代表的Modbus客户端读取/写入。QModbusServer与Modbus后端通信,为用户提供了便捷的API。
02. 开发环境
Windows系统:Windows10
Qt版本:Qt5.15或者Qt6
03. 公有类型
enum Option { DiagnosticRegister, ExceptionStatusOffset, DeviceBusy, AsciiInputDelimiter,
ListenOnlyMode, …, UserOption }
enum QModbusServer::Option
每个Modbus服务器都有一组与其关联的值,每个值都有其自己的选项。
通用选项(和关联的类型)是:
常量 | 值 | 描述 |
---|---|---|
QModbusServer::DiagnosticRegister | 0 | 服务器的诊断寄存器。 quint16 |
QModbusServer::ExceptionStatusOffset | 1 | 服务器的异常状态字节偏移量。 quint16 |
QModbusServer::DeviceBusy | 2 | 指示服务器正在处理长时间程序命令的标志。 quint16 |
QModbusServer::AsciiInputDelimiter | 3 | 消息定界符的Modbus ASCII末尾。 char |
QModbusServer::ListenOnlyMode | 4 | 设置服务器的仅侦听模式的标志。通常只有Modbus串行设备支持此功能。bool |
QModbusServer::ServerIdentifier | 5 | 服务器的标识符,而不是服务器地址。quint8 |
QModbusServer::RunIndicatorStatus | 6 | 服务器的运行指示灯。 quint8 |
QModbusServer::AdditionalData | 7 | 服务器的附加数据。 QByteArray |
QModbusServer::DeviceIdentification | 8 | 服务器的物理和功能描述。 QModbusDeviceIdentification |
用户选项
常量 | 值 | 描述 |
---|---|---|
QModbusServer::UserOption | 0x100 | 可以用于用户特定目的的第一个选项。 |
对于用户选项,由开发人员决定使用哪种类型,并确保组件在访问和设置值时使用正确的类型。
04. 成员方法
QModbusServer(QObject *parent = nullptr)
用指定的parent构造一个Modbus服务器。
bool data(QModbusDataUnit *newData) const
返回newData给定的寄存器范围内的值。
newData必须提供有效的寄存器类型,起始地址和valueCount。返回的newData将包含与给定范围关联的寄存器值。
如果newData包含有效的寄存器类型但起始地址为负,则返回整个寄存器映射,并适当调整newData的大小。
bool data(QModbusDataUnit::RegisterType table, quint16 address, quint16 *data) const
读取Modbus服务器中存储的数据。Modbus服务器具有四个表(table),每个表都有一个唯一的地址字段,该地址字段用于从所需字段
读取数据。有关不同表的更多信息,请参见QModbusDataUnit :: RegisterType。false如果地址超出映射范围,或者甚至未定义寄存
器类型,则返回。
virtual bool processesBroadcast() const
如果传输层应处理广播,则子类应实现此功能。true如果当前处理的请求是广播请求,则实现应返回;否则,返回。否则false。默认
实现始终返回false。
注意:此函数的返回值仅在processRequest()或processPrivateRequest()内部有意义,否则只能告诉最后处理的请求是广播请求。
int serverAddress() const
返回此Mobus服务器实例的地址。
bool setData(const QModbusDataUnit &newData)
将newData写入Modbus服务器映射。false如果newData范围不在地图范围内,则返回。
如果调用成功,则发出dataWritten()信号。请注意,当寻址的寄存器未更改时,不会发射信号。当newData包含与寄存器已经完全
相同的值时,可能会发生这种情况。尽管如此,true在这种情况下该函数仍会返回。
bool setData(QModbusDataUnit::RegisterType table, quint16 address, quint16 data)
将数据写入Modbus服务器。Modbus服务器具有四个表(table),每个表都有一个唯一的地址字段,该地址字段用于将数据写入所需
的字段。返回false地址是否在地图范围之外。
如果调用成功,则发出dataWritten()信号。请注意,当数据未更改时,不会发射信号。尽管如此,true在这种情况下该函数仍会返回。
virtual bool setMap(const QModbusDataUnitMap &map)
设置注册的映射结构,以供其他ModBus客户端请求映射。寄存器值初始化为零。true成功回报;否则false。
如果在连接之前未调用此函数,则会设置一个零条目的默认寄存器。
注意:调用此函数将丢弃先前设置的任何寄存器值。
void setServerAddress(int serverAddress)
将此Modbus服务器实例的地址设置为serverAddress。
virtual bool setValue(int option, const QVariant &newValue)
设置NEWVALUE的选项和返回true成功; false除此以外。
virtual QVariant value(int option) const
返回选项的值,QVariant如果未设置选项,则返回无效值。
virtual QModbusResponse processPrivateRequest(const QModbusPdu &request)
此功能应由定制Modbus服务器实现。如果给定的请求不是标准的Modbus请求,则由processRequest()调用。
覆盖此功能可处理未在Modbus应用协议规范1.1b中指定的其他功能代码和子功能代码。重新实现应再次调用此函数,以确保针对
自定义Modbus实现不处理的所有未知函数代码返回异常响应。
此默认实现返回QModbusExceptionResponse,其中请求功能代码和错误代码设置为非法功能。
virtual QModbusResponse processRequest(const QModbusPdu &request)
处理Modbus客户端请求并返回Modbus响应。此函数根据请求的性质返回QModbusResponse或QModbusExceptionResponse。
该功能的默认实现处理Modbus应用协议规范1.1b定义的所有标准Modbus功能代码。规范中未包括的所有其他Modbus功能代码均
转发至processPrivateRequest()。
通过重新实现此功能,可以覆盖标准Modbus功能代码请求的默认处理。重写必须处理有问题的请求类型,并返回适当的
QModbusResponse。一个常见的原因可能是过滤掉对数据值的功能代码请求,以限制读/写访问和特定实现(例如,以太网
或Modbus Plus传输层上的串行线路诊断)所不需要的功能代码。其他所有请求类型都应转发到此默认实现。
注意:不应重写此功能,以为非标准Modbus请求类型提供自定义实现。
virtual bool readData(QModbusDataUnit *newData) const
读取newData给定的寄存器范围内的值,并将数据写回到newData。true成功返回,或者false如果newData为0,则返回newData
范围超出映射范围,或者registerType()不存在。
注意:实现从其他后备存储读取(然后从默认后备存储读取)的子类也需要实现setMap()和writeData()。
virtual bool writeData(const QModbusDataUnit &newData)
将newData写入Modbus服务器映射。返回true表示成功,或false如果newData范围是地图范围或registerType()之外不存在。
注意:实现写入不同后备存储(然后是默认后备存储)的子类也需要实现setMap()和readData()。所述dataWritten()信号需要
从功能执行内部以及发射。
05. 信号
void dataWritten(QModbusDataUnit::RegisterType table, int address, int size)
当Modbus客户端已将一个或多个数据字段写入Modbus服务器时,将发出此信号。该信号包含有关已写入字段的信息:
写入的寄存器类型(表),
写入的第一个字段的地址,
和从address开始写入的连续字段的大小。
当待写入字段由于值不变而没有变化时,不发射信号。
06. 附录
6.1 Qt教程汇总
网址:https://dengjin.blog.csdn.net/article/details/115174639
以上是关于QtQModbusServer类的主要内容,如果未能解决你的问题,请参考以下文章
elasticsearch代码片段,及工具类SearchEsUtil.java
Android 逆向类加载器 ClassLoader ( 类加载器源码简介 | BaseDexClassLoader | DexClassLoader | PathClassLoader )(代码片段