1. 程式人生 > >Modbus協議(翻自wiki)

Modbus協議(翻自wiki)

文章目錄

原文

Modbus

譯文

Modbus


來自維基百科,自由的百科全書

Modbus 是一種序列通訊協議,最初由Modicon(現為施耐德電氣)於 1979 年出版,用於其可程式設計邏輯控制器( PLC )。 Modbus 已成為約定俗成的標準通訊協議,現在已成為連線工業電子裝置的常用方法。 1 在工業環境中使用 Modbus 的主要原因是:

  • 在考慮工業應用的情況下開發,
  • 公開發布,免版稅,
  • 易於部署和維護,
  • 允許供應商無限制移動原始位或字。

Modbus 支援連線到同一網路的許多裝置之間的通訊,例如,測量溫度和溼度的系統,並將結果傳送給計算機。 Modbus 通常用於將監控計算機與遠端終端單元( RTU )連線在監控和資料採集( SCADA )系統中。 許多資料型別都是從其在驅動繼電器中的使用命名的:單位元物理輸出稱為線圈,單位元物理輸入稱為離散輸入或接觸。

自 2004 年 4 月施耐德電氣將權利轉讓給該組織以來,Modbus 協議的開發和更新已由 Modbus 組織 2 管理。3 Modbus 組織是 Modbus 相容裝置的使用者和供應商協會,主張繼續使用該技術。4

Modbus物件型別


以下是 Modbus 從站裝置向 Modbus 主站裝置提供的物件型別表

物件型別 許可權 大小
線圈 讀寫 1 bit
離散輸入 只讀 1 bit
輸入暫存器 只讀 16 bits
保持暫存器 讀寫 16 bits

協議版本


對於串列埠以及支援 Internet 協議套件的乙太網和其他協議,存在 Modbus 協議的版本。 Modbus 協議有很多種變體:

  • Modbus RTU - 用於序列通訊,並使用緊湊的二進位制資料表示協議通訊。 RTU 格式遵循命令/資料,迴圈冗餘校驗和校驗和作為錯誤檢查機制,以確保資料的可靠性。 Modbus RTU 是 Modbus 最常用的實現方式。必須連續傳輸 Modbus RTU 訊息,而不會出現字元間的猶豫。 Modbus 訊息由空閒(靜默)時段構成(分離)。
  • Modbus ASCII - 用於序列通訊,並使用 ASCII 字元進行協議通訊。 ASCII 格式使用縱向冗餘校驗校驗和。 Modbus ASCII 訊息由前導冒號(“:”)和尾隨換行符(CR / LF)構成。
  • Modbus TCP / IP或Modbus TCP - 這是一種 Modbus 變體,用於通過 TCP / IP 網路進行通訊,通過埠 502 連線。5它不需要校驗和計算,因為較低層已經提供校驗和保護。
  • TCP / IP上的Modbus或TCP上的Modbus或Modbus RTU / IP - 這是一種 Modbus 變體,與 Modbus TCP 的不同之處在於,與 Modbus RTU 一樣,有效載荷中包含校驗和。
  • 基於UDP的Modbus - 一些人嘗試在IP網路上使用 Modbus over UDP ,這消除了 TCP 所需的開銷。6
  • Modbus Plus(Modbus +,MB +或MBP) - Modbus Plus 是施耐德電氣專有的,與其他變體不同,它支援多個主站之間的點對點通訊。7它需要一個專用的協處理器來處理類似 HDLC 的快速令牌輪換。它使用 1 Mbit / s 的雙絞線,並在每個節點處包含變壓器隔離,這使其轉換/邊沿觸發而不是電壓/電平觸發。將 Modbus Plus 連線到計算機(通常是用於 ISA , PCI 或 PCMCIA 匯流排的卡)需要特殊硬體。
  • Pemex Modbus - 這是標準 Modbus 的擴充套件,支援歷史和流量資料。它專為 Pemex 石油和天然氣公司設計,用於過程控制,從未得到廣泛採用。
  • Enron Modbus - 這是 Enron 公司開發的標準 Modbus 的另一個擴充套件,支援 32 位整數和浮點變數以及歷史和流量資料。使用標準地址對映資料型別。8歷史資料符合美國石油協會( API )行業標準,用於儲存資料。[需要引證]

對於前4種協議變數,資料模型和函式呼叫是相同的; 只有封裝是不同的。 但是,變體不可互操作,幀格式也不可互操作。

通訊和裝置


準備使用 Modbus 進行通訊的每個裝置都有一個唯一的地址。在序列和 MB + 網路中,只有指定為主節點的節點才能發起命令。在乙太網上,任何裝置都可以傳送 Modbus 命令,儘管通常只有一個主裝置會這樣做。 Modbus 命令包含裝置的 Modbus 地址(1到247)。只有預期的裝置才會對該命令起作用,即使其他裝置可能會收到它(例外情況是傳送到節點 0 的特定可廣播命令,它們被作用但未被確認)。所有 Modbus 命令都包含校驗和資訊,以允許接收方檢測傳輸錯誤。基本 Modbus 命令可以指示 RTU 更改其中一個暫存器中的值,控制或讀取 I / O 埠,並命令裝置發回其暫存器中包含的一個或多個值。

有許多調變解調器和閘道器支援 Modbus ,因為它是一個非常簡單且經常被複制的協議。其中一些是專門為此協議設計的。不同的實現使用有線,無線通訊,例如在 ISM 頻帶中,甚至是短訊息服務( SMS )或通用分組無線服務( GPRS )。無線網路的一種常見設計利用網狀網路。設計人員必須克服的典型問題包括高延遲和時序問題。

幀格式


Modbus幀由應用資料單元(ADU)組成,它包含協議資料單元(PDU):9

  • ADU =地址+ PDU +錯誤檢查,
  • PDU =功能程式碼+資料。

所有Modbus變體都選擇以下幀格式之一。1

Modbus RTU 幀格式(主要用於 EIA-485 等 8 位非同步線路)

名稱 長度(bits) 功能
開始 28 至少3又1/2 個字元的沉默時間(標記條件)
地址 8 站地址
功能 8 功能碼; 例如,讀取線圈/保持暫存器
資料 n * 8 資料+長度將根據訊息型別填充
CRC 16 迴圈冗餘校驗
停止 28 幀之間至少有3又1/2個字元的靜音時間

關於CRC的說明:

  • 多項式:x16 + x15 + x2+ 1(CRC-16-ANSI 也稱為 CRC-16-IBM ,正常十六進位制代數多項式為 8005 ,反轉 A001 )。
    初始值:65,535。
  • 以十六進位制表示的幀示例:01 04 02 FF FF B8 80(從01到FF的 CRC-16-ANSI 計算給出 80B8 ,它首先發送最低有效位元組)。

Modbus ASCII 幀格式(主要用於 7 位或 8 位非同步序列線)

名稱 長度(bytes) 功能
開始 1 以冒號開頭:(ASCII十六進位制值為3A)
地址 2 站地址
功能 2 功能碼; 例如,讀取線圈/保持暫存器
資料 n * 2 資料+長度將根據訊息型別填充
LRC 2 校驗和(縱向冗餘校驗)
停止 2 回車 - 換行(CR / LF)對(ASCII值為0D,0A)

地址,函式,資料和LRC都是表示 8 位值(0-255)的大寫十六進位制可讀字元對。 例如,122(7×16 + 10)將表示為 7A 。

LRC計算為 8 位值之和,取反(二進位制補碼)並編碼為 8 位值。 示例:如果地址,函式和資料編碼為 247,3,19,137,0 和 10 ,則它們的和為 416 。轉化為8位的二進位制補碼(-416)為 96(例如256×2 - 416), 它將以十六進位制表示為 60 。 因此,以下框架:: F7031389000A60 <CR> <LF>。

Modbus TCP幀格式(主要用於乙太網)

名稱 長度(bytes) 功能
傳輸識別符號 2 用於伺服器和客戶端的訊息之間的同步
協議識別符號 2 0表示 Modbus / TCP協議
長度欄位 2 此幀中的剩餘位元組數
單元識別符號 1 從站地址(如果不使用則為255)
功能碼 1 功能碼與其他變體一樣
資料 n 資料作為響應或命令

單元識別符號與 Modbus / TCP 裝置一起使用,這些裝置是幾個 Modbus 裝置的組合,例如, 在 Modbus / TCP 到 Modbus RTU 閘道器上。 在這種情況下,單元識別符號告知閘道器後面的裝置的從屬地址。 本機 Modbus / TCP 功能裝置通常忽略單元識別符號。

Modbus 資料幀中值的位元組順序是 big-endian(MSB,首先接收的值的最高有效位元組)。

支援的功能程式碼


各種讀,寫和其他操作分類如下。10 最原始的讀取和寫入以粗體顯示。 許多來源使用替代術語,例如 Force Single Coil ,其中標準使用Write Single Coil11
Modbus 中的突出實體是:

  • 線圈:可讀寫,1位(關/開)
  • 離散輸入:可讀,1位(關/開)
  • 輸入暫存器:可讀,16位(0到65,535),基本上是測量和狀態
  • 保持暫存器:可讀寫,16位(0到65,535),基本上是配置值

主要功能程式碼的請求和響應資料格式


請求和響應遵循上述幀格式。 本節詳細介紹了大多數使用過的功能程式碼的資料格式。

功能程式碼 1(讀取線圈)和功能程式碼 2(讀取離散輸入)

請求

  • 讀取的第一個線圈/離散輸入的地址( 16 位)
  • 讀取的線圈/離散輸入數量( 16 位)

正常響應

  • 要跟隨的線圈/離散輸入值的位元組數( 8 位)
  • 線圈/離散輸入值(每個位元組 8 個線圈/離散輸入)

每個線圈/離散輸入的值是二進位制的( 0 表示關閉,1 表示開啟)。 首先請求的線圈/離散輸入被儲存為作為答覆的第一位元組的最低有效位。
如果線圈/離散輸入的數量不是 8 的倍數,則最後一個位元組的最高有效位將填充零。
例如,如果請求 11 個線圈,則需要兩個位元組的值。 假設這些連續線圈的狀態為開,關,開,關,開,開,開,關,開,開,則響應將為十六進位制的 02 E5 06 。

由於應答訊息中返回的位元組數僅為 8 位寬,協議開銷為 5 位元組,因此最多可以同時讀取 2000(250 x 8)個離散輸入或線圈。

功能碼 5(強制/寫入單線圈)

請求

  • 線圈地址( 16 位)
  • 強制/寫入的值:0 表示關閉,65,280(FF00表示十六進位制)表示開啟

正常響應:與請求相同。

功能碼 15(強制/寫入多個線圈)

請求

  • 強制/寫入的第一個線圈的地址( 16 位)
  • 強制/寫入的線圈數( 16 位)
  • 要遵循的線圈值的位元組數( 8 位)
  • 線圈值(每個位元組 8 個線圈值)

每個線圈的值是二進位制的(0 表示關閉,1 表示開啟)。 首先請求的線圈被儲存為請求中的第一位元組的最低有效位。
如果線圈數不是 8 的倍數,則最後一個位元組的最高有效位應填充零。 請參閱功能程式碼 1 和 2 的示例。

正常響應

  • 第一個線圈的地址( 16 位)
  • 線圈數( 16 位)

功能程式碼 4(讀取輸入暫存器)和功能程式碼 3(讀取保持暫存器)

請求

  • 第一個讀取暫存器的地址( 16 位)
  • 要讀取的暫存器數( 16 位)

正常響應
要遵循的暫存器值的位元組數( 8 位)
暫存器值(每個暫存器 16 位)
由於暫存器值的位元組數為 8 位寬,因此一次只能讀取 125 個暫存器。12

功能碼 6(預置/寫入單個保持暫存器)

請求

  • 保持暫存器預置/寫入的地址( 16 位)
  • 保持暫存器的新值( 16 位)

正常響應:與請求相同。

功能碼 16(預置/寫入多個保持暫存器)

請求

  • 第一個保持暫存器的地址預置/寫入( 16 位)
  • 預置/寫入的保持暫存器數( 16 位)
  • 要遵循的暫存器值的位元組數( 8 位)
  • 保持暫存器的新值(每個暫存器 16 位)

由於暫存器值為 2 位元組寬,並且只能傳送 127 個位元組的值,因此一次只能預置/寫入 63 個保持暫存器。

正常響應

  • 第一個預置/寫入保持暫存器的地址( 16 位)
  • 預置/寫入保持暫存器的數量( 16 位)

異常響應:

對於正常響應,從站重複功能程式碼。 如果從站想報告錯誤,它將回復所請求的功能程式碼加上 128(十六進位制 0x80 )( 3 變為 131 =十六進位制 0x83 ),並且只包含一個位元組的資料,稱為異常程式碼。

主要的Modbus異常程式碼

異常程式碼 長度(bytes) 功能
1 非法功能 從裝置無法識別或允許在查詢中接收的功能程式碼
2 非法資料地址 從裝置中不允許或不存在部分或全部所需實體的資料地址
3 非法資料值 從裝置不接受該資料
4 從裝置故障 從設備嘗試執行請求的操作時發生不可恢復的錯誤)
5 確認 從裝置已接受請求並正在處理它,但需要很長的時間。 返回此響應以防止在主裝置中發生超時錯誤。 主裝置可以接下來發出一個 Poll Program Complete 訊息來確定處理是否完成
6 從裝置忙 從裝置參與處理長時間命令。 主裝置應該稍後再試)
7 否認 從裝置無法執行程式設計功能。 主裝置應從從裝置請求診斷或錯誤資訊
8 記憶體奇偶校驗錯誤 從裝置檢測到記憶體中的奇偶校驗錯誤。 主裝置可以重試請求,但可能需要在從裝置上提供服務
10 閘道器路徑不可用 專門用於 Modbus 閘道器。 表示配置錯誤的閘道器
                    11         閘道器目標裝置無法響應 專門用於 Modbus 閘道器。 從站無法響應時傳送

線圈,離散輸入,輸入暫存器,保持暫存器編號和地址


一些約定控制如何引用對 Modbus 實體(線圈,離散輸入,輸入暫存器,保持暫存器)的訪問。

在實體編號和實體地址之間進行區分非常重要:

  • 實體編號在其描述表中組合實體型別和實體位置。
  • 實體地址是起始地址,是 Modbus 幀資料部分中的 16 位值。 因此它的範圍從 0 到 65,535 。

在傳統標準中,這些實體的數字以數字開頭,後跟 1-9,999 範圍內的 4 位數字:

  • 線圈編號從 0 開始,跨度從 00001 到 09999 ,
  • 離散輸入數字從 1 開始,跨度從 10001 到 19999 ,
  • 輸入暫存器編號從 3 開始,跨度從 30001 到 39999 ,
  • 保持暫存器號從 4 開始,跨度從 40001 到 49999 。

這轉換為資料幀中 0 到 9,998 之間的地址。 例如,為了從數字 40001 開始讀取保持暫存器,資料幀中的相應地址將為 0 ,功能程式碼為 3(如上所示)。 對於保持從編號 40100 開始的暫存器,地址將為 99 等等。

這將每個實體的地址數限制為 9,999 。 事實上的引用將其擴充套件到最大值 65,536 。13 它只是在前一個列表中新增一個數字:

  • 線圈編號從 000001 到 065536 ,
  • 離散輸入數字從 100001 到 165536 ,
  • 輸入暫存器編號範圍從 300001 到 365536 ,
  • 保持暫存器號碼範圍從 400001 到 465536 。

使用擴充套件引用時,所有數字引用必須正好有 6 位數。 這避免了線圈和其他實體之間的混淆。 例如,要知道保持暫存器#40001 和線圈 #40001 之間的區別,如果線圈 #40001 是目標,則它必須顯示為 #040001 。

JBUS對映
與 Modbus 密切相關的另一個事實協議出現在它之後,由 PLC 品牌 April Automates 定義,這是法國公司 Renault Automation 和 Merlin Gerin et Cie 於 1985 年合作努力的成果: JBUS 。 當時 Modbus 和 JBUS 之間的差異(實體數量,從站數量)現在無關緊要,因為該協議幾乎與 AEG 施耐德自動化於 1994 年購買的四月 PLC 系列一起消失,然後使它們過時。 然而,JBUS 的名稱在某種程度上存活了下來。

JBUS支援功能程式碼 1,2,3,4,5,6,15 和 16 ,因此支援上述所有實體。 但是 JBUS 的編號不同:

  • 數字和地址重合:實體 #x 在資料幀中具有地址 x。
  • 因此,實體編號不包括實體型別。 例如,在 Modbus 中儲存暫存器 #40010 將保持暫存器# 9 ,位於 JBUS 的地址 9 。
  • 不支援數字 0(因此地址 0)。 從裝置不應該在此數字和地址處實現任何實際資料,並且它可以返回空值或在請求時丟擲錯誤。

實現


幾乎所有的實現都有官方標準的變化。 不同品種可能無法在不同供應商的裝置之間正確溝通。 一些最常見的變體是:

資料型別

  • IEEE浮點數-
  • 32 位整數
  • 8 位資料
  • 混合資料型別
  • 整數中的位欄位
  • 用於將資料更改為整數的乘數。 10,100,1000,256 …

協議擴充套件

  • 16 位從機地址
  • 32 位資料大小( 1 個地址=返回的 32 位資料)
  • 換字資料

限制


  • 由於Modbus是在 20 世紀 70 年代後期設計的,用於與可程式設計邏輯控制器通訊,因此資料型別的數量僅限於 PLC 當時所理解的資料型別。不支援大型二進位制物件。
  • 節點沒有標準方法來查詢資料物件的描述,例如,確定暫存器值是否表示 30 到 175 度之間的溫度。
  • 由於 Modbus 是主/從協議,因此現場裝置無法“異常報告”(乙太網 TCP / IP 除外,稱為 open-mbus ) - 主節點必須定期輪詢每個現場裝置並查詢更改在資料中。這在頻寬可能昂貴的應用中消耗頻寬和網路時間,例如通過低位元率無線電鏈路。
  • Modbus 僅限於在一條資料鏈路上定址 254 個裝置,這限制了可能連線到主站的現場裝置的數量(再次,乙太網 TCP / IP 是一個例外)。
  • Modbus 傳輸必須是連續的,這將遠端通訊裝置的型別限制為可以緩衝資料以避免傳輸中的間隙的裝置。
  • Modbus協議本身不能防止未經授權的命令或資料攔截。14

貿易集團


Modbus Organization,Inc。是一個促進和發展 Modbus 協議的行業協會。2

Modbus Plus


儘管有這個名字,Modbus Plus 15並不是 Modbus 的變種。 它是一種不同的協議,涉及令牌傳遞。

它是施耐德電氣的專有規格,雖然它未發表而不是專利。 它通常使用僅適用於 Schneider 合作伙伴的定製晶片組實現。

參考


  1. Drury, Bill (2009). Control Techniques Drives and Controls Handbook (PDF) (2nd ed.).Institution of Engineering and Technology . pp. 508–. (Subscription required (help)). ↩︎ ↩︎

  2. “Modbus home page” Modbus. Modbus Organization, Inc. Retrieved 2 August 2013. ↩︎ ↩︎

  3. “Modbus FAQ” Modbus. Modbus Organization, Inc. Retrieved 1 November 2012. ↩︎

  4. “About Modbus Organization”. Modbus. Modbus Organization, Inc. Retrieved 8 November 2012. ↩︎

  5. Modbus Messaging on TCP/IP Implementation Guide V1.0b (PDF), Modbus Organization, Inc., October 24, 2006, retrieved 2017-01-07 ↩︎

  6. “Java Modbus Library - About”. 2010. Retrieved 2017-02-07. ↩︎

  7. “What is the difference between Modbus and Modbus Plus?”. Schneider Electric. Retrieved 2017-02-07. ↩︎

  8. “Simply Modbus - About Enron Modbus”. Simply Modbus. Retrieved 2017-02-07. ↩︎

  9. “Modbus Messaging On TCP/IP Implementation Guide” (PDF). Modbus Organization. Modbus-IDA. ↩︎

  10. “Modbus Application Protocol V1.1b3”(PDF). Modbus. Modbus Organization, Inc. Retrieved 2 August 2013. ↩︎

  11. Clarke, Gordon; Reynders, Deon (2004). Practical Modern Scada Protocols: Dnp3, 60870.5 and Related Systems. Newnes. pp. 47–51. ISBN 0-7506-5799-5. ↩︎

  12. http://modbus.org/docs/PI_MBUS_300.pdf ↩︎

  13. “Modbus 101 – Introduction to Modbus”. Control Solutions, Inc. ↩︎

  14. Palmer; Shenoi, Sujeet, eds. (23–25 March 2009). Critical Infrastructure Protection III. Third IFIP WG 11. 10 International Conference. Hanover, New Hampshire: Springer. p. 87. ISBN 3-642-04797-1. ↩︎

  15. “Modbus Plus - Modbus Plus Network - Products overview - Schneider Electric United States”. Schneider-electric.com. Retrieved 2014-01-03. ↩︎