Modbus
Modbus是一種串行通信協議,是Modicon公司(現在的施耐德電氣)於1979年為使用可編程邏輯控制器(PLC)通信而發表。Modbus已經成為工業領域通信協議事實上的業界標準,並且現在是工業電子設備之間常用的連接方式。[1] Modbus比其他通信協議使用的更廣泛的主要原因有:
- 公開發表並且無版權要求
- 易於部署和維護
- 對供應商來說,修改移動原生的位元或字節沒有很多限制
Modbus允許多個 (大約240個) 設備連接在同一個網絡上進行通信,舉個例子,一個由測量溫度和濕度的裝置,並且將結果發送給計算機。在數據採集與監視控制系統(SCADA)中,Modbus通常用來連接監控計算機和遠程終端控制系統(RTU)。
協議版本
[編輯]Modbus協議目前存在用於串口、以太網以及其他支持互聯網協議的網絡的版本。
大多數Modbus設備通信通過串EIA-485物理層進行[2]。
對於串行連接,存在兩個變種,它們在數值數據表示不同和協議細節上略有不同。Modbus RTU是一種緊湊的,採用二進制表示數據的方式,Modbus ASCII是一種人類可讀的,冗長的表示方式。這兩個變種都使用串行通訊(serial communication)方式。RTU格式後續的命令/數據帶有循環冗餘校驗的校驗和,而ASCII格式採用縱向冗餘校驗的校驗和。被配置為RTU變種的節點不會和設置為ASCII變種的節點通信,反之亦然。
對於通過TCP/IP(例如以太網)的連接,存在多個Modbus/TCP變種,這種方式不需要校驗和計算。
對於所有的這三種通信協議在數據模型和功能調用上都是相同的,只有封裝方式是不同的。
Modbus有一個擴展版本Modbus Plus(Modbus+或者MB+),不過此協定是Modicon專有的,和Modbus不同。它需要一個專門的協處理器來處理類似HDLC的高速令牌旋轉。它使用1Mbit/s的雙絞線,並且每個節點都有轉換隔離裝置,是一種採用轉換/邊緣觸發而不是電壓/水平觸發的裝置。連接Modbus Plus到計算機需要特別的接口,通常是支持ISA(SA85),PCI或者PCMCIA總線的板卡。
通信和設備
[編輯]Modbus協議是一個master/slave架構的協議。有一個節點是master節點,其他使用Modbus協議參與通信的節點是slave節點。每一個slave設備都有一個唯一的地址。在串行和MB+網絡中,只有被指定為主節點的節點可以啟動一個命令(在以太網上,任何一個設備都能發送一個Modbus命令,但是通常也只有一個主節點設備啟動指令)。
一個ModBus命令包含了打算執行的設備的Modbus地址。所有設備都會收到命令,但只有指定位置的設備會執行及回應指令(地址0例外,指定地址0的指令是廣播指令,所有收到指令的設備都會執行,不過不回應指令)。所有的Modbus命令包含了檢查碼,以確定到達的命令沒有被破壞。基本的ModBus命令能指揮一個RTU改變它的寄存器的某個值,控制或者讀取一個I/O端口,以及指揮設備回送一個或者多個其寄存器中的數據。
有許多modems和網關支持Modbus協議,因為Modbus協議很簡單而且容易複製。它們當中一些為這個協議特別設計的。有使用有線、無線通信甚至短消息和GPRS的不同實現。不過設計者需要克服一些包括高延遲和時序的問題。
實現
[編輯]幾乎所有的實現都是官方標準的某種變體。不同的供應商設備之間可能無法正確的通信。一些主要的變化有:
- 數據類型
- IEEE標準的浮點數
- 32位整型數
- 8位數據
- 混合數據類型
- 整數中的位域
- multipliers to change data to/from integer. 10, 100, 1000, 256 ...
- 協議擴展
- 16位元的從站地址
- 32位的數據大小(1個地址 = 返回32位數據)
- 字交換數據
限制
[編輯]- Modbus是在1970年末為可編程邏輯控制器通信開發的,這些有限的數據類型在那個時代是可以被PLC理解的,大型二進制對象數據是不支持的。
- 對節點而言,沒有一個標準的方法找到數據對象的描述信息,舉個例子,確定一個寄存器數據是否表示一個介於30-175度之間的溫度。
- 由於Modbus是一個主/從協議,沒有辦法要求設備「報告異常」(構建在以太網的TCP/IP協議之上,被稱為open-mbus除外)- 主節點必須循環的詢問每個節點設備,並查找數據中的變化。在帶寬可能比較寶貴的應用中,這種方式在應用中消耗帶寬和網絡時間,例如在低速率的無線鏈路上。
- Modbus在一個數據鏈路上只能處理247個地址,這種情況限制了可以連接到主控站點的設備數量(再一次指出以太網TCP/IP除外)
- Modbus傳輸在遠端通訊設備之間緩衝數據的方式進行,有對通訊一定是連續的限制,避免了傳輸中的緩衝區漏洞的問題
- Modbus協議針對未經授權的命令或截取數據沒有安全性。[3]
Modbus 通訊協定學理上的弱點分析
[編輯]Modbus 當初設計的時候,主要著重兩點,分別是簡單-易於各項系統或是設備上的實現與各項系統所需求的資源較低,以利降低成本, 另一則是通用-便於整合各式各樣設備或是平台,同樣地,這樣也帶來一些缺點,從資安的角度上去解析可發現具有三個主要的弱點:
- 沒有保護機制-指令明碼傳輸(透過第三方封包側錄軟體就可以擷取封包內容,無須解密)。
- 沒有認證機制-符合規範就執行 (只要符合Modbus規範之封包傳輸便可透過第三方控制軟體監控接受端設備)
- 有可能有實現上的問題(針對未定義參考位置輸入指令值,可能造成接收端傳輸異常進而癱瘓接收端設備)。
參考文獻
[編輯]- ^ Drury, Bill. Control Techniques Drives and Controls Handbook (PDF) 2nd. Institution of Engineering and Technology. 2009: 508– [2014-12-17]. (原始內容存檔於2013-11-02).
- ^ 存档副本. [2008-12-23]. (原始內容存檔於2009-02-09).
- ^ Palmer; Shenoi, Sujeet (編). Critical Infrastructure Protection III. Third IFIP WG 11. 10 International Conference. Hanover, New Hampshire: Springer: 87. 23–25 March 2009. ISBN 3-642-04797-1.
外部連結
[編輯]- 開源軟件
- 一個基於GNU/Linux C開發的開源Modbus庫(頁面存檔備份,存於網際網路檔案館)
- 為微控制器開發的免費的Modbus ASCII/RTU和TCP軟件(頁面存檔備份,存於網際網路檔案館)。
- C開發。新站點位置http://www.freemodbus.org(頁面存檔備份,存於網際網路檔案館)。商業支持版本在http://www.embedded-solutions.at(頁面存檔備份,存於網際網路檔案館)。
- NModbus(頁面存檔備份,存於網際網路檔案館)是一個有例子的C#實現版本
- Perl語言開發的Protocol::Modbus
- Perl語言開發的Modbus::Client(頁面存檔備份,存於網際網路檔案館)
- Ruby開發的Modbus master(頁面存檔備份,存於網際網路檔案館)。公共領域的示例代碼,可以很容易的用其他腳本語言重新開發。