徐建明 俞俊銘 董建偉 俞 立
(浙江工業(yè)大學(xué)信息工程學(xué)院 杭州 310023)
隨著德國(guó)“工業(yè)4.0”的推出,工業(yè)生產(chǎn)進(jìn)入到使用信息化技術(shù)促進(jìn)產(chǎn)業(yè)變革的時(shí)代,同時(shí)轉(zhuǎn)向云計(jì)算是互聯(lián)網(wǎng)發(fā)展面臨的一個(gè)重大改變,而云平臺(tái)則是該改變中重要的一個(gè)環(huán)節(jié),因此研究基于云平臺(tái)的機(jī)器人監(jiān)控系統(tǒng)顯得越來越重要。
目前機(jī)器人監(jiān)控系統(tǒng)多數(shù)采用客戶端/服務(wù)端的模式進(jìn)行搭建,如張愛民等人[1]基于TCP/IP協(xié)議設(shè)計(jì)工業(yè)機(jī)器人遠(yuǎn)程監(jiān)控與診斷系統(tǒng)。這種模式下,遠(yuǎn)程端需要安裝客戶端,系統(tǒng)擴(kuò)展性降低;另一種模式是通過訪問瀏覽器獲取數(shù)據(jù)并查看設(shè)備運(yùn)行狀態(tài)。Sallinen等人[2]提出基于Web用戶界面的工業(yè)機(jī)器人遠(yuǎn)程監(jiān)控與維護(hù)的框架。駱曉娟等人[3]設(shè)計(jì)基于AJAX和瀏覽器/服務(wù)器(browser/server,B/S)構(gòu)架的實(shí)時(shí)監(jiān)測(cè)系統(tǒng)。徐建明等人[4]設(shè)計(jì)基于Web的工業(yè)機(jī)器人3D虛擬動(dòng)態(tài)監(jiān)控系統(tǒng)。同時(shí)隨著云平臺(tái)和云計(jì)算的發(fā)展,基于云平臺(tái)的機(jī)器人監(jiān)控系統(tǒng)成為物聯(lián)網(wǎng)未來的發(fā)展方向之一。Gubbi等人[5]研究物聯(lián)網(wǎng)未來的發(fā)展方向。Ji等人[6]提出基于云的物聯(lián)網(wǎng)城市停車系統(tǒng)。Douzis[7]提出基于云的模塊化和通用物聯(lián)網(wǎng)管理系統(tǒng)。Baker等人[8]研究基于云的物聯(lián)網(wǎng)系統(tǒng)的組合算法。Dinh等人[9]提出云與面向移動(dòng)云計(jì)算應(yīng)用的物聯(lián)網(wǎng)基于位置的交互模型。同時(shí),消息隊(duì)列遙測(cè)傳輸(message queuing telemetry transport, MQTT)作為即時(shí)消息協(xié)議逐漸被廣泛用于物聯(lián)網(wǎng)。Schmitt等人[10]提出通過MQTT協(xié)議作為物聯(lián)網(wǎng)數(shù)據(jù)交換的橋梁。在此基礎(chǔ)上,機(jī)器人3維展示被逐漸運(yùn)用于監(jiān)控系統(tǒng)中。Mostefa等人[11]設(shè)計(jì)一種基于虛擬現(xiàn)實(shí)的移動(dòng)機(jī)器人遠(yuǎn)程操作系統(tǒng)。楊碩等人[12]設(shè)計(jì)基于虛擬現(xiàn)實(shí)的一對(duì)多遠(yuǎn)程康復(fù)訓(xùn)練機(jī)器人監(jiān)控系統(tǒng)。
隨著數(shù)據(jù)量不斷擴(kuò)大,基于本地服務(wù)器的監(jiān)控系統(tǒng)對(duì)硬件資源的需求會(huì)不斷增大,本文以客戶端/服務(wù)端(client/server,C/S)模式與B/S模式相結(jié)合的方式設(shè)計(jì)一種基于阿里云的機(jī)器人監(jiān)控系統(tǒng),相較于上述傳統(tǒng)方式,云平臺(tái)具有更好的穩(wěn)定性、容量擴(kuò)展性,可按照需求為用戶定制服務(wù)資源。本系統(tǒng)由本地客戶端和Web遠(yuǎn)程監(jiān)控端組成,其中本地客戶端基于TCP/IP協(xié)議和OPC統(tǒng)一架構(gòu)(OPC unified architecture,OPC UA)協(xié)議與機(jī)器人控制器進(jìn)行數(shù)據(jù)通訊,通過搭建MySQL客戶端存儲(chǔ)數(shù)據(jù),在此基礎(chǔ)上,基于MQTT協(xié)議與云端進(jìn)行數(shù)據(jù)交互。Web遠(yuǎn)程監(jiān)控端采用前后端分離的方式搭建,相較于傳統(tǒng)機(jī)器人監(jiān)控系統(tǒng)的開發(fā)方式,前后端分離的方式具有開發(fā)周期短暫的優(yōu)勢(shì),同時(shí)更容易發(fā)現(xiàn)系統(tǒng)運(yùn)行時(shí)出現(xiàn)的錯(cuò)誤。后端基于Django rest framework框架搭建,前端采用Vue框架搭建,大屏展示界面基于阿里云的DataV模塊搭建,3維畫面展示界面基于WebGL[13]和Three.js技術(shù)搭建[14]。
本系統(tǒng)以基于CoDeSys開發(fā)的SCARA機(jī)器人控制系統(tǒng)為研究對(duì)象進(jìn)行搭建,包括本地客戶端和WEB遠(yuǎn)程監(jiān)控端,系統(tǒng)框架圖如圖1所示。
圖1 系統(tǒng)框架圖
圖1中的設(shè)備層與設(shè)備操作層通過機(jī)器人控制器進(jìn)行銜接,機(jī)器人控制器的運(yùn)動(dòng)控制程序以及OPC UA服務(wù)器由Codesys PLC軟件編程工具進(jìn)行編寫,通過工業(yè)以太網(wǎng)(EtherCAT)解決采集機(jī)器人相關(guān)物理數(shù)據(jù)[15],通過搭建OPC UA客戶端來解決SCARA機(jī)器人的數(shù)據(jù)交互。
本地客戶端基于TCP/IP協(xié)議搭建,通過OPC UA協(xié)議解決與控制器的數(shù)據(jù)交互問題,基于MySQL的嵌入式應(yīng)用程序解決數(shù)據(jù)存儲(chǔ)問題,其中數(shù)據(jù)庫作為監(jiān)控系統(tǒng)前后端的信息載體,存儲(chǔ)SCARA機(jī)器人運(yùn)動(dòng)過程中產(chǎn)生的各種信息,同時(shí)基于MQTT協(xié)議解決與云端的數(shù)據(jù)交互問題,MQTT協(xié)議具有功耗低、輕量級(jí)及易于實(shí)現(xiàn)的優(yōu)點(diǎn),是物聯(lián)網(wǎng)的重要組成部分。
WEB遠(yuǎn)程監(jiān)控端由圖1中的平臺(tái)服務(wù)層,應(yīng)用服務(wù)層和門戶層組成,采用nginx[16]與uwsgi技術(shù)將遠(yuǎn)程監(jiān)控程序部署于阿里云服務(wù)器,程序部署完成后,用戶可以通過瀏覽器隨時(shí)隨地查看機(jī)器人歷史數(shù)據(jù)并進(jìn)行實(shí)時(shí)監(jiān)控。
本地監(jiān)控端采用C/S(客戶端/服務(wù)器端)模式進(jìn)行搭建,主要由3部分組成,即基于OPC UA Client[17]的數(shù)據(jù)采集模塊、基于MySQL的數(shù)據(jù)存儲(chǔ)模塊和基于MQTT與云平臺(tái)的數(shù)據(jù)交互模塊。
傳統(tǒng)的工業(yè)自動(dòng)化解決方案由于在設(shè)備間通信上采用不兼容和不可互操作的差別化標(biāo)準(zhǔn),因而存數(shù)據(jù)交互的困難。OPC UA架構(gòu)采用客戶端/服務(wù)器模式和發(fā)布者/訂閱者模式為數(shù)據(jù)交互提供框架,在地址空間定義節(jié)點(diǎn)類并實(shí)例化,通過層次結(jié)構(gòu)進(jìn)行訪問,以簡(jiǎn)化客戶端訪問。C#語言可以實(shí)現(xiàn)OPC UA的自動(dòng)化接口,提供自動(dòng)配置、過程控制和數(shù)據(jù)存取的接口,在窗口界面中搭建用戶輸入和響應(yīng)事件模塊,在工作線程中通過訂閱方式對(duì)數(shù)據(jù)進(jìn)行采集。在功能上實(shí)現(xiàn)瀏覽OPC UA服務(wù)器、修改數(shù)據(jù)、訂閱數(shù)據(jù),具體實(shí)現(xiàn)方式如下。
(1)瀏覽OPC UA服務(wù)器。在窗口界面拖入panel容器控件,在主程序中引用“Opc.Ua.Client”庫,在工作線程中使用FormBrowseServer form = new FormBrowseServer()函數(shù),該函數(shù)通過結(jié)構(gòu)層次的方式訪問服務(wù)器,查看服務(wù)器的節(jié)點(diǎn)狀態(tài),從而獲取服務(wù)器的內(nèi)容,使用panel.Controls.Add(form)函數(shù),該函數(shù)是C#語言的內(nèi)置函數(shù),用于將服務(wù)器的內(nèi)容顯示在panel容器中,供用戶瀏覽和使用。
(2)修改數(shù)據(jù)。在工作線程中使用private OpcUaClient opcUaClient= new OpcUaClient()函數(shù),該函數(shù)為opcua.dll函數(shù)庫的內(nèi)置函數(shù),用于將OPC UA客戶端實(shí)例化,工作線程根據(jù)該實(shí)例對(duì)象進(jìn)行節(jié)點(diǎn)操作、節(jié)點(diǎn)查閱、節(jié)點(diǎn)訂閱以及其他操作,線程中使用opcUaClient.writeNode(this.NodeId.Text,this.writeNodeId.Text)函數(shù),該函數(shù)通過結(jié)構(gòu)層次查找節(jié)點(diǎn),依賴TCP/IP協(xié)議修改節(jié)點(diǎn)數(shù)據(jù),從而實(shí)現(xiàn)修改機(jī)械臂運(yùn)動(dòng)參數(shù)等數(shù)據(jù),并控制機(jī)械臂。
(3)訂閱數(shù)據(jù)。在工作線程中編寫SubCallback()函數(shù),該函數(shù)通過調(diào)用者(Caller)向回調(diào)函數(shù)(Callee)發(fā)出調(diào)用,被調(diào)用函數(shù)啟動(dòng)后,不需要被調(diào)函數(shù)執(zhí)行完畢,程序執(zhí)行流立即返回到調(diào)用者繼續(xù)執(zhí)行,從而實(shí)現(xiàn)節(jié)點(diǎn)訂閱,并對(duì)訂閱的節(jié)點(diǎn)綁定listView1_DragDrop()函數(shù),該函數(shù)根據(jù)C#控件內(nèi)容的可拖動(dòng)原理,實(shí)現(xiàn)對(duì)數(shù)據(jù)節(jié)點(diǎn)名稱的拖動(dòng),編寫AddSubscription()函數(shù),用于添加節(jié)點(diǎn),并將每個(gè)節(jié)點(diǎn)綁定上文中的SubCallback()函數(shù),實(shí)現(xiàn)對(duì)批量節(jié)點(diǎn)的訂閱。工作程序流程圖如圖2所示。
圖2 數(shù)據(jù)訂閱程序流程圖
MySQL[18]是一個(gè)關(guān)系型數(shù)據(jù)庫管理系統(tǒng),關(guān)系數(shù)據(jù)庫將數(shù)據(jù)保存在不同的表中以增加速度并提高靈活性,并為C#編程語言提供了API接口,同時(shí)能夠作為一個(gè)庫嵌入到其他軟件中,使嵌入客戶端的方式實(shí)現(xiàn)數(shù)據(jù)的存儲(chǔ)得以實(shí)現(xiàn),不僅可以提高數(shù)據(jù)的實(shí)時(shí)性,也能降低本地客戶端的內(nèi)存空間。
本數(shù)據(jù)存儲(chǔ)模塊通過C#語言進(jìn)行搭建,并嵌入到本地客戶端,數(shù)據(jù)庫表格采用樹狀關(guān)系圖的方法進(jìn)行設(shè)計(jì),使用多表關(guān)聯(lián)方式建立機(jī)器人對(duì)象表、設(shè)備表、采集點(diǎn)數(shù)據(jù)表,該設(shè)計(jì)方法優(yōu)勢(shì)在于擴(kuò)展性高,無需頻繁修改數(shù)據(jù)庫。在功能上實(shí)現(xiàn)數(shù)據(jù)解析,數(shù)據(jù)篩選和數(shù)據(jù)存儲(chǔ),如圖3所示,具體實(shí)現(xiàn)方式如下。
圖3 數(shù)據(jù)存儲(chǔ)模塊功能圖
(1)數(shù)據(jù)解析。將從控制器接收到的數(shù)據(jù)按照通訊協(xié)議解析成當(dāng)前系統(tǒng)實(shí)際的物理值,在工作線程中使用value.WrappedValue.TypeInfo.BuiltInType函數(shù),該函數(shù)有2個(gè)屬性,數(shù)組和基礎(chǔ)類型,通過返回值判斷數(shù)據(jù)類型、數(shù)據(jù)格式和數(shù)據(jù)量,從而得到該數(shù)據(jù)包含的物理量和數(shù)值單位。
(2)數(shù)據(jù)篩選。在窗口界面中拖入comboBox控件和ListBox列表框控件,用于存放采集點(diǎn)信息,在工作線程中使用comboBox.Items.Add(sArray[s-1])函數(shù),該函數(shù)用于在comboBox控件中添加新的采集點(diǎn),同時(shí)使用infos.Add(new database(){data=""})函數(shù),該函數(shù)通過創(chuàng)建新的數(shù)據(jù)對(duì)象,將采集的數(shù)據(jù)篩選后添加至列表框控件中,便于用戶對(duì)數(shù)據(jù)的管理和分類。
(3)數(shù)據(jù)存儲(chǔ)。在本地客戶端主程序中引用“MySQL.Data.DLL”庫,在工作線程中使用MySqlConnection conn = new MySqlConnection()函數(shù),該函數(shù)用于創(chuàng)建MySQL Client實(shí)例對(duì)象,對(duì)實(shí)例對(duì)象調(diào)用conn.Open()函數(shù)創(chuàng)建MySQL通道,編寫MySqlCommand cmd1 = new MySqlCommand(" select * from users_userprofile ", conn)函數(shù),該函數(shù)根據(jù)上文創(chuàng)建的實(shí)例對(duì)象(conn)連接MySQL數(shù)據(jù)庫,編寫MySqlCommand cmd1 = new MySqlCommand("select * from device_device order by id DESC limit 1", conn)函數(shù),該函數(shù)用于將數(shù)據(jù)存儲(chǔ)至云端MySQL數(shù)據(jù)庫,同時(shí)添加存儲(chǔ)時(shí)間,用戶信息等,函數(shù)內(nèi)部參數(shù)包括實(shí)例對(duì)象,采集點(diǎn)對(duì)象和采集點(diǎn)數(shù)據(jù)。
目前基于Http協(xié)議的物聯(lián)網(wǎng)系統(tǒng)開發(fā)的方式[19]被頻繁采用,但在嵌入式系統(tǒng)中或網(wǎng)絡(luò)帶寬昂貴的環(huán)境下,Http協(xié)議并不適用,MQTT做為一種低開銷、低帶寬占用的即時(shí)通訊協(xié)議,MQTT在工業(yè)物聯(lián)網(wǎng)、小型設(shè)備等方面有廣泛的應(yīng)用。因此本客戶端選擇采用MQTT協(xié)議搭建數(shù)據(jù)交互模塊,具體實(shí)現(xiàn)方式如下。
(1)在云端搭建MQTT服務(wù)器,用于主題消息接收、發(fā)布。使用“apollo create brokerServer”創(chuàng)建服務(wù)器實(shí)例,使用“apollo-broker.cmd run”啟動(dòng)服務(wù)器,并且Apollo提供后臺(tái)管理頁面,方便管理和調(diào)試。
(2)建立MQTT服務(wù),在客戶端程序中添加引用“MQTTnet”,用于激活MQTTnet功能。
(3)在工作線程中使用private MqttClient mqttClient函數(shù),該函數(shù)用于創(chuàng)建MQTT實(shí)例對(duì)象,連接MySQL數(shù)據(jù)庫。
(4)利用C#自帶控件庫在窗口界面中拖入textBox等控件,用于在客戶端中搭建MQTT用戶操作界面。
MQTT模塊的后臺(tái)工作線程為編寫Task.Run(async()=>{awaitConnectMqttServerAsync();})函數(shù),該函數(shù)用于連接位于云端的MQTT服務(wù)器;通過編寫MqttApplicationMessage()函數(shù),該函數(shù)用于將采集到的數(shù)據(jù)實(shí)時(shí)地傳輸?shù)轿挥谠贫说腗QTT服務(wù)器;同時(shí)通過mqttClient.PublishAsync()函數(shù),該函數(shù)用于訂閱所需要的數(shù)據(jù),程序流程如圖4所示。
圖4 MQTT程序流程圖
整個(gè)工作流程如圖5所示,當(dāng)客戶端連接到機(jī)器人控制器后,通過OPC客戶端將采集到的數(shù)據(jù)以MQTT的形式實(shí)時(shí)地傳輸?shù)皆贫?,位于云端的MQTT服務(wù)器接收到數(shù)據(jù)后,做出處理,發(fā)布該主題,同時(shí)位于WEB端的MQTT客戶端訂閱該主題,獲取數(shù)據(jù)。
圖5 MQTT工作流程圖
Web遠(yuǎn)程監(jiān)控端采用B/S(瀏覽器、服務(wù)器)架構(gòu)的方式實(shí)現(xiàn),使用阿里云作為Web服務(wù)器。傳統(tǒng)的Web框架過于復(fù)雜,難以滿足快速開發(fā)的要求,而Django框架以其便捷、快速、高效的特點(diǎn)而深受好評(píng)。綜上所述,后端基于Django rest framework框架[20]進(jìn)行搭建,以JSON[21]的格式提供數(shù)據(jù)接口。前端基于Vue框架進(jìn)行搭建,Vue是一套用于構(gòu)建用戶界面的漸進(jìn)式JavaScript框架[22]。在此基礎(chǔ)上,Web遠(yuǎn)程監(jiān)控端針對(duì)SCARA機(jī)器人,搭建3維動(dòng)畫界面和繪制曲線圖。Web系統(tǒng)分為4個(gè)層面:
(1)門戶層。即網(wǎng)頁瀏覽,通過統(tǒng)一認(rèn)證授權(quán)提供業(yè)務(wù)服務(wù)統(tǒng)一注冊(cè)、統(tǒng)一登錄入口。
(2)API接口輸出層。該層主要包括設(shè)備資產(chǎn)管理,通過設(shè)備數(shù)據(jù)采集與建模,以API接口的形式提供給前端使用。
(3)業(yè)務(wù)邏輯層。該層主要為各業(yè)務(wù)應(yīng)用系統(tǒng)的構(gòu)建和運(yùn)行提供技術(shù)支撐,并為各應(yīng)用服務(wù)提供計(jì)算、數(shù)據(jù)的調(diào)度及數(shù)據(jù)管理服務(wù)。
(4)數(shù)據(jù)庫操作層。該層主要是獲取數(shù)據(jù)庫中的數(shù)據(jù)。通過Django框架中的model操作與MySQL數(shù)據(jù)庫進(jìn)行交互,使用ModelViewset類對(duì)數(shù)據(jù)庫進(jìn)行增刪改查操作。Web系統(tǒng)框架如圖6所示。
圖6中的門戶層即前端可視化界面;圖6中的API接口輸出層、業(yè)務(wù)邏輯層和數(shù)據(jù)操作層組成后端服務(wù)程序,用于數(shù)據(jù)驗(yàn)證、數(shù)據(jù)查詢,用戶驗(yàn)證等操作。整個(gè)Web系統(tǒng)包括用戶管理功能塊,數(shù)據(jù)查詢功能塊,實(shí)時(shí)監(jiān)控功能塊和3維動(dòng)畫展示功能塊。
圖6 Web系統(tǒng)框架圖
用戶管理采用目前較流行的session與token機(jī)制進(jìn)行驗(yàn)證,使用JSON Web Token(JWT)作為跨域身份驗(yàn)證的解決方案,在雙方之間使用JSON對(duì)象進(jìn)行數(shù)據(jù)傳輸,該種方式通過使用密鑰(HMAC算法),RSA或ECDSA 的公鑰/密鑰鍵值對(duì)進(jìn)行認(rèn)證和信任,具有較高的安全性,原理如圖7所示。用戶管理模塊實(shí)現(xiàn)用戶短信驗(yàn)證注冊(cè)和用戶驗(yàn)證登錄功能,具體實(shí)現(xiàn)方式如下。
圖7 JWT原理圖
(1)用戶短信驗(yàn)證注冊(cè)。后端Django程序中編寫YunPian()類方法,該函數(shù)調(diào)用底層數(shù)據(jù)傳輸協(xié)議,并依賴第3方短信服務(wù)商,實(shí)現(xiàn)短信發(fā)送功能,編寫generate_code()函數(shù),調(diào)用隨機(jī)數(shù)生成函數(shù),生成4位驗(yàn)證碼,編寫UserRegSerializer()類方法,該函數(shù)實(shí)現(xiàn)的原理是通過獲取用戶傳輸過來的驗(yàn)證碼,與上文中生成的驗(yàn)證碼作比較,從而驗(yàn)證短信驗(yàn)證碼和密碼格式的正確性,編寫SmsCodeViewset()類方法,將通過驗(yàn)證的用戶名和密碼存入數(shù)據(jù)庫;前端VUE程序[23]中編寫register組件,用于搭建用戶注冊(cè)界面,同時(shí)使用Html5, CSS3, JavaScript, jquery[24]美化界面。編寫register()函數(shù),通過后端生成的api接口,上傳數(shù)據(jù),實(shí)現(xiàn)用戶注冊(cè)功能。
(2)用戶驗(yàn)證登錄。編寫UserViewset()類方法,用于獲取前端上傳的用戶名和密碼信息,編寫UserDetailSerializer()類方法,用于驗(yàn)證用戶名和密碼正確性,若正確,使用Response(re_dict)函數(shù)返回session與token給前端用戶界面,同時(shí)在settings配置文件中導(dǎo)入JWT,用于啟用該登錄驗(yàn)證功能塊,通過JWT自帶的登錄驗(yàn)證的api接口url(r'^login/', obtain_jwt_token)完成用戶登錄功能;前端Vue程序中編寫login組件,搭建用戶登錄界面,建立store狀態(tài)管理器,用于存儲(chǔ)用戶登錄的信息,如session與token,實(shí)現(xiàn)用戶登錄功能。
數(shù)據(jù)查詢頁面以節(jié)點(diǎn)樹的形式展現(xiàn),該方式可以簡(jiǎn)潔明了地展示所有設(shè)備和采集點(diǎn),頁面上通過查詢?cè)O(shè)備,查看設(shè)備下的所有采集點(diǎn)數(shù)據(jù),通過曲線圖的形式展示數(shù)據(jù)。數(shù)據(jù)查詢模塊在功能上設(shè)計(jì)實(shí)現(xiàn)用戶數(shù)據(jù)綁定,數(shù)據(jù)篩選和數(shù)據(jù)展示等3大功能,如圖8所示,具體實(shí)現(xiàn)方式如下。
圖8 數(shù)據(jù)查詢模塊功能圖
(1)用戶數(shù)據(jù)綁定。編寫DeviceViewset()類方法,該函數(shù)通過遍歷url配置中的as_view字典參數(shù),獲取元組類型的items(),從而獲取用戶信息,編寫SensorSerializer()類方法,該函數(shù)用于獲取該用戶下的設(shè)備數(shù)據(jù)和采集點(diǎn)數(shù)據(jù),以JSON格式提供給前端,同時(shí)在url.py文件使用路由注冊(cè)函數(shù),給前端提供api接口;前端VUE程序中編寫device組件,搭建用戶數(shù)據(jù)可視化界面,通過編寫getDeviceInfo()函數(shù),該函數(shù)用于獲取相關(guān)數(shù)據(jù),實(shí)現(xiàn)用戶數(shù)據(jù)綁定功能。
(2)數(shù)據(jù)篩選。編寫CollectionPointViewset()類方法,該函數(shù)通過遍歷所有字典參數(shù)獲取所有采集點(diǎn)數(shù)據(jù),編寫collectionFilter()類方法,該函數(shù)通過接收"|"前的變量值(value)和":"后的參數(shù)(args),返回一個(gè)值。從而解決時(shí)間篩選的問題,在該基礎(chǔ)上,編寫filter_backends()類方法,用于實(shí)現(xiàn)數(shù)據(jù)排序,數(shù)據(jù)過濾和數(shù)據(jù)查詢等功能。前端VUE程序中編寫deviceBrowses組件,搭建用戶數(shù)據(jù)篩選界面,如時(shí)間段篩選,設(shè)備名稱篩選等,在此基礎(chǔ)之上編寫getCollectionName=params=>{return,axios.get(`${local_host}/collectionpoint/`, { params: params })}函數(shù),將篩選條件發(fā)送到后端程序,后端獲取篩選條件信息后,實(shí)現(xiàn)數(shù)據(jù)篩選功能。
(3)數(shù)據(jù)展示。在Vue框架中引入jqplot功能包,該功能包用于在前端頁面繪制曲線圖,通過調(diào)用MYM.jqplot函數(shù),在該函數(shù)中添加數(shù)據(jù)列表,axes、axesDefaults、highlighter、cursor、title等參數(shù)來繪制曲線圖;服務(wù)端使用流行的rest api接口的形式給前端提供數(shù)據(jù)。前端頁面通過axios()函數(shù)向服務(wù)端請(qǐng)求數(shù)據(jù),服務(wù)端首先查看客戶端是否已經(jīng)登錄,如果有則提供對(duì)用戶開放的api接口。隨后繼續(xù)監(jiān)聽是否有具體請(qǐng)求某個(gè)api接口,如果有則將采集到的機(jī)器人最新數(shù)據(jù)封裝成JSON格式發(fā)送到客戶端,實(shí)現(xiàn)數(shù)據(jù)展示功能。
數(shù)據(jù)實(shí)時(shí)監(jiān)控展示主要分為自定義Web界面的數(shù)據(jù)監(jiān)控與阿里云DataV的數(shù)據(jù)監(jiān)控。
自定義Web界面數(shù)據(jù)監(jiān)控是通過MQTT協(xié)議實(shí)現(xiàn),實(shí)現(xiàn)與MQTT服務(wù)器交互、采集點(diǎn)篩選和數(shù)據(jù)實(shí)時(shí)顯示等功能,如圖9所示,具體實(shí)現(xiàn)方式如下。
圖9 數(shù)據(jù)監(jiān)控模塊功能圖
(1)與MQTT服務(wù)器交互。在前端Vue項(xiàng)目中引入Paho功能包,用于實(shí)現(xiàn)MQTT客戶端功能,生成MQTT客戶端前先編寫用于連接MQTT服務(wù)器的參數(shù)列表,如服務(wù)器IP地址、端口號(hào)等,具體為ServerUri=’mq.tongxinmao.com’ServerPort=18832;TimeOut=5;KeepAlive=100;CleanSession=false;SSL=false;在此基礎(chǔ)上調(diào)用new Paho.MQTT.Client函數(shù),創(chuàng)建MQTT Client實(shí)例,編寫onConnect()函數(shù)和onConnectionLost()函數(shù)用于登錄和斷開MQTT服務(wù)器;編寫WriteToStatus()函數(shù),用于描述MQTT狀態(tài);編寫onMessageArrived()函數(shù),用于接收MQTT服務(wù)器的消息,實(shí)現(xiàn)與MQTT服務(wù)器數(shù)據(jù)交互功能。
(2)采集點(diǎn)篩選。在前端Vue項(xiàng)目中編寫getChartAllData()函數(shù),從MQTT服務(wù)器獲取所有上傳的數(shù)據(jù),編寫editChartData()函數(shù),用于移除繪制到曲線圖上的部分曲線,編寫collectData:function()函數(shù),用于獲取實(shí)時(shí)數(shù)據(jù),實(shí)現(xiàn)采集點(diǎn)篩選功能。
(3)數(shù)據(jù)實(shí)時(shí)顯示。搭建在數(shù)據(jù)采集客戶端的MQTT Client,不斷將數(shù)據(jù)以0.5 s間隔上傳到MQTT服務(wù)器,位于前端界面的MQTT客戶端訂閱MQTT服務(wù)器上該主題,獲取數(shù)據(jù),編寫this.plot= MYM.jqplot(‘UserChart’, SeriesData)函數(shù),將采集到的數(shù)據(jù)實(shí)時(shí)顯示在表格和曲線圖中,通過修改seriesDefaults、axes、legend、highlighter等參數(shù),更改曲線樣式,實(shí)現(xiàn)數(shù)據(jù)實(shí)時(shí)顯示功能。
阿里云DataV的數(shù)據(jù)監(jiān)控界面是通過使用阿里云DataV中的組件,搭建整個(gè)UI界面,DataV搭建頁面方便簡(jiǎn)潔,使用阿里云所提供的組件,拖拽到頁面即可形成一個(gè)界面,界面酷炫。數(shù)據(jù)接口有多種方式,比如api接口,靜態(tài)數(shù)據(jù)等。本方案使用最常見的api數(shù)據(jù)接口的形式。后端服務(wù)器只需要將數(shù)據(jù)以json的數(shù)據(jù)格式,以api接口方式開放,然后通過DataV獲取數(shù)據(jù),通過使用曲線表,數(shù)據(jù)列表等工具形成大屏界面,如圖10所示。
圖10 DataV大屏展示圖
本模塊使用soildworks對(duì)SCARA機(jī)器人進(jìn)行3D建模。soildworks[25]與其他主流的3維制圖軟件相比,做機(jī)械機(jī)構(gòu)設(shè)計(jì),鈑金設(shè)計(jì)等具有很大的優(yōu)勢(shì)。建模方案是將SCARA機(jī)器人分為5個(gè)部分進(jìn)行建模,如底座,連桿等。圖11所示是機(jī)器人底座3維模型圖。對(duì)機(jī)器人的各部件進(jìn)行建模后,將3D模型以stl的文件格式導(dǎo)出。
圖11 底座3維模型圖
在3D界面的開發(fā)中,需要使用到WebGL類庫three.js[26],three.js在WebGL的基礎(chǔ)上進(jìn)行了進(jìn)一步地封裝和簡(jiǎn)化開發(fā)過程。在此基礎(chǔ)上,需要導(dǎo)入STLLoader.js類庫,該庫功能是將stl文件導(dǎo)入到前端頁面當(dāng)中,具體實(shí)現(xiàn)方式如下。
(1)初始化場(chǎng)景。場(chǎng)景是所有物體的容器,在Three.js中場(chǎng)景就只有一種,用Three.Scene來表示,要構(gòu)件一個(gè)場(chǎng)景需要new一個(gè)對(duì)象,代碼為var scene=new Three.Scene()。
(2)初始化相機(jī)。相機(jī)類型選擇透視相機(jī),該類型所展示的效果更接近人眼視覺效果,代碼是This.camera=Three.PerspectiveCamera(70, 800/600, 0.1,10)。
(3)初始化渲染器。渲染器決定了渲染的結(jié)果并且以怎樣的方式來繪制,代碼如下:
var renderer=new Three.WebGLRenderer()
renderer.setSize(800,600)
this.renderer.render(this.scene, this.camera)
在完成一個(gè)3維場(chǎng)景的基本框架后,添加3維物體、光源,實(shí)例化模型并加載對(duì)象,導(dǎo)入SCARA機(jī)器人各部件的3維模型,對(duì)模型對(duì)象的材質(zhì)、網(wǎng)格、大小等進(jìn)行定義,圖12為機(jī)器人3維展示界面。
圖12 3維展示界面
通過實(shí)驗(yàn)驗(yàn)證本系統(tǒng)的可行性,首先測(cè)試本地客戶端的數(shù)據(jù)采集模塊,界面如圖13所示,上半部分用于設(shè)置機(jī)器人控制器的IP地址,連接控制器。下半部分用于查看節(jié)點(diǎn)樹數(shù)據(jù),數(shù)據(jù)操作和節(jié)點(diǎn)訂閱等。當(dāng)本地客戶端運(yùn)行時(shí)監(jiān)測(cè)診斷如圖14所示,從圖中可看出當(dāng)客戶端開始采集數(shù)據(jù)時(shí),進(jìn)程內(nèi)存會(huì)變大,但整個(gè)采集階段一直處于平穩(wěn)階段,其中CPU占有率一直處于低消耗狀態(tài),具有較高的效率。
圖13 OPC UA數(shù)據(jù)采集界面
圖14 客戶端運(yùn)行監(jiān)測(cè)診斷圖
其次測(cè)試本地客戶端的數(shù)據(jù)存儲(chǔ)模塊,界面如圖15所示,從操作界面可知,數(shù)據(jù)有多種存儲(chǔ)路徑,用戶可對(duì)不同種類的機(jī)器人進(jìn)行數(shù)據(jù)采集以及存儲(chǔ),系統(tǒng)不需要額外設(shè)計(jì)數(shù)據(jù)庫表進(jìn)行數(shù)據(jù)存儲(chǔ),從而提高了系統(tǒng)的可擴(kuò)展性。同時(shí),通信效率達(dá)到每50 ms發(fā)送一個(gè)數(shù)據(jù)包,客戶端采集的數(shù)據(jù)量為2 000,經(jīng)過MySQL模塊存儲(chǔ)后,數(shù)據(jù)庫接收到的數(shù)據(jù)量為1 982,丟包率不超過1%。
圖15 數(shù)據(jù)存儲(chǔ)模塊界面
本地客戶端的MQTT數(shù)據(jù)交互模塊測(cè)試界面如圖16所示,從操作界面可知,用戶可根據(jù)自己的需求上傳數(shù)據(jù),對(duì)數(shù)據(jù)進(jìn)行篩選。網(wǎng)頁端的MQTT客戶端測(cè)試界面如圖17所示,主要包括連接MQTT服務(wù)器,查看數(shù)據(jù)節(jié)點(diǎn),繪制波形圖,移除曲線等操作。其中本地客戶端的MQTT客戶端數(shù)據(jù)上傳間隔設(shè)置為25 ms,網(wǎng)頁端的MQTT客戶端運(yùn)行時(shí)監(jiān)測(cè)診斷如圖18所示,由圖可知,接收到數(shù)據(jù)的時(shí)間間隔在25~30 ms之間,延時(shí)較低,可以滿足系統(tǒng)實(shí)時(shí)性的要求。
圖16 數(shù)據(jù)交互模塊界面
圖17 用戶登錄界面
圖18 MQTT客戶端運(yùn)行監(jiān)測(cè)診斷圖
Web遠(yuǎn)程監(jiān)控端的用戶登錄測(cè)試界面如圖19所示,系統(tǒng)實(shí)現(xiàn)了用戶的登錄操作,與后端的數(shù)據(jù)交互信息如圖20所示,由圖可知,通過驗(yàn)證后只返回?zé)o規(guī)律的token值,保證了用戶個(gè)人信息與數(shù)據(jù)的安全性。
圖19 用戶登錄界面
圖20 數(shù)據(jù)交互信息圖
Web遠(yuǎn)程監(jiān)控端的設(shè)備瀏覽測(cè)試界面如圖21所示,設(shè)備列表欄用來顯示設(shè)備以及采集點(diǎn)信息。設(shè)備瀏覽界面的右側(cè)是用戶所選擇的設(shè)備的所有數(shù)據(jù),該模塊上半部分顯示用戶選取的單設(shè)備下的所有采集點(diǎn)信息,包括采集點(diǎn)名稱,采集的數(shù)量,初次采集時(shí)間以及最后一次采集時(shí)間;下半部分顯示用戶選取的采集點(diǎn)的所有數(shù)據(jù),包括數(shù)據(jù)的名稱和采集時(shí)間。
圖21 設(shè)備瀏覽測(cè)試界面
Web遠(yuǎn)程監(jiān)控端的數(shù)據(jù)查詢測(cè)試界面如圖22所示,設(shè)備數(shù)據(jù)查詢界面的中間部分的頂部用來選擇篩選條件,后端系統(tǒng)根據(jù)前端提供的篩選條件返回采集點(diǎn)數(shù)據(jù)和信息;中間部分的中部用來顯示經(jīng)過篩選查詢后采集點(diǎn)信息,包括該采集點(diǎn)的名稱,采集點(diǎn)總數(shù),初次采集時(shí)間以及末次采集時(shí)間;中間部分的底部用來將采集點(diǎn)的數(shù)據(jù)曲線化的形式展示出來。頁面的右側(cè)部分用來顯示所選取的采集點(diǎn)的所有數(shù)據(jù)以及采集時(shí)間。
圖22 數(shù)據(jù)查詢測(cè)試界面
實(shí)驗(yàn)結(jié)果表明,系統(tǒng)分塊化設(shè)計(jì)有利于整個(gè)系統(tǒng)的穩(wěn)定性、高效性和可擴(kuò)展性,同時(shí)前后端分離的方式使系統(tǒng)出現(xiàn)的錯(cuò)誤更容易查找,維護(hù)更加容易。
本文研究了一種基于云平臺(tái)的機(jī)器人監(jiān)控系統(tǒng),基于OPC UA協(xié)議、MySQL數(shù)據(jù)庫技術(shù)及前后端分離技術(shù)相結(jié)合進(jìn)行搭建,同時(shí),該系統(tǒng)掛載于阿里云平臺(tái)。在數(shù)據(jù)采集過程中,不需要考慮底層系統(tǒng)的差異性,提高了開發(fā)效率,降低了開發(fā)成本。Web系統(tǒng)采用前后端分離的方式,該方式開發(fā)周期短,系統(tǒng)穩(wěn)定性高。系統(tǒng)針對(duì)SCARA機(jī)器人進(jìn)行實(shí)時(shí)采集數(shù)據(jù),通過MQTT客戶端將數(shù)據(jù)傳送到位于云端的MQTT服務(wù)器,位于可視化界面的MQTT客戶端將MQTT服務(wù)器接收到數(shù)據(jù)進(jìn)行實(shí)時(shí)展示和3維展示。目前市面上的機(jī)器人都具有以太網(wǎng)接口,且OPC UA協(xié)議使通訊有統(tǒng)一的標(biāo)準(zhǔn),因此本系統(tǒng)對(duì)于開發(fā)機(jī)器人監(jiān)控系統(tǒng),具有一定的參考價(jià)值。