湯春球,王 達,莫易敏,韓 輝,蔣亞華
(武漢理工大學(xué) 機電工程學(xué)院,湖北 武漢 430070)
在國內(nèi)大多數(shù)企業(yè)中,生產(chǎn)線設(shè)備信息化集成度并不高,車間各個設(shè)備單元多為獨立個體,信息交互比較少,設(shè)備故障信息及工作狀態(tài)信息缺乏相應(yīng)的監(jiān)控。智能手機作為一種通用的通信工具,具有小巧,便攜,可隨時無線接入互聯(lián)網(wǎng)的特點。采用智能手機作為終端,設(shè)計一種移動遠程監(jiān)控系統(tǒng),使得操作人員可隨時隨地通過手機連接WIFI進行遠程監(jiān)控,方便工廠生產(chǎn)人員對車間內(nèi)充電加熱設(shè)備的工作狀況及運行情況實現(xiàn)有效實時監(jiān)管,提升車間工作效率。
Qt是基于C++跨平臺的UI和應(yīng)用軟件開發(fā)框架[1],使用特殊的代碼生成擴展(稱其為源對象編譯器)以及一些宏。Qt擁有良好的擴展功能,當(dāng)Qt自帶控件功能無法滿足使用要求時,可重寫其方法,實現(xiàn)自定義功能。Qt集成Qt Designer工具,可方便程序編寫者設(shè)計美觀易用的界面。Qt具有優(yōu)秀的跨平臺特性,可支持Windows、Linux、Mac OS X、Android、iOS、Windows Phone和嵌入式系統(tǒng)。
車間設(shè)備監(jiān)控系統(tǒng)通過Qt開發(fā)桌面程序,移動監(jiān)控終端為安卓APP。利用Qt良好的擴展功能,設(shè)計自定義控件進行添加,優(yōu)化程序顯示界面,實現(xiàn)上位機監(jiān)控應(yīng)用程序。通過Qt跨平臺特點,將上位機監(jiān)控程序功能代碼進行修改移植,編譯形成安卓客戶端APP。
遠程監(jiān)控體系由車間設(shè)備監(jiān)控系統(tǒng)、移動監(jiān)控終端、服務(wù)器和MySQL數(shù)據(jù)庫組成。車間設(shè)備監(jiān)控系統(tǒng)與下位機采用CAN總線連接,CAN總線采用擴展幀[2]格式,根據(jù)自定義的CAN應(yīng)用層協(xié)議,將獲取的下位機數(shù)據(jù)進行解析。車間設(shè)備監(jiān)控系統(tǒng)通過QMySQL驅(qū)動與MySQL數(shù)據(jù)庫連接,對重要信息進行存儲。服務(wù)器集成在車間設(shè)備監(jiān)控系統(tǒng)中,對解析后的數(shù)據(jù)進行封裝處理,采用UDP通信協(xié)議發(fā)送至以太網(wǎng),監(jiān)控終端通過WIFI連入以太網(wǎng),采用UDP通信協(xié)議獲取數(shù)據(jù),顯示到界面上。不同區(qū)域的車間設(shè)備監(jiān)控系統(tǒng)形成組播,實現(xiàn)設(shè)備數(shù)據(jù)共享,安卓監(jiān)控終端加入組播,獲取實時設(shè)備數(shù)據(jù),主要通信框架如圖1所示。
圖1 監(jiān)控系統(tǒng)通信框架
遠程監(jiān)控系統(tǒng)以車間設(shè)備監(jiān)控系統(tǒng)作為上位機,安卓客戶端作為移動終端來實現(xiàn)對車間設(shè)備數(shù)據(jù)傳輸?shù)墓δ?。遠程監(jiān)控系統(tǒng)具備數(shù)據(jù)的存儲、處理和查詢功能。需要上位機服務(wù)器接收下位機數(shù)據(jù), MySQL數(shù)據(jù)庫實現(xiàn)對重要數(shù)據(jù)的管理、存儲。
MySQL由于其性能卓越,服務(wù)穩(wěn)定,開放源代碼無版本制約,自主性及使用成本低,體積小,安裝簡單易維護的優(yōu)勢倍受開發(fā)者的青睞[3-4]。
移動遠程監(jiān)控系統(tǒng)采用MySQL數(shù)據(jù)庫實現(xiàn)設(shè)備信息、計劃信息、操作人員信息和設(shè)備工作信息的存儲。車間設(shè)備監(jiān)控系統(tǒng)通過QMySQL驅(qū)動MySQL數(shù)據(jù)庫,QSqlDatabase與數(shù)據(jù)庫進行連接,QSqlQuery執(zhí)行SQL語句,對數(shù)據(jù)庫內(nèi)容進行增刪改查操作,QSqlRecord將封裝數(shù)據(jù)庫記錄。
上位機服務(wù)器作為監(jiān)控系統(tǒng)中數(shù)據(jù)的傳遞者,需要接收CAN總線的數(shù)據(jù),再將數(shù)據(jù)發(fā)送給監(jiān)控終端,同時接收來自監(jiān)控終端的指令,并將控制數(shù)據(jù)傳遞給下位機,實現(xiàn)監(jiān)控終端對下位機設(shè)備的遠程控制。
由于監(jiān)控終端需對不同區(qū)域設(shè)備進行監(jiān)控,故上位機服務(wù)器通信采用UDP協(xié)議實現(xiàn)傳輸。考慮到設(shè)備量較多,數(shù)據(jù)量較大,為優(yōu)化網(wǎng)絡(luò)性能,減少其他區(qū)域服務(wù)器的負載,服務(wù)器采用組播方式。本區(qū)域上位機監(jiān)控系統(tǒng)服務(wù)器獲取數(shù)據(jù)后,將數(shù)據(jù)進行處理,設(shè)計好數(shù)據(jù)結(jié)構(gòu)后,封裝成數(shù)據(jù)報,往組播地址IP發(fā)送,實現(xiàn)共享本區(qū)域數(shù)據(jù)。也可接受來自其他區(qū)域的數(shù)據(jù),完成跨區(qū)域監(jiān)控。將監(jiān)控終端加入以太網(wǎng)組播地址,即可接收到所有區(qū)域設(shè)備實時數(shù)據(jù)。當(dāng)安卓客戶端需要查詢數(shù)據(jù)庫內(nèi)容時,向服務(wù)器發(fā)出查詢報文,服務(wù)器響應(yīng)后,從數(shù)據(jù)庫中獲取數(shù)據(jù),發(fā)送給監(jiān)控客戶端。設(shè)備實時數(shù)據(jù)中部分數(shù)據(jù)結(jié)構(gòu)如表1所示。
表1 設(shè)備信息數(shù)據(jù)結(jié)構(gòu)
在安卓移動遠程監(jiān)控系統(tǒng)中,移動監(jiān)控終端主要是安卓客戶端通過UDP網(wǎng)絡(luò)通信獲取車間設(shè)備監(jiān)控系統(tǒng)的實時設(shè)備數(shù)據(jù)。安卓客戶端作為整個系統(tǒng)手機移動終端部分,由用戶選擇工作區(qū)域,驗證信息登錄后,獲取監(jiān)控權(quán)限,接收并顯示來自網(wǎng)絡(luò)中設(shè)備的數(shù)據(jù),將其顯示在客戶端界面中,具體功能如下:
(1)工作區(qū)域選擇功能;
(2)人員信息登錄功能;
(3)設(shè)備工作參數(shù)實時顯示功能;
(4)設(shè)備狀態(tài)、故障信息、工作計劃等重要信息的查詢功能;
(5)遠程控制功能。
通過Qt開發(fā)安卓APP,應(yīng)該考慮兩個部分[5]。第一個是基于Qt類庫的C/C++程序部分,這個部分是APP實現(xiàn)圖像顯示,數(shù)據(jù)操作以及事件響應(yīng)。第二個部分則是基于Java的Android底層資源調(diào)用API部分,這部分是與Android底層硬件通信和調(diào)用的功能。通過JNI[6](Java Native Interface)實現(xiàn)這兩部分的協(xié)同工作,基于Qt的安卓APP封裝模型如圖2所示。
圖2 基于Qt的安卓APP封裝模型
在此模型中,模塊①里,Qt編譯平臺會利用抽象層QPA(Qt Platfrom Abstaction)對所有的操作系統(tǒng)進行統(tǒng)一化支持,使得Qt類庫程序可以運行在其他操作系統(tǒng)中,包括Android平臺;模塊②是Qt中的事件循環(huán)與Android里的事件循環(huán)通過線程發(fā)生交互;模塊③中Qt編寫的安卓程序利用JNI反向調(diào)用Java代碼,實現(xiàn)調(diào)用安卓系統(tǒng)功能,諸如判斷網(wǎng)絡(luò)連接、獲取外部存儲或者緩存文件目錄等。
主界面及子模塊界面均采用C++代碼進行設(shè)計,界面均是基于Qt類庫實現(xiàn),用戶對界面的操作均是轉(zhuǎn)化為事件的形式。當(dāng)用戶在屏幕上按下按鈕、在編輯框輸入數(shù)字,都會發(fā)出一個相應(yīng)的事件。對事件進行響應(yīng)則是通過信號與槽的機制來實現(xiàn)的。信號和槽機制是Qt的核心機制,主要應(yīng)用于對象之間的通信。它是Qt對象間通信的一種機制,也是Qt的核心特性,它替代了回調(diào)函數(shù)。MOC(Meta Object Compiler)是Qt的一種工具,它本質(zhì)上是C++預(yù)處理程式,可在編譯前將擴展語法如宏Q_OBJECT去掉,生成附加代碼,幫助Qt處理信號與槽。
每個Qt對象均有若干個定義好的信號和槽,當(dāng)對象狀態(tài)發(fā)生變化時(如發(fā)生一個事件),一個信號則被發(fā)送,與信號相關(guān)聯(lián)的槽則會響應(yīng)信號并進行響應(yīng)的處理。當(dāng)一個類被繼承時, 子類將會繼承父類的信號與槽,同時也可根據(jù)需要自定義信號與槽。信號與槽是一個十分強大的組件編程機制[7-8],如圖3所示。
圖3 信號與槽
客戶端界面設(shè)計采用樹狀界面??蛻舳私缑姘ǎ汗ぷ鲄^(qū)域選擇界面、登陸界面、主界面、設(shè)備實時信息界面、工作信息界面、用戶界面、故障信息界面以及計劃信息界面??蛻舳瞬僮髁鞒倘鐖D4所示。
圖4 安卓客戶端操作流程圖
(1)工作區(qū)域選擇界面。該界面獲取指定區(qū)域設(shè)備工作數(shù)據(jù),方便工作人員從一個監(jiān)控區(qū)域轉(zhuǎn)換到另一個監(jiān)控區(qū)域時,只需切換工作區(qū)域即可實現(xiàn)設(shè)備監(jiān)控切換。
(2)登錄界面。該界面進行監(jiān)控人員信息驗證。與數(shù)據(jù)庫信息進行驗證,通過后不同人員擁有不同操作權(quán)限,分為操作人員和管理人員權(quán)限,權(quán)限不同客戶端局部功能也不同,驗證失敗則無法獲取監(jiān)控頁面信息。
(3)主界面。該界面對區(qū)域內(nèi)所有設(shè)備的工作狀態(tài)進行顯示,主要包括設(shè)備工作輸出功率,設(shè)備運行工作狀態(tài)如開機、關(guān)機或故障。方便操作人員能直觀地看到區(qū)域內(nèi)所有設(shè)備的工作狀態(tài)。
(4)設(shè)備實時信息界面。該界面對區(qū)域內(nèi)每臺設(shè)備具體的輸入輸出工作參數(shù)進行顯示以及設(shè)備工作狀態(tài)、故障狀態(tài)進行實時顯示,工作人員通過查看客戶端上設(shè)備實時工作信息、設(shè)備狀態(tài)即可判斷設(shè)備是否存在故障及故障類型,方便進行高效處理。
(5)工作信息界面。該界面查看區(qū)域內(nèi)各設(shè)備處于何種工作狀態(tài),以及設(shè)備歷史工作記錄。其中設(shè)備歷史工作記錄包括開機時間,關(guān)機時間以及工作總時長。
(6)故障信息界面。該界面用于查看設(shè)備故障歷史記錄。其中包括設(shè)備名稱、故障時間、狀態(tài)、故障類型、恢復(fù)類型和恢復(fù)狀態(tài)等。
(7)計劃信息界面。該界面用于查看計劃任務(wù)信息,管理人員可進行作業(yè)計劃下達。管理人員可對任務(wù)執(zhí)行人員、作業(yè)位置、作業(yè)設(shè)備進行選擇,對具體作業(yè)內(nèi)容進行編輯后進行下達,計劃任務(wù)將存儲于數(shù)據(jù)庫中,現(xiàn)場操作人員根據(jù)計劃執(zhí)行,實現(xiàn)遠程控制功能。
安卓客戶端與上位機服務(wù)器通信采用UDP[9]通信方式,UDP是輕量的、不可靠的、面向數(shù)據(jù)報,無連接的協(xié)議。由于不同上位機之間通過組播方式形成網(wǎng)絡(luò),安卓客戶端則采用加入組播的方式,可獲取其他上位機往組播所發(fā)送的數(shù)據(jù)包。在監(jiān)控不同區(qū)域時,根據(jù)不同區(qū)域IP地址進行選擇性接收,監(jiān)控系統(tǒng)網(wǎng)絡(luò)拓撲圖如圖5所示。
圖5 監(jiān)控系統(tǒng)網(wǎng)絡(luò)拓撲圖
在Qt中,采用QUdpSocket類實現(xiàn)UDP通訊。在上位機服務(wù)器端需要實例化一個QUdpSocket對象來創(chuàng)建一個通信套接字,并采用bind()函數(shù)去綁定地址和端口號,來監(jiān)聽指定客戶端的請求,當(dāng)套接字接收到客戶端數(shù)據(jù),則會發(fā)出readyRead()信號,將此信號關(guān)聯(lián),在槽函數(shù)中使用readDatagram()讀取數(shù)據(jù)。進行數(shù)據(jù)反饋時,發(fā)送數(shù)據(jù)采用writeDatagram()函數(shù),指定手機終端IP和端口號進行發(fā)送。
安卓客戶端同樣需要實例化QUdpSocket[10]對象創(chuàng)建通信套接字,可使用writeDatagram()函數(shù)往組播中發(fā)送數(shù)據(jù)包。同時使用joinMulticastGroup()函數(shù)加入一個多播組,leaveMulticastGroup()函數(shù)離開一個多播組,關(guān)鍵函數(shù)語句如下:
m_UdpSocket->bind(address,port);
m_UdpSocket->writeDatagram(data,size,address,port);
m_UdpSocket->readDatagram(data,size,address,port);
connect(m_UdpSocket,SIGNAL(readyRead()),this,SLOT(read_data()));
其中read_data()為自定義函數(shù)。
針對傳統(tǒng)工業(yè)車間環(huán)境,通過Qt良好的跨平臺性能,結(jié)合C++編程和互聯(lián)網(wǎng)通信開發(fā)移動監(jiān)控客戶端。移動客戶端基于上位機程序編寫移植,省去二次學(xué)習(xí)Java的時間成本,降低了學(xué)習(xí)成本。同時克服監(jiān)控地點限制,使用戶通過手機即可檢測車間設(shè)備工作狀態(tài),無需再去現(xiàn)場查看設(shè)備信息,提高了工作效率。