博客專欄

EEPW首頁 > 博客 > 什么是 Modbus 協(xié)議及其工作原理?

什么是 Modbus 協(xié)議及其工作原理?

發(fā)布人:電子資料庫 時(shí)間:2023-03-17 來源:工程師 發(fā)布文章
image.png


Modbus 是一種流行的低速串行通信協(xié)議,廣泛應(yīng)用于自動(dòng)化行業(yè)。該協(xié)議由 Modicon(現(xiàn)被 Schneider Electric 收購)于 1979 年為其自己的可編程邏輯控制器開發(fā)。該協(xié)議用作 PLC 和智能自動(dòng)化設(shè)備之間的鏈接。Modbus 現(xiàn)在是一個(gè)由 Modbus 組織維護(hù)的開放協(xié)議,從一開始就在自動(dòng)化工程師中非常流行。該協(xié)議廣泛用于工業(yè)監(jiān)控,尤其是 PLC。

串行協(xié)議基于主從配置,能夠設(shè)置 Modbus 客戶端與多達(dá) 247 個(gè) Modbus 服務(wù)器的通信。設(shè)備上的物理接口通過標(biāo)準(zhǔn) RS-485 或 RS-232 端口實(shí)現(xiàn)??偩€是屏蔽或非屏蔽雙絞線電纜,兩端電阻為 150 歐姆。使用 9 針 D 型外殼、螺絲端子或 RJ-45 連接器,可以輕松地將電纜連接到設(shè)備。

Modbus 是使用菊花鏈或分接頭的點(diǎn)對(duì)點(diǎn)或多點(diǎn)網(wǎng)絡(luò)。Modbus 網(wǎng)絡(luò)中的整個(gè)通信由主站(即 Modbus 客戶端)控制和管理。Modbus 廣泛用于連接儀器和控制設(shè)備與控制器或數(shù)據(jù)收集設(shè)備。通常,數(shù)據(jù)收集設(shè)備或 Modbus 客戶端是人機(jī)界面 (HMI) 或監(jiān)控和數(shù)據(jù)采集 (SCADA) 系統(tǒng)中的監(jiān)控計(jì)算機(jī)。包括傳感器模塊、可編程邏輯控制器(PLC)或可編程自動(dòng)化控制器(PAC)在內(nèi)的遠(yuǎn)程終端單元(RTU)是Modbus服務(wù)器。幾乎所有商業(yè) HMI、SCADA、OPC 服務(wù)器都支持 Modbus,

為什么 Modbus 如此受歡迎

Modbus 被許多不同行業(yè)的制造商使用,并且由于其簡單性而變得非常流行。它是一個(gè)開放標(biāo)準(zhǔn);因此,制造商可以在他們的設(shè)備中構(gòu)建 Modbus 的 RTU 版本,而無需支付任何專利費(fèi)。該協(xié)議甚至可以在 Arduino 等原型板上實(shí)現(xiàn)。事實(shí)上,通信協(xié)議可以很容易地在任何微控制器或計(jì)算機(jī)上實(shí)現(xiàn)。數(shù)據(jù)通信通過請(qǐng)求-響應(yīng)進(jìn)行,消息具有固定的幀格式。

最初開發(fā)為在串行層上傳輸數(shù)據(jù)的應(yīng)用層協(xié)議,目前有三個(gè)版本的 Modbus 協(xié)議:兩個(gè)用于串行線路——Modbus RTU 和 Modbus ASCII;一種用于以太網(wǎng)(TCP/IP 和 UDP)——Modbus TCP。雖然相對(duì)簡單,但該協(xié)議仍然支持消息檢查,準(zhǔn)確率超過 99%。Modbus RTU 具有循環(huán)冗余校驗(yàn)和 (CRC),而 Modbus ASCII 具有用于錯(cuò)誤檢查的縱向冗余校驗(yàn) (LRC)。

盡管該協(xié)議始于 1970 年代,但該協(xié)議的實(shí)施需要最少的 RAM 和內(nèi)存資源。在 20 世紀(jì) 70 年代,當(dāng)計(jì)算機(jī)技術(shù)和嵌入式技術(shù)還沒有今天那么先進(jìn)時(shí),像 Modbus 這樣的輕量級(jí)協(xié)議特別有吸引力。Modbus 的流行度從未下降。

image.png


范圍和數(shù)據(jù)速率

Modbus 的標(biāo)準(zhǔn)數(shù)據(jù)速率為 9600 b/s 或 19.2 kb/s。通常,默認(rèn)速率為 19.2 kb/s。數(shù)據(jù)速率可以降低到 4800 b/s、2400 b/s 等。最大數(shù)據(jù)速率為 115.2 kb/s。在 9600 b/s 的標(biāo)準(zhǔn)數(shù)據(jù)速率下,Modbus 的最大范圍可達(dá) 1000 米。如果數(shù)據(jù)速率增加,則范圍會(huì)縮小。抽頭長度應(yīng)始終小于 20 米。

邏輯電平

在 Modbus 上,二進(jìn)制 0 由 +2 至 +6V 的電壓電平表示。二進(jìn)制 1 由 -2 到 -6V 的電壓電平表示。

最初,Modbus 是在串行層上實(shí)現(xiàn)的單一協(xié)議。當(dāng)為以太網(wǎng)實(shí)現(xiàn)協(xié)議時(shí),引入了應(yīng)用程序數(shù)據(jù)單元以支持通過串行以及 TCP/IP 和 UDP 網(wǎng)絡(luò)實(shí)現(xiàn)。該協(xié)議現(xiàn)在分為兩層——核心層和網(wǎng)絡(luò)層。核心層定義協(xié)議數(shù)據(jù)單元(PDU),而網(wǎng)絡(luò)層定義應(yīng)用數(shù)據(jù)單元(ADU)。即使沒有定義任何應(yīng)用程序數(shù)據(jù)單元,PDU 也可以通過 UDP 網(wǎng)絡(luò)傳輸。

Modbus 的串行版本(即 Modbus RTU 和 Modbus ASCII)只需要 PDU,而以太網(wǎng)版本(即 Modbus TCP)則需要 PDU 和 ADU。

image.png


網(wǎng)絡(luò)和通信

Modbus 是一種在主從配置中實(shí)現(xiàn)的請(qǐng)求-響應(yīng)協(xié)議。有兩種類型的設(shè)備——Modbus 客戶端和 Modbus 服務(wù)器。Modbus Client 是主機(jī),通常是 SCADA 系統(tǒng)或 HMI 中的監(jiān)控計(jì)算機(jī)。Modbus 服務(wù)器是從站,通常是遠(yuǎn)程終端單元,如傳感器模塊、PLC 和 PAC。

Modbus 的串行版本支持單個(gè)客戶端與多達(dá) 247 個(gè) Modbus 服務(wù)器的通信。由于 RS-485 和 RS-232 端口對(duì)于 Modbus 實(shí)施是通用的,如果使用 RS-232 端口,Modbus 服務(wù)器的最大數(shù)量可以達(dá)到 247 個(gè),但是如果使用 RS-485 端口,最大數(shù)量由于 RS-485 標(biāo)準(zhǔn)的實(shí)際限制,Modbus 服務(wù)器被限制為 32 個(gè)??梢杂卸鄠€(gè)客戶端和無限的服務(wù)器,因?yàn)橐蕴W(wǎng)版本的 Modbus 有一個(gè)額外的 6 字節(jié)標(biāo)頭用于互聯(lián)網(wǎng)路由

整個(gè)數(shù)據(jù)通信由Modbus客戶端通過請(qǐng)求-響應(yīng)的方式進(jìn)行控制。在 Modbus 中,數(shù)據(jù)以字節(jié)形式傳輸。在 RTU 版本中,每個(gè)字節(jié)都編碼在一個(gè) 11 位異步幀中,該幀由起始位、數(shù)據(jù)字節(jié)、偶校驗(yàn)位和一個(gè)停止位組成。在 ASCII 版本中,每個(gè)字節(jié)都編碼在一個(gè) 10 位幀中,該幀由一個(gè)起始位、7 位數(shù)據(jù)、1 位偶數(shù)或奇數(shù)奇偶校驗(yàn)或無奇偶校驗(yàn)位組成,如果使用奇偶校驗(yàn)則為 1 位停止位 2停止位。

主/客戶端和從/服務(wù)器之間通信的消息稱為協(xié)議數(shù)據(jù)單元 (PDU)。PDU 由從機(jī)地址、功能代碼(命令)、數(shù)據(jù)和校驗(yàn)和(CRC 或 LRC)組成。

主機(jī)向由從機(jī)地址標(biāo)識(shí)的其中一個(gè)從機(jī)發(fā)送請(qǐng)求。從地址是一個(gè)字節(jié)長,可以有一個(gè)介于0和255之間的值。根據(jù)協(xié)議,從地址0是為廣播消息保留的,標(biāo)識(shí)從設(shè)備的從地址不能超過247。功能代碼也是一個(gè)字節(jié)long,它告訴被尋址的從設(shè)備必須采取什么樣的行動(dòng)。1~255 范圍內(nèi)的功能碼有效,其中128~255 為異常響應(yīng)預(yù)留。該操作是讀取或?qū)懭氩僮?,?qǐng)求中的數(shù)據(jù)借此提供執(zhí)行該操作所需的附加信息。例如,它可能指定從哪里開始讀取以及必須讀取多少數(shù)據(jù)。CRC在RTU版本中用于錯(cuò)誤校驗(yàn),

當(dāng)主機(jī)向?qū)ぶ返膹臋C(jī)發(fā)出請(qǐng)求時(shí),它會(huì)發(fā)回響應(yīng)。從站地址和功能代碼在同一響應(yīng)中回顯。數(shù)據(jù)包含主站請(qǐng)求的值。如果在執(zhí)行請(qǐng)求的操作時(shí)發(fā)生錯(cuò)誤,則修改功能代碼并且數(shù)據(jù)包含描述錯(cuò)誤的代碼。同樣,CRC 或 LRC 分別取決于 RTU 或 ASCII 幀,用于確保消息或 PDU 的完整性。

在 RTU 幀中,每個(gè)字節(jié)代表 11 位幀中的兩個(gè) 4 位十六進(jìn)制字符。PDU由1字節(jié)長的從地址、1字節(jié)長的功能碼、0到252字節(jié)長的數(shù)據(jù)和2字節(jié)長的CRC組成。

image.png


在 ASCII 幀中,每個(gè)字節(jié)代表 10 位幀中的兩個(gè) ASCII 字符。PDU由1個(gè)字符長的Start字符、2個(gè)字符長的從機(jī)地址、2個(gè)字符長的功能碼、0到504個(gè)字符長的數(shù)據(jù)、2個(gè)字符長的LRC和2個(gè)字符長的End字符組成。起始字符始終是冒號(hào) (:) 或 ASCII 3A 十六進(jìn)制。結(jié)束字符始終是帶換行符的回車符(ASCII 0D 和 0A 十六進(jìn)制)。RTU 和 ASCII 版本中的每個(gè) PDU 由 28 位或 3.5 個(gè)字符分隔。

image.png


Modbus 的 RTU 和 ASCII 版本幾乎相似,只有少數(shù)差異。在 RTU 幀中,字節(jié)以二進(jìn)制形式呈現(xiàn),而在 ASCII 幀中,字節(jié)以可讀的 4 位 ASCII 字符形式呈現(xiàn)。ASCII 幀具有文本開始和文本結(jié)束字符,而在 RTU 幀中,PDU/消息之間的 28 位分隔被解釋為檢測幀的開始和結(jié)束。由于 RTU 成幀使用較短的消息,因此它比 ASCII 版本更快。ASCII 版本確實(shí)有一個(gè)優(yōu)勢,即消息中的字符之間最多可以間隔一秒。如果間隔超過一秒,則設(shè)備將其視為傳輸錯(cuò)誤。

TCP版本Modbus中的PDU由2字節(jié)長的事務(wù)ID、2字節(jié)長的協(xié)議字段、2字節(jié)長的長度字段、1字節(jié)長的從機(jī)地址、1到252字節(jié)長的消息字段。

image.png


事務(wù) ID 標(biāo)識(shí)事務(wù),協(xié)議始終設(shè)置為 0 以指示 Modbus。長度表示后面的字節(jié)數(shù)。隨后是一個(gè) 1 字節(jié)長的從機(jī)地址。消息字段是類似于 Modbus 幀的 RTU 版本,由功能代碼和數(shù)據(jù)組成。消息字段的最大大小可以為 253 字節(jié)(即功能代碼為 1 字節(jié),數(shù)據(jù)最大為 252 字節(jié),如 RTU 幀)。

在所有版本中首先發(fā)送最低有效位 — RTU、ASCII 和 TCP,Modbus 兼容設(shè)備無法自動(dòng)檢測波特率,因此需要在總線的客戶端和服務(wù)器端明確設(shè)置相同的波特率。Modbus PDU 支持一種只能發(fā)送數(shù)據(jù)而不能跨通信設(shè)備發(fā)送參數(shù)的格式。

數(shù)據(jù)類型

Modbus 中有兩種數(shù)據(jù)類型——線圈和寄存器。線圈是單個(gè)位,可以是 0(關(guān))或 1(開)。線圈可以是離散輸出線圈或離散輸入觸點(diǎn)。離散輸入觸點(diǎn)是物理離散輸入的狀態(tài),為 ON 或 OFF。離散輸出線圈是物理離散輸出信號(hào)的狀態(tài),為 ON 或 OFF。

這些寄存器是 16 位無符號(hào)寄存器,可以包含表示浮點(diǎn)數(shù)、ASCII 文本、隊(duì)列或表的值。寄存器本身僅存儲(chǔ) 0 到 65535 范圍內(nèi)的正值,即 0x0000 到 0xFFFF 十六進(jìn)制。存儲(chǔ)在寄存器中的 16 位數(shù)據(jù)可以被 Modbus 客戶端解釋為 16 位無符號(hào)整數(shù)、16 位有符號(hào)整數(shù)、2 個(gè)字符的 ASCII 字符串或離散的 ON/OFF 值。存儲(chǔ)在寄存器中的 32 位數(shù)據(jù)可以被 Modbus 客戶端解釋為 32 位無符號(hào)整數(shù)、32 位有符號(hào)整數(shù)、4 字符 ASCII 字符串或 32 位雙精度浮點(diǎn)數(shù)。

有兩種類型的寄存器——模擬輸入寄存器和模擬輸出保持寄存器。與離散輸入觸點(diǎn)(線圈)一樣,輸入寄存器將外部輸入的狀態(tài)存儲(chǔ)為 0 到 65535(0x0000 到 0xFFFF)之間的值。過去,輸入寄存器通常用于存儲(chǔ)模擬輸入值的數(shù)字表示,可以是電壓或電流信號(hào)。輸出保持寄存器用于在設(shè)備上存儲(chǔ)數(shù)據(jù)。現(xiàn)在,由于大多數(shù)Modbus兼容設(shè)備都不是輸入/輸出設(shè)備,因此輸入寄存器也用于存儲(chǔ)數(shù)據(jù)。

服務(wù)器如何存儲(chǔ)數(shù)據(jù)

在傳感器模塊、PLC 或 PAC 等 Modbus 服務(wù)器上,數(shù)據(jù)被組織到四個(gè)表或數(shù)據(jù)庫中。有兩個(gè)數(shù)據(jù)庫用于存儲(chǔ)離散的開/關(guān)值或線圈。這些數(shù)據(jù)庫分別存儲(chǔ)離散輸出線圈和離散輸入觸點(diǎn)。然后,有兩個(gè)存儲(chǔ)數(shù)值的數(shù)據(jù)庫或分別存儲(chǔ)模擬輸入寄存器和模擬輸出保持寄存器的寄存器。

每個(gè)數(shù)據(jù)庫可以存儲(chǔ) 9999 個(gè)值。例如,離散輸出線圈和離散輸入觸點(diǎn)的數(shù)據(jù)庫可以存儲(chǔ) 9999 個(gè)位,范圍從 0000 到 270E。模擬輸入寄存器和模擬輸出保持寄存器的數(shù)據(jù)庫可以存儲(chǔ) 9999 個(gè)字,范圍從 0000 到 270E,每個(gè)字為 16 位長。

離散量輸出線圈和模擬量輸出保持寄存器的數(shù)據(jù)庫為讀寫型,而離散量輸入接點(diǎn)和模擬量輸入寄存器的數(shù)據(jù)庫為只讀型。

數(shù)據(jù)庫中的值通過位置名稱訪問。離散輸出線圈、離散輸入接點(diǎn)、模擬輸入寄存器、模擬輸出保持寄存器的數(shù)據(jù)庫位置分別為1~9999、10001~19999、30001~39999、40001~49999。下表總結(jié)了 Modbus 服務(wù)器上四個(gè)數(shù)據(jù)庫的結(jié)構(gòu)和性質(zhì)。

image.png


結(jié)論

Modbus 是一種廣泛使用的工業(yè)通信協(xié)議,通常與 PLC 一起使用。該協(xié)議具有三個(gè)版本——RTU、ASCII 和 Modbus。RTU 版本是開放標(biāo)準(zhǔn)且最快的,最常被制造商使用。對(duì)于較短的消息,RTU 幀的 Modbus 消息可以 100 毫秒的間隔更新。幾乎所有商業(yè) HMI、SCADA、OPC 服務(wù)器和數(shù)據(jù)采集軟件都支持 Modbus,因此可以輕松地將 Modbus 兼容設(shè)備集成到任何工業(yè)自動(dòng)化系統(tǒng)或樓宇管理系統(tǒng)中。


*博客內(nèi)容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀點(diǎn),如有侵權(quán)請(qǐng)聯(lián)系工作人員刪除。



關(guān)鍵詞: Modbus 原理

相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉