控到SCADA上位機實戰(zhàn))
上個月我?guī)鸵粋€朋友選型一套小型產(chǎn)線的上位機方案他最初的念頭是買一套現(xiàn)成的商業(yè)組態(tài)軟件。結(jié)果去打聽了一圈授權(quán)費用、培訓成本、后期維護加起來直接勸退而且很多功能他根本用不上。后來我們擠出兩個晚上把幾款主流開源HMI設計工具拉出來對比又花了一天半把一套PLC監(jiān)控頁面上線預算幾乎歸零。這篇文章就是從那兩天半的實戰(zhàn)里整理出來的重點圍繞工業(yè)自動化、SCADA上位機、PLC監(jiān)控場景聊聊開源HMI設計工具到底該怎么選、怎么用。先給個忠告開源HMI工具不是商業(yè)軟件的簡單替代品它是另一條技術(shù)路線。選得好兩三天就能上線選不好后面改架構(gòu)的痛苦會遠超你的想象。下面我按選型前思考、方案盤點、實操Demo、通信原理、踩坑記錄這個順序講最后附上我的個人判斷。1. 為什么越來越多的工控項目開始放棄商業(yè)組態(tài)軟件1.1 商業(yè)HMI軟件的核心痛點做自動化項目的工程師多少都碰過這幾類商業(yè)組態(tài)軟件。它們功能確實全組態(tài)畫圖、變量管理、報警、歷史曲線、配方管理什么都有。但問題也集中在幾點授權(quán)成本高按點位收費是行業(yè)慣例有些軟件連開發(fā)環(huán)境都要單獨買授權(quán)。一個中型項目大幾百上千點的授權(quán)費動輒幾萬。綁定硬件和操作系統(tǒng)很多授權(quán)鎖定加密狗或網(wǎng)卡換電腦要重新激活運行環(huán)境以Windows為主想在Linux工控機上跑非常費勁。擴展性差想給頁面加一個非標準控件想接一個私有協(xié)議想去掉某個用不到的模塊基本都做不到。文檔與社區(qū)封閉遇到問題大多數(shù)時候只能找原廠客服。而原廠客服對中小項目的響應速度經(jīng)歷過的人都懂。所以這幾年我越來越傾向于把開源方案放進候選清單里不是在摳成本而是它確實解決了很多工程現(xiàn)場的實際麻煩。1.2 開源方案為什么能站住腳過去大家覺得開源HMI不靠譜主要是早期項目功能太弱、文檔太少、界面簡陋。但最近五年發(fā)生了幾個變化Web技術(shù)成熟瀏覽器端SVG組態(tài)、WebSocket實時推送、WebGL圖表渲染讓開源HMI在畫面表現(xiàn)力上已經(jīng)不輸傳統(tǒng)組態(tài)軟件。工業(yè)通信協(xié)議走向標準化Modbus TCP/RTU、OPC UA這些跨廠商協(xié)議被越來越廣泛地支持開源項目只要支持這些協(xié)議就等于打通了市面上絕大多數(shù)PLC和儀表。部署方式變輕Docker等容器技術(shù)普及之后開源SCADA平臺從“搭建一堆依賴”變成了“一條命令啟動”實施成本大幅下降。生態(tài)互補有采集工具、有數(shù)據(jù)庫、有可視化前端每個環(huán)節(jié)都有優(yōu)秀的開源項目可選大家可以像搭積木一樣組合出適合自己方案的鏈路。當然開源不是免費午餐。你已經(jīng)支付的成本是“學習時間”和“自己維護的精力”這兩個我在后面的選型清單里會詳細展開。2. 選型前的硬核思考你的HMI到底需要哪幾層能力2.1 不要把“畫面上有幾個儀表盤”當成HMI經(jīng)常有人拿著Grafana做的漂亮大屏來問“這是不是就是開源HMI”嚴格來說不是。HMI或者SCADA系統(tǒng)至少包含五層能力采集層從PLC、儀表、傳感器讀取數(shù)據(jù)按指定周期輪詢支持斷線重連。數(shù)據(jù)映射層把協(xié)議側(cè)的寄存器地址、數(shù)據(jù)塊偏移映射成工程意義上的“變量”比如“1號罐溫度”“水泵轉(zhuǎn)速”還要解決字節(jié)序、數(shù)據(jù)類型轉(zhuǎn)換問題。畫面組態(tài)層把圖元、按鈕、文本框和變量綁定起來支持顏色變化、動畫、數(shù)值顯示、滑動條、趨勢圖。報警與事件層設置上下限、報警確認、恢復判斷、報警記錄。歷史存儲層把數(shù)據(jù)存進數(shù)據(jù)庫支持按時間段查詢和曲線回放。一個項目如果只需要第1、3層那很多輕量工具就夠了如果五層都要就不能只看“能畫圖”否則做到中途會發(fā)現(xiàn)報警或者歷史記錄缺失非常難受。2.2 選型前必須明確的技術(shù)約束清單我建議你在選型前先把下面這張表填完再開始比工具。這能幫你過濾掉80%不合適的選項。問題為什么重要點位數(shù)量有多少50、200、還是2000以上點位直接影響采集輪詢策略、數(shù)據(jù)庫選型、頁面加載性能數(shù)據(jù)刷新速度要求多快1秒、500毫秒、還是毫秒級刷新周期太短會壓垮設備網(wǎng)口太長則失去實時監(jiān)控意義現(xiàn)場用到哪些PLC或儀表不同協(xié)議支持程度差異巨大私有協(xié)議往往需要額外網(wǎng)關(guān)或庫需要Web遠程訪問嗎需要瀏覽器訪問就優(yōu)先Web組態(tài)型不需要可以選桌面型歷史數(shù)據(jù)要存多久存多少點決定用SQLite、MySQL還是時序數(shù)據(jù)庫報警需要怎么處理只要閃爍還是要確認、要記錄簡版報警和工業(yè)級報警實現(xiàn)成本差別很大開發(fā)團隊熟悉什么語言Python、Node.js、Java、C#團隊適合的工具完全不同有沒有人專職維護這個系統(tǒng)沒人維護就選社區(qū)活躍、常規(guī)部署簡單的項目比如20個點位的水泵房監(jiān)控和2000個點位的車間SCADA前者用輕量Web組態(tài)加SQLite就夠后者必須考慮分布式采集、歷史歸檔、性能優(yōu)化甚至考慮是否要引入時序數(shù)據(jù)庫。把這些問題想清楚再去選型才能少走彎路。3. 主流開源HMI/SCADA方案盤點它們到底是什么定位3.1 輕量Web組態(tài)型出自帶編輯器的場景這一類的代表是FUXA一個基于Web的HMI/SCADA項目自帶網(wǎng)頁版組態(tài)編輯器支持拖拽圖元、綁定變量、設置報警、畫趨勢曲線。它對中小型項目非常友好部署后用戶在瀏覽器里打開IP地址就能開發(fā)畫面不需要裝任何客戶端。它的數(shù)據(jù)接入能力也比較全支持Modbus TCP/RTU、MQTT、OPC UA還有西門子S7等其他協(xié)議。我實測下來一個200點以內(nèi)的項目單臺服務器跑得很穩(wěn)。如果你做的是泵站、污水處理、小型產(chǎn)線監(jiān)控這類需求可以把它列為第一候選。3.2 流程編排加儀表盤型靈活但需要拼裝這一類以Node-RED為代表。Node-RED本身就是一款基于流的編程工具生態(tài)里有大量的Modbus、S7、OPC UA、MQTT節(jié)點可以把采集邏輯用節(jié)點連線的方式搭出來。它的Dashboard模塊又能生成基礎(chǔ)儀表盤包括圖表、開關(guān)、表格等。Node-RED最大的優(yōu)勢是靈活幾乎所有協(xié)議都能通過安裝節(jié)點來支持很適合做“采集端”和“中轉(zhuǎn)層”。但它本身不是專業(yè)的組態(tài)軟件畫面布局能力偏弱復雜聯(lián)動邏輯要靠寫Function節(jié)點完成做大型SCADA畫面會比較痛苦。業(yè)界最常見的用法是讓Node-RED專門負責采集數(shù)據(jù)然后往MQTT或數(shù)據(jù)庫里扔再讓其他可視化工具取數(shù)據(jù)展示。3.3 數(shù)據(jù)可視化大屏型只做展示是它的強項提到Grafana工控圈都不陌生。它擅長對接時序數(shù)據(jù)庫比如InfluxDB、Prometheus、SQLite、MySQL做出非常美觀的實時曲線、儀表盤、告警面板。但注意Grafana不能直接采集Modbus或者S7數(shù)據(jù)也沒有工業(yè)組態(tài)里“變量綁定圖元”的概念。它不是HMI而是數(shù)據(jù)可視化平臺。如果項目只需要把已經(jīng)存在數(shù)據(jù)庫里的數(shù)據(jù)做得好看Grafana足夠好如果還要實時控制PLC輸出、做復雜報警聯(lián)動就必須在前面加一道采集層比如Node-RED采集后寫庫再由Grafana展示。它的告警能力相對簡單復雜的分級策略或確認流程做起來不如專業(yè)SCADA順手。3.4 全功能開源SCADA平臺型適合中大型項目如果系統(tǒng)規(guī)模較大需要完整的SCADA功能就要看Rapid SCADA和SCADA-LTS這一類項目。Rapid SCADA采用C#生態(tài)包含服務器、通信模塊、Web界面、數(shù)據(jù)庫存儲以及大量工業(yè)設備驅(qū)動模塊。適合有一定.NET開發(fā)能力的團隊部署偏傳統(tǒng)學習曲線比輕量工具陡。SCADA-LTS基于Java生態(tài)提供數(shù)據(jù)采集、報警、歷史存儲、趨勢分析等功能內(nèi)置Web界面支持多用戶權(quán)限和工業(yè)協(xié)議。適合熟悉Java技術(shù)棧、需要全功能SCADA但不想從零搭建的團隊。這類平臺的特點是“該有的功能都有”但代價是你得投入時間學習它們的架構(gòu)、配置文件和數(shù)據(jù)模型。它們更像是傳統(tǒng)商業(yè)SCADA的開源對應物。3.5 物聯(lián)網(wǎng)平臺型自帶SCADA模塊的融合方案最后說一下ThingsBoard。它本來是個物聯(lián)網(wǎng)設備管理平臺后來加入了儀表盤和SCADA能力。它的強項在設備管理、數(shù)據(jù)入庫、報警規(guī)則以及REST API和MQTT接入。如果你的“HMI”要對接大量物聯(lián)網(wǎng)設備又需要遠程管理、多租戶、設備影子之類的功能ThingsBoard會很合適。不過它偏向IoT體系純做PLC監(jiān)控時反而顯得重配置流程也復雜中小型純工控項目要慎重評估。3.6 橫向?qū)Ρ纫痪湓捰涀∷鼈兊哪芰吔绶桨钢饕Z言/生態(tài)數(shù)據(jù)采集畫面組態(tài)報警聯(lián)動歷史存儲適合場景FUXANode.js/WebModbus、MQTT、OPC UA、S7自帶組態(tài)編輯器拖拽式支持閾值報警內(nèi)嵌存儲中小型監(jiān)控頁面的快速搭建Node-REDNode.js生態(tài)節(jié)點豐富協(xié)議極多Dashboard較弱需自行寫邏輯配合數(shù)據(jù)庫采集中轉(zhuǎn)、系統(tǒng)集成GrafanaGo/Web不能直接采集儀表盤/大屏非常強簡單告警配合時序數(shù)據(jù)庫數(shù)據(jù)可視化、大屏Rapid SCADAC#/.NET內(nèi)置大量工業(yè)驅(qū)動Web/桌面組態(tài)完整報警體系數(shù)據(jù)庫支持良好中大型全功能SCADASCADA-LTSJava支持Modbus、OPC UA等自帶Web界面完整報警體系MySQL/MariaDB中大型SCADA的Java選型ThingsBoardJava/WebIoT協(xié)議、MQTT、HTTP儀表盤/SCADA模塊規(guī)則引擎報警內(nèi)置數(shù)據(jù)庫IoT設備管理融合場景4. 實操篇用開源方案把一套PLC數(shù)據(jù)搬進瀏覽器頁面4.1 為什么我拿FUXA做演示我平時做中小型監(jiān)控項目最常選的組合就是FUXA加Modbus模擬器做驗證。原因很簡單FUXA部署最簡單組態(tài)界面就在瀏覽器里新手上手路徑最短。下面的操作能在一天內(nèi)從零跑通而且步驟可以平移到真實PLC環(huán)境。先說明一下我下面提到的“FUXA”你可以理解為一類Web組態(tài)型開源HMI設計工具的代表。如果你在選型時看到功能類似的其他項目思路和操作流程基本通用。4.2 第一步部署運行環(huán)境FUXA支持Docker部署這是最快的方式。在服務器或工控機上裝好Docker之后一條命令就能啟動docker run -d --name fuxa \ -p 1881:1881 \ -v fuxa_data:/usr/src/app/data \ FUXA官方鏡像名稱啟動后瀏覽器訪問http://服務器IP:1881就能打開組態(tài)開發(fā)界面。如果你不用Docker也可以直接用Node.js跑源碼但那樣需要手動裝依賴、配置數(shù)據(jù)庫速度慢一些。我這里強調(diào)一個易錯細節(jié)數(shù)據(jù)卷要掛載好。因為FUXA的畫面、變量配置、報警規(guī)則都存在數(shù)據(jù)目錄里容器一刪就要靠這個數(shù)據(jù)卷保留配置。我做項目時習慣把數(shù)據(jù)目錄單獨放在一塊獨立磁盤或NAS上避免工控機系統(tǒng)盤故障時整個項目配置丟失。4.3 第二步準備一個Modbus從站做數(shù)據(jù)源沒有真實PLC時可以用Modbus模擬器充當從站。常見做法是裝一個Modbus Slave軟件在里面創(chuàng)建一張寄存器表手動改變數(shù)值模擬現(xiàn)場工況。也可以寫一個Python腳本用pymodbus庫啟動一個虛擬Modbus TCP從站from pymodbus.server import StartTcpServer from pymodbus.datastore import ModbusSequentialDataBlock, ModbusSlaveContext, ModbusServerContext # 建立一段模擬保持寄存器起始地址從0開始共100個寄存器 slave ModbusSlaveContext( diModbusSequentialDataBlock(0, [False] * 100), coModbusSequentialDataBlock(0, [False] * 100), hrModbusSequentialDataBlock(0, [0] * 100), irModbusSequentialDataBlock(0, [0] * 100), ) context ModbusServerContext(slaves{1: slave}, singleFalse) # 啟動Modbus TCP Server默認端口502 StartTcpServer(contextcontext, address(0.0.0.0, 502))運行起來后這臺機器就是一臺虛擬PLC寄存器地址可以直接映射到FUXA里。這里也要提醒一句Linux下運行綁502端口需要root或?qū)獧?quán)限Windows下沒這個問題實際項目里PLC的Modbus TCP端口通常也是502。4.4 第三步在FUXA里創(chuàng)建設備與變量打開FUXA頁面后先創(chuàng)建設備。設備類型選Modbus TCP填從站IP地址、端口502、輪詢周期。輪詢周期建議先按1秒設后面根據(jù)設備響應速度再調(diào)。接著創(chuàng)建變量。這是把寄存器地址變成“工程變量”的關(guān)鍵一步變量名寫上“1號罐溫度”這種便于辨識的名稱。數(shù)據(jù)地址填寄存器偏移量比如保持寄存器40001對應偏移040002對應偏移1。數(shù)據(jù)類型按PLC寄存器里的實際存儲類型選擇常見的有Int16、UInt16、Int32、Float32。這一步非常關(guān)鍵選錯數(shù)據(jù)類型讀出來的數(shù)就是亂碼。訪問類型按需選只讀或讀寫。要支持控制按鈕、遠程啟停就選讀寫。我在實際配置時會把變量在紙質(zhì)的點位表上先整理好把設備IP、寄存器偏移、數(shù)據(jù)類型、讀寫屬性全部列清楚再到FUXA里錄入。這樣看起來慢但能大幅度減少配置錯誤。動輒幾十上百個變量的時候腦子直接記絕對會亂。4.5 第四步拖拽圖元綁定變量FUXA的組態(tài)界面和傳統(tǒng)HMI軟件類似左側(cè)是圖元庫中間是畫布右側(cè)是屬性面板。把數(shù)值顯示、開關(guān)按鈕、圖形儀表拖到畫布上然后在屬性里綁定剛才創(chuàng)建的變量。舉個實際例子我需要做一個水泵運行狀態(tài)頁面。拖入一個圓形的“指示燈”圖元綁定一個布爾變量用顏色表達式讓變量為1時顯示綠色為0時顯示灰色。拖入一個“數(shù)值顯示”控件綁定溫度變量顯示單位保持“℃”。拖入一個“啟動”按鈕綁定一個讀寫變量按下時寫入1實現(xiàn)遠程啟動動作。綁定完成后切換到運行模式模擬器里修改寄存器值頁面上應該能看到實時變化。這種“數(shù)值變化驅(qū)動圖元變化”的機制就是HMI組態(tài)的核心圖元只是載體變量才是靈魂。4.6 第五步設置報警與聯(lián)動報警是SCADA不可或缺的部分。FUXA里可以為變量配置報警規(guī)則比如1號罐溫度上限60度觸發(fā)報警后頁面上的圖元會閃爍并在報警列表里出現(xiàn)記錄。這里有幾個經(jīng)驗報警值建議設置成“閾值滯回區(qū)間”比如高報58度觸發(fā)、55度恢復避免臨界值附近反復報警。報警要配置確認機制操作人員點擊“確認”后閃爍變常亮但報警記錄仍保留。聯(lián)動邏輯比如溫度超限自動解鎖某個按鈕依賴變量之間的讀寫控制必要時可以在瀏覽器端用少量腳本實現(xiàn)不影響組態(tài)流程。4.7 第六步多人訪問與權(quán)限控制Web組態(tài)帶來的一個直接好處是現(xiàn)場中控室大屏、辦公室辦公電腦、車間平板可以同時打開同一個頁面不需要安裝任何客戶端。FUXA支持用戶管理可以設置不同權(quán)限。我的習慣是查看權(quán)限給車間主任、值班人員只讀頁面。操作權(quán)限給當班操作員可以點按鈕、改設置參數(shù)。管理員權(quán)限僅給少數(shù)維護人員能修改畫面、修改報警規(guī)則。權(quán)限這個事別偷懶。工業(yè)現(xiàn)場一旦有人誤操作影響的不只是電腦畫面可能是真實設備。系統(tǒng)上線前把權(quán)限表理清楚再開通賬號。5. Modbus、OPC UA還是私有協(xié)議HMI與PLC通信的底層邏輯5.1 寄存器與點位理解HMI通信的第一把鑰匙PLC里的數(shù)據(jù)對HMI來說就是一堆“寄存器”。HMI按協(xié)議發(fā)出讀取請求PLC返回寄存器里的數(shù)值HMI再把數(shù)值映射到畫布圖元上。以Modbus為例最常用的是保持寄存器和輸入寄存器。保持寄存器可以讀寫通常用來存放控制參數(shù)和輸出值輸入寄存器一般只讀用來讀取外部模擬量或設備狀態(tài)。地址編號在不同場合有不同表示法容易把人繞暈區(qū)域常見地址表示協(xié)議偏移線圈00001開始0x區(qū)離散輸入10001開始1x區(qū)輸入寄存器30001開始3x區(qū)保持寄存器40001開始4x區(qū)在配置開源HMI時多數(shù)工具讓你填“偏移量”而不是“40001”這種完整地址。比如保持寄存器40001填偏移040002填偏移1千萬不要把40001這個數(shù)字直接填進偏移里這是新手最容易犯的錯配置完讀數(shù)全亂。5.2 32位數(shù)據(jù)與字節(jié)序為什么會讀到天文數(shù)字Modbus寄存器一個只有16位也就是一個寄存器最多放一個16位整數(shù)。工業(yè)現(xiàn)場的浮點溫度、累加計量這種32位數(shù)據(jù)是占用兩個連續(xù)寄存器的。這時候就涉及字節(jié)序大端模式Motorola順序高字節(jié)在前。小端模式Intel順序低字節(jié)在前。還有字序的區(qū)別兩個寄存器誰在高位、誰在低位。我遇到過一個典型問題讀回來的溫度在值域范圍內(nèi)但小數(shù)點后面幾位完全不對或者一會兒正一會兒負。排查到最后就是設備手冊里寫的是“低字在前高字在后”而組態(tài)這邊按“高字在前”解析了。解決辦法就是配置變量時留個心眼先把一個已知值寫進PLC讀過來看解析是否正確。比對出正確字節(jié)序后把所有同類變量統(tǒng)一設置。千萬別憑記憶猜每臺設備的Modbus從站實現(xiàn)都可能不一樣。5.3 OPC UA跨廠商互通的時代選擇OPC UA的價值在于它不關(guān)心你底層用的什么PLC、什么協(xié)議。PLC廠商或者第三方網(wǎng)關(guān)會把所有數(shù)據(jù)整理成統(tǒng)一的“節(jié)點樹”上位機只需要瀏覽節(jié)點、訂閱節(jié)點值就行。用OPC UA接HMI最大的好處是配置簡單不需要關(guān)心寄存器偏移、字節(jié)序、數(shù)據(jù)類型映射節(jié)點名稱和工程變量名幾乎一一對應而且OPC UA自帶加密鑒權(quán)比裸奔的Modbus TCP安全很多。開源HMI工具里對OPC UA支持做得好的方案在設備配置時只要填OPC UA服務端地址和節(jié)點ID即可。如果你的現(xiàn)場設備比較多、品牌雜我非常建議先把數(shù)據(jù)匯到一臺OPC UA服務器上再讓HMI統(tǒng)一對接。這樣HMI只需要處理一種協(xié)議維護成本低不少。5.4 西門子私有協(xié)議S7通信怎么接西門子PLC除了支持Modbus TCP之外它自己的S7通信協(xié)議是私有的。好在開源生態(tài)里已經(jīng)有很成熟的通信庫比如snap7C/C、Python、Node.js都有綁定。用開源HMI直接連西門子PLC通常需要提供DB塊號、起始偏移、數(shù)據(jù)類型。這和Modbus邏輯相同只是尋址方式換成了“DB號加偏移”的體系。我用這類方案連過S7-1200和S7-1500讀取DB塊里的溫度、壓力、速度等變量都很穩(wěn)定寫操作也支持但要注意PLC側(cè)的訪問權(quán)限設置CPU屬性里必須允許從遠程通信訪問。這里有個排查技巧如果連接失敗先查看通信庫自身的報錯信息常見的多是“機架號/槽號配置錯誤”“PLC側(cè)訪問保護拒絕”“端口被防火墻攔截”這三類逐個排除比盲目改HMI參數(shù)高效得多。6. 我在實際項目里踩過的坑以及對應的處理辦法6.1 刷新周期打太高設備網(wǎng)口直接擁堵有一次做項目客戶說數(shù)據(jù)要“越快越好”我把Modbus輪詢周期調(diào)到了100毫秒結(jié)果沒跑幾分鐘PLC的網(wǎng)口CPU占用就飆高了連正常程序下載都變慢。復盤原因HMI每100毫秒對整個寄存器區(qū)做一次全量輪詢報文數(shù)量巨大打爆了PLC響應能力。后來改成“分組輪詢”策略把實時性要求高的數(shù)據(jù)放一個組500毫秒一輪普通數(shù)據(jù)顯示放另一個組2秒一輪變化率小的累計量放5秒一輪。實測下來數(shù)據(jù)一樣跟手PLC負載下降了80%以上。6.2 斷線重連機制PLC重啟后頁面“卡死”模擬器測試一切正?,F(xiàn)場跑了幾天后有一臺PLC斷電重啟HMI頁面從此再也不刷新。檢查發(fā)現(xiàn)通信庫在PLC斷線后默認不會自動重連必須手動重啟設備服務。解決辦法在設備配置里找到通信超時和重試設置把“自動重連”打開同時把重試間隔設得溫和一些比如5秒重試一次。最好再寫一個看門狗定期檢查通信狀態(tài)長時間斷線時在頁面上顯示醒目的“通訊故障”橫幅。開源工具往往默認不會做這件事運維和值班人員又不會去翻服務狀態(tài)頁面上的故障提示非常重要。6.3 報警“抖”臨界點反復觸發(fā)溫度在59.9度和60.1度之間來回跳動時一個簡單的“溫度大于60度報警”就會瘋了似的頻繁觸發(fā)和恢復報警記錄被刷屏操作員也分不清哪些是真實故障。這就是沒有設置“滯回區(qū)間”造成的。正確做法是高報觸發(fā)值設為60度恢復值設為55度低報觸發(fā)值設為0度恢復值設為5度。這樣現(xiàn)場設備的正常波動不會頻繁跨越報警邊界報警記錄一眼看過去只有真正的異常。6.4 歷史數(shù)據(jù)越存越多頁面打開越來越慢中小型項目最常見的做法是數(shù)據(jù)直接存在本機數(shù)據(jù)庫比如SQLite。但運行三個月之后歷史表積了大量記錄趨勢頁面的查詢開始變慢。這時不能一直加索引硬扛應該考慮數(shù)據(jù)分級策略實時數(shù)據(jù)寫入內(nèi)存緩存頁面查最近幾分鐘直接從緩存取。當天數(shù)據(jù)寫入按小時分區(qū)的數(shù)據(jù)表。超過三個月的老數(shù)據(jù)定期歸檔減小主表的查詢壓力。如果項目數(shù)據(jù)量大也可以把歷史庫換成時序數(shù)據(jù)庫把查詢壓力交給專門為時間序列優(yōu)化的引擎。開源組件之間可以通過MQTT或HTTP接口解耦把“采集、存儲、展示”做成三段獨立的服務哪一段出問題都不影響另外兩段。6.5 瀏覽器緩存改完配置頁面還是老樣子Web組態(tài)的另一個怪毛病是瀏覽器緩存。組態(tài)畫面的JS和圖片資源更新后現(xiàn)場大屏的瀏覽器還是舊版本。我經(jīng)常在客戶現(xiàn)場被問“為什么改了畫面沒生效”其實按下F12打開開發(fā)工具勾選“Disable cache”再刷新頁面就正常了。為了減少這種問題我一般會在發(fā)布時改一下靜態(tài)資源的版本號或者文件名讓瀏覽器識別為“新資源”。實操層面開發(fā)機永遠用無痕窗口訪問HMI頁面現(xiàn)場機器則掛一個大字提示畫面不更新時按CtrlF5強制刷新。6.6 常見問題速查表現(xiàn)象可能原因處置方向全部變量斷線IP、端口、網(wǎng)絡不通服務未啟動先ping再telnet 502端口再查日志單個變量數(shù)據(jù)異常寄存器偏移填錯、數(shù)據(jù)類型不對對照點位表檢查偏移和字節(jié)序數(shù)據(jù)抖動但PLC側(cè)正常輪詢周期太短、電磁干擾加大輪詢間隔檢查屏蔽雙絞線接地頁面加載慢變量過多、圖元復雜、數(shù)據(jù)庫查詢慢優(yōu)化輪詢分組圖元SVG簡化歷史分表報警刷屏未設置滯回區(qū)間加滯回閾值或改為變化率報警7. 寫在最后我的選型經(jīng)驗和一個小彩蛋做了好幾個開源HMI項目之后我最大的體會是選型不是找“最好的工具”而是找“最匹配當前團隊和項目約束的工具”。20個點的小泵站上一個全功能SCADA平臺純屬給自己添麻煩2000個點的車間級項目指望一個輕量組態(tài)工具撐全場也不現(xiàn)實。先畫點位表、列采集清單、理報警需求再回到這篇文章的對比表里去匹配整個過程會順暢非常多。最后分享一個小彩蛋用這套Web組態(tài)方案調(diào)試時我會同時打開瀏覽器的開發(fā)者工具切到Network面板過濾WebSocket連接。頁面里所有實時變量的數(shù)據(jù)推送都走WebSocket刷新頻率多少、有沒有斷線重連在Network面板里看得一清二楚。排查“頁面為什么沒更新”時這個技巧比在HMI代碼里打斷點還快。如果你已經(jīng)在用開源HMI做項目下次遇到莫名其妙的刷新問題先別急著懷疑工具打開這個面板看一眼大概率能直接定位到問題。