返回部落格
教學8 分鐘閱讀

沒有硬體實驗室,怎麼測 OCPP 1.6 充電樁

要對一套 OCPP 實作有信心,你並不需要一整機櫃的充電樁。這裡給出一套在筆電上測試連線兩端的實用方案,以及它能告訴你什麼、不能告訴你什麼。

I
Infinite Service Team

大多數 OCPP 缺陷不是電氣問題。是少了一個欄位、寫錯一個列舉值,或者狀態機接受了一條本該拒絕的 StartTransaction。這些都不需要電流真的流過——也就是說,絕大部分 OCPP 測試可以在一台筆電上完成。

以下是我們推薦給那些還在等硬體、或者有硬體但沒法為每次提交都佔用它的團隊的方案。

先決定你在測哪一邊

這聽起來是廢話,卻是白費力氣的第一大來源。人們嘴裡的「OCPP 測試」其實是兩件互相獨立的事:

測一台充電樁。 你有一份應該會講 OCPP 的固件,你想知道它到底會不會。你需要一個行為像 CSMS、並且會評判充電樁發出內容的東西。

測一套 CSMS。 你有一個後端,你想知道它能不能接住真實充電樁的行為。你需要一個行為像充電樁、並且可以被指使去亂來的東西。

這兩件事需要的工具是相反的,為其中一件做的工具,對另一件幾乎沒用。先把這個決定做了。

測一台充電樁

把充電樁指向一個你自己控制的 CSMS,然後看它說什麼。充電樁並不知道、也不在乎那個端點是生產環境的基礎設施,還是你機器上的一個行程。

把充電樁的中央系統 URL 設成你的端點。幾乎每台充電樁都會在 Web 介面或設定檔裡揭露這一項,通常長這樣:

wss://10.0.1.50:9000/ocpp/CP001

然後按順序走一遍訊息流程,因為後面的訊息依賴前面的:

  1. BootNotification。 檢查 chargePointVendor 和 chargePointModel 是否都在——兩者都是必填,而早期固件裡兩者常常留空。確認充電樁遵守你回的 interval,而不是用寫死的值。
  2. Heartbeat。 確認它按你在 BootNotification 回應裡給的間隔到來,並且當你用 ChangeConfiguration 改動之後,充電樁會跟著調整。
  3. StatusNotification。 讓接口依次走過 Available、Preparing、Charging、Finishing。留意規範不允許的狀態轉移,也留意那種在指整站時卻回報 connectorId: 0 的充電樁。
  4. StartTransaction / StopTransaction。 用你能回傳的每一種 AuthorizationStatus 去檢驗 idTag 的處理——Accepted、Blocked、Expired、Invalid、ConcurrentTx。拒絕一筆交易是被測得最少、壞得最多的那條路徑。
  5. MeterValues。 確認取樣間隔與設定一致,單位和 measurand 的取值也和你預期的一樣。

這個練習裡最有價值的部分,是故意回傳失敗。能正確處理 Accepted、卻在 Blocked 上翻車的固件極其常見,因為幸福路徑是唯一被人走過的那條。

測一套 CSMS

這一邊你需要一台模擬充電樁,而讓模擬器有用的,不是它能把一次充電工作階段跑完。是它能做出真實充電樁在出岔子時會做的那些事。

值得自動化的情境:

  • 冷啟動。 一台 CSMS 從未見過的充電樁發來 BootNotification。它是自動納管,還是拒絕?
  • 交易中途重連。 在一筆進行中的交易期間斷掉 socket,然後重連。交易必須活下來;電表讀數不能從頭開始。
  • 時鐘偏差。 傳送差了幾個小時的時間戳。無條件信任充電樁時鐘的 CSMS,會產出無法對帳的計費記錄。
  • 重複的 StartTransaction。 同一個 idTag、同一個接口,發兩次。ConcurrentTx 的存在是有原因的。
  • 離線佇列灌入。 斷線期間把訊息快取起來,重連時一次性灌過去。天真的 CSMS 實作就是在這裡掉資料的。
  • 畸形封包。 缺必填欄位、型別錯誤、未知列舉值。CSMS 應該回一個 CALLERROR,而不是關掉連線或者把 worker 弄崩。

規模也重要,但比人們想的要晚。一百台模擬充電樁能幫你找出並行缺陷;一萬台找出的多半是你資料庫的上限,那是另一場調查。

放進 CI

把這一切用軟體來做的理由,是軟體可以在每次提交時跑。一個有用的 OCPP CI 任務大致長這樣:

  1. 啟動被測的 CSMS
  2. 對著它啟動 N 台模擬充電樁
  3. 跑一段腳本化的情境——連線、啟動、授權、充電、停止、斷線
  4. 對結果狀態下斷言:交易已關閉、電表讀數單調、沒有孤立工作階段
  5. 拆掉環境並輸出報告

這能抓住硬體測試抓得太晚的那些迴歸。一個改動破壞了 StopTransaction 的原因碼,在 CI 裡發現很便宜,在現場試點裡發現很貴。

這套方法涵蓋不到什麼

對侷限保持誠實很重要,因為一套綠燈卻掩蓋了一整類故障的測試集,比沒有測試集更糟。

電氣與安全行為。 接觸器時序、接地故障偵測、溫度降額、緊急停止。這些在 OCPP 上全都看不見,也全都無法模擬。

真實的網路狀況。 充電樁活在電信業者 NAT 後面的行動網路鏈路上。掉包、數秒級延遲、靜默斷線——localhost 上的模擬器不會重現這些,而它們要為相當大一部分生產事故負責。

廠商的怪癖。 每家製造商都會在規範的某個角落上做出不同的解讀。這些只能靠接上那家廠商的真實硬體才能發現,沒有替代品。

正式認證。 通過你自己的測試並不等於 OCPP 認證。那件事仍然要走 OCA 的流程和他們的測試工具。

所以一個合理的方案大致是這個形狀:軟體測試持續、低成本地抓住大多數缺陷;硬體測試確認只有硬體才能確認的東西;等前兩項都乾淨了,再去做認證。

工具

這個領域有不錯的開源工作——docile-charge-point 可腳本化,而且已經存在多年;Python 的 ocpp 函式庫給了你兩邊都能用的構件。

我們為第一件事做了 TestPilot——一個評判充電樁並匯出一致性報告的 CSMS——為第二件事做了 SimPilot,它對著你的後端模擬充電樁,包括上面那些故障模式。如果你想要的是把協定層放進自己的 Go 服務裡,而不是在旁邊放一個工具,那麼 OcppPilot 就是另外兩者所依賴的那個函式庫。

相關文章