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