首页 > 其他分享 >Qt QModbusServer类

Qt QModbusServer类

时间:2024-03-01 11:22:38浏览次数:19  
标签:返回 const Qt Modbus 寄存器 服务器 QModbusServer newData

1、概述

QModbusServer类是用于接收和处理Modbus请求的接口。

1  Header:  #include <QModbusServer>
2  qmake: QT += serialbus 
3  Since: Qt 5.8 
4  Inherits: QModbusDevice 
5  Inherited By: QModbusRtuSerialSlave and QModbusTcpServer

Modbus网络可以具有多个Modbus服务器。Modbus服务器由 QModbusClient代表的Modbus客户端读取/写入。QModbusServer与Modbus后端通信,为用户提供了便捷的API。

2. 开发环境

Windows系统:Windows10

Qt版本:Qt5.15或者Qt6

3. 公有类型

1  enum Option { DiagnosticRegister, ExceptionStatusOffset, DeviceBusy, AsciiInputDelimiter, 
2  ListenOnlyMode, …, UserOption }

enum QModbusServer::Option

每个Modbus服务器都有一组与其关联的值,每个值都有其自己的选项。

通用选项(和关联的类型)是:

 用户选项

对于用户选项,由开发人员决定使用哪种类型,并确保组件在访问和设置值时使用正确的类型。

4. 成员方法

 1  QModbusServer(QObject *parent = nullptr)
 2  用指定的parent构造一个Modbus服务器。
 3      
 4  bool data(QModbusDataUnit *newData) const
 5  返回newData给定的寄存器范围内的值。
 6  newData必须提供有效的寄存器类型,起始地址和valueCount。返回的newData将包含与给定范围关联的寄存器值。
 7  如果newData包含有效的寄存器类型但起始地址为负,则返回整个寄存器映射,并适当调整newData的大小。
 8      
 9  bool data(QModbusDataUnit::RegisterType table, quint16 address, quint16 *data) const
10  读取Modbus服务器中存储的数据。Modbus服务器具有四个表(table),每个表都有一个唯一的地址字段,该地址字段用于从所需字段
11  读取数据。有关不同表的更多信息,请参见QModbusDataUnit :: RegisterType。false如果地址超出映射范围,或者甚至未定义寄存
12  器类型,则返回。
13      
14  virtual bool processesBroadcast() const
15  如果传输层应处理广播,则子类应实现此功能。true如果当前处理的请求是广播请求,则实现应返回;否则,返回。否则false。默认
16  实现始终返回false。
17  
18 注意:此函数的返回值仅在processRequest()或processPrivateRequest()内部有意义,否则只能告诉最后处理的请求是广播请求。
19      
20  int serverAddress() const
21  返回此Mobus服务器实例的地址。
22      
23  bool setData(const QModbusDataUnit &newData)
24  将newData写入Modbus服务器映射。false如果newData范围不在地图范围内,则返回。
25  
26 如果调用成功,则发出dataWritten()信号。请注意,当寻址的寄存器未更改时,不会发射信号。当newData包含与寄存器已经完全
27 相同的值时,可能会发生这种情况。尽管如此,true在这种情况下该函数仍会返回。
28      
29  bool setData(QModbusDataUnit::RegisterType table, quint16 address, quint16 data)
30  将数据写入Modbus服务器。Modbus服务器具有四个表(table),每个表都有一个唯一的地址字段,该地址字段用于将数据写入所需
31  的字段。返回false地址是否在地图范围之外。
32  
33 如果调用成功,则发出dataWritten()信号。请注意,当数据未更改时,不会发射信号。尽管如此,true在这种情况下该函数仍会返回。
34      
35  virtual bool setMap(const QModbusDataUnitMap &map)
36  设置注册的映射结构,以供其他ModBus客户端请求映射。寄存器值初始化为零。true成功回报;否则false。
37  
38 如果在连接之前未调用此函数,则会设置一个零条目的默认寄存器。
39  
40 注意:调用此函数将丢弃先前设置的任何寄存器值。
41      
42  void setServerAddress(int serverAddress)
43  将此Modbus服务器实例的地址设置为serverAddress。
44      
45  virtual bool setValue(int option, const QVariant &newValue)
46  设置NEWVALUE的选项和返回true成功; false除此以外。
47      
48  virtual QVariant value(int option) const
49  返回选项的值,QVariant如果未设置选项,则返回无效值。
50      
51  virtual QModbusResponse processPrivateRequest(const QModbusPdu &request)
52  此功能应由定制Modbus服务器实现。如果给定的请求不是标准的Modbus请求,则由processRequest()调用。
53  
54 覆盖此功能可处理未在Modbus应用协议规范1.1b中指定的其他功能代码和子功能代码。重新实现应再次调用此函数,以确保针对
55 自定义Modbus实现不处理的所有未知函数代码返回异常响应。
56  
57 此默认实现返回QModbusExceptionResponse,其中请求功能代码和错误代码设置为非法功能。
58      
59      
60  virtual QModbusResponse processRequest(const QModbusPdu &request)
61  处理Modbus客户端请求并返回Modbus响应。此函数根据请求的性质返回QModbusResponse或QModbusExceptionResponse。
62  
63 该功能的默认实现处理Modbus应用协议规范1.1b定义的所有标准Modbus功能代码。规范中未包括的所有其他Modbus功能代码均
64 转发至processPrivateRequest()。
65  
66 通过重新实现此功能,可以覆盖标准Modbus功能代码请求的默认处理。重写必须处理有问题的请求类型,并返回适当的
67 QModbusResponse。一个常见的原因可能是过滤掉对数据值的功能代码请求,以限制读/写访问和特定实现(例如,以太网
68 或Modbus Plus传输层上的串行线路诊断)所不需要的功能代码。其他所有请求类型都应转发到此默认实现。
69  
70 注意:不应重写此功能,以为非标准Modbus请求类型提供自定义实现。
71      
72      
73  virtual bool readData(QModbusDataUnit *newData) const
74  读取newData给定的寄存器范围内的值,并将数据写回到newData。true成功返回,或者false如果newData为0,则返回newData
75  范围超出映射范围,或者registerType()不存在。
76  
77 注意:实现从其他后备存储读取(然后从默认后备存储读取)的子类也需要实现setMap()和writeData()。
78      
79  virtual bool writeData(const QModbusDataUnit &newData)
80 将newData写入Modbus服务器映射。返回true表示成功,或false如果newData范围是地图范围或registerType()之外不存在。
81  
82 注意:实现写入不同后备存储(然后是默认后备存储)的子类也需要实现setMap()和readData()。所述dataWritten()信号需要
83 从功能执行内部以及发射。

5. 信号

1  void dataWritten(QModbusDataUnit::RegisterType table, int address, int size)
2  当Modbus客户端已将一个或多个数据字段写入Modbus服务器时,将发出此信号。该信号包含有关已写入字段的信息:
3  
4  写入的寄存器类型(表),
5  写入的第一个字段的地址,
6  和从address开始写入的连续字段的大小。
7  当待写入字段由于值不变而没有变化时,不发射信号。    

 

标签:返回,const,Qt,Modbus,寄存器,服务器,QModbusServer,newData
From: https://www.cnblogs.com/ybqjymy/p/18046584

相关文章

  • Qt 多线程中使用QTimer和信号、槽 QObject::startTimer: Timers cannot be started fr
    多线程中使用QTimer我们可能在Qt的多线程中使用QTimer中都会遇到一个错误:Cannotcreatechildrenforaparentthatisinadifferentthread.或者QObject::startTimer:TimerscannotbestartedfromanotherthreadQTimer定时器不能在不同的线程中启动。出现这个主要原因......
  • Qt Cannot open include file: 'QtConcurrent': No such file or directory
    假期手痒用Qt写了个便笺程序,其中文件操作用到了QtConcurrent模块。噼里啪啦,一通猛如虎的操作下来,代码写完了,愉快地build+run一套,结果报错了:(Cannotopenincludefile:'QtConcurrent':Nosuchfileordirectory编译不过一声吼,操起鼠标查google。官方文档就是这么写的看......
  • Qt 多线程中使用信号槽的示例
    之前对线程理解得不深入,所以对Qt的线程机制没有搞清楚,今天写一篇文章总结一下,如有错误,欢迎指出。    首先需要理解线程是什么,线程在代码中的表现其实就是一个函数,只不过这个函数和主线程的函数同时运行,写C语言的都知道,一般代码是从main()函数开始运行的,每个线程都有一......
  • VS Qt - cmake项目中添加运行时命令行参数
    1、VS在项目目录中找到.vs目录--->launch.vs.json{"version":"0.2.1","defaults":{},"configurations":[{"type":"default","project":"CMakeLists.txt",......
  • OpenCV计数应用 c++(QT)
    一、前言为了挑战一下OpenCV的学习成果,最经一直在找各类项目进行实践。机缘巧合之下,得到了以下的需求:要求从以下图片中找出所有的近似矩形的点并计数,重叠点需要拆分单独计数。二、解题思路1.图片作二值化处理autoimage=cv::imread("points.jpg");cv::Matborder;//为......
  • Qt 随机数生成器:QRandomGenerator
    一、描述QRandomGenerator可用于从高质量随机数生成器生成随机值。与C++随机引擎一样,QRandomGenerator可以通过构造函数使用用户提供的值作为种子。播种时,此类生成的数字序列是确定性的。也就是说,给定相同的种子数据,QRandomGenerator会生成相同的数字序列。给定不同的种......
  • Qt 生成随机数 qrand、QRandomGenerator
    //老方法//利用qrand和qsrand生成随机数//位于QtGlobal中//例,生成一个0和10之间的随机数1qsrand(QTime::currentTime().msec());//设置种子,该种子作为qrand生成随机数的起始值,RAND_MAX为32767,即随机数在种子值到32767之间2qrand()%10;//新方法//利用QRandomGenerator类......
  • Qt 无法连接到进程内QML调试器
    问题:由于在Qt5以上版本默认开启QML调试器造成的。用于告知用户,这将打开一个到运行QML的Javascript解释器的端口,以便从中获得调试输出。显然,这会造成一个安全漏洞,所以在不安全的地方使用时应该关闭它(在释放运行时自动关闭)。Qt4默认不开启QML调试器,而Qt5版本以上默认开启。......
  • Qt QList使用总结
    概述QList是Qt的泛型容器类之一。它将项目存储在一个列表中,该列表提供基于索引的快速访问以及基于索引的插入和删除。QList、QLinkedList和QVector提供了类似的API和功能。它们通常是可互换的,但性能有所区别。QVector应该是默认首选的容器QList是最广泛用于QtAPI中传递值......
  • Qt QVector和vector以及QMap和map的遍历性能对比
    使用Qt中的容器给C++开发带来很大的便利,而且QVector和QMap等容器扩展的一些成员函数也是很方便的。但是Qt的这些容器和STL库的容器比,效率到底怎么样?我就写了几个简单的遍历的例子,测试了QVector、vector等容器的那些方法效率更高。测试环境:系统:windows10编译器:MingGWmingw......