老舊設(shè)備數(shù)據(jù)上云:Modbus轉(zhuǎn)MQTT網(wǎng)關(guān)采集方案詳解)
1. 工業(yè)現(xiàn)場(chǎng)老舊設(shè)備數(shù)據(jù)上云的現(xiàn)實(shí)困境在工業(yè)現(xiàn)場(chǎng)摸爬滾打這些年我經(jīng)手過(guò)不少新老混搭的改造項(xiàng)目。最典型的一類(lèi)場(chǎng)景就是車(chē)間里跑著十幾二十年的老設(shè)備——老式PLC、溫控儀表、變頻器、電表、稱(chēng)重儀表它們清一色只認(rèn)RS485或者RS232串口跑的是Modbus RTU協(xié)議數(shù)據(jù)出不來(lái)更別談什么上云、看板、遠(yuǎn)程監(jiān)控。老板一句把這些數(shù)據(jù)接到平臺(tái)上落到工程師頭上就是一堆硬骨頭。Modbus轉(zhuǎn)MQTT采集方案說(shuō)白了就是給這些啞巴設(shè)備裝一張嘴讓它們能把數(shù)據(jù)說(shuō)出來(lái)并且用一種現(xiàn)代物聯(lián)網(wǎng)平臺(tái)聽(tīng)得懂的語(yǔ)言——MQTT——把數(shù)據(jù)送到服務(wù)器、云平臺(tái)或者本地?cái)?shù)據(jù)中心。這套方案的核心價(jià)值在于不改動(dòng)原有設(shè)備、不更換控制器、不重寫(xiě)底層邏輯只在中間加一層協(xié)議轉(zhuǎn)換網(wǎng)關(guān)就能把幾十年的老設(shè)備接入現(xiàn)代數(shù)據(jù)體系。適合誰(shuí)看做設(shè)備改造的自動(dòng)化工程師、做工業(yè)物聯(lián)網(wǎng)的開(kāi)發(fā)者、負(fù)責(zé)產(chǎn)線(xiàn)數(shù)字化的運(yùn)維人員以及想自己動(dòng)手把車(chē)間數(shù)據(jù)接上來(lái)的技術(shù)負(fù)責(zé)人。我見(jiàn)過(guò)太多人一上來(lái)就買(mǎi)網(wǎng)關(guān)、接線(xiàn)、配參數(shù)結(jié)果卡在數(shù)據(jù)上不去或者上去了但格式不對(duì)這種問(wèn)題上。根子在于沒(méi)搞清楚Modbus和MQTT這兩套體系的本質(zhì)差異。Modbus是主從輪詢(xún)模型主機(jī)問(wèn)一句從機(jī)答一句數(shù)據(jù)是拉出來(lái)的MQTT是發(fā)布訂閱模型客戶(hù)端主動(dòng)把消息推到Broker再由Broker分發(fā)給訂閱者。一個(gè)是問(wèn)答式一個(gè)是廣播式中間這層轉(zhuǎn)換邏輯沒(méi)理順后面全是坑。下面我把整套方案從設(shè)計(jì)思路到落地細(xì)節(jié)掰開(kāi)揉碎講一遍。2. 方案整體設(shè)計(jì)與核心思路拆解2.1 為什么選網(wǎng)關(guān)轉(zhuǎn)換而不是上位機(jī)直采面對(duì)老舊設(shè)備采集常見(jiàn)的路子有三條一是用一臺(tái)工控機(jī)裝上組態(tài)軟件或自研程序直接通過(guò)串口讀Modbus再轉(zhuǎn)發(fā)MQTT二是用協(xié)議轉(zhuǎn)換網(wǎng)關(guān)硬件串口進(jìn)、網(wǎng)絡(luò)出三是換掉老設(shè)備直接上支持MQTT的新控制器。第三條基本不用考慮成本高、停產(chǎn)風(fēng)險(xiǎn)大老板也不會(huì)同意。第一條和第二條是主流選擇我兩種都用過(guò)各有適用場(chǎng)景。工控機(jī)方案靈活能跑復(fù)雜邏輯、能做數(shù)據(jù)清洗和邊緣計(jì)算但缺點(diǎn)是穩(wěn)定性依賴(lài)操作系統(tǒng)Windows工控機(jī)跑久了容易卡死、藍(lán)屏現(xiàn)場(chǎng)又沒(méi)人會(huì)維護(hù)。網(wǎng)關(guān)方案是嵌入式系統(tǒng)功耗低、體積小、斷電恢復(fù)快配置好之后基本扔那兒不管特別適合點(diǎn)位不多、邏輯簡(jiǎn)單的場(chǎng)景。我一般的判斷標(biāo)準(zhǔn)是采集點(diǎn)位在200個(gè)寄存器以?xún)?nèi)、不需要復(fù)雜邊緣計(jì)算、現(xiàn)場(chǎng)沒(méi)有專(zhuān)職IT運(yùn)維優(yōu)先選網(wǎng)關(guān)。反之如果要做數(shù)據(jù)聚合、協(xié)議二次轉(zhuǎn)換、本地存儲(chǔ)和斷點(diǎn)續(xù)傳那就上工控機(jī)或者邊緣計(jì)算盒子。這個(gè)項(xiàng)目標(biāo)題里的加裝二字很關(guān)鍵意味著是在既有系統(tǒng)上做增量改造所以網(wǎng)關(guān)方案是性?xún)r(jià)比最高的切入點(diǎn)。2.2 Modbus與MQTT的本質(zhì)差異決定了轉(zhuǎn)換邏輯要把這兩套協(xié)議對(duì)接起來(lái)必須先吃透它們的差異否則配置參數(shù)時(shí)就是瞎猜。我整理了一張對(duì)照表這是我每次做方案時(shí)都會(huì)先畫(huà)出來(lái)的東西對(duì)比維度Modbus RTUMQTT通信模型主從輪詢(xún)一問(wèn)一答發(fā)布訂閱異步推送傳輸層RS485/RS232串口TCP/IP網(wǎng)絡(luò)數(shù)據(jù)單位寄存器地址功能碼Topic主題Payload載荷觸發(fā)方式主機(jī)主動(dòng)讀取客戶(hù)端主動(dòng)發(fā)布實(shí)時(shí)性取決于輪詢(xún)周期取決于發(fā)布頻率和QoS尋址方式從站地址寄存器地址Broker地址Topic層級(jí)數(shù)據(jù)格式二進(jìn)制字節(jié)流通常為JSON/字符串看懂這張表轉(zhuǎn)換方案的設(shè)計(jì)思路就清晰了網(wǎng)關(guān)要扮演兩個(gè)角色——對(duì)下它是Modbus主站按周期輪詢(xún)各個(gè)從站設(shè)備把寄存器數(shù)據(jù)讀上來(lái)對(duì)上它是MQTT客戶(hù)端把讀到的數(shù)據(jù)打包成JSON按約定的Topic發(fā)布到Broker。中間還要處理數(shù)據(jù)格式轉(zhuǎn)換、字節(jié)序調(diào)整、異常處理這些臟活。2.3 數(shù)據(jù)流向與Topic設(shè)計(jì)原則數(shù)據(jù)流向是現(xiàn)場(chǎng)設(shè)備 → RS485總線(xiàn) → 轉(zhuǎn)換網(wǎng)關(guān) → 以太網(wǎng)/4G → MQTT Broker → 訂閱端平臺(tái)/看板/數(shù)據(jù)庫(kù)。這條鏈路上Topic設(shè)計(jì)是最容易被忽視但影響最大的環(huán)節(jié)。我見(jiàn)過(guò)有人把所有數(shù)據(jù)往一個(gè)Topic里塞結(jié)果訂閱端收到一大坨JSON解析起來(lái)痛苦不堪也有人Topic層級(jí)設(shè)計(jì)得亂七八糟后期想按設(shè)備篩選數(shù)據(jù)根本做不到。我的經(jīng)驗(yàn)是Topic層級(jí)遵循業(yè)務(wù)域/設(shè)備類(lèi)型/設(shè)備編號(hào)/數(shù)據(jù)類(lèi)型的結(jié)構(gòu)。舉個(gè)例子一個(gè)注塑車(chē)間的溫度采集Topic可以設(shè)計(jì)成factory/injection/temp_01/realtime factory/injection/temp_01/status factory/injection/temp_01/alarm這樣訂閱端可以用通配符factory/injection//realtime一次性訂閱所有注塑機(jī)溫度也可以用factory/injection/temp_01/#訂閱單臺(tái)設(shè)備的全部數(shù)據(jù)。層級(jí)清晰后期擴(kuò)展和篩選都方便。Payload統(tǒng)一用JSON字段名用英文小寫(xiě)下劃線(xiàn)比如{temp: 185.6, ts: 1718000000}別用中文鍵名跨系統(tǒng)解析容易出編碼問(wèn)題。3. 核心細(xì)節(jié)解析與實(shí)操要點(diǎn)3.1 Modbus寄存器地址規(guī)則別被40001騙了這是新手最容易栽跟頭的地方。Modbus協(xié)議里寄存器地址有協(xié)議地址和PLC地址兩套說(shuō)法差一個(gè)偏移量。協(xié)議地址從0開(kāi)始PLC地址從1開(kāi)始而且不同功能碼對(duì)應(yīng)不同的地址區(qū)間。常見(jiàn)的對(duì)應(yīng)關(guān)系是這樣的線(xiàn)圈Coil功能碼01PLC地址00001-09999協(xié)議地址0x0000起離散輸入Discrete Input功能碼02PLC地址10001-19999協(xié)議地址0x0000起輸入寄存器Input Register功能碼04PLC地址30001-39999協(xié)議地址0x0000起保持寄存器Holding Register功能碼03PLC地址40001-49999協(xié)議地址0x0000起關(guān)鍵點(diǎn)來(lái)了很多設(shè)備手冊(cè)上寫(xiě)的是40001但網(wǎng)關(guān)配置里要填的是0。因?yàn)?0001是PLC地址減去40001的基址協(xié)議地址就是0。我踩過(guò)這個(gè)坑當(dāng)時(shí)對(duì)著手冊(cè)填40001讀出來(lái)全是0折騰了半天才發(fā)現(xiàn)是地址偏移問(wèn)題。所以配置前一定要確認(rèn)設(shè)備手冊(cè)用的是哪套地址體系拿不準(zhǔn)就用Modbus調(diào)試工具先掃一遍。3.2 字節(jié)序與數(shù)據(jù)類(lèi)型兩個(gè)寄存器拼一個(gè)浮點(diǎn)數(shù)的坑Modbus寄存器是16位的但現(xiàn)場(chǎng)數(shù)據(jù)有32位浮點(diǎn)數(shù)、32位整數(shù)、甚至64位雙精度。一個(gè)32位數(shù)據(jù)要占兩個(gè)連續(xù)寄存器這就涉及字節(jié)序和字序問(wèn)題。不同廠(chǎng)家的設(shè)備字節(jié)排列順序可能完全不同常見(jiàn)的有四種組合大端字序大端字節(jié)序ABCD小端字序大端字節(jié)序CDAB大端字序小端字節(jié)序BADC小端字序小端字節(jié)序DCBA我遇到過(guò)一臺(tái)老式溫控儀表溫度值是32位浮點(diǎn)手冊(cè)上沒(méi)寫(xiě)字節(jié)序讀出來(lái)是亂碼。后來(lái)用調(diào)試工具把四種組合都試了一遍發(fā)現(xiàn)是CDAB格式。所以配置網(wǎng)關(guān)時(shí)數(shù)據(jù)類(lèi)型和字節(jié)序這兩個(gè)參數(shù)必須和實(shí)際設(shè)備匹配否則讀出來(lái)的數(shù)值要么是天文數(shù)字要么是負(fù)數(shù)要么直接是NaN。提示拿不準(zhǔn)字節(jié)序時(shí)先讀一個(gè)已知的、變化緩慢的物理量比如環(huán)境溫度用調(diào)試工具切換四種字節(jié)序哪個(gè)讀出來(lái)是合理值就用哪個(gè)。3.3 輪詢(xún)周期與超時(shí)設(shè)置快慢之間的平衡輪詢(xún)周期設(shè)多長(zhǎng)是個(gè)需要權(quán)衡的問(wèn)題。設(shè)太短串口總線(xiàn)負(fù)載高從站響應(yīng)不過(guò)來(lái)會(huì)丟包設(shè)太長(zhǎng)數(shù)據(jù)實(shí)時(shí)性差看板上數(shù)據(jù)半天不刷新。我的經(jīng)驗(yàn)值是關(guān)鍵工藝參數(shù)1-2秒輪詢(xún)一次一般監(jiān)測(cè)參數(shù)5-10秒一次電表電量這類(lèi)累積量30秒到1分鐘一次就夠。超時(shí)時(shí)間一般設(shè)為輪詢(xún)周期的1.5到2倍。比如輪詢(xún)周期2秒超時(shí)設(shè)3秒。如果某個(gè)從站連續(xù)多次超時(shí)網(wǎng)關(guān)應(yīng)該標(biāo)記該設(shè)備離線(xiàn)而不是一直死等否則會(huì)拖垮整條總線(xiàn)的采集效率。RS485總線(xiàn)是半雙工的同一時(shí)刻只能有一個(gè)主站發(fā)問(wèn)一個(gè)從站應(yīng)答所以從站數(shù)量多的時(shí)候輪詢(xún)周期要相應(yīng)拉長(zhǎng)或者分組輪詢(xún)。3.4 MQTT QoS等級(jí)選擇消息不丟的代價(jià)MQTT有三個(gè)QoS等級(jí)0是最多一次發(fā)了不管1是至少一次可能重復(fù)但不丟2是恰好一次不丟不重但開(kāi)銷(xiāo)大。工業(yè)采集場(chǎng)景我一般用QoS 1。原因很簡(jiǎn)單數(shù)據(jù)寧可重復(fù)也不能丟重復(fù)的數(shù)據(jù)在平臺(tái)側(cè)可以用時(shí)間戳去重但丟了就真沒(méi)了。QoS 2雖然最可靠但握手次數(shù)多網(wǎng)絡(luò)抖動(dòng)時(shí)反而容易卡住對(duì)于秒級(jí)采集的數(shù)據(jù)流不劃算。另外要設(shè)置保留消息Retain和遺囑消息Will。保留消息讓新訂閱的客戶(hù)端立刻拿到最后一次數(shù)據(jù)不用等下一個(gè)發(fā)布周期遺囑消息在網(wǎng)關(guān)異常斷線(xiàn)時(shí)由Broker自動(dòng)發(fā)布一條離線(xiàn)通知讓平臺(tái)知道設(shè)備掉線(xiàn)了。這兩個(gè)機(jī)制配合使用能大幅提升系統(tǒng)的可觀測(cè)性。4. 實(shí)操過(guò)程與核心環(huán)節(jié)實(shí)現(xiàn)4.1 硬件選型與接線(xiàn)RS485總線(xiàn)的手拉手原則網(wǎng)關(guān)選型看幾個(gè)硬指標(biāo)串口數(shù)量決定能接幾條總線(xiàn)、支持的協(xié)議Modbus RTU/TCP都要有、網(wǎng)絡(luò)方式以太網(wǎng)還是4G、工作溫度范圍工業(yè)現(xiàn)場(chǎng)冬天冷夏天熱。我常用的配置是一路RS485接現(xiàn)場(chǎng)儀表一路以太網(wǎng)上聯(lián)支持Modbus RTU轉(zhuǎn)MQTT工作溫度-20到70度。接線(xiàn)是RS485最容易出問(wèn)題的地方。必須手拉手串聯(lián)不能星型分支。A接AB接B屏蔽層單端接地??偩€(xiàn)兩端各加一個(gè)120歐姆終端電阻中間設(shè)備不加。我見(jiàn)過(guò)一個(gè)現(xiàn)場(chǎng)十幾臺(tái)設(shè)備星型接法通信時(shí)好時(shí)壞后來(lái)改成手拉手加終端電阻立馬穩(wěn)定了。線(xiàn)材用雙絞屏蔽線(xiàn)截面積0.5到1.0平方毫米距離超過(guò)500米要考慮加中繼器。4.2 網(wǎng)關(guān)參數(shù)配置從串口到MQTT的完整鏈路配置網(wǎng)關(guān)一般通過(guò)Web界面或者專(zhuān)用配置軟件。核心參數(shù)分三塊串口參數(shù)要和所有從站設(shè)備一致波特率常見(jiàn)9600、19200、38400、數(shù)據(jù)位8、停止位1、校驗(yàn)位無(wú)校驗(yàn)、偶校驗(yàn)、奇校驗(yàn)。這里有個(gè)坑有些老設(shè)備默認(rèn)偶校驗(yàn)有些默認(rèn)無(wú)校驗(yàn)混在同一條總線(xiàn)上就會(huì)通信失敗。所以同一條RS485總線(xiàn)上的所有設(shè)備串口參數(shù)必須完全一致不一致的要分組走不同串口。Modbus采集配置要逐條添加采集項(xiàng)每條包含從站地址、功能碼、起始寄存器地址、寄存器數(shù)量、數(shù)據(jù)類(lèi)型、字節(jié)序、輪詢(xún)周期。我一般會(huì)先列一張采集清單表格把每個(gè)點(diǎn)位的信息填清楚再往網(wǎng)關(guān)里錄避免漏配錯(cuò)配。MQTT配置包含Broker地址和端口默認(rèn)1883加密8883、客戶(hù)端ID要唯一別重復(fù)、用戶(hù)名密碼、Keep Alive時(shí)間一般60秒、QoS等級(jí)、Topic前綴。客戶(hù)端ID重復(fù)會(huì)導(dǎo)致兩個(gè)客戶(hù)端互相踢下線(xiàn)這個(gè)坑我踩過(guò)現(xiàn)場(chǎng)兩臺(tái)網(wǎng)關(guān)用了默認(rèn)ID結(jié)果數(shù)據(jù)時(shí)斷時(shí)續(xù)查了半天才發(fā)現(xiàn)。4.3 數(shù)據(jù)打包與發(fā)布JSON格式的實(shí)操示例網(wǎng)關(guān)讀到的原始數(shù)據(jù)是寄存器值需要打包成JSON再發(fā)布。以一臺(tái)溫控儀表為例采集溫度、設(shè)定值、報(bào)警狀態(tài)三個(gè)量打包后的Payload大概是這樣{ device_id: temp_01, temp: 185.6, setpoint: 190.0, alarm: 0, ts: 1718000000, quality: good }這里有幾個(gè)細(xì)節(jié)ts是采集時(shí)間戳用Unix秒級(jí)時(shí)間戳方便平臺(tái)側(cè)排序和去重quality標(biāo)記數(shù)據(jù)質(zhì)量正常是good通信異常時(shí)標(biāo)bad平臺(tái)側(cè)可以根據(jù)這個(gè)字段決定是否展示數(shù)值型數(shù)據(jù)保留一位小數(shù)即可別搞一堆無(wú)意義的小數(shù)位浪費(fèi)帶寬。4.4 平臺(tái)側(cè)訂閱與驗(yàn)證用工具先跑通再上平臺(tái)配置完網(wǎng)關(guān)別急著接平臺(tái)先用MQTT客戶(hù)端工具比如MQTTX、mosquitto_sub訂閱一下看看數(shù)據(jù)能不能正常收到、格式對(duì)不對(duì)。這一步能排除掉大部分網(wǎng)關(guān)側(cè)的問(wèn)題。確認(rèn)數(shù)據(jù)沒(méi)問(wèn)題了再配置平臺(tái)側(cè)的訂閱規(guī)則、數(shù)據(jù)解析、入庫(kù)邏輯。平臺(tái)側(cè)我一般會(huì)做三件事一是數(shù)據(jù)解析把JSON字段映射到數(shù)據(jù)庫(kù)表字段二是異常告警quality為bad或者數(shù)值超限時(shí)觸發(fā)告警三是數(shù)據(jù)存儲(chǔ)時(shí)序數(shù)據(jù)用InfluxDB或者TDengine關(guān)系型數(shù)據(jù)用MySQL。這里要注意MQTT消息是流式的平臺(tái)側(cè)要做好削峰填谷別讓高頻數(shù)據(jù)把數(shù)據(jù)庫(kù)打爆。5. 常見(jiàn)問(wèn)題與排查技巧實(shí)錄5.1 通信類(lèi)問(wèn)題速查表現(xiàn)象可能原因排查方法所有從站都讀不到串口參數(shù)不匹配、接線(xiàn)反了檢查波特率校驗(yàn)位A/B線(xiàn)對(duì)調(diào)試試部分從站讀不到從站地址沖突、該設(shè)備掉線(xiàn)單獨(dú)用調(diào)試工具測(cè)該從站數(shù)據(jù)時(shí)有時(shí)無(wú)總線(xiàn)干擾、終端電阻缺失加終端電阻檢查屏蔽接地讀出來(lái)全是0寄存器地址偏移錯(cuò)誤確認(rèn)協(xié)議地址還是PLC地址數(shù)值明顯不對(duì)字節(jié)序或數(shù)據(jù)類(lèi)型錯(cuò)誤切換四種字節(jié)序組合測(cè)試MQTT連不上Broker地址端口錯(cuò)、認(rèn)證失敗用客戶(hù)端工具單獨(dú)測(cè)試連接數(shù)據(jù)重復(fù)推送QoS 1的正常表現(xiàn)平臺(tái)側(cè)按時(shí)間戳去重網(wǎng)關(guān)頻繁掉線(xiàn)網(wǎng)絡(luò)不穩(wěn)定、Keep Alive太短檢查網(wǎng)絡(luò)適當(dāng)加大Keep Alive5.2 那些文檔里不會(huì)寫(xiě)的避坑經(jīng)驗(yàn)第一先離線(xiàn)調(diào)試再上線(xiàn)。我習(xí)慣在辦公室用Modbus Slave模擬軟件搭一套虛擬從站把網(wǎng)關(guān)配置全部跑通確認(rèn)數(shù)據(jù)格式、Topic、QoS都沒(méi)問(wèn)題再到現(xiàn)場(chǎng)接線(xiàn)?,F(xiàn)場(chǎng)調(diào)試時(shí)間寶貴能提前解決的問(wèn)題絕不帶到現(xiàn)場(chǎng)。第二給每個(gè)從站做通信質(zhì)量統(tǒng)計(jì)。網(wǎng)關(guān)一般有通信成功率統(tǒng)計(jì)功能調(diào)試階段每天看一眼哪個(gè)從站成功率低于95%就要重點(diǎn)排查。我遇到過(guò)一個(gè)從站成功率只有80%最后發(fā)現(xiàn)是那臺(tái)設(shè)備的RS485芯片老化換了芯片就好了。第三Topic命名別用中文和特殊字符。有些平臺(tái)對(duì)Topic字符有限制中文、空格、斜杠以外的特殊符號(hào)都可能出問(wèn)題。統(tǒng)一用英文小寫(xiě)加下劃線(xiàn)穩(wěn)妥。第四做好配置備份。網(wǎng)關(guān)配置好之后導(dǎo)出配置文件存檔?,F(xiàn)場(chǎng)網(wǎng)關(guān)壞了換新的導(dǎo)入配置就能用不用重新配一遍。這個(gè)習(xí)慣幫我省過(guò)好幾次事。第五注意網(wǎng)關(guān)的并發(fā)連接數(shù)限制。有些低端網(wǎng)關(guān)MQTT并發(fā)連接數(shù)有限接多個(gè)平臺(tái)或者多個(gè)訂閱端時(shí)可能不夠用。選型時(shí)看清楚規(guī)格別貪便宜。5.3 數(shù)據(jù)丟失的排查思路數(shù)據(jù)丟失是采集系統(tǒng)最頭疼的問(wèn)題可能出在鏈路的任何一環(huán)。我的排查順序是先看網(wǎng)關(guān)本地緩存有沒(méi)有數(shù)據(jù)再看Broker有沒(méi)有收到最后看訂閱端有沒(méi)有消費(fèi)。網(wǎng)關(guān)本地有緩存說(shuō)明采集正常問(wèn)題在上傳Broker沒(méi)收到說(shuō)明網(wǎng)絡(luò)或認(rèn)證有問(wèn)題Broker收到了但訂閱端沒(méi)有說(shuō)明訂閱規(guī)則或消費(fèi)邏輯有問(wèn)題。一層層往下查比盲目猜測(cè)高效得多。另外網(wǎng)絡(luò)抖動(dòng)導(dǎo)致的數(shù)據(jù)丟失可以通過(guò)網(wǎng)關(guān)的斷點(diǎn)續(xù)傳功能緩解。網(wǎng)關(guān)本地緩存一定量的數(shù)據(jù)網(wǎng)絡(luò)恢復(fù)后補(bǔ)傳。但要注意緩存容量有限網(wǎng)絡(luò)中斷時(shí)間長(zhǎng)了還是會(huì)丟所以關(guān)鍵數(shù)據(jù)最好在平臺(tái)側(cè)也做冗余。6. 方案擴(kuò)展與個(gè)人實(shí)操體會(huì)這套Modbus轉(zhuǎn)MQTT的方案跑通之后擴(kuò)展空間其實(shí)很大。往上走可以接入邊緣計(jì)算做數(shù)據(jù)預(yù)處理比如把原始數(shù)據(jù)做滑動(dòng)平均、做單位換算、做閾值判斷只把有價(jià)值的數(shù)據(jù)推上去減輕平臺(tái)壓力。往橫走可以接入多路串口同時(shí)采集多條RS485總線(xiàn)覆蓋更大的設(shè)備范圍。往下走可以結(jié)合4G模塊把沒(méi)有網(wǎng)絡(luò)的現(xiàn)場(chǎng)也接進(jìn)來(lái)。我個(gè)人在實(shí)際操作中的體會(huì)是這套方案的技術(shù)難點(diǎn)不在協(xié)議本身而在現(xiàn)場(chǎng)細(xì)節(jié)。Modbus和MQTT的協(xié)議文檔網(wǎng)上到處都是但現(xiàn)場(chǎng)那臺(tái)老設(shè)備的寄存器地址到底怎么算、字節(jié)序到底是哪種、總線(xiàn)干擾怎么解決這些才是真正花時(shí)間的地方。所以我的建議是動(dòng)手之前先把設(shè)備手冊(cè)翻爛把采集清單列清楚把調(diào)試工具準(zhǔn)備好現(xiàn)場(chǎng)調(diào)試時(shí)才能快準(zhǔn)狠。別指望一次成功留出足夠的調(diào)試時(shí)間遇到問(wèn)題按鏈路分段排查基本都能解決。最后分享一個(gè)小技巧現(xiàn)場(chǎng)調(diào)試時(shí)帶一個(gè)USB轉(zhuǎn)RS485的調(diào)試工具配合Modbus調(diào)試軟件能直接連到總線(xiàn)上抓報(bào)文。網(wǎng)關(guān)讀不到的數(shù)據(jù)用調(diào)試工具能讀到說(shuō)明是網(wǎng)關(guān)配置問(wèn)題調(diào)試工具也讀不到說(shuō)明是設(shè)備或接線(xiàn)問(wèn)題。這一個(gè)工具能幫你快速定位問(wèn)題在哪一層省下大量排查時(shí)間。