工業企業中生產線處於高速運轉,由工業設備所產生、採集和處理的數據量遠大於企業中計算機和人工產生的數據,生產線的高速運轉則對數據的實時性要求也更高。破解這些大數據就是企業在新一輪製造革命中贏得競爭力的鑰匙。所以,工業生產可視化系統是工業製造業的最佳選擇。html
工業生產可視化是將虛擬現實技術有機融入了工業監控系統,系統展示界面以生產廠房的仿真場景爲基礎,對各個工段、重要設備的形態都進行復原,做業流轉狀態能夠在廠房視圖當中直接顯示。在單體設備視圖中,機械設備的運行模式直接以仿真動畫的形式展示,經過圖像、三維動畫以及計算機程控技術與實體模型相融合,實現對設備的可視化表達,使管理者對其所管理的設備有形象具體的概念。同時,對設備運行中產生的全部參數一目瞭然,從而大大減小管理者的勞動強度,提升管理效率和管理水平。node
如下是基於 HT for Web(http://www.hightopo.com/)的裙房監控系統的具體解決方案動圖:web
var g3d = new ht.graph3d.Graph3dView();// Hightopo 的 3D 組件(三維場景地基) g3d.addToDOM();// 將 3D 組將添加到 body 體中
addToDOM = function(){ var self = this, view = self.getView(),//獲取組件的底層 div style = view.style; document.body.appendChild(view);//將組件底層div添加進body中 style.left = '0';//ht 默認將全部的組件的position都設置爲absolute絕對定位 style.right = '0'; style.top = '0'; style.bottom = '0'; window.addEventListener('resize', function () { self.iv(); }, false);//窗口大小改變事件,調用刷新函數 }
var dm = g3d.dm();// 獲取 HT 3D 組件的數據容器 ht.Default.xhrLoad('scenes/system.json', function(text) { dm.deserialize(text);// 將函數的 text(json)參數傳給 deserialize 反序列化方法,可將 json 內容中的元素添加到 dataModel 數據容器中進行顯示 }
var task = []; var yelun = dm.getDataByTag('yelun');// 獲取 tag 爲 yelun 的節點 // 建立一個動畫調度任務 task.yelunTask = { interval: 100,// 動畫持續時間 action: function(data) {// 動畫內容 if (data !== yelun) return; // 設置 yelun 節點的 x 軸旋轉爲當前 x 軸旋轉值再加上 Math.PI/12 yelun.setRotationX(yelun.getRotationX() + Math.PI/12); } } dm.addScheduleTask(task.yelunTask);// 將調度任務添加到數據容器中
容器中水位的上升降低也是數字孿生(雙胞胎)的體現,數據同步進行展示給監控人員,監控人員不須要進行數據採集系統也能直接獲取當前數據。json
action: function(data) { if (!(data === yelun || data === cylinder)) return; // 葉輪轉動 yelun.setRotationX(yelun.getRotationX() + Math.PI/12); // 容器水位變化 if (cylinder.getTall() === 100) cylinder.setTall(0);// 容器水位高度到達 100 的值時,重置爲 0else cylinder.setTall(cylinder.getTall() + 1); }
var alarm = dm.getDataByTag('alarm');// 獲取告警圖標節點 setInterval(function() { var random = Math.floor(Math.random()*5); if (random === 1) { alarm.s('shape3d.image', 'symbols/電信/故障 2.json');// 設置告警圖標節點爲「故障」圖標 dm.removeScheduleTask(task.yelunTask);// 將葉輪的動畫加上 } else { alarm.s('shape3d.image', 'symbols/電信/正常 2.json');// 設置告警圖標節點爲「正常」圖標 dm.addScheduleTask(task.yelunTask);// 移除葉輪的動畫 } }, 1000);
function createForm(task) { var form = new ht.widget.FormPane();// 建立 form 表單組件對象 form.setWidth(160);// 設置表單組件的寬度 form.setHeight(90);// 設置表單組件的高度 // 設置表單組件底層 div 的樣式屬性 form.getView().style.right = '10px'; form.getView().style.top = '10px'; form.getView().style.background = 'rgba(255, 255, 255, 0.2)'; form.getView().style.borderRadius = '5px'; document.body.appendChild(form.getView());// 將 form 表單底層 div 添加到 body 體中 // 水閥開啓和關閉 form.addRow([// 給 form 表單添加一行數據 { checkBox: {// 複選框類,HT 將此封裝到 form 中 實際上建立了一個 ht.widget.CheckBox 組件 label: '水流開關',// 設置 checkbox 的文本內容 labelColor: '#fff',// 設置 checkbox 文本顏色 selected: true,// 設置此 checkbox 是否選中 onValueChanged: function() {// 監聽值變化事件 if (this.isSelected()) dm.addScheduleTask(task.arrowTask);// 若是這個 checkBox 選中,則添加動畫(開啓水閥) else dm.removeScheduleTask(task.arrowTask);// 若是這個 checkBox 未被選中,則移除動畫(關閉水閥) } } } ], [0.1]);// 設置這個行數據中列的寬度 return form; }
// 添加燈光 var light = new ht.Light();// 建立一個燈節點(繼承於 ht.Node) (https://hightopo.com/guide/guide/core/lighting/ht-lighting-guide.html) light.p3([15, 120, 50]);// 設置此節點的位置 light.setTag('light');// 設置此節點的惟一標識 dm.add(light);// 將此節點添加到 dm 數據容器中進行顯示 light.s({// 設置此節點的樣式屬性 setStyle 簡寫爲 s 'light.type': 'point',// 設置燈類型 'light.color': 'rgb(252,252,149)',// 設置燈顏色 'light.range': 1400,// 設置燈照範圍 '3d.visible': false// 設置此節點在 3d 上不可見 });
// 九、燈光開啓和關閉 以及顏色切換 form.addRow([// form 中添加一行 { id: 'lightDisabled',// 設置此項的 id 值,可經過 form.getItemById 獲取此項 checkBox: {// 複選框組件 label: '開關燈',// 設置複選框文本內容 labelColor: '#fff',// 設置複選框文本顏色 selected: true,// 設置複選框是否選中 onValueChanged: function() {// 監聽值變化事件 dm.getDataByTag('light').s('light.disabled', !this.getValue());// 獲取燈節點並設置是否關閉燈光效果,light.disabled 屬性默認爲false,可設置爲true關閉燈效果 } } }, { colorPicker: {// 顏色選擇器組件 value: 'rgb(252,252,149)',// 設置當前值 instant: true,// 設置是否處於即時狀態,將會實時改變模型值 onValueChanged: function() {// 監聽值變化事件 dm.getDataByTag('light').s('light.color', this.getValue())// 設置燈的顏色爲當前選中的顏色 } } } ], [0.1, 0.1]);
var waterPump6 = dm.getDataByTag('水泵06');// 獲取 tag 爲「水泵06」的節點 waterPump6.s({// 設置該節點的樣式屬性 'note': '點我切換模型',// 設置標註文字內容 'note.transparent': true,// 設置標註在 3D 下是否透明 'note.t3': [0, 0, -50],// 設置標註在 3D 下的偏移 'note.reverse.flip': true//設置標註背面是否顯示正面的內容 }); g3d.mi(function(e) {// 監聽 3D 組件上的事件 if(e.kind === 'clickData') {// 點擊節點事件 // 模型點擊切換 if (e.data === waterPump6 && e.data.s('shape3d') === 'models/裙房系統/水泵.json') e.data.s('shape3d', 'models/fengji.json');// 設置點擊節點的 shape3d 樣式屬性 else if (e.data === waterPump6 && e.data.s('shape3d') === 'models/fengji.json') e.data.s('shape3d', 'models/裙房系統/水泵.json');// 設置點擊節點的 shape3d 樣式屬性 } });
var waterPump5 = dm.getDataByTag('水泵05'); waterPump6.s({ 'note': '點我切換模型', 'note.transparent': true, 'note.t3': [0, 0, -50], 'note.reverse.flip': true }); g3d.mi(function(e) { if(e.kind === 'clickData') { // 模型點擊切換 if (e.data === waterPump6 && e.data.s('shape3d') === 'models/裙房系統/水泵.json') e.data.s('shape3d', 'models/fengji.json'); else if (e.data === waterPump6 && e.data.s('shape3d') === 'models/fengji.json') e.data.s('shape3d', 'models/裙房系統/水泵.json'); // 模型點擊 隱藏/顯示屬性窗口 if (e.data === waterPump5) {// 判斷點擊的圖元是否爲 waterPump5 if(giveWater.s('3d.visible')) {// 判斷當前屬性窗口是否爲顯示狀態 giveWater.s('3d.visible', false);// 設置屬性窗口不可見 e.data.s('note', '點我顯示屬性窗口');// 更改標註中的顯示內容 } else { giveWater.s('3d.visible', true);// 設置屬性窗口可見 e.data.s('note', '點我隱藏屬性窗口')// 更改標註中的顯示內容 } } } });
工業生產現場數據確定是不斷地變化,數字孿生的特性也在這裏充分地展現出來,根據設備返回的數據不斷地更新顯示數據,清晰地展現了當前設備的動態。數組
var billboardArray = []; // 經過 tag 獲取節點 var temperature1 = dm.getDataByTag('回水溫度1');// 獲取 tag 爲"回水溫度1"的節點 billboardArray.push(temperature1); var temperature2 = dm.getDataByTag('回水溫度2'); billboardArray.push(temperature2); var returnPress = dm.getDataByTag('回水壓力'); billboardArray.push(returnPress); var givePress = dm.getDataByTag('供水壓力'); billboardArray.push(givePress); var giveTemp = dm.getDataByTag('供水溫度'); billboardArray.push(giveTemp); var giveWater = dm.getDataByTag('供水流量'); billboardArray.push(giveWater); // 文字標籤內容變換 billboardArray.forEach(function(billboard) { billboard.a('label', billboard.getTag());// 設置數據綁定屬性爲 label 的屬性值爲當前節點的 tag 內容 }); // 文字標籤數字變換+顏色變換 更改圖標中綁定的 value 屬性值 setInterval(function() { billboardArray.forEach(function(billboard) { var random = Math.random()*100; billboard.a('value', random.toFixed(2)); // 設置圖標中「數值內容顏色」 if (random > 70 && random <= 80) billboard.a('valueColor', '#00FFFF'); else if (random > 80 && random <= 90) billboard.a('valueColor', '#FFA000'); else if (random > 90) billboard.a('valueColor', '#FF0000'); else billboard.a('valueColor', ''); }); }, 1000);
工業互聯網 3D 的可視化應用很是普遍,除了裙房監控系統,工業設備好比變壓器的數據監控以及智能樓宇外還有不少不少,甚至能夠運用到農業以及城市規劃上......最後,有興趣的朋友能夠私信或留言交流一下技術或者交個朋友。app