劉佳梁



關鍵詞: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余個分系統的實時狀態信息,對故障狀態進行提示告警,同時將關鍵信息納入數據庫,并對設備關鍵節點進行控制。基于文中介紹的程序模型,可快速開發出適用于類似場景的狀態監視及控制軟件。