[Modbus] 保護主義下的通訊協定設計,造成應用的困擾


某國內上市以羅馬字母為名的科技大廠,以下簡稱 D,2011 新出的太陽能逆變器 (以下簡稱 Inverter) 通訊協定推測是基於保護自家監測系統設計出來。

這不是技能問題,而是故意為之。

並聯型的 Inverter 功能是將太陽能板的直流電轉換為交流電,併入台電電網供電。

在國際規範有相關的規定,跟監測相關的是 1998 編訂的 IEC 61724,在 2017 有更新版釋出,1998 的國際規範要求的不多,就要求要有 EIA-485 及 9600 bps 的支援,監測項目則有交直流電壓、電流、功率、頻率、累積發電量等規定。

由於近年來太陽能產業技術快速發展,又隨時有新產品上線、舊產品停產等變化,而太陽能板保固是 25 年,Inverter 保固 5 年,必然產生 Inverter 需要替換的問題,而 IEC 相關規定只有大方向,因此近年民間超過 100 家太陽能廠商成立協議組織,共同訂定 SunSpec 相關規範,其中就包含 Inverter 通訊協定除使用 Modbus 外,並要求通訊位置列表的一致性。

好比你今天電腦內的硬碟故障,你隨時可以買一顆新硬碟取代,遵守 SunSpec 通訊協定的,你只要設定好 Inverter 參數,就可以正常上線,不會影響到你既有系統的運作。

D 廠牌早期的 Inverter 功率小,通訊雖然使用 Modbus ,但 ID 只能使用 1 ~ 31 ,通訊協定只有 2400 bps ,早期技術欠佳可以理解容忍。

2011/2014 出的新產品,裡面最神奇的地方就是透過通訊協定設計,形成技術障礙,讓大部分設備均無法支援。

一般來說,Modbus 通訊通常只要讀資料,除維護外,不輕易寫入設備。因此大部分的工業設備在設計上,都是透過設定讀取對照表來取得對應數據。

D 廠牌利用一個奇異的邏輯:

在 800 位置分別寫入目前項目 (0, 1, 2, 48, 49)

可在 1055 連續位置分別讀取 (AC1, AC2, AC3, DC1, DC2) 的目前項目、電壓、電流、功率、頻率 等資訊。

沒錯,要寫入、讀取、判讀目前項目、計算平均、累加。

這對自己有能力開發軟體的系統商其實不難,但是會破壞原先通用架構的邏輯,我的作法是加入動態原始碼支援方式處理。

VB6 版本的透過 Script Control ,載入我加密過後的 VBScript (可選擇使用 javascript)

VBNET 版本則是透過動態編譯方式處理。(我網站上有動態編譯原始碼)

但沒能力開發的系統商,既有系統或工業設備無力支援這個複雜的邏輯,就變成必須購買 D 廠牌提供的監控套件,買了後還不知道該怎樣整合。

D 廠牌不是沒能力處理通訊協定,以下情況可以說明之:

  1. 舊版 2400 bps 的通訊對照表正常。
  2. 2013 D 廠牌替斯奈德 OEM 的 Inverter 通訊對照表正常,硬體相同,只有差韌體。
  3. 2017 版的韌體支援 SunSpec ,但只對國外銷售,內銷想買還不出貨,只能買到奇怪通訊協定的版本。
  4. D 廠牌有其他工業設備、UPS 都屬正常通訊對照表。

早先國內太陽能案場多數 500 kWp 以下,2017 起,逐漸邁向 2 MWp 以下為大宗,當規模增加後,自然設備就會分散布置,485 雖然有很多方式分散式讀取,但穩定度畢竟不如光纖網路,因此分散式的環境下,我會使用 Modbus TCP Gateway 來將網路訊號轉換成 Modbus RTU 。

這裡面又發生了很瞎的狀況。

Modbus RTU 就像教室裡面只能有一個老師 (Master),老師上課的時候就會喊 3 號 (Slave),你來唸下面這段課文,3 號就會開始唸。但教室裡面不能同時有兩個老師,或是說兩個老師不能同時發命令。

Modbus TCP 就像是多個教務組員隨時透過電話 (Gateway) 打給老師詢問學生狀況,老師如果知道可以立即回覆,老師不知道可以問學生,老師要不要問學生就決定快取 (Cache) 時間有多長。

由於 D 廠牌設計很瞎的通訊協定造成 AC1/AC2/AC3/DC1/DC2 都在同一位置,因此在快取情形下,就可能發生問 DC1 時,還在回應 AC1 。

大部分 Cache 是全自動不可設定,還好我使用泓格的有調整 Read Cache 毫秒數,預設為 980ms ,0 ms 為停用,我改設定為 0 ms ,整個系統就能正常運作,當然,基本上就變成把 Modbus TCP 當 Modbus RTU 在用了。

謠傳,下半年或明年起,國內各太陽能案場需使用國產的 Inverter ,我對於保護主義尚能接受,但我只有一個要求,你他媽的至少要支援 SunSpec 這類國際規範,不接受胡搞瞎搞的廠牌。

註:

VB6 呼叫 VBScript 可參閱下面兩篇:

  1. [VBScript] VB6 Variant 變數傳遞給 VBScript 的相容檢討
  2. [VBScript] 傳遞陣列到 VB6 的物件

動態編譯可參考:[VB2005] 程式碼動態編譯執行引擎(模擬 Script Control)

廣告
Categories: 工作點滴, 技術分享 | 標籤: | 發表留言

文章分頁導航

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

您的留言將使用 WordPress.com 帳號。 登出 /  變更 )

Google+ photo

您的留言將使用 Google+ 帳號。 登出 /  變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 /  變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 /  變更 )

w

連結到 %s

在 WordPress.com 建立免費網站或網誌.

%d 位部落客按了讚: