2026年8月2日8 分鐘Modbus · 逆向工程 · 太陽能 · IoT · 工業自動化 · 設備整合 · 系統整合

廠商不給文件,設備資料就拿不出來嗎 — 我們逆向 Modbus 打通了整套太陽能系統

買回來的設備,資料被關在廠商自己的 App 裡 — 這是工業與能源設備最常見的困境。這篇拆我們怎麼把一台沒有文件的太陽能逆變器逆向出來:CRC16 封包對不上、寄存器要逐一比對、廠家還鎖死了一組沒人告訴你的相對規則。同一套工法可以直接搬去做工廠產線與智慧建築的設備整合。

陳先生 (Henry)

廠商不給文件,設備資料就拿不出來嗎 — 我們逆向 Modbus 打通了整套太陽能系統 — 文章主視覺

「這台機器有沒有辦法把資料拉出來?廠商說要另外買他們的雲端方案。」

這句話我們聽過太多次了。太陽能逆變器、產線設備、環境感測器、電表 —— 買的時候是你的,資料卻在廠商的 App 裡。想接進自己的系統做分析、告警、報表,答案往往是「要加購」。

這篇講一個我們自己跑完的實例:把一台沒有任何文件的太陽能逆變器逆向出來,讓發電、儲能、電芯、電表四種設備的資料,全部進到我們自己的資料庫。

重點不在太陽能。重點在方法可以複製

一、先確認:協定看起來標準,其實不標準 #

設備規格書寫著「支援 Modbus TCP」。實際接上去,標準的 Modbus TCP 函式庫卻讀不到東西。

原因是它跑的是 Modbus RTU over TCP —— 資料內容是 RTU 格式(尾端帶 CRC16 校驗),只是用 TCP 當通道送出去。跟標準 Modbus TCP 的差別在封包開頭:標準 TCP 版有一段 MBAP header 且不帶 CRC,RTU-over-TCP 沒有 header、必須自己算 CRC16

差這一段,現成函式庫就完全對不上。

這類「看起來標準、其實有自己習慣」的情況非常普遍。 判斷方式很直接:抓一包實際流量下來,看開頭有沒有 header、尾端有沒有校驗碼,兩三包就能認出來。

二、寄存器沒有文件,就用面板當答案卷 #

協定通了,接著是更繁瑣的一步:哪個寄存器代表什麼?

沒有文件的情況下,設備自己的操作面板就是最好的對照表。做法很土但有效:

  1. 把一段連續的寄存器全部讀回來
  2. 對照面板上當下顯示的數值(發電功率、電池電壓、溫度、市電狀態)
  3. 找出數值吻合的位址,記下來
  4. 改變設備狀態(例如讓它切換到市電),看哪些位址跟著變

逐一比對之後,發電、負載、電池電壓電流、溫度、充放電狀態、市電切換狀態全部對應出來了。

還要注意倍率。這台機器的電壓類寄存器倍率是 0.1V,而且是以單顆電池模組為單位回報 —— 48V 系統要再乘以 4 才是整組電壓。沒發現這件事,讀出來的數字會全部小一截,而且看起來還很合理,這種錯最難抓。

三、最意外的一關:廠家鎖死了一組沒人告訴你的規則 #

讀出來只是一半,我們還要能寫回去(調整充電上限、市電切換點這些參數)。

結果一寫就被設備拒絕,回一個 Illegal Data Value。值明明在合理範圍內。

實測推導之後才發現:廠家在韌體裡鎖死了各參數之間的相對關係,例如——

低電壓警告值   必須嚴格大於   市電切換電壓
過放保護值     必須小於等於   市電切換電壓
逆變回切電壓   必須高於市電切換電壓一段差距(避免來回抖動)

也就是說,要調高市電切換點,得先調高低電壓警告值;順序反了就寫不進去。而且這個限制不只擋 Modbus 寫入,連在設備面板上手動改也一樣卡住。

這種規則不會出現在任何文件裡。它是廠商為了防止使用者把電池設定成互相矛盾的狀態而做的保護 —— 立意是好的,但沒有文件,就只能靠「改一個值、被拒絕、換順序再試」逼出來。

實務建議:遇到寫入被拒,先假設不是你的值錯,而是你動的順序錯。 把相關參數全部讀出來排一排,通常就會看出被鎖住的相對關係。

四、資料拿到之後,真正的工程才開始 #

很多人以為打通協定就結束了。其實資料進來之後,才是判斷準不準的問題。

這台逆變器自己回報的電池 SOC(電量百分比)是錯的。 直接拿來用,決策全部會歪。

我們的處理方式是建立一個單一真理來源:不信設備回報的百分比,改用實際的邊界電壓回推 ——

  • 逆變器自動切換到市電的那個電壓 = 使用者感受上的 0%
  • 充電上限電壓 = 100%
  • 中間依實際可用電量換算

過程中我們也用過幾個「想當然耳」的換算公式,結果多算了 5%。5% 聽起來不多,但它會讓你在電池其實快沒電的時候以為還有餘裕。

最後定案的做法有兩個重點:

  1. 自動校準 —— 每當系統偵測到一次完整的充放電循環,就用實際數據回推可用容量,取代預設值。電池會老化,寫死的容量遲早失真。
  2. 前後端共用同一份換算邏輯 —— 後端 Python 與前端 TypeScript 各有一份實作,但公式與邊界值必須一致。同一顆電池在儀表板和在告警邏輯裡不能是兩個數字,這種不一致的 bug 極難追。

五、看電芯,不要只看總電壓 #

整組電池電壓正常,不代表電池健康。

接上 BMS 之後,我們讀的是每一顆電芯的電壓,真正在盯的指標是同一組電池裡最高與最低電芯的壓差。壓差開始擴大,是電池失衡與老化的早期訊號 —— 比等到總電壓掉下來才發現,早非常多。

這是「有資料」和「有洞察」的差別。總電壓是設備願意給你的數字,電芯壓差是你把資料拿回來之後才能自己算出來的東西。

六、同一套工法,不只用在太陽能 #

把這個案子抽象一層,流程是這樣:

步驟 做什麼 通用性
1 抓封包,判斷實際協定變體 任何工業設備
2 用設備面板反推寄存器對應 任何有顯示面板的設備
3 實測逼出廠商的隱藏限制 任何可寫入參數的設備
4 建立單一真理來源與自動校準 任何會隨時間漂移的量測
5 從原始資料算出設備不給的洞察 任何監控場景

工廠的產線設備、機房的環境監控、智慧建築的空調與電力 —— 遇到的是同一組問題:設備是你的,資料卻不是。

我們在自家機房把這套跑通了(3Q 的伺服器就靠太陽能加電池供電,做不好第一個受害的是自己)。設備換一種,前面兩步要重做,後面三步的工法完全一樣。

需要把設備資料解放出來嗎 #

如果你手上有這些情況:

  • 設備資料被鎖在廠商 App 或雲端,要匯出得另外付費
  • 多套設備各有各的介面,沒辦法放在一起看
  • 想做告警、趨勢分析、自動控制,但拿不到原始資料
  • 廠商已經不提供支援,或系統老到沒人維護

這些都是可以處理的。先確認能不能讀,再談要做多大 —— 通常花半天做可行性確認,就能知道整件事值不值得投入。

歡迎直接跟我們說你手上是什麼設備、卡在哪一段。

有類似的問題想解決?

先聊聊你的狀況,我們給你可執行的方向。諮詢免費,依工時報價。

3Q · 摩葳實業 / 牛寶創意科技社 / 倍新有限公司 — 企業 IT 系統,做了 23 年