什么是 Modbus 協(xié)議及其工作原理?
Modbus 是一種流行的低速串行通信協(xié)議,廣泛應用于自動化行業(yè)。該協(xié)議由 Modicon(現(xiàn)被 Schneider Electric 收購)于 1979 年為其自己的可編程邏輯控制器開發(fā)。該協(xié)議用作 PLC 和智能自動化設備之間的鏈接。Modbus 現(xiàn)在是一個由 Modbus 組織維護的開放協(xié)議,從一開始就在自動化工程師中非常流行。該協(xié)議廣泛用于工業(yè)監(jiān)控,尤其是 PLC。
串行協(xié)議基于主從配置,能夠設置 Modbus 客戶端與多達 247 個 Modbus 服務器的通信。設備上的物理接口通過標準 RS-485 或 RS-232 端口實現(xiàn)??偩€是屏蔽或非屏蔽雙絞線電纜,兩端電阻為 150 歐姆。使用 9 針 D 型外殼、螺絲端子或 RJ-45 連接器,可以輕松地將電纜連接到設備。
Modbus 是使用菊花鏈或分接頭的點對點或多點網(wǎng)絡。Modbus 網(wǎng)絡中的整個通信由主站(即 Modbus 客戶端)控制和管理。Modbus 廣泛用于連接儀器和控制設備與控制器或數(shù)據(jù)收集設備。通常,數(shù)據(jù)收集設備或 Modbus 客戶端是人機界面 (HMI) 或監(jiān)控和數(shù)據(jù)采集 (SCADA) 系統(tǒng)中的監(jiān)控計算機。包括傳感器模塊、可編程邏輯控制器(PLC)或可編程自動化控制器(PAC)在內(nèi)的遠程終端單元(RTU)是Modbus服務器。幾乎所有商業(yè) HMI、SCADA、OPC 服務器都支持 Modbus,
為什么 Modbus 如此受歡迎Modbus 被許多不同行業(yè)的制造商使用,并且由于其簡單性而變得非常流行。它是一個開放標準;因此,制造商可以在他們的設備中構(gòu)建 Modbus 的 RTU 版本,而無需支付任何專利費。該協(xié)議甚至可以在 Arduino 等原型板上實現(xiàn)。事實上,通信協(xié)議可以很容易地在任何微控制器或計算機上實現(xiàn)。數(shù)據(jù)通信通過請求-響應進行,消息具有固定的幀格式。
最初開發(fā)為在串行層上傳輸數(shù)據(jù)的應用層協(xié)議,目前有三個版本的 Modbus 協(xié)議:兩個用于串行線路——Modbus RTU 和 Modbus ASCII;一種用于以太網(wǎng)(TCP/IP 和 UDP)——Modbus TCP。雖然相對簡單,但該協(xié)議仍然支持消息檢查,準確率超過 99%。Modbus RTU 具有循環(huán)冗余校驗和 (CRC),而 Modbus ASCII 具有用于錯誤檢查的縱向冗余校驗 (LRC)。
盡管該協(xié)議始于 1970 年代,但該協(xié)議的實施需要最少的 RAM 和內(nèi)存資源。在 20 世紀 70 年代,當計算機技術(shù)和嵌入式技術(shù)還沒有今天那么先進時,像 Modbus 這樣的輕量級協(xié)議特別有吸引力。Modbus 的流行度從未下降。
Modbus 的標準數(shù)據(jù)速率為 9600 b/s 或 19.2 kb/s。通常,默認速率為 19.2 kb/s。數(shù)據(jù)速率可以降低到 4800 b/s、2400 b/s 等。最大數(shù)據(jù)速率為 115.2 kb/s。在 9600 b/s 的標準數(shù)據(jù)速率下,Modbus 的最大范圍可達 1000 米。如果數(shù)據(jù)速率增加,則范圍會縮小。抽頭長度應始終小于 20 米。
邏輯電平在 Modbus 上,二進制 0 由 +2 至 +6V 的電壓電平表示。二進制 1 由 -2 到 -6V 的電壓電平表示。
層最初,Modbus 是在串行層上實現(xiàn)的單一協(xié)議。當為以太網(wǎng)實現(xiàn)協(xié)議時,引入了應用程序數(shù)據(jù)單元以支持通過串行以及 TCP/IP 和 UDP 網(wǎng)絡實現(xiàn)。該協(xié)議現(xiàn)在分為兩層——核心層和網(wǎng)絡層。核心層定義協(xié)議數(shù)據(jù)單元(PDU),而網(wǎng)絡層定義應用數(shù)據(jù)單元(ADU)。即使沒有定義任何應用程序數(shù)據(jù)單元,PDU 也可以通過 UDP 網(wǎng)絡傳輸。
Modbus 的串行版本(即 Modbus RTU 和 Modbus ASCII)只需要 PDU,而以太網(wǎng)版本(即 Modbus TCP)則需要 PDU 和 ADU。
Modbus 是一種在主從配置中實現(xiàn)的請求-響應協(xié)議。有兩種類型的設備——Modbus 客戶端和 Modbus 服務器。Modbus Client 是主機,通常是 SCADA 系統(tǒng)或 HMI 中的監(jiān)控計算機。Modbus 服務器是從站,通常是遠程終端單元,如傳感器模塊、PLC 和 PAC。
Modbus 的串行版本支持單個客戶端與多達 247 個 Modbus 服務器的通信。由于 RS-485 和 RS-232 端口對于 Modbus 實施是通用的,如果使用 RS-232 端口,Modbus 服務器的最大數(shù)量可以達到 247 個,但是如果使用 RS-485 端口,最大數(shù)量由于 RS-485 標準的實際限制,Modbus 服務器被限制為 32 個。可以有多個客戶端和無限的服務器,因為以太網(wǎng)版本的 Modbus 有一個額外的 6 字節(jié)標頭用于互聯(lián)網(wǎng)路由
整個數(shù)據(jù)通信由Modbus客戶端通過請求-響應的方式進行控制。在 Modbus 中,數(shù)據(jù)以字節(jié)形式傳輸。在 RTU 版本中,每個字節(jié)都編碼在一個 11 位異步幀中,該幀由起始位、數(shù)據(jù)字節(jié)、偶校驗位和一個停止位組成。在 ASCII 版本中,每個字節(jié)都編碼在一個 10 位幀中,該幀由一個起始位、7 位數(shù)據(jù)、1 位偶數(shù)或奇數(shù)奇偶校驗或無奇偶校驗位組成,如果使用奇偶校驗則為 1 位停止位 2停止位。
主/客戶端和從/服務器之間通信的消息稱為協(xié)議數(shù)據(jù)單元 (PDU)。PDU 由從機地址、功能代碼(命令)、數(shù)據(jù)和校驗和(CRC 或 LRC)組成。
主機向由從機地址標識的其中一個從機發(fā)送請求。從地址是一個字節(jié)長,可以有一個介于0和255之間的值。根據(jù)協(xié)議,從地址0是為廣播消息保留的,標識從設備的從地址不能超過247。功能代碼也是一個字節(jié)long,它告訴被尋址的從設備必須采取什么樣的行動。1~255 范圍內(nèi)的功能碼有效,其中128~255 為異常響應預留。該操作是讀取或?qū)懭氩僮?,請求中的?shù)據(jù)借此提供執(zhí)行該操作所需的附加信息。例如,它可能指定從哪里開始讀取以及必須讀取多少數(shù)據(jù)。CRC在RTU版本中用于錯誤校驗,
當主機向?qū)ぶ返膹臋C發(fā)出請求時,它會發(fā)回響應。從站地址和功能代碼在同一響應中回顯。數(shù)據(jù)包含主站請求的值。如果在執(zhí)行請求的操作時發(fā)生錯誤,則修改功能代碼并且數(shù)據(jù)包含描述錯誤的代碼。同樣,CRC 或 LRC 分別取決于 RTU 或 ASCII 幀,用于確保消息或 PDU 的完整性。
在 RTU 幀中,每個字節(jié)代表 11 位幀中的兩個 4 位十六進制字符。PDU由1字節(jié)長的從地址、1字節(jié)長的功能碼、0到252字節(jié)長的數(shù)據(jù)和2字節(jié)長的CRC組成。
在 ASCII 幀中,每個字節(jié)代表 10 位幀中的兩個 ASCII 字符。PDU由1個字符長的Start字符、2個字符長的從機地址、2個字符長的功能碼、0到504個字符長的數(shù)據(jù)、2個字符長的LRC和2個字符長的End字符組成。起始字符始終是冒號 (:) 或 ASCII 3A 十六進制。結(jié)束字符始終是帶換行符的回車符(ASCII 0D 和 0A 十六進制)。RTU 和 ASCII 版本中的每個 PDU 由 28 位或 3.5 個字符分隔。
Modbus 的 RTU 和 ASCII 版本幾乎相似,只有少數(shù)差異。在 RTU 幀中,字節(jié)以二進制形式呈現(xiàn),而在 ASCII 幀中,字節(jié)以可讀的 4 位 ASCII 字符形式呈現(xiàn)。ASCII 幀具有文本開始和文本結(jié)束字符,而在 RTU 幀中,PDU/消息之間的 28 位分隔被解釋為檢測幀的開始和結(jié)束。由于 RTU 成幀使用較短的消息,因此它比 ASCII 版本更快。ASCII 版本確實有一個優(yōu)勢,即消息中的字符之間最多可以間隔一秒。如果間隔超過一秒,則設備將其視為傳輸錯誤。
TCP版本Modbus中的PDU由2字節(jié)長的事務ID、2字節(jié)長的協(xié)議字段、2字節(jié)長的長度字段、1字節(jié)長的從機地址、1到252字節(jié)長的消息字段。
事務 ID 標識事務,協(xié)議始終設置為 0 以指示 Modbus。長度表示后面的字節(jié)數(shù)。隨后是一個 1 字節(jié)長的從機地址。消息字段是類似于 Modbus 幀的 RTU 版本,由功能代碼和數(shù)據(jù)組成。消息字段的最大大小可以為 253 字節(jié)(即功能代碼為 1 字節(jié),數(shù)據(jù)最大為 252 字節(jié),如 RTU 幀)。
在所有版本中首先發(fā)送最低有效位 — RTU、ASCII 和 TCP,Modbus 兼容設備無法自動檢測波特率,因此需要在總線的客戶端和服務器端明確設置相同的波特率。Modbus PDU 支持一種只能發(fā)送數(shù)據(jù)而不能跨通信設備發(fā)送參數(shù)的格式。
數(shù)據(jù)類型Modbus 中有兩種數(shù)據(jù)類型——線圈和寄存器。線圈是單個位,可以是 0(關(guān))或 1(開)。線圈可以是離散輸出線圈或離散輸入觸點。離散輸入觸點是物理離散輸入的狀態(tài),為 ON 或 OFF。離散輸出線圈是物理離散輸出信號的狀態(tài),為 ON 或 OFF。
這些寄存器是 16 位無符號寄存器,可以包含表示浮點數(shù)、ASCII 文本、隊列或表的值。寄存器本身僅存儲 0 到 65535 范圍內(nèi)的正值,即 0x0000 到 0xFFFF 十六進制。存儲在寄存器中的 16 位數(shù)據(jù)可以被 Modbus 客戶端解釋為 16 位無符號整數(shù)、16 位有符號整數(shù)、2 個字符的 ASCII 字符串或離散的 ON/OFF 值。存儲在寄存器中的 32 位數(shù)據(jù)可以被 Modbus 客戶端解釋為 32 位無符號整數(shù)、32 位有符號整數(shù)、4 字符 ASCII 字符串或 32 位雙精度浮點數(shù)。
有兩種類型的寄存器——模擬輸入寄存器和模擬輸出保持寄存器。與離散輸入觸點(線圈)一樣,輸入寄存器將外部輸入的狀態(tài)存儲為 0 到 65535(0x0000 到 0xFFFF)之間的值。過去,輸入寄存器通常用于存儲模擬輸入值的數(shù)字表示,可以是電壓或電流信號。輸出保持寄存器用于在設備上存儲數(shù)據(jù)?,F(xiàn)在,由于大多數(shù)Modbus兼容設備都不是輸入/輸出設備,因此輸入寄存器也用于存儲數(shù)據(jù)。
服務器如何存儲數(shù)據(jù)在傳感器模塊、PLC 或 PAC 等 Modbus 服務器上,數(shù)據(jù)被組織到四個表或數(shù)據(jù)庫中。有兩個數(shù)據(jù)庫用于存儲離散的開/關(guān)值或線圈。這些數(shù)據(jù)庫分別存儲離散輸出線圈和離散輸入觸點。然后,有兩個存儲數(shù)值的數(shù)據(jù)庫或分別存儲模擬輸入寄存器和模擬輸出保持寄存器的寄存器。
每個數(shù)據(jù)庫可以存儲 9999 個值。例如,離散輸出線圈和離散輸入觸點的數(shù)據(jù)庫可以存儲 9999 個位,范圍從 0000 到 270E。模擬輸入寄存器和模擬輸出保持寄存器的數(shù)據(jù)庫可以存儲 9999 個字,范圍從 0000 到 270E,每個字為 16 位長。
離散量輸出線圈和模擬量輸出保持寄存器的數(shù)據(jù)庫為讀寫型,而離散量輸入接點和模擬量輸入寄存器的數(shù)據(jù)庫為只讀型。
數(shù)據(jù)庫中的值通過位置名稱訪問。離散輸出線圈、離散輸入接點、模擬輸入寄存器、模擬輸出保持寄存器的數(shù)據(jù)庫位置分別為1~9999、10001~19999、30001~39999、40001~49999。下表總結(jié)了 Modbus 服務器上四個數(shù)據(jù)庫的結(jié)構(gòu)和性質(zhì)。
Modbus 是一種廣泛使用的工業(yè)通信協(xié)議,通常與 PLC 一起使用。該協(xié)議具有三個版本——RTU、ASCII 和 Modbus。RTU 版本是開放標準且最快的,最常被制造商使用。對于較短的消息,RTU 幀的 Modbus 消息可以 100 毫秒的間隔更新。幾乎所有商業(yè) HMI、SCADA、OPC 服務器和數(shù)據(jù)采集軟件都支持 Modbus,因此可以輕松地將 Modbus 兼容設備集成到任何工業(yè)自動化系統(tǒng)或樓宇管理系統(tǒng)中。
*博客內(nèi)容為網(wǎng)友個人發(fā)布,僅代表博主個人觀點,如有侵權(quán)請聯(lián)系工作人員刪除。