源Web組態(tài)軟件實(shí)戰(zhàn):從設(shè)備數(shù)據(jù)采集到可視化大屏)
在工業(yè)現(xiàn)場(chǎng)摸爬滾打了這些年組態(tài)軟件接觸了不少。從早期用國(guó)外商業(yè)大廠的產(chǎn)品到后來(lái)接觸國(guó)內(nèi)各種廠家的方案再到投入大量精力折騰開(kāi)源項(xiàng)目這條路走下來(lái)最大的感受就是設(shè)備聯(lián)網(wǎng)和數(shù)據(jù)可視化這兩件事正卡在每一個(gè)想做信息化改造的車間和工廠的咽喉上。商業(yè)組態(tài)軟件功能確實(shí)強(qiáng)大但License費(fèi)用、授權(quán)綁定、二次開(kāi)發(fā)的封閉性以及那套老舊的渲染交互機(jī)制在當(dāng)下這個(gè)什么都講Web化、移動(dòng)化的時(shí)代越來(lái)越顯得笨重。直到有一天我在整理一個(gè)污水廠監(jiān)控項(xiàng)目資料時(shí)偶然間看到了FUXA這個(gè)開(kāi)源項(xiàng)目一下就被它的理念吸引住了。它全稱是Web-based Visualization and SCADA說(shuō)白了就是一套完全跑在瀏覽器里的可視化組態(tài)和監(jiān)控系統(tǒng)。我當(dāng)時(shí)心里就咯噔一下這玩意兒要是真能扛住工業(yè)現(xiàn)場(chǎng)的糟蹋那可真是給咱們這些搞集成的人省了一大筆銀子和大把頭發(fā)。這篇文章不打算做那種羅列功能特性的說(shuō)明文而是想從一個(gè)實(shí)際使用者的角度把這套系統(tǒng)的真正價(jià)值、技術(shù)底座、部署時(shí)的坑、以及如何把它打磨成一個(gè)能交付給甲方的東西掰開(kāi)揉碎了講講清楚。1. FUXA是什么Web組態(tài)軟件的一股清流1.1 核心需求解析為什么傳統(tǒng)組態(tài)軟件越來(lái)越讓人頭疼傳統(tǒng)組態(tài)軟件的痛點(diǎn)干這行的兄弟們都再清楚不過(guò)了。首先是那套C/S架構(gòu)要在每臺(tái)看監(jiān)控的電腦上裝客戶端還要配置各種數(shù)據(jù)源驅(qū)動(dòng)和運(yùn)行環(huán)境。我記得早年間做一個(gè)項(xiàng)目光是在項(xiàng)目現(xiàn)場(chǎng)幾臺(tái)電腦上裝環(huán)境和調(diào)試驅(qū)動(dòng)就耗掉了我大半天時(shí)間。其次是價(jià)格問(wèn)題一個(gè)幾百點(diǎn)位的商業(yè)組態(tài)授權(quán)報(bào)價(jià)輕松破萬(wàn)增加點(diǎn)位又是一筆費(fèi)用。還有最讓我難受的一點(diǎn)是它那套圖形組態(tài)風(fēng)格按鈕、管道、儀表盤做出來(lái)跟2005年的網(wǎng)頁(yè)似的在給甲方領(lǐng)導(dǎo)匯報(bào)演示的時(shí)候視覺(jué)沖擊力太差方案再好也顯得沒(méi)檔次。而FUXA選擇了一條完全不同的路——Web可視化。整個(gè)系統(tǒng)由服務(wù)端和前端組成服務(wù)端負(fù)責(zé)采集數(shù)據(jù)、處理歷史、跑報(bào)警邏輯前端就是一套現(xiàn)代化的瀏覽器頁(yè)面用當(dāng)下最流行的Angular框架構(gòu)建。你在電腦上看到的畫(huà)面、交互、圖表跟你在手機(jī)上看到的是同一套東西完全響應(yīng)式不需要裝任何插件。這帶來(lái)的直接好處就是項(xiàng)目交付時(shí)甲方不用再糾結(jié)裝什么客戶端一個(gè)網(wǎng)址一個(gè)賬號(hào)密碼打開(kāi)瀏覽器就能看現(xiàn)場(chǎng)。1.2 FUXA技術(shù)底座全解析從Node.js到圖形化編輯器的逆襲第一次在服務(wù)器上部署FUXA的時(shí)候我確實(shí)愣住了因?yàn)樗茉贜ode.js環(huán)境上這跟傳統(tǒng)PLC工程師和自動(dòng)化集成商的認(rèn)知完全是兩個(gè)世界。但我們得清醒地認(rèn)識(shí)到以后工業(yè)互聯(lián)網(wǎng)的底座就是IT技術(shù)這是大勢(shì)所趨。FUXA的技術(shù)棧非常清晰如果你懂JavaScript和Node.js那么你就可以為它寫(xiě)驅(qū)動(dòng)、寫(xiě)服務(wù)接口、做二次開(kāi)發(fā)比看那些封裝得死死的商業(yè)組態(tài)SDK要痛快得多。核心構(gòu)建模塊大概是這個(gè)組成服務(wù)端Node.js負(fù)責(zé)處理設(shè)備通信內(nèi)置了ModbusTCP/RTU、OPC UA、BACnet等驅(qū)動(dòng)也支持MQTT、HTTP API等物聯(lián)網(wǎng)協(xié)議接入同時(shí)還兼顧了用戶認(rèn)證、歷史數(shù)據(jù)存儲(chǔ)、報(bào)警判斷。前端Angular SVG這是最讓我驚喜的部分它把組態(tài)界面做成了所見(jiàn)即所得的方式。你在畫(huà)布上畫(huà)管道、閥門、電機(jī)實(shí)際上是在操作SVG圖形每一根線條、每一個(gè)變量都可以通過(guò)屬性面板綁定數(shù)據(jù)點(diǎn)。應(yīng)用內(nèi)存數(shù)據(jù)庫(kù)這個(gè)設(shè)計(jì)是我覺(jué)得FUXA在工程實(shí)踐中最聰明的地方。它的實(shí)時(shí)數(shù)據(jù)緩存管理、變量點(diǎn)表管理都跑在應(yīng)用內(nèi)存庫(kù)里讀寫(xiě)速度快得飛起不像傳統(tǒng)的組態(tài)軟件要頻繁跟關(guān)系型數(shù)據(jù)庫(kù)打交道。它的可擴(kuò)展性非常強(qiáng)如果你有一定的編程基礎(chǔ)完全可以在它的基礎(chǔ)上封裝自己的業(yè)務(wù)組件。我在集成一個(gè)數(shù)字化車間項(xiàng)目的時(shí)候就利用它的API接口把企業(yè)已有的ERP獲取到的工單信息直接推送給了產(chǎn)線看板這個(gè)功能要是放在傳統(tǒng)組態(tài)軟件上甲方不加個(gè)三五萬(wàn)塊錢你根本做不下來(lái)。2. 快速上手五分鐘搭建一個(gè)可視化監(jiān)控Demo2.1 環(huán)境準(zhǔn)備與安裝Windows下的傻瓜式部署關(guān)于FUXA的安裝網(wǎng)上的資料普遍寫(xiě)得比較簡(jiǎn)略要么是讓你跑Docker命令要么是讓你用Linux部署。但工業(yè)現(xiàn)場(chǎng)很多情況是服務(wù)器就是一臺(tái)Windows機(jī)器甚至就是工控機(jī)現(xiàn)場(chǎng)工程師對(duì)Linux命令并不熟悉。在Windows下部署FUXA其實(shí)非常簡(jiǎn)單。首先確保你機(jī)器上有Node.js環(huán)境建議安裝長(zhǎng)期支持版本比如14.x或16.x這些年我測(cè)試下來(lái)這兩個(gè)版本最穩(wěn)。然后打開(kāi)命令提示符執(zhí)行npm install -g fuxa/fuxa然后在你想要存放工程文件的目錄下運(yùn)行fuxa終端會(huì)提示服務(wù)啟動(dòng)成功默認(rèn)端口是1881。在瀏覽器地址欄輸入http://localhost:1881你就會(huì)看到初始的登錄界面。首次登錄的初始賬戶是admin密碼是admin進(jìn)去之后第一件事就是改密碼這個(gè)之后細(xì)說(shuō)。如果你覺(jué)得在全局環(huán)境安裝不舒服也可以在項(xiàng)目目錄里單獨(dú)建立FUXA運(yùn)行環(huán)境mkdir my-fuxa-project cd my-fuxa-project npm init -y npm install fuxa/fuxa npx fuxa這兩種方式我都實(shí)際驗(yàn)證過(guò)都能正常運(yùn)行。只不過(guò)第一種方式比較適合隨手拿來(lái)測(cè)試用的環(huán)境第二種方式更適合正式項(xiàng)目因?yàn)槟憧梢园压こ涛募创a放在一起方便做備份和版本管理。2.2 Docker部署方式容器化讓交付變得無(wú)比省心如果說(shuō)Windows部署是給調(diào)試甲方服務(wù)器用的那么Docker部署就是給你自己省心用的。我目前做項(xiàng)目交付的標(biāo)準(zhǔn)姿勢(shì)是在干凈的Linux服務(wù)器或者是NAS上用Docker Compose來(lái)組織整個(gè)監(jiān)控系統(tǒng)。FUXA在Docker環(huán)境下的運(yùn)行只需要確保兩件事端口映射和數(shù)據(jù)持久化。下面是一份典型的docker-compose.yml配置可以直接抄作業(yè)version: 3 services: fuxa: image: frangoteam/fuxa:latest container_name: fuxa-server restart: unless-stopped ports: - 1881:1881 volumes: - ./fuxa_data:/usr/src/app/data - ./fuxa_backup:/usr/src/app/backup environment: - TZAsia/Shanghai在這里./fuxa_data目錄用來(lái)存放SQLite數(shù)據(jù)庫(kù)文件、工程配置、歷史數(shù)據(jù)。./fuxa_backup目錄存放快照備份。TZ環(huán)境變量一定要設(shè)置成Asia/Shanghai否則你在組態(tài)界面里看到的報(bào)警時(shí)間、趨勢(shì)曲線時(shí)間會(huì)比北京時(shí)間差8個(gè)小時(shí)這個(gè)坑我踩過(guò)排查了整整一個(gè)下午。配置好之后執(zhí)行docker-compose up -d服務(wù)就起來(lái)了。注意在Docker方式下如果后面你更新了FUXA鏡像版本一定要注意先備份fuxa_data目錄再替換鏡像。我有一次沒(méi)備份直接升級(jí)結(jié)果工程文件倒是還在但是歷史報(bào)警記錄全被覆蓋了那個(gè)項(xiàng)目里甲方要求保存三年數(shù)據(jù)真是欲哭無(wú)淚。2.3 系統(tǒng)初始化與License坑位避讓開(kāi)源不等于免費(fèi)FUXA這個(gè)項(xiàng)目采用了部分開(kāi)源商業(yè)模式就是在核心功能免費(fèi)的基礎(chǔ)上提供增強(qiáng)功能模塊收費(fèi)的模式?;A(chǔ)版本也就是社區(qū)版你可以免費(fèi)用于商業(yè)項(xiàng)目它包含了基礎(chǔ)的組態(tài)編輯、數(shù)據(jù)采集、報(bào)警顯示、趨勢(shì)曲線、歷史存儲(chǔ)等核心功能。這部分功能對(duì)于中小型應(yīng)用場(chǎng)景、幾十上百個(gè)點(diǎn)位完全夠用。但是要注意它就一個(gè)限制免費(fèi)的社區(qū)版本雖然夠用但如果你想在生產(chǎn)項(xiàng)目里商用還是得仔細(xì)看清楚它的License說(shuō)明和功能限制表格。某些高級(jí)功能例如報(bào)表功能、審計(jì)追蹤、冗余備份等是在PRO專業(yè)版功能模塊里鎖著的。FUXA項(xiàng)目目前的做法是代碼倉(cāng)庫(kù)是全開(kāi)放但PRO版本的安裝包需要你在它的官網(wǎng)商城購(gòu)買序列號(hào)才能解鎖。這里要鄭重提醒一句網(wǎng)上有人把破解版?zhèn)鞯蒙窈跗渖裎覄衲悴灰?。工業(yè)監(jiān)控軟件涉及生產(chǎn)安全用盜版代碼出了事故后果很嚴(yán)重而且FUXA官網(wǎng)對(duì)PRO功能查得比較嚴(yán)一旦發(fā)現(xiàn)未經(jīng)授權(quán)的激活會(huì)直接影響項(xiàng)目驗(yàn)收。所以我的建議是先評(píng)估項(xiàng)目需求如果只是常規(guī)的產(chǎn)線監(jiān)控、設(shè)備狀態(tài)采集和報(bào)警展示用社區(qū)版沒(méi)有任何問(wèn)題如果甲方明確要求出詳盡的報(bào)表或者是做等保三級(jí)改造那可以直接考慮購(gòu)買PRO授權(quán)畢竟相對(duì)于傳統(tǒng)商業(yè)組態(tài)軟件動(dòng)不動(dòng)大幾萬(wàn)的報(bào)價(jià)FUXA這波操作簡(jiǎn)直是白菜價(jià)。3. 核心功能深度實(shí)操?gòu)脑O(shè)備數(shù)據(jù)到三維可視化大屏的一次打通3.1 驅(qū)動(dòng)配置詳解Modbus TCP、OPC UA和MQTT的實(shí)戰(zhàn)對(duì)比設(shè)備接入是組態(tài)軟件的靈魂FUXA在這方面的配置體驗(yàn)我覺(jué)得可以給個(gè)好評(píng)因?yàn)樗羊?qū)動(dòng)、設(shè)備、點(diǎn)位這三個(gè)概念分得清清楚楚。Modbus TCP是工業(yè)現(xiàn)場(chǎng)最廣泛使用的協(xié)議在FUXA里配置Modbus TCP并不復(fù)雜。首先在驅(qū)動(dòng)區(qū)新建一個(gè)Modbus TCP Master配置好PLC或網(wǎng)關(guān)的IP地址和端口默認(rèn)502端口別改大多數(shù)設(shè)備都認(rèn)這個(gè)端口。然后開(kāi)始新建設(shè)備比如你有一臺(tái)水泵控制柜通訊參數(shù)設(shè)置如下參數(shù)項(xiàng)配置值備注說(shuō)明Slave ID1從站地址需跟PLC里設(shè)置保持一致IP地址192.168.10.30PLC控制器的實(shí)際IP端口502Modbus TCP默認(rèn)端口輪詢間隔1000ms默認(rèn)1秒讀一次實(shí)時(shí)性要求高可降到500ms超時(shí)時(shí)間3000ms網(wǎng)絡(luò)異常時(shí)判定超時(shí)斷開(kāi)的時(shí)間閾值重試次數(shù)3超時(shí)后的自動(dòng)重連嘗試次數(shù)建好設(shè)備后在設(shè)備下面添加變量你需要指定寄存器類型和地址。這里要注意FUXA的寄存器地址是0基址的也就是說(shuō)你要讀PLC程序里定義的%MW100這個(gè)保持寄存器在FUXA里填的地址是99。還有數(shù)據(jù)類型要選對(duì)是16位有符號(hào)還是32位浮點(diǎn)選錯(cuò)了顯示出來(lái)的數(shù)值完全是亂的。OPC UA的配置就更現(xiàn)代化了它天然支持復(fù)雜的節(jié)點(diǎn)命名空間和安全證書(shū)認(rèn)證。在配置OPC UA連接時(shí)你需要填Server的Endpoint地址還要處理證書(shū)信任問(wèn)題。FUXA首次連接OPC UA服務(wù)器時(shí)需要雙方交換證書(shū)這時(shí)候你只需要在FUXA的配置界面里把目標(biāo)服務(wù)器的證書(shū)指紋導(dǎo)入信任列表就行了比起很多商業(yè)軟件它對(duì)這個(gè)流程的封裝已經(jīng)算是非常友好的。MQTT協(xié)議接入是智能傳感器和IOT網(wǎng)關(guān)的利器。你用MQTT接入一個(gè)溫濕度傳感器核心是配置好Broker地址、主題格式和QoS級(jí)別。FUXA會(huì)訂閱你設(shè)置的主題然后把載荷數(shù)據(jù)映射成點(diǎn)位值。我習(xí)慣在配置MQTT變量時(shí)直接選用數(shù)據(jù)解析里的JSON解析模板用$.temperature這種表達(dá)式就能拿到多層嵌套的JSON對(duì)象里的具體數(shù)值。3.2 可視化組態(tài)實(shí)操像搭積木一樣構(gòu)建你的車間大屏說(shuō)到可視化組態(tài)很多人覺(jué)得FUXA不如有些專門的Web組態(tài)平臺(tái)那么“高大上”但我恰恰覺(jué)得它好就好在把工業(yè)現(xiàn)場(chǎng)最需要的那些控件和交互邏輯都給你打包好了。在FUXA的編輯器里左側(cè)是圖元庫(kù)包括基礎(chǔ)形狀矩形、圓形、線條、工業(yè)設(shè)備圖形電機(jī)、閥門、泵、液位計(jì)、儀表盤、報(bào)警燈、按鈕、文本框、圖片以及SVG動(dòng)畫(huà)組件。圖形庫(kù)里元素不算特別豐富比不過(guò)那些砸了幾千萬(wàn)研發(fā)的商業(yè)圖庫(kù)但應(yīng)付常規(guī)的工藝流程圖綽綽有余。如果你想做出更酷炫的效果可以直接自己用SVG畫(huà)FUXA對(duì)SVG的原生支持非常到位我可以把我在AI軟件里畫(huà)好的工藝設(shè)備圖直接復(fù)制粘貼到它的畫(huà)布上保留所有圖層和路徑信息然后給這個(gè)圖形的填充顏色和旋轉(zhuǎn)屬性綁定點(diǎn)位值。這就很靈活了。需要重點(diǎn)說(shuō)明的是動(dòng)態(tài)變量綁定的思路。組態(tài)軟件的功底不在于你會(huì)不會(huì)畫(huà)矩形和圓形而在于你懂不懂讓圖形“動(dòng)”起來(lái)。在我做的那個(gè)污水廠監(jiān)控項(xiàng)目里有一個(gè)曝氣池的液位顯示。傳統(tǒng)做法是放一個(gè)數(shù)字文本框顯示當(dāng)前液位值太土了。我用兩個(gè)矩形一個(gè)做背景水一個(gè)做動(dòng)態(tài)水面然后給“水面”矩形的Y坐標(biāo)和高度屬性綁定上位機(jī)采集到的液位變量通過(guò)縮放計(jì)算讓水面高度隨著液位真實(shí)值動(dòng)態(tài)變化。同時(shí)我給這個(gè)“水面”矩形的填充色綁定了另一個(gè)表達(dá)式液位高于安全水位時(shí)顯示紅色低于安全水位時(shí)顯示綠色。整套操作下來(lái)甲方生產(chǎn)部長(zhǎng)看到的效果就是一個(gè)實(shí)時(shí)變化的、帶顏色預(yù)警的工藝流程圖視覺(jué)上非常直觀。再舉一個(gè)動(dòng)畫(huà)流量的例子。管道里的流體流動(dòng)效果在很多組態(tài)軟件里需要做復(fù)雜的動(dòng)畫(huà)幀定義。在FUXA里你可以給管道線條設(shè)置stroke-dasharray和stroke-dashoffset然后把stroke-dashoffset屬性綁定到一個(gè)循環(huán)遞增的計(jì)數(shù)器變量上這樣看起來(lái)就像管道里的水在流動(dòng)。這不是什么高深算法但做出來(lái)的畫(huà)面動(dòng)態(tài)感一下就出來(lái)了。保存工程時(shí)有個(gè)細(xì)節(jié)要記住一定要定期點(diǎn)擊“發(fā)布”按鈕生成運(yùn)行時(shí)版本。因?yàn)镕UXA的編輯器打開(kāi)的是工程源文件而系統(tǒng)運(yùn)行時(shí)讀取的是發(fā)布后的版本。如果你在編輯器里改了半天圖形和邏輯忘記點(diǎn)發(fā)布就關(guān)掉了那么頁(yè)面上看到的依舊是老版本。3.3 歷史數(shù)據(jù)與趨勢(shì)曲線用SQLite還是時(shí)序數(shù)據(jù)庫(kù)的思考監(jiān)控系統(tǒng)永不落伍的功能就是歷史曲線。FUXA內(nèi)置的歷史數(shù)據(jù)存儲(chǔ)邏輯默認(rèn)是寫(xiě)入SQLite數(shù)據(jù)庫(kù)畫(huà)趨勢(shì)曲線時(shí)就查這個(gè)庫(kù)。在早期版本SQLite在處理高頻、大數(shù)據(jù)量的歷史數(shù)據(jù)時(shí)會(huì)有性能瓶頸尤其是一個(gè)幾十點(diǎn)位的設(shè)備密集記錄存儲(chǔ)長(zhǎng)時(shí)間運(yùn)行后查詢速度會(huì)明顯下降。不過(guò)我實(shí)測(cè)下來(lái)發(fā)現(xiàn)最近這幾個(gè)版本FUXA對(duì)SQLite的讀寫(xiě)優(yōu)化做得越來(lái)越好了。它內(nèi)部實(shí)現(xiàn)了數(shù)據(jù)按時(shí)間分塊存儲(chǔ)和聚合查詢機(jī)制也就是說(shuō)當(dāng)你查看一個(gè)較長(zhǎng)時(shí)間跨度比如過(guò)去一周的趨勢(shì)曲線時(shí)它會(huì)把數(shù)據(jù)自動(dòng)聚合成分辨率較低的點(diǎn)加快渲染速度。如果想要更專業(yè)的時(shí)序數(shù)據(jù)存儲(chǔ)可以在FUXA的配置里接入InfluxDB、TimescaleDB等外部時(shí)序數(shù)據(jù)庫(kù)來(lái)做對(duì)接。在趨勢(shì)面板的操作上FUXA也做得挺貼心。你可以同時(shí)拖拽多個(gè)變量進(jìn)入同一個(gè)曲線面板每條曲線有自己的顏色和坐標(biāo)軸。配合時(shí)間范圍選擇按鈕最近1小時(shí)、24小時(shí)、7天、自定義時(shí)間基本能滿足絕大多數(shù)用戶查曲線、做工藝分析的需求。3.4 報(bào)警管理把信息推給該知道的人報(bào)警是做監(jiān)控系統(tǒng)繞不開(kāi)的剛需FUXA的報(bào)警系統(tǒng)設(shè)計(jì)思路清晰且實(shí)用。報(bào)警配置主要有幾個(gè)要點(diǎn)變量、觸發(fā)條件、報(bào)警級(jí)別、消息內(nèi)容、恢復(fù)條件。在變量配置的報(bào)警相關(guān)屬性里你可以設(shè)置高高報(bào)、高報(bào)、低報(bào)、低低報(bào)等幾種類型的閾值還可以設(shè)置報(bào)警死區(qū)。死區(qū)這個(gè)參數(shù)非常重要假如你設(shè)置某設(shè)備溫度上限是80度觸發(fā)報(bào)警但現(xiàn)場(chǎng)溫度在79.9度和80.1度之間抖動(dòng)沒(méi)有死區(qū)的話報(bào)警記錄會(huì)瘋狂彈窗有了死區(qū)比如正負(fù)0.5度溫度要降到79.5度以下才會(huì)解除報(bào)警。報(bào)警產(chǎn)生后你可以通過(guò)FUXA搭配發(fā)布訂閱消息中間件或者HTTP推送將報(bào)警事件轉(zhuǎn)發(fā)到企業(yè)微信、釘釘、短信平臺(tái)。我在項(xiàng)目里是把FUXA的報(bào)警事件通過(guò)HTTP協(xié)議推送到微信機(jī)器人只要報(bào)警狀態(tài)一觸發(fā)手機(jī)微信第一時(shí)間就彈消息并負(fù)責(zé)人比傳統(tǒng)聲光報(bào)警器要實(shí)時(shí)得多。4. 項(xiàng)目實(shí)戰(zhàn)復(fù)盤與排查技巧分享從0到1交付一個(gè)可視化監(jiān)控系統(tǒng)4.1 項(xiàng)目背景與方案選型甲方要什么和我們給什么幾個(gè)月前我接了一個(gè)老客戶的數(shù)字化車間改造項(xiàng)目。甲方是做精密零部件制造的車間里有幾十臺(tái)數(shù)控加工設(shè)備和十幾臺(tái)輔助設(shè)備空壓機(jī)、冷卻循環(huán)泵等生產(chǎn)管理部一直苦于設(shè)備狀態(tài)不透明開(kāi)機(jī)和停機(jī)全靠人工現(xiàn)場(chǎng)巡查數(shù)據(jù)報(bào)表靠紙質(zhì)臺(tái)賬。他們提出的核心需求有三條第一實(shí)時(shí)掌握每臺(tái)設(shè)備的運(yùn)行狀態(tài)、主軸負(fù)載、進(jìn)給倍率、報(bào)警信息第二需要?dú)v史曲線可以分析設(shè)備加工負(fù)荷趨勢(shì)第三最好能有一個(gè)車間總覽大屏領(lǐng)導(dǎo)進(jìn)門就能看到整體開(kāi)工率。接到這種需求我腦子里立刻浮現(xiàn)出FUXA。設(shè)備互聯(lián)層數(shù)控設(shè)備基本都支持OPC UA或者M(jìn)odbus TCP協(xié)議不支持的用工業(yè)網(wǎng)關(guān)轉(zhuǎn)一下數(shù)據(jù)可視化層FUXA完全能承載大屏展示和趨勢(shì)分析成本層FUXA開(kāi)源版零授權(quán)費(fèi)用項(xiàng)目總成本大幅縮水這在我們做系統(tǒng)集成時(shí)是很大的競(jìng)爭(zhēng)優(yōu)勢(shì)。4.2 從點(diǎn)位表梳理到組態(tài)交付的完整流程復(fù)盤項(xiàng)目實(shí)施的第一步是梳理點(diǎn)位表。我把所有參與聯(lián)網(wǎng)的設(shè)備統(tǒng)一編號(hào)整理出一份詳細(xì)的變量地址映射表這是最土但最有效的辦法。每個(gè)變量包含設(shè)備名、點(diǎn)位ID、寄存器地址、數(shù)據(jù)類型、讀寫(xiě)屬性、報(bào)警上下限、單位名稱。這份表做扎實(shí)了后續(xù)在FUXA里建變量就是純粹的體力活了。第二步是調(diào)試驅(qū)動(dòng)通信。先把一臺(tái)有代表性的設(shè)備接入FUXA確認(rèn)數(shù)據(jù)采集正常后再批量接入其他設(shè)備。這里強(qiáng)烈建議你不要一次性把50臺(tái)設(shè)備全配上否則出了問(wèn)題根本沒(méi)法定位是網(wǎng)絡(luò)問(wèn)題還是點(diǎn)表問(wèn)題。我采用的策略是分片區(qū)逐步接入每接入一片設(shè)備就觀察一段時(shí)間數(shù)據(jù)穩(wěn)定性。第三步是設(shè)計(jì)組態(tài)畫(huà)面。車間總覽大屏我設(shè)計(jì)了三個(gè)主要區(qū)域頂部是車間綜合指標(biāo)卡總設(shè)備數(shù)、運(yùn)行數(shù)、故障數(shù)、OEE中部是車間平面布局圖每個(gè)設(shè)備的圖標(biāo)按位置分布用顏色區(qū)分運(yùn)行、停機(jī)、故障、離線狀態(tài)底部是動(dòng)態(tài)運(yùn)行的實(shí)時(shí)報(bào)警滾動(dòng)條。這套大屏做下來(lái)效果完全超出了甲方的預(yù)期。他們說(shuō)以前開(kāi)會(huì)要把各個(gè)機(jī)臺(tái)的表格數(shù)據(jù)匯總起來(lái)說(shuō)半天現(xiàn)在大屏上一目了然。4.3 高頻問(wèn)題排查實(shí)錄與優(yōu)化建議在實(shí)際部署和運(yùn)維過(guò)程中我總結(jié)了一些高頻出現(xiàn)的問(wèn)題和解決路徑這幾個(gè)案例非常有代表性分享出來(lái)希望對(duì)各位有幫助。問(wèn)題一數(shù)據(jù)采集掉線過(guò)一會(huì)兒自動(dòng)恢復(fù)但始終不平穩(wěn)。排查經(jīng)歷這種現(xiàn)象排查起來(lái)特別折磨人。一開(kāi)始我以為是現(xiàn)場(chǎng)網(wǎng)絡(luò)交換機(jī)有廣播風(fēng)暴拿筆記本接在現(xiàn)場(chǎng)抓包看結(jié)果網(wǎng)絡(luò)正常。后來(lái)懷疑是FUXA的輪詢線程出了問(wèn)題就把日志級(jí)別調(diào)到DEBUG發(fā)現(xiàn)每次掉線前都有超時(shí)重試的記錄。仔細(xì)對(duì)比后發(fā)現(xiàn)原來(lái)是部分設(shè)備自帶的TCP連接數(shù)有限而FUXA默認(rèn)的并發(fā)輪詢策略會(huì)對(duì)某些老設(shè)備造成壓力。解決方案是把部分老舊設(shè)備的輪詢間隔從1秒調(diào)整到了3秒并且限制了單設(shè)備的最大并發(fā)請(qǐng)求數(shù)。調(diào)完之后通信再也沒(méi)掉過(guò)線。問(wèn)題二趨勢(shì)曲線數(shù)據(jù)斷斷續(xù)續(xù)甚至在短時(shí)間內(nèi)出現(xiàn)跳變。當(dāng)時(shí)在查空壓機(jī)排氣壓力的歷史曲線時(shí)發(fā)現(xiàn)曲線在大多數(shù)時(shí)間平直但偶爾會(huì)有尖銳的波峰波谷。首先懷疑傳感器問(wèn)題后來(lái)在FUXA的變量歷史里配置了數(shù)據(jù)變化率限制把超出物理極限的突跳值過(guò)濾掉。再配合報(bào)警死區(qū)的合理設(shè)置曲線就恢復(fù)正常了這提醒我一個(gè)事別急著懷疑硬件先看看是不是軟件采樣和統(tǒng)計(jì)邏輯的問(wèn)題。問(wèn)題三大屏在展廳的4K電視上展示時(shí)字體模糊布局錯(cuò)位。FUXA默認(rèn)的畫(huà)布分辨率可能是針對(duì)普通顯示器設(shè)計(jì)的放到4K大屏上如果直接拉伸鋪滿會(huì)因?yàn)闆](méi)有等比縮放導(dǎo)致字體發(fā)虛。建議在組態(tài)前就確定好目標(biāo)分辨率和寬高比在畫(huà)布設(shè)置里鎖定為16:9例如1280x720或者1920x1080。在大屏上展示時(shí)用瀏覽器的窗口全屏模式配合FUXA的顯示自適應(yīng)選項(xiàng)這樣縮放才精確。問(wèn)題四系統(tǒng)重啟后歷史記錄數(shù)據(jù)丟失一部分。這個(gè)坑主要出在SQLite寫(xiě)盤的時(shí)序上。FUXA緩存了一部分實(shí)時(shí)數(shù)據(jù)在內(nèi)存里計(jì)劃定期寫(xiě)入數(shù)據(jù)庫(kù)如果系統(tǒng)突然斷電緩存區(qū)里還沒(méi)落盤的數(shù)據(jù)就會(huì)丟失。解決方案一是配置不間斷電源二是調(diào)整歷史數(shù)據(jù)落盤策略把緩沖時(shí)間設(shè)置為較短的值例如5秒這樣最多丟5秒數(shù)據(jù)但會(huì)增加數(shù)據(jù)庫(kù)寫(xiě)入頻率。我個(gè)人更推薦前者工業(yè)現(xiàn)場(chǎng)UPS幾乎是標(biāo)配。4.4 性能優(yōu)化與運(yùn)維最佳實(shí)踐項(xiàng)目上線穩(wěn)定運(yùn)行后不要以為事情就結(jié)束了運(yùn)維才是長(zhǎng)期活。有一個(gè)重要的性能調(diào)整參數(shù)FUXA服務(wù)端輪詢線程池的大小。默認(rèn)配置在處理少量設(shè)備和點(diǎn)位時(shí)沒(méi)問(wèn)題但當(dāng)你接入超過(guò)上百臺(tái)設(shè)備、上千個(gè)點(diǎn)位時(shí)默認(rèn)線程數(shù)會(huì)顯得不夠用。你可以在服務(wù)端配置里適當(dāng)增加線程池大小同時(shí)留意服務(wù)器本身的CPU核數(shù)不要太拉胯。我實(shí)測(cè)下來(lái)一臺(tái)四核八線程的服務(wù)器跑兩千個(gè)點(diǎn)位加圖形界面渲染CPU占用能控制在百分之二十左右FUXA的優(yōu)化已經(jīng)相當(dāng)不錯(cuò)了。再者建議定期備份工程文件和歷史數(shù)據(jù)庫(kù)。FUXA提供了快照備份功能在管理界面可以直接把整個(gè)工程打包成ZIP下載。我現(xiàn)在的習(xí)慣是每周五下班前進(jìn)行一次手動(dòng)快照并且配合NAS的定時(shí)任務(wù)把fuxa_data目錄增量同步到異地。畢竟工程文件是無(wú)價(jià)的設(shè)備壞了能修程序丟了就真的欲哭無(wú)淚了。另外訪問(wèn)安全性方面雖然FUXA有用戶認(rèn)證機(jī)制但強(qiáng)烈建議你在生產(chǎn)環(huán)境前面再套一層Nginx反向代理配上HTTPS證書(shū)這樣既加密了通信又能通過(guò)Nginx的ACL策略控制訪問(wèn)IP來(lái)源。默認(rèn)用HTTP明文傳輸在工業(yè)內(nèi)網(wǎng)還能接受但如果甲方要求公網(wǎng)訪問(wèn)或跨地域監(jiān)控組網(wǎng)不加密就太危險(xiǎn)了。5. 關(guān)于FUXA的一些思考與使用心得分享5.1 關(guān)鍵技術(shù)選型背后的設(shè)計(jì)邏輯FUXA采用Node.js做服務(wù)端在傳統(tǒng)工業(yè)軟件陣營(yíng)里顯得格格不入但仔細(xì)想想這其實(shí)是一個(gè)極為精準(zhǔn)的定位選擇。Node.js的異步非阻塞I/O模型天然適合處理大量設(shè)備的并發(fā)采集和推送任務(wù)一個(gè)設(shè)備一個(gè)通信循環(huán)互不阻塞非常適合工業(yè)SCADA這種高并發(fā)低延遲的采集場(chǎng)景。而前端用Angular框架雖然學(xué)習(xí)曲線比Vue或者React更陡峭一些但Angular在大型復(fù)雜單頁(yè)應(yīng)用的架構(gòu)體系上確實(shí)更嚴(yán)謹(jǐn)TypeScript的靜態(tài)類型檢查在工業(yè)這種對(duì)穩(wěn)定性要求極高的環(huán)境里也能提前規(guī)避很多運(yùn)行時(shí)錯(cuò)誤。SVG矢量圖形組態(tài)方案的亮點(diǎn)在于矢量圖形意味著不管在什么分辨率的屏幕上縮放都不會(huì)失真而且SVG本身跟DOM結(jié)合非常緊密用它來(lái)做組態(tài)畫(huà)面的事件綁定和數(shù)據(jù)聯(lián)動(dòng)比用Canvas更自然。Canvas圖像雖然渲染性能更強(qiáng)但做萬(wàn)噸水處理的工藝流程圖需要大量交互點(diǎn)和圖形事件SVG還是更順手。5.2 學(xué)習(xí)成本評(píng)估從過(guò)來(lái)人角度聊聊該不該入坑如果你想上手FUXA我給出的建議是在自動(dòng)化行業(yè)里它值得投入時(shí)間。對(duì)于純做PLC和電氣工程師背景的朋友第一次接觸Node.js和NPM生態(tài)可能會(huì)有點(diǎn)懵。但好消息是FUXA并不要求你從零開(kāi)始寫(xiě)代碼你只需要掌握以下技能節(jié)點(diǎn)看懂JSON配置結(jié)構(gòu)會(huì)用一點(diǎn)JavaScript表達(dá)式這個(gè)和Excel公式一樣拿來(lái)就能用熟悉SVG的基本圖形屬性填充顏色、坐標(biāo)、旋轉(zhuǎn)角度懂Modbus協(xié)議和點(diǎn)位映射邏輯。這些技能對(duì)任何一個(gè)搞過(guò)工控的人來(lái)說(shuō)一個(gè)星期基本都能上手。當(dāng)你完成了第一個(gè)變量的點(diǎn)位采集和圖形綁定你會(huì)由衷感嘆原來(lái)監(jiān)控界面可以做得這么簡(jiǎn)單。5.3 FUXA的擴(kuò)展空間與邊界FUXA雖然很好用但也有能力邊界。它畢竟不是萬(wàn)能的物聯(lián)網(wǎng)平臺(tái)如果你要做多租戶、大規(guī)模云邊協(xié)同、復(fù)雜的數(shù)據(jù)分析建模它并不擅長(zhǎng)。但如果你就是要一臺(tái)服務(wù)器跑一個(gè)工廠的監(jiān)控大屏它就是那個(gè)最順手的工具。我目前正在做的一件事是把FUXA跟開(kāi)源的時(shí)序數(shù)據(jù)存儲(chǔ)方案以及開(kāi)源告警平臺(tái)整合嘗試構(gòu)建一套輕量級(jí)的開(kāi)源MES框架。FUXA負(fù)責(zé)最底層的數(shù)據(jù)采集和可視化呈現(xiàn)時(shí)序數(shù)據(jù)庫(kù)負(fù)責(zé)長(zhǎng)時(shí)間維度的大數(shù)據(jù)量存儲(chǔ)告警平臺(tái)負(fù)責(zé)全天候輪詢和事件通知分發(fā)。這套組合不僅極大地縮短了項(xiàng)目開(kāi)發(fā)周期更把整個(gè)系統(tǒng)的可控權(quán)真正掌握在了自己手里這在過(guò)去用商業(yè)組態(tài)軟件的時(shí)代是幾乎不敢想象的。寫(xiě)在最后也是幾句實(shí)在話回頭看看這幾年用FUXA的經(jīng)歷從最開(kāi)始抱著試試看的心態(tài)測(cè)試到現(xiàn)在把多個(gè)交付級(jí)項(xiàng)目都跑在它上面我的態(tài)度已經(jīng)從一開(kāi)始的懷疑轉(zhuǎn)變成了信賴。有一次項(xiàng)目上線初期半夜設(shè)備出故障車間主任打電話問(wèn)情況。我打開(kāi)手機(jī)上的FUXA頁(yè)面直接看到設(shè)備報(bào)紅的報(bào)警狀態(tài)和最近半小時(shí)的溫度飆升趨勢(shì)遠(yuǎn)程指導(dǎo)現(xiàn)場(chǎng)人員快速排查避免了產(chǎn)線停產(chǎn)。那一刻我實(shí)實(shí)在在感受到一個(gè)成熟可靠的可視化組態(tài)系統(tǒng)對(duì)于生產(chǎn)管理帶來(lái)的價(jià)值是無(wú)法用具體金額來(lái)衡量的。最后再分享一個(gè)小技巧如果你需要在多個(gè)顯示器上展示不同的監(jiān)控畫(huà)面不需要部署多臺(tái)服務(wù)器直接在瀏覽器里打開(kāi)多個(gè)標(biāo)簽頁(yè)每個(gè)標(biāo)簽頁(yè)通過(guò)短鏈接指向同一個(gè)FUXA服務(wù)端里的不同工程視圖互不干擾而且性能表現(xiàn)很穩(wěn)定。這一點(diǎn)在展廳展示方案中非常實(shí)用。如果你正準(zhǔn)備在某個(gè)項(xiàng)目里做設(shè)備監(jiān)控或者數(shù)字化車間改造不妨把FUXA納入你的技術(shù)備選池花一個(gè)周末時(shí)間跑一遍Demo你的心里就會(huì)有答案了。