QModbusServer Class
QModbusServer 类是接收和处理 Modbus 请求的接口。更多
头文件: | #include <QModbusServer> |
CMake: | find_package(Qt6 REQUIRED COMPONENTS SerialBus) target_link_libraries(mytarget PRIVATE Qt6::SerialBus) |
qmake: | QT += serialbus |
继承: | QModbusDevice |
继承于 |
公共类型
enum | Option { DiagnosticRegister, ExceptionStatusOffset, DeviceBusy, AsciiInputDelimiter, ListenOnlyMode, …, UserOption } |
公共函数
QModbusServer(QObject *parent = nullptr) | |
bool | data(QModbusDataUnit *newData) const |
bool | data(QModbusDataUnit::RegisterType table, quint16 address, quint16 *data) const |
virtual bool | processesBroadcast() const |
int | serverAddress() const |
bool | setData(const QModbusDataUnit &newData) |
bool | setData(QModbusDataUnit::RegisterType table, quint16 address, quint16 data) |
virtual bool | setMap(const QModbusDataUnitMap &map) |
void | setServerAddress(int serverAddress) |
virtual bool | setValue(int option, const QVariant &newValue) |
virtual QVariant | value(int option) const |
信号
void | dataWritten(QModbusDataUnit::RegisterType table, int address, int size) |
受保护函数
virtual QModbusResponse | processPrivateRequest(const QModbusPdu &request) |
virtual QModbusResponse | processRequest(const QModbusPdu &request) |
virtual bool | readData(QModbusDataUnit *newData) const |
virtual bool | writeData(const QModbusDataUnit &newData) |
详细说明
Modbus 网络可以有多个 Modbus 服务器。Modbus 服务器由QModbusClient 所代表的 Modbus 客户端读写。QModbusServer 与 Modbus 后端通信,为用户提供方便的 API。
成员类型文档
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 | 第一个可用于用户特定目的的选项。 |
对于用户选项,应由开发人员决定使用哪种类型,并确保组件在访问和设置值时使用正确的类型。
成员函数文档
[explicit]
QModbusServer::QModbusServer(QObject *parent = nullptr)
使用指定的parent 构建 Modbus 服务器。
bool QModbusServer::data(QModbusDataUnit *newData) const
返回newData 给定的寄存器范围内的值。
newData 必须提供有效的寄存器类型、起始地址和值计数。返回的 将包含与给定范围相关的寄存器值。newData
如果newData 包含有效的寄存器类型,但起始地址为负数,则将返回整个寄存器映射,并适当调整newData 的大小。
另请参见 setData().
bool QModbusServer::data(QModbusDataUnit::RegisterType table, quint16 address, quint16 *data) const
读取存储在 Modbus 服务器中的数据。Modbus 服务器有四个表 (table),每个表都有一个唯一的address 字段,用于从所需字段读取data 。有关不同表的更多信息,请参阅QModbusDataUnit::RegisterType 。如果地址超出映射范围或寄存器类型未定义,则返回false
。
另请参见 QModbusDataUnit::RegisterType 和setData()。
[signal]
void QModbusServer::dataWritten(QModbusDataUnit::RegisterType table, int address, int size)
当 Modbus 客户端向 Modbus 服务器写入一个或多个数据字段时,就会发出该信号。该信号包含已写入字段的相关信息:
- 写入的寄存器类型 (table)、
- address 写入的第一个字段、
- 以及从address 开始写入的连续字段的size 。
如果待写字段的值没有变化,则不会发出该信号。
[virtual protected]
QModbusResponse QModbusServer::processPrivateRequest(const QModbusPdu &request)
自定义 Modbus 服务器应执行此函数。如果给定的request 不是标准 Modbus 请求,processRequest() 将调用该函数。
重写此函数可处理《Modbus 应用协议规范 1.1b 》中未指定的附加功能代码和子功能代码。重新实现时应再次调用此函数,以确保对自定义 Modbus 实现未处理的所有未知功能代码返回异常响应。
此默认实现返回一个QModbusExceptionResponse
,其中包含request 功能代码和设置为非法功能的错误代码。
另请参见 processRequest()。
[virtual protected]
QModbusResponse QModbusServer::processRequest(const QModbusPdu &request)
处理 Modbus 客户端request 并返回 Modbus 响应。该函数根据请求的性质返回QModbusResponse 或QModbusExceptionResponse 。
该函数的默认执行方式是处理 Modbus 应用协议规范 1.1b 中定义的所有标准 Modbus 功能代码。规范中未包含的所有其他 Modbus 功能代码都将转发到processPrivateRequest() 。
标准 Modbus 功能代码请求的默认处理方式可通过重新实现此函数来覆盖。覆盖必须处理相关的请求类型,并返回相应的QModbusResponse 。一个常见的原因可能是过滤掉数据值的功能代码请求,以限制读/写访问,以及在以太网或 Modbus Plus 传输层上的串行线路诊断等特定实现中不需要的功能代码。其他所有请求类型均应转发至该默认实现。
注意: 不应重写此函数,以便为非标准 Modbus 请求类型提供自定义实现。
另请参阅 processPrivateRequest().
[virtual]
bool QModbusServer::processesBroadcast() const
如果传输层应处理广播,子类应实现该函数。如果当前处理的请求是广播请求,则该实现应返回true
;否则返回false
。默认实现总是返回false
。
注意: 该函数的返回值只有在processRequest() 或processPrivateRequest() 中才有意义,否则只能说明最后处理的请求是广播请求。
[virtual protected]
bool QModbusServer::readData(QModbusDataUnit *newData) const
读取newData 给出的寄存器范围内的值,并将数据写回newData 。成功时返回true
,如果newData 是0
、newData 范围超出映射范围或 registerType() 不存在,则返回false
。
int QModbusServer::serverAddress() const
返回此 Modbus 服务器实例的地址。
另请参阅 setServerAddress()。
bool QModbusServer::setData(const QModbusDataUnit &newData)
将newData 写入 Modbus 服务器映射。如果newData 范围超出映射范围,则返回false
。
如果调用成功,则发出dataWritten() 信号。请注意,当寻址寄存器未发生变化时,信号不会发出。当newData 包含的值与寄存器已包含的值完全相同时,可能会出现这种情况。不过,在这种情况下,该函数将返回true
。
另请参阅 data() 。
bool QModbusServer::setData(QModbusDataUnit::RegisterType table, quint16 address, quint16 data)
向 Modbus 服务器写入数据。一个 Modbus 服务器有四个表 (table),每个表都有一个唯一的address 字段,使用该字段可将data 写入所需字段。如果地址超出映射范围,则返回false
。
如果调用成功,则发出dataWritten() 信号。请注意,当data 未发生变化时,信号不会发出。不过,在这种情况下,该函数会返回true
。
另请参见 QModbusDataUnit::RegisterType,data() 和dataWritten()。
[virtual]
bool QModbusServer::setMap(const QModbusDataUnitMap &map)
将其他 ModBus 客户端请求的注册映射结构设置为map 。寄存器值初始化为 0。成功时返回true
,否则返回false
。
如果在连接前未调用此函数,则会设置一个条目为零的默认寄存器。
注意: 调用该函数会丢弃之前设置的寄存器值。
void QModbusServer::setServerAddress(int serverAddress)
将此 Modbus 服务器实例的地址设置为serverAddress 。
另请参阅 serverAddress() 。
[virtual]
bool QModbusServer::setValue(int option, const QVariant &newValue)
为option 设置newValue ,成功时返回true
,否则返回false
。
注意: 如果选项的相关类型是quint8
或quint16
,而newValue 的类型较大,数据将被截断或对话失败。
关键字 | 说明 |
---|---|
QModbusServer::DiagnosticRegister | 将服务器诊断寄存器的设备特定编码设置为newValue 。默认值为0x0000 。寄存器的位值需要设备特定文档说明。 |
QModbusServer::ExceptionStatusOffset | 将服务器的异常状态字节偏移设置为newValue ,即线圈中的绝对偏移地址(0x 寄存器)。Modbus 寄存器表从0x0000h 开始。默认值预设为0x0000 ,使用与 Modicon 984 CPU 类似的异常状态线圈(线圈 1-8)。如果线圈寄存器包含存储和检索状态线圈所需的 8 位,则函数返回 |
QModbusServer::DeviceBusy | 设置一个标志,表示服务器正在处理一个长时间程序命令。有效值为0x0000 (不忙)和0xffff (忙)。默认预设值为0x0000 。 |
QModbusServer::AsciiInputDelimiter | newValue 将成为未来 Modbus ASCII 报文的报文结束分隔符。默认值预设为\n 。 |
QModbusServer::ListenOnlyMode | 将服务器的只听状态设置为newValue 。如果只听模式设置为true ,则会监听报文,但不会发送任何响应。默认值预设为false 。 |
QModbusServer::ServerIdentifier | 将服务器的制造商标识符设置为newValue 。可能的值范围为0x00 至 0xff。默认预设值为0x0a 。 |
QModbusServer::RunIndicatorStatus | 将服务器的运行指示器状态设置为newValue 。该数据用作QModbusPdu::ReportServerId 功能代码的增编。有效值为0x00 (OFF) 和0xff (ON)。默认预设值为0xff (ON)。 |
QModbusServer::AdditionalData | 将服务器的附加数据设置为newValue 。该数据被QModbusPdu::ReportServerId 功能代码用作附加数据。最大数据大小不能超过 249 字节,以符合响应信息大小限制。默认预设值为Qt Modbus Server 。 |
QModbusServer::DeviceIdentification | 设置服务器的物理和功能描述。默认情况下没有额外的设备标识数据集。 |
QModbusServer::UserOption | 将用户选项的值设置为newValue 。 注意: 对于用户选项,应由开发人员决定使用哪些类型,并确保组件在访问和设置值时使用正确的类型。 |
另请参阅 value() 。
[virtual]
QVariant QModbusServer::value(int option) const
返回option 的值,如果未设置该选项,则返回无效的QVariant
。
选项 | 说明 |
---|---|
QModbusServer::DiagnosticRegister | 返回服务器诊断寄存器的值。诊断寄存器包含设备特定内容,其中每个位都有特定含义。 |
QModbusServer::ExceptionStatusOffset | 返回线圈寄存器中异常状态字节位置的偏移地址。 |
QModbusServer::DeviceBusy | 返回服务器是否正在处理长时间程序命令的标志。 |
QModbusServer::AsciiInputDelimiter | 返回 Modbus ASCII 报文的报文结束分隔符。 |
QModbusServer::ListenOnlyMode | 返回服务器的只监听状态。信息会被监听,但不会发送响应。 |
QModbusServer::ServerIdentifier | 返回服务器制造商的标识符代码。可以是0x00 至 0xff 范围内的任意值。 |
QModbusServer::RunIndicatorStatus | 返回服务器的运行指示器状态。该数据被QModbusPdu::ReportServerId 功能代码用作附加数据。 |
QModbusServer::AdditionalData | 返回服务器的附加数据。该数据用作QModbusPdu::ReportServerId 功能代码的附录。 |
QModbusServer::DeviceIdentification | 返回服务器的物理和功能描述。 |
QModbusServer::UserOption | 返回用户选项的值。 注: 对于用户选项,应由开发人员决定使用哪种类型,并确保组件在访问和设置值时使用正确的类型。 |
另请参阅 setValue()。
[virtual protected]
bool QModbusServer::writeData(const QModbusDataUnit &newData)
将newData 写入 Modbus 服务器映射。成功时返回true
,如果newData 范围超出映射范围或 registerType() 不存在,则返回false
。
注: 子类如果要实现写入与默认存储不同的后备存储,还需要实现setMap() 和readData() 。dataWritten() 信号也需要在函数实现中发出。
另请参见 setMap()、readData() 和dataWritten()。
© 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.