APP下载

基于Qt5开发的面向工业设备的状态监视及控制软件

2023-08-26刘佳梁

电脑知识与技术 2023年20期
关键词:网络通信数据库

刘佳梁

关键词:Qt Creator;C++;状态监视;网络通信;数据库

中图分类号:TP311 文献标识码:A

文章编号:1009-3044(2023)20-0070-03

21世纪以来,我国工业化进程快速发展,工业自动化设备呈现高精度、高集成的发展趋势,与此同时,由于电子系统故障引发的灾难性事故时有发生,也因此造成大量的人力、物力损失,针对现代设备故障状态监控、设备管理及远程控制,研发一款设备状态监视及控制软件,提供设备健康监视平台,实现设备远程管理及控制,符合当前设备管理的发展方向[1]。因此,提出了一种基于Qt Creator开发环境,使用C++编程语言开发的设备状态监视及管理软件,软件编写过程中使用的Qt Creator 版本为5.9.1,MinGw 版本为5.3.0,运行平台为X86架构计算机,操作系统为Win?dows 10专业版。

1 软件工作流程

软件基于UDP/IP协议并采用组播的方式与系统内各设备进行通信,将接收到的来自各设备数据包解码后分发给数据管理线程和界面管理线程,数据管理线程负责对数据进行分类、提取并存储,便于事后数据回放及分析[2]。界面管理线程实时更新设备状态显示,对于异常状态进行告警提示,同时响应界面用户操作,实现对设备远程控制。软件工作流程图如图1 所示。

2 软件界面

Qt Designer(界面设计师)提供了非常丰富的界面控件,使用鼠标简单拖拽控件即可创建出程序界面框架,同时运用Qt布局管理系统可以对程序界面实现布局、美化。软件主界面如图2所示。

Qt提供了信号与槽的机制,其中信号会在特定情况下被触发,槽函数则可以理解为与信号相对应的响应函数,使用connect函数将信号与槽函数进行连接,也可以通过disconnect函数断开信号与槽函数之间的连接关系,当界面中控件状态发生变化时,系统会自动发射相应信号,只需将处理函数与信号连接,便可实现界面操作响应。

信号与槽函数有三个特点:1) 信号之間可以互相连接;2) 一个信号可以连接多个槽函数;3) 多个信号可以连接同一个槽函数。这三个特点决定了信号与槽函数的应用非常灵活、便利,同时能够极大降低对象之间的耦合度[3]。

当界面中存在较多同类型控件需要响应点击操作时,可以通过findChildren函数遍历界面中同类型控件,在for循环中执connect操作,减少重复代码并且易于维护[4],如图3所示。

findChildren 函数找到了MainWindow 下的所有QPushButton类型按钮。然后给每一个按钮设置图标和尺寸,通过connect 函数连接到buttonClick()槽函数[5]。槽函数代码如图4所示。

3 网络通信

系统采用udp组播的方式进行网络数据收发。Qt 提供QUdpSocket类用于实现udp通信,进行udp通信前需要通过以下步骤对套接字进行初始化[6]。

3.1 指定网卡

通常计算机中存在多块网卡,QNetworkInterface::allInterfaces()可以获得计算机中所有网卡,通过MAC 地址识别出指定网卡,使用setMulticastInterface函数指定用该网卡用于组播通信。

3.2 生存时间

设置组播数据的生存时间TTL(Time-To-Live)。TTL指一个数据报到达目的地址之前跳过网络的最大次数,可以理解为数据报每跨1个路由生存时间就会减1,程序中将生存时间设置为1,表示数据报只能在同一路由下的局域网内传播。

3.3 禁止回环

通过setSocketOption(QAbstractSocket:: Multicast?LoopbackOption,0)函数,设置禁止回环,表示本机不能接收自身发出的数据。

3.4 绑定IP地址及端口

通过bind函数绑定IP地址和端口,从而进行网络数据报收发。当有数据报传入时会自动发射ready?Read()信号,通过connect()函数将readyRead()信号与ReceiveData()槽函数连接,即可在ReceiveData()函数中读取并处理接收到的数据报。

3.5 加入组播组

使用joinMulticastGroup()函数加入指定组播组地址,便可以接受该组播组中的数据报。网络初始化函数代码如图5所示。

网络数据接收函数代码如图7所示,当套接字中存在未读取数据时,hasPendingDatagrams()函数返回true。pendingDatagramSize()的值表示第一个数据报的长度,同时初始化一个对应长度的QbyteArray变量,将readDatagram()读取的数据报内容存入变量中,在processData()函数中对读取的数据报进行解码等处理[7]。网络数据接收函数代码如图6所示。

网络数据发送函数代码如图7所示。

4 数据库

本软件包含历史状态信息查询及事后分析功能,选择使用数据库实现历史信息存储及查询操作。Qt 为数据库操作提供了QtSql模块,其中包含一套无关于开发平台和数据库类型的调用接口,通过运用该模块,实现数据库和应用程序的无缝衔接。开发人员只需掌握基本的SQL语句,即可实现数据库应用程序开发。结合本软件对数据库的性能需求,最终选择使用QSQLite数据库[8]。

qt_sql_default_connection为数据库的默认连接名称,实际应用中,可以通过QSqlDatabase::addDatabase()函数的第二个参数指定连接名称。第一个参数QSQLite表示使用SQLite数据库。如果默认连接不存在,则创建连接并添加数据库。数据库打开函数代码如图8所示。

SQLite的创建表语句为CREATE TABLE,同时还可以判断表是否已经存在。创建表函数代码如图9所示,创建了一个名为temp_data的数据表,包含7列,第一列是id,类型是整型,设置为主键且自增长。第二列是TIME,类型是可变字符串,最长20个字符,五至六列为info,数据类型是浮点值。第七列为STATUS,数据类型是带符号的整数[9]。

SQLite的插入语句是INSERT INTO,插入函数代码如图10所示。

QSqlQueryModel 类为SQL 结果集提供了一个只读数据模型,是用于执行 SQL 语句和遍历结果集的高级接口,可用于为 QTableView 等视图类提供数据。从数据库中提取数据操作如图11 所示,通过can?FetchMore()、fetchMore()函数,提取数据库中整个结果集[10]。数据库数据获取函数代码如图11所示。

5 结束语

Qt是一个跨平台的C++图形用户界面应用程序框架,提供给应用程序开发者建立图形用户界面所需的所用功能,同时,Qt还具有优良的跨平台特性,并提供丰富的API。在工程项目开发中,使用Qt进行程序开发极大降低了使用者的学习成本。

主要介绍了使用Qt软件进行界面搭建、网络数据通信模块以及数据库的建立和使用,在实际应用过程中,软件同时接收20余个分系统的实时状态信息,对故障状态进行提示告警,同时将关键信息纳入数据库,并对设备关键节点进行控制。基于文中介绍的程序模型,可快速开发出适用于类似场景的状态监视及控制软件。

猜你喜欢

网络通信数据库
基于网络通信的智能照明系统设计
基于CAN总线的网络通信信道的建模与研究
计算机网络通信常见问题与技术发展研究
网络通信中信息隐藏技术的应用
基于网络通信的校园智能音箱设计
谈计算机网络通信常见问题及技术发展