Modbus基礎知識
發(fā)表時間:2018-09-24
概述:
Modbus是領先的工業(yè)開放式控制協(xié)議。該幫助頁面將討論一些基本概念并糾正一些常見的誤解,但不提供協(xié)議本身的詳細描述。
Modbus的類型:
Modbus有幾種不同的類型,具體取決于運輸?shù)慕橘|(zhì)。
- Modbus RTU - 這是原始Modbus。它通過RS-232和RS-485鏈路使用。
- Modbus ASCII - 這與Modbus RTU類似,但數(shù)據(jù)以ASCII而不是原始二進制編碼。該版本主要用于無線電鏈路。
- Modbus / TCP - 此版本通過以太網(wǎng)使用。它類似于Modbus RTU,但使用內(nèi)置于以太網(wǎng)中的校驗和,而不是包括RTU校驗和。
- Modbus over Ethernet - 這是一些供應商使用的模糊術語,但不是官方認可的名稱。它通常用于指使用特殊硬件在兩點之間通過以太網(wǎng)隧道傳輸Modbus RTU。這不是 Modbus標準的一部分,格式取決于供應商。
- Modbus / UDP - 這與Modbus / TCP類似,但使用UDP以太網(wǎng)套接字而不是TCP套接字。這是由一些供應商提供的,但 不是 Modbus標準的一部分。
- Modbus + - 這是一個使用Modbus名稱的專有協(xié)議,但不遵循Modbus通信標準。這很少遇到。
MBLogic使用Modbus / TCP。
通訊
客戶/服務器或主/從:
與大多數(shù)通信協(xié)議一樣,Modbus使用客戶端/服務器類型協(xié)議。這有時也稱為主/從。“主”與“客戶”是同一個東西,而“奴隸”與“服務器”是同一個東西。主/從術語起源于工業(yè),而客戶/服務器術語起源于計算機行業(yè)。不同的術語是由于它們?nèi)绾伪粦玫臍v史差異而產(chǎn)生的,但計算機行業(yè)術語在很大程度上取代了工業(yè)術語,因為工業(yè)界采用了更多現(xiàn)成的計算機技術。通常,客戶端是PLC或控制器,而服務器是現(xiàn)場設備,例如閥組或傳感器塊。
“客戶端”向“服務器” 發(fā)送請求。服務器對該請求進行解碼,并發(fā)送回一個響應與請求的數(shù)據(jù)或確認。這與其他常用協(xié)議的工作原理相同。
例如,當您使用Web瀏覽器在Internet上查看網(wǎng)頁時,Web瀏覽器會向Web服務器發(fā)送“頁面請求”。Web服務器對請求進行解碼,并將網(wǎng)頁作為“響應”發(fā)回。您的電子郵件客戶端程序以相同的方式從郵件服務器提取您的電子郵件。
單位ID:
Modbus消息包括所謂的單元ID。單元ID是0到255之間的數(shù)字,用于標識RS-232或RS-485網(wǎng)絡中的服務器(或從站)地址。為每個服務器(從站)分配一個“從站ID”號,并在單元ID字段中偵聽包含該號碼的消息。
Modbus / TCP在其消息中也有單元ID,但以太網(wǎng)TCP / IP地址用于決定實際傳送消息的位置。許多或大多數(shù)服務器設備將忽略設備ID。但是,有些人會使用單元ID來決定是否將消息轉(zhuǎn)發(fā)出內(nèi)置串行端口。此消息轉(zhuǎn)發(fā)允許較舊的RS-485設備用于較新的以太網(wǎng)網(wǎng)絡。但是,只有少數(shù)設備才支持此功能。
消息ID:
當Modbus消息發(fā)送請求時,它包括消息ID 號。這是0到65,535之間的數(shù)字。對于每個請求,此數(shù)字通常由客戶端遞增(并且當它溢出時允許再次翻轉(zhuǎn)到0)。此消息ID由服務器回顯。客戶端可以使用此消息ID號來確定是否有任何消息在傳輸中丟失或延遲。
串口通訊參數(shù):
當通過RS-232或RS-585網(wǎng)絡使用時,必須為所有設備正確設置通常的串行通信參數(shù),如波特率,奇偶校驗,停止位等。這里不討論這些參數(shù)的設定。請參閱供應商文檔以獲取詳細信
以太網(wǎng)參數(shù):
通過以太網(wǎng)使用時,Modbus / TCP不需要設置波特率或其他類似參數(shù)。但是,它確實需要使用正確的 IP地址和端口號。
“IP地址”是發(fā)送消息的設備的網(wǎng)絡地址。網(wǎng)絡上的每個設備都必須具有唯一的IP地址。可能的IP地址數(shù)量非常大(數(shù)十億個地址)。
除IP地址外,還需要“端口號”。以太網(wǎng)“端口號”不是指物理連接器。端口號是在設備中的操作系統(tǒng)或固件使用的以太網(wǎng)報頭中發(fā)送的號碼,用于確定應將消息發(fā)送到哪個程序。這允許多個程序共享同一個以太網(wǎng)適配器而不會發(fā)生沖突。當客戶端發(fā)送消息時,它發(fā)送它指定一個特定的端口號。當服務器收到消息時,操作系統(tǒng)或固件將查看端口號并將消息路由到正確的程序。
當服務器程序啟動時,它將“綁定到端口”。這只是意味著它會要求為操作系統(tǒng)分配一個特定的端口號。任何時候只有一個服務器可以綁定到同一個端口號。如果端口號已被其他程序使用,則不允許新服務器程序使用它,并且將遇到錯誤。當服務器程序關閉時,它釋放了端口的使用。然后,在允許再次使用該端口號之前,操作系統(tǒng)將等待一定的超時時間(標準為70秒)。
Modbus / TCP的“標準”端口號是端口502.就協(xié)議本身而言,它使用的端口號是完全透明的。Modbus協(xié)議消息本身不發(fā)送端口號。但是,端口502按慣例被識別為要使用的標準端口號,因此大多數(shù)現(xiàn)場設備將在端口502上進行偵聽。但是,可以在備用端口號上運行Modbus / TCP,前提是所有參與通信可以配置為使用備用端口。
Modbus數(shù)據(jù)表示:
數(shù)據(jù)表
Modbus使用數(shù)據(jù)表的概念來引用數(shù)據(jù)。使用PLC的任何人都應該熟悉數(shù)據(jù)表。數(shù)據(jù)表是用于存儲數(shù)據(jù)的數(shù)組或內(nèi)存塊。使用數(shù)據(jù)表地址引用數(shù)據(jù)。Modbus數(shù)據(jù)表地址有四種類型。
- 離散輸入 - 這些是只讀布爾值。它們通常用于表示傳感器輸入和其他布爾值,這些布爾值是由用戶讀取但不寫入的。
- 線圈 - 這些是讀寫布爾值。它們通常用于表示輸出(例如閥電磁閥)或內(nèi)部位,它們都由用戶讀取和寫入。
- 輸入寄存器 - 這些是只讀16位整數(shù)。它們通常用于表示模擬輸入值和其他整數(shù)值,這些值由用戶讀取但不寫入。
- 保持寄存器 - 這些是讀寫16位整數(shù)。它們通常用于表示模擬輸出或內(nèi)部數(shù)字,它們由用戶讀取和寫入。
除了布爾和整數(shù)的本機數(shù)據(jù)類型之外,還可以通過在多個寄存器上分割數(shù)據(jù)來在Modbus數(shù)據(jù)表中存儲大整數(shù),浮點數(shù)和字符串。但是,Modbus不提供任何直接支持,因此用戶負責將值拆分并將它們存儲在不同的位置。
數(shù)據(jù)表地址
Modbus數(shù)據(jù)表地址只是整數(shù)。每種地址類型(離散輸入,線圈,輸入寄存器,保持寄存器)都有自己編號的地址集。例如,離散輸入42和線圈42是兩個單獨的地址。
Modbus區(qū)分協(xié)議地址和 數(shù)據(jù)模型地址。協(xié)議中使用的地址編號為0到65,535。但是,供應商文檔的編號可能為1到65,536。本文檔將引用協(xié)議地址(即第一個地址為0)。
雖然每種類型的地址可能有65,536個,但在特定設備(傳感器塊,閥組,PLC等)中實際實現(xiàn)的地址數(shù)量通常要少得多。每個設備設計人員負責決定對其應用程序有意義的內(nèi)容。然后,他們通常會為其設備提供“存儲器映射”或地址列表,列出實施的地址以及每個地址的功能。
也可以“覆蓋”地址類型。也就是說,可以設計一種設備,使得幾種不同的地址類型都指向相同的物理存儲器位置。例如,可以使保持寄存器10和輸入寄存器10都是相同的存儲位置。在這種情況下,如果您要寫入保持寄存器10,該值也將出現(xiàn)在輸入寄存器10中。這同樣適用于線圈和離散輸入。
以同樣的方式,可以在寄存器中包裝線圈和離散輸入。例如,線圈0至15可以被包裝在保持寄存器0中,線圈16至31被包裝在保持寄存器1中,等等。這將允許多個線圈被讀?。ɑ?qū)懭耄┳鳛樽帧?/font>
盡管可以疊加數(shù)據(jù)類型并將線圈封裝到寄存器中,但實際上并不常見。
關于Modbus地址的一些常見誤解
根據(jù)Modbus標準,地址只是從0到65,535的整數(shù),不同的地址范圍被稱為線圈,保持寄存器等。但是,一些供應商將使用數(shù)字前綴來記錄其硬件,這些前綴實際上不是Modbus地址的一部分。 。這源于一些使用Modbus通信協(xié)議的PLC模型,并且在其內(nèi)部數(shù)據(jù)表中也使用了數(shù)字前綴。這類似于使用“I”,“Q”,“V”等作為IEC類型PLC中的地址前綴。
但是,重要的是要記住這些數(shù)字前綴是文檔方法,并不是 Modbus協(xié)議本身作為消息的一部分發(fā)送的部分。文檔方法的不同不會影響協(xié)議本身的兼容性。
這些前綴是在Modbus標準中的任何地方提到的,但以下顯示了它們?nèi)绾卧诨谶@個較舊的約定的文檔中使用:
- 0xxxx - 線圈。
- 1xxxx - 離散輸入。
- 3xxxx - 輸入寄存器。
- 4xxxx - 保持寄存器。
請注意,沒有2xxxx地址前綴。
除了數(shù)字前綴之外,一些文檔將引用協(xié)議地址(地址從0開始),而其他文檔將引用數(shù)據(jù)模型地址(地址從1開始)。也就是說,第一個保持寄存器可以是0或1(或40000對40001使用前綴)。但是,這與作為Modbus消息通過線路發(fā)送的內(nèi)容無關。對于Modbus協(xié)議消息,最低地址始終為“0”,而不是“1”。
本文檔在使用Modbus協(xié)議尋址時使用標準Modbus術語和地址,沒有前綴或偏移。但是,如果您正在閱讀傳感器塊,閥門和其他設備的文檔,則必須記住某些供應商可能以不同方式記錄其硬件。
Modbus命令或“功能”:
功能:
Modbus命令稱為功能。函數(shù)只是讀取或?qū)懭霐?shù)據(jù)表地址的命令。功能是諸如1,2,3,4等的數(shù)字。例如,功能“1”將讀取一個或多個線圈。功能“15”將寫入一個或多個線圈。所有功能代碼都被定義為Modbus標準的一部分,但實際在任何特定設備中實現(xiàn)的功能取決于設備設計者。例如,閥組可以僅實現(xiàn)用于寫入線圈的功能,因為這是該設備所必需的。
最常見的功能如下所示。Modbus標準中定義了許多其他功能,但這些功能是最常遇到的功能。
- 1 - 讀取多個線圈。
- 2 - 讀取多個離散輸入。
- 3 - 讀取多個保持寄存器。
- 4 - 讀取多個輸入寄存器。
- 5 - 寫單線圈。
- 6 - 寫單保持寄存器。
- 15 - 寫多個線圈。
- 16 - 寫入多個保持寄存器。
數(shù)量:
讀取或?qū)懭攵鄠€地址的Modbus功能也需要數(shù)量參數(shù)。“quantity”參數(shù)指定要讀取或?qū)懭氲倪B續(xù)地址的數(shù)量。
一次可以讀取或?qū)懭氲淖畲蟮刂窋?shù):
modbus協(xié)議指定一次可以讀取或?qū)懭氲淖畲蟮刂窋?shù)。這將在單個命令中必須傳輸?shù)臄?shù)據(jù)量限制為不超過255個字節(jié)。對于讀取命令,限制是2000個線圈或離散輸入或125個寄存器。對于寫命令,限制是1968個線圈或123個寄存器。
Modbus錯誤:
Modbus故障:
當服務器收到Modbus消息時,將對其進行分析以查看所有參數(shù)是否正確。如果一切正常,服務器將發(fā)送響應。此響應可能包含數(shù)據(jù),也可能只是確認收到了消息。
但是,如果有任何錯誤,服務器可能會執(zhí)行以下兩種操作之一。如果消息根本無法解碼(例如,存在錯誤的校驗和),則簡單地丟棄該消息。如果消息可以被解碼但是一個或多個參數(shù)不正確(例如,嘗試讀取不存在的地址),則服務器將發(fā)送包含故障代碼的響應。故障代碼只是請求中添加了128的功能代碼。
例如,如果客戶端發(fā)送包含錯誤的功能3(讀取保持寄存器)的請求,則服務器將以131(3 + 128 = 131)的故障代碼進行響應。
Modbus例外:
除了故障代碼之外,服務器還將返回一個異常代碼,該代碼提供有關錯誤的更多詳細信息。為每個函數(shù)單獨定義異常代碼,但對于大多數(shù)常見函數(shù),以下內(nèi)容將適用:
- 1 =不支持所請求的功能代碼(命令)。
- 2 =地址不正確(不存在)。對于在多個地址上運行的功能,此檢查包括受請求影響的所有地址。
- 3 =地址數(shù)量不正確。對于所請求的功能,數(shù)量參數(shù)太大(或為零)。
- 4 =服務器中發(fā)生了一些未指定的錯誤,導致請求無法執(zhí)行。

