Modbus應(yīng)用程序協(xié)議規(guī)范V1.1b3
1.介紹
1.1本文件范圍
MODBUS是一種應(yīng)用層消息傳遞協(xié)議,位于OSI模型的第7級(jí),它在不同類型的總線或網(wǎng)絡(luò)上連接的設(shè)備之間提供客戶端/服務(wù)器通信。
MODBUS是一種請(qǐng)求/回復(fù)協(xié)議,并提供由功能碼指定的服務(wù)。MODBUS功能碼是MODBUS請(qǐng)求/回復(fù)pdu的元素。本文檔的目的是描述在MODBUS事務(wù)框架內(nèi)使用的功能碼。
目前,它使用:
- 以太網(wǎng)上的 TCP/IP。請(qǐng)參見(jiàn)MODBUS消息傳遞實(shí)現(xiàn)指南V1.0a。
- 在各種媒體上進(jìn)行的異步串行傳輸(電線:EIA/TIA-232-E、EIA-422、EIA/TIA-485-A;光纖、無(wú)線電等)。
- MODBUS+,一個(gè)高速令牌傳遞網(wǎng)絡(luò)。
2.縮寫
- ADU 應(yīng)用數(shù)據(jù)單元
- ADU 應(yīng)用數(shù)據(jù)單元控制
- HMI 人機(jī)接口
- IETF 互聯(lián)網(wǎng)工程任務(wù)組
- I/O 輸入/輸出
- IP 互聯(lián)網(wǎng)協(xié)議
- MAC 媒體訪問(wèn)控制
- MB MODBUS協(xié)議
- MBAP MODBUS應(yīng)用協(xié)議
- PDU 協(xié)議數(shù)據(jù)單元
- PLC 可編程邏輯控制
- TCP 傳輸控制協(xié)議
3.背景
MODBUS協(xié)議允許在所有類型的網(wǎng)絡(luò)架構(gòu)中進(jìn)行輕松的通信。
每種類型的設(shè)備(PLC、HMI、控制面板、驅(qū)動(dòng)程序、運(yùn)動(dòng)控制、I/O設(shè)備……)都可以使用MODBUS協(xié)議啟動(dòng)遠(yuǎn)程操作。
可以在串行線上和在以太網(wǎng)TCP/IP網(wǎng)絡(luò)上進(jìn)行相同的通信。網(wǎng)關(guān)允許使用MODBUS協(xié)議在幾種類型的總線或網(wǎng)絡(luò)之間進(jìn)行通信。
4. 一般說(shuō)明
4.1協(xié)議描述
MODBUS 協(xié)議定義了一個(gè)獨(dú)立于底層通信層的簡(jiǎn)單協(xié)議數(shù)據(jù)單元 (PDU)。 MODBUS 協(xié)議在特定總線或網(wǎng)絡(luò)上的映射可以在應(yīng)用數(shù)據(jù)單元(ADU)上引入一些附加字段。
MODBUS應(yīng)用程序數(shù)據(jù)單元由啟動(dòng)MODBUS事務(wù)的客戶端構(gòu)建。該函數(shù)向服務(wù)器指示要執(zhí)行什么類型的操作。MODBUS應(yīng)用程序協(xié)議建立了由客戶端發(fā)起的請(qǐng)求的格式。
MODBUS數(shù)據(jù)單元的功能碼字段以一個(gè)字節(jié)進(jìn)行編碼。有效代碼的范圍為1…255十進(jìn)制(保留的范圍為128-255,并用于異常響應(yīng))。當(dāng)消息從客戶端發(fā)送到服務(wù)器設(shè)備時(shí),功能碼字段會(huì)告訴服務(wù)器要執(zhí)行什么類型的操作。功能碼“0”無(wú)效。
子功能碼被添加到一些功能碼中,以定義多個(gè)操作。
從客戶端發(fā)送到服務(wù)器的消息的數(shù)據(jù)字段包含服務(wù)器用于執(zhí)行由功能碼定義的操作的附加信息。這可以包括離散地址和寄存器地址、要處理的項(xiàng)目數(shù)量以及字段中實(shí)際數(shù)據(jù)字節(jié)的計(jì)數(shù)。
在某些類型的請(qǐng)求中,數(shù)據(jù)字段可能不存在(零長(zhǎng)度),在這種情況下,服務(wù)器不需要任何附加信息。該功能碼單獨(dú)指定了該操作。
如果在正確接收的MODBUS ADU中所請(qǐng)求的MODBUS功能沒(méi)有發(fā)生錯(cuò)誤,則從服務(wù)器到客戶端的響應(yīng)的數(shù)據(jù)字段包含所請(qǐng)求的數(shù)據(jù)。如果發(fā)生與所請(qǐng)求的MODBUS功能相關(guān)的錯(cuò)誤,則該字段將包含一個(gè)異常代碼,服務(wù)器應(yīng)用程序可以使用該異常代碼來(lái)確定下一個(gè)要采取的操作。
例如,客戶端可以讀取一組離散輸出或輸入的開(kāi)/關(guān)狀態(tài),也可以讀取/寫一組寄存器的數(shù)據(jù)內(nèi)容。
當(dāng)服務(wù)器響應(yīng)客戶端時(shí),它將使用功能碼字段來(lái)指示正常(無(wú)錯(cuò)誤)響應(yīng)或發(fā)生了某種錯(cuò)誤(稱為異常響應(yīng))。對(duì)于正常響應(yīng),服務(wù)器簡(jiǎn)單地向請(qǐng)求回顯原始功能碼。
對(duì)于異常響應(yīng),服務(wù)器返回與請(qǐng)求PDU中的原始功能碼相同的代碼,其最高有效位設(shè)置為邏輯1。
MODBUS PDU 的大小受限于從串行線路網(wǎng)絡(luò)上的第一個(gè) MODBUS 實(shí)現(xiàn)繼承的大小約束(最大 RS485 ADU = 256 字節(jié))。
因此:
MODBUS用于串行線通信的PDU=256-服務(wù)器地址(1字節(jié))-CRC(2字節(jié))=253字節(jié)。
最后:
RS232/RS485 ADU=253字節(jié)+Server地址(1字節(jié))+CRC(2字節(jié))=256字節(jié)。
TCPMODBUS ADU=253字節(jié)+MBAP(7字節(jié))=260字節(jié)。
MODBUS協(xié)議定義了三個(gè)PDU。它們分別是:
- MODBUS請(qǐng)求PDU, mb_req_pdu
- MODBUS響應(yīng)PDU,mb_rsp_pdu
- MODBUS異常響應(yīng)PDU,mb_excep_rsp_pdu
對(duì)mb_req_pdu的定義為:
mb_req_pdu = {function_code, request_data}
function_code = [1字節(jié)]MODBUS功能碼
request_data = [n字節(jié)]這個(gè)字段依賴于功能碼,通常包含變量引用、變量計(jì)數(shù)、數(shù)據(jù)偏移量、子函數(shù)代碼。
對(duì)mb_rsp_pdu的定義為:
mb_rsp_pdu={function_code,response_data}
function_code=[1字節(jié)]MODBUS功能碼
response_data=[n字節(jié)]這個(gè)字段依賴于功能碼,通常包含變量引用、變量計(jì)數(shù)、數(shù)據(jù)偏移量、子函數(shù)代碼。
對(duì)mb_excep_rsp_pdu的定義為:
mb_excep_rsp_pdu={exception-function_code,request_data}
exception-function_code=[1字節(jié)]MODBUS功能碼+0x80
exception_code=[1字節(jié)]MODBUS異常碼定義在表“MODBUS異常代碼”(參見(jiàn)第7節(jié))。
4.2數(shù)據(jù)編碼
MODBUS對(duì)地址和數(shù)據(jù)項(xiàng)使用“大端”表示。這意味著,當(dāng)傳輸?shù)臄?shù)值大于一個(gè)字節(jié)時(shí),將首先發(fā)送最高的字節(jié)。例如
4.3MODBUS數(shù)據(jù)模型
MODBUS的數(shù)據(jù)模型基于一系列具有顯著特征的表。
這四個(gè)主要表包括:
在輸入和輸出之間的區(qū)別,以及在可位尋址和可文字尋址數(shù)據(jù)項(xiàng)之間的區(qū)別,并不意味著任何程序行為。如果這是對(duì)相關(guān)目標(biāo)機(jī)器最自然的解釋,那么認(rèn)為所有四個(gè)表相互疊加是完全可以接受的,而且也是非常常見(jiàn)的。
對(duì)于每個(gè)主表,該協(xié)議允許單獨(dú)選擇65536個(gè)數(shù)據(jù)項(xiàng),并且這些項(xiàng)的讀取或?qū)懖僮鞅辉O(shè)計(jì)為跨越多個(gè)連續(xù)的數(shù)據(jù)項(xiàng),直到依賴于事務(wù)函數(shù)代碼的數(shù)據(jù)大小限制。
很明顯,所有通過(guò)MODBUS(位、寄存器)處理的數(shù)據(jù)都必須位于設(shè)備應(yīng)用程序內(nèi)存中。但是內(nèi)存中的物理地址不應(yīng)該與數(shù)據(jù)引用相混淆。唯一的要求是將數(shù)據(jù)引用與物理地址鏈接起來(lái)。
在MODBUS函數(shù)中使用的MODBUS邏輯引用數(shù)是從零開(kāi)始的無(wú)符號(hào)整數(shù)索引。
- MODBUS模型的實(shí)現(xiàn)例子
下面的示例顯示了組織設(shè)備中數(shù)據(jù)的兩種方法。 可能存在不同的組織方法,但本文檔并未對(duì)所有組織方法進(jìn)行描述。 每個(gè)設(shè)備都可以根據(jù)其應(yīng)用程序擁有自己的數(shù)據(jù)組織。
示例1:具有4個(gè)獨(dú)立數(shù)據(jù)塊的設(shè)備
下面的示例顯示了具有數(shù)字和模擬、輸入和輸出的設(shè)備中的數(shù)據(jù)組織。每個(gè)塊都是獨(dú)立的,因?yàn)閬?lái)自不同塊的數(shù)據(jù)沒(méi)有相關(guān)性。因此,每個(gè)塊都可以使用不同的MODBUS函數(shù)進(jìn)行訪問(wèn)。
示例2:只有一個(gè)數(shù)據(jù)塊的設(shè)備
在本例中,該設(shè)備只有1個(gè)數(shù)據(jù)塊。相同的數(shù)據(jù)可以通過(guò)幾個(gè)MODBUS函數(shù)獲得,或通過(guò)16位訪問(wèn)或通過(guò)位訪問(wèn)。
4.4MODBUS地址模型
MODBUS應(yīng)用程序協(xié)議精確地定義了PDU尋址規(guī)則。在 MODBUS PDU 中,每個(gè)數(shù)據(jù)的尋址范圍為 0 到 65535。
它還清楚地定義了由 4 個(gè)塊組成的 MODBUS 數(shù)據(jù)模型,這些塊包括從 1 到 n 編號(hào)的幾個(gè)元素。
在MODBUS數(shù)據(jù)模型中,數(shù)據(jù)塊中的每個(gè)元素的編號(hào)都從1到n。然后,MODBUS數(shù)據(jù)模型必須綁定到設(shè)備應(yīng)用程序。
MODBUS 數(shù)據(jù)模型和設(shè)備應(yīng)用程序之間的預(yù)映射完全是供應(yīng)商設(shè)備特定的。
上圖顯示編號(hào)為 X 的 MODBUS 數(shù)據(jù)在 MODBUS PDU X-1 中尋址。
4.5定義 MODBUS 事務(wù)
以下?tīng)顟B(tài)圖描述了在服務(wù)器端對(duì)MODBUS事務(wù)的通用處理。
一旦服務(wù)器處理了請(qǐng)求,就會(huì)使用適當(dāng)?shù)腗ODBUS服務(wù)器事務(wù)構(gòu)建MODBUS響應(yīng)。
根據(jù)處理的結(jié)果,將構(gòu)建兩種類型的響應(yīng):
- 積極的 MODBUS 響應(yīng):
- 響應(yīng)功能碼=請(qǐng)求功能碼
- MODBUS異常響應(yīng):
- 其目的是向客戶提供有關(guān)在處理過(guò)程中檢測(cè)到的錯(cuò)誤的相關(guān)信息;
- 響應(yīng)功能碼=請(qǐng)求功能碼+0x80;
- 提供了一個(gè)異常代碼來(lái)指示錯(cuò)誤的原因。
5.功能碼類別
MODBUS功能代碼有三類。它們是:
- 公共功能代碼
- 定義良好的功能碼
- 保證獨(dú)一無(wú)二
- 已由http://MODBUS.org社區(qū)進(jìn)行驗(yàn)證
- 公開(kāi)記錄的
- 有可用的一致性測(cè)試
- 包括已定義的公共分配功能碼以及保留供將來(lái)使用的未分配功能碼
- 用戶定義的功能碼
- 用戶定義的功能碼有兩個(gè)范圍,即從65到72和從100到110的十進(jìn)制。
- 用戶可以選擇并實(shí)現(xiàn)該規(guī)范不支持的功能碼。
- 不能保證所選功能碼的使用將是唯一的。
- 如果用戶希望將該功能重新定位為公共功能碼,他必須啟動(dòng)一個(gè)RFC來(lái)將更改引入公共類別,并分配一個(gè)新的公共功能碼。
- MODBUS組織公司明確保留開(kāi)發(fā)擬議的RFC的權(quán)利。
- 保留功能碼
- 一些公司目前用于遺留產(chǎn)品的功能代碼,但不供公眾使用。
- 參考性說(shuō)明。
5.1公共功能碼定義
6.功能碼描述
6.1 讀取線圈01(0x01)
此功能碼用于讀取遠(yuǎn)程設(shè)備中從1到2000個(gè)線圈的連續(xù)狀態(tài)。請(qǐng)求PDU指定了起始地址,即所指定的第一個(gè)線圈的地址,以及線圈的數(shù)量。在PDU中,線圈從零開(kāi)始處理。因此,編號(hào)為1-16的線圈被命名為0-15。
響應(yīng)消息中的線圈被打包為數(shù)據(jù)字段的每一位一個(gè)線圈。 狀態(tài)表示為 1= ON 和 0= OFF。 第一個(gè)數(shù)據(jù)字節(jié)的 LSB 包含查詢中尋址的輸出。 其他線圈跟隨到該字節(jié)的高位端,并在后續(xù)字節(jié)中從低位到高位。
如果返回的輸出量不是8的倍數(shù),則最終數(shù)據(jù)字節(jié)中的其余位將用零填充(朝向字節(jié)的高階末端)。“字節(jié)計(jì)數(shù)”字段指定完整字節(jié)的數(shù)量。
*N = 輸出的數(shù)量/8,如果余數(shù)不為0,則N=N+1
以下是讀取離散輸出 20–38 的請(qǐng)求示例:
輸出27-20的狀態(tài)顯示為字節(jié)值CD十六進(jìn)制。輸出27是這個(gè)字節(jié)的MSB,輸出20是LSB。
按照慣例,一個(gè)字節(jié)中的位顯示為 MSB 在左邊,LSB 在右邊。 因此,第一個(gè)字節(jié)中的輸出從左到右是“27 到 20”。 下一個(gè)字節(jié)從左到右輸出“35 到 28”。 由于位是串行傳輸?shù)?,因此它們?LSB 流向 MSB: 20 。 . . 27, 28 。 . . 35,以此類推。
在最后一個(gè)數(shù)據(jù)字節(jié)中,輸出 38-36 的狀態(tài)顯示為字節(jié)值 05 十六進(jìn)制。輸出 38 位于左起第六位位置,輸出 36 是該字節(jié)的 LSB。 剩下的五個(gè)高位用零填充。
6.2 讀取離散輸入 02(0x02)
此功能代碼用于讀取遠(yuǎn)程設(shè)備中離散輸入的1到2000個(gè)連續(xù)狀態(tài)。請(qǐng)求PDU指定了起始地址,即指定的第一個(gè)輸入的地址以及輸入的數(shù)量。在PDU中,離散輸入從零開(kāi)始被尋址。因此,編號(hào)為1-16的離散輸入被處理為0-15。
響應(yīng)消息中的離散輸入被打包為數(shù)據(jù)字段的每一位一個(gè)輸入。 狀態(tài)表示為 1=ON; 0 = 關(guān)閉。 第一個(gè)數(shù)據(jù)字節(jié)的 LSB 包含查詢中尋址的輸入。 其他輸入跟隨該字節(jié)的高位端,并在后續(xù)字節(jié)中從低位到高位。
如果返回的輸入數(shù)量不是 8 的倍數(shù),則最終數(shù)據(jù)字節(jié)中的剩余位將用零填充(朝向字節(jié)的高位端)。 字節(jié)計(jì)數(shù)字段指定完整數(shù)據(jù)字節(jié)的數(shù)量。
以下是讀取離散輸入 197 – 218 的請(qǐng)求示例:
離散輸入 204–197 的狀態(tài)顯示為字節(jié)值 AC 十六進(jìn)制。輸入 204 是該字節(jié)的 MSB,輸入 197 是 LSB。
離散輸入 218–213 的狀態(tài)顯示為字節(jié)值 35 十六進(jìn)制。輸入 218 位于左起第三位位置,輸入 213 是 LSB。
注意: 剩余的兩個(gè)位(朝向高階端)為零填充。
6.3 讀取保持寄存器 03(0x03)
該功能碼用于讀取遠(yuǎn)程設(shè)備中連續(xù)的保持寄存器塊的內(nèi)容。 請(qǐng)求 PDU 指定起始寄存器地址和寄存器數(shù)量。 在 PDU 寄存器中,從零開(kāi)始尋址。 因此,編號(hào)為 1-16 的寄存器被尋址為 0-15。
響應(yīng)消息中的寄存器數(shù)據(jù)被打包為每個(gè)寄存器兩個(gè)字節(jié),每個(gè)字節(jié)內(nèi)的二進(jìn)制內(nèi)容右對(duì)齊。 對(duì)于每個(gè)寄存器,第一個(gè)字節(jié)包含高位,第二個(gè)字節(jié)包含低位。
以下是讀取寄存器 108 – 110 的請(qǐng)求示例:

6.4 讀取輸入寄存器 04(0x04)
該功能碼用于讀取遠(yuǎn)程設(shè)備中 1 到 125 個(gè)連續(xù)輸入寄存器。 請(qǐng)求 PDU 指定起始寄存器地址和寄存器數(shù)量。 在 PDU 寄存器中,從零開(kāi)始尋址。 因此,編號(hào)為 1-16 的輸入寄存器尋址為 0-15。
響應(yīng)消息中的寄存器數(shù)據(jù)被打包為每個(gè)寄存器兩個(gè)字節(jié),每個(gè)字節(jié)內(nèi)的二進(jìn)制內(nèi)容右對(duì)齊。 對(duì)于每個(gè)寄存器,第一個(gè)字節(jié)包含高位,第二個(gè)字節(jié)包含低位。
下面是一個(gè)要讀取輸入寄存器9的請(qǐng)求的示例:

6.5 寫單個(gè)線圈 05(0x05)
此功能碼用于在遠(yuǎn)程設(shè)備中將單個(gè)輸出寫入 ON 或 OFF。
請(qǐng)求 PDU 指定要強(qiáng)制的線圈的地址。 線圈從零開(kāi)始尋址。 因此編號(hào)為 1 的線圈被尋址為 0。請(qǐng)求的 ON/OFF 狀態(tài)由線圈值字段中的常量指定。 值 0XFF00 請(qǐng)求線圈開(kāi)啟。 值 0X0000 要求關(guān)閉線圈。 所有其他值都是非法的,不會(huì)影響線圈。
正常響應(yīng)是請(qǐng)求的回顯,在寫入線圈狀態(tài)后返回。

以下是將線圈 173 寫入 ON 的請(qǐng)求示例:

6.6 寫單個(gè)寄存器 06(0x06)
此功能代碼用于在遠(yuǎn)程設(shè)備中寫入單個(gè)保持寄存器。
請(qǐng)求 PDU 指定要寫入的寄存器的地址。 寄存器從零開(kāi)始尋址。 因此,編號(hào)為 1 的寄存器被尋址為 0。
正常響應(yīng)是請(qǐng)求的回顯,在寫入寄存器內(nèi)容后返回。
以下是將寄存器 2 寫入 0x0003的請(qǐng)求示例:

6.7 讀異常狀態(tài) 07(0x07)(僅串行線)
該功能碼用于讀取遠(yuǎn)程設(shè)備中 8 個(gè)異常狀態(tài)輸出的內(nèi)容。
該功能提供了一種訪問(wèn)此信息的簡(jiǎn)單方法,因?yàn)楫惓]敵鲆檬且阎模ê瘮?shù)中不需要輸出引用)。
正常響應(yīng)包含八個(gè)異常狀態(tài)輸出的狀態(tài)。 輸出被打包成一個(gè)數(shù)據(jù)字節(jié),每個(gè)輸出一位。 最低輸出參考的狀態(tài)包含在字節(jié)的最低有效位中。
八個(gè)異常狀態(tài)輸出的內(nèi)容是特定于設(shè)備的。
下面是一個(gè)要讀取異常狀態(tài)的請(qǐng)求的示例:
在本例中,輸出數(shù)據(jù)為 6D 十六進(jìn)制(0110 1101 二進(jìn)制)。 從左到右,輸出為 OFF-ON-ON-OFF-ON-ON-OFF-ON。 狀態(tài)從最高地址到最低地址的輸出顯示。
6.8 診斷 08(0x08)(僅串行線)
MODBUS 功能碼 08 提供了一系列測(cè)試,用于檢查客戶端設(shè)備和服務(wù)器之間的通信系統(tǒng),或檢查服務(wù)器內(nèi)部的各種錯(cuò)誤情況。
------未翻譯------
6.9 獲取Comm事件計(jì)數(shù)器 11(0x0B)(僅串行線)
該功能碼用于從遠(yuǎn)程設(shè)備的通信事件計(jì)數(shù)器中獲取狀態(tài)字和事件計(jì)數(shù)。
通過(guò)獲取一系列消息前后的當(dāng)前計(jì)數(shù),客戶端可以確定遠(yuǎn)程設(shè)備是否能正常處理這些消息。
每次成功完成消息后,設(shè)備的事件計(jì)數(shù)器都會(huì)增加一次。 對(duì)于異常響應(yīng)、輪詢命令或獲取事件計(jì)數(shù)器命令,它不會(huì)增加。
事件計(jì)數(shù)器可以通過(guò)診斷功能(代碼 08)復(fù)位,具有重新啟動(dòng)通信選項(xiàng)(代碼 00 01)或清除計(jì)數(shù)器和診斷寄存器(代碼 00 0A)的子功能。
正常響應(yīng)包含一個(gè)兩字節(jié)的狀態(tài)字和一個(gè)兩字節(jié)的事件計(jì)數(shù)。 如果遠(yuǎn)程設(shè)備仍在處理先前發(fā)出的程序命令(存在忙狀態(tài)),則狀態(tài)字將為全 1(FF FF 十六進(jìn)制)。 否則,狀態(tài)字將全為零。
以下是獲取遠(yuǎn)程設(shè)備中的通信事件計(jì)數(shù)器的請(qǐng)求示例:
在此示例中,狀態(tài)字為 0xFFFF,表示遠(yuǎn)程設(shè)備中的程序功能仍在進(jìn)行中。事件計(jì)數(shù)顯示設(shè)備已計(jì)數(shù)了 264 個(gè)(01 08 hex)事件。
6.10 獲取Comm事件日志 12(0x0C)(僅串行線)
此功能代碼用于從遠(yuǎn)程設(shè)備獲取狀態(tài)字、事件計(jì)數(shù)、消息計(jì)數(shù)和事件字節(jié)字段。
狀態(tài)字和事件計(jì)數(shù)與獲取通信事件計(jì)數(shù)器功能(11,0B 十六進(jìn)制)返回的相同。
消息計(jì)數(shù)器包含遠(yuǎn)程設(shè)備自上次重啟、清除計(jì)數(shù)器操作或上電以來(lái)處理的消息數(shù)量。 此計(jì)數(shù)與診斷功能(代碼 08)、子功能返回總線消息計(jì)數(shù)(代碼 11,0B 十六進(jìn)制)返回的計(jì)數(shù)相同。
事件字節(jié)字段包含 0-64 個(gè)字節(jié),每個(gè)字節(jié)對(duì)應(yīng)于遠(yuǎn)程設(shè)備的一個(gè) MODBUS 發(fā)送或接收操作的狀態(tài)。 遠(yuǎn)程設(shè)備按時(shí)間順序?qū)⑹录斎胱侄巍?字節(jié) 0 是最近的事件。 每個(gè)新字節(jié)都會(huì)從字段中刷新最舊的字節(jié)。
正常響應(yīng)包含一個(gè)兩字節(jié)的狀態(tài)字字段、一個(gè)兩字節(jié)的事件計(jì)數(shù)字段、一個(gè)兩字節(jié)的消息計(jì)數(shù)字段和一個(gè)包含 0-64 字節(jié)事件的字段。 字節(jié)計(jì)數(shù)字段定義了這四個(gè)字段中數(shù)據(jù)的總長(zhǎng)度。
以下是在遠(yuǎn)程設(shè)備中獲取通信事件日志的請(qǐng)求示例:
-------未翻譯-------
6.11 寫多個(gè)線圈 15(0x0F)
該功能碼用于在遠(yuǎn)程設(shè)備中強(qiáng)制線圈序列中的每個(gè)線圈打開(kāi)或關(guān)閉。 請(qǐng)求 PDU 指定要強(qiáng)制的線圈參考。 線圈從零開(kāi)始尋址。 因此編號(hào)為 1 的線圈尋址為 0。
請(qǐng)求的開(kāi)/關(guān)狀態(tài)由請(qǐng)求數(shù)據(jù)字段的內(nèi)容指定。字段位位置的邏輯“1”請(qǐng)求相應(yīng)輸出的ON。邏輯上的“0”請(qǐng)求其關(guān)閉。
正常響應(yīng)返回功能碼、起始地址、強(qiáng)制線圈數(shù)量。
以下是從線圈 20 開(kāi)始寫入一系列 10 個(gè)線圈的請(qǐng)求示例:
請(qǐng)求數(shù)據(jù)內(nèi)容為兩個(gè)字節(jié):CD 01 hex(1100 1101 0000 0001 binary)。 二進(jìn)制位對(duì)應(yīng)于以下方式的輸出:
傳輸?shù)牡谝粋€(gè)字節(jié)(CD 十六進(jìn)制)尋址輸出 27-20,最低有效位尋址該組中的最低輸出 (20)。
傳輸?shù)南乱粋€(gè)字節(jié)(01 十六進(jìn)制)尋址輸出 29-28,最低有效位尋址該組中的最低輸出 (28)。 最后一個(gè)數(shù)據(jù)字節(jié)中未使用的位應(yīng)填零。

6.12 寫多個(gè)寄存器 16(0x10)
該功能碼用于在遠(yuǎn)程設(shè)備中寫入一塊連續(xù)的寄存器(1 到 123 個(gè)寄存器)。
請(qǐng)求的寫入值在請(qǐng)求數(shù)據(jù)字段中指定。 數(shù)據(jù)被打包為每個(gè)寄存器的兩個(gè)字節(jié)。
正常響應(yīng)返回功能碼、起始地址和寫入的寄存器數(shù)量。
這是一個(gè)請(qǐng)求寫入兩個(gè)寄存器的示例:


6.13 報(bào)告服務(wù)器ID 17(0x11)
6.14 讀取文件記錄 20(0x14)
6.15 寫文件記錄 21(0x15)
6.16 掩碼寫入寄存器(Mask Write Register) 22(0x16)
該功能碼用于使用AND掩碼、OR掩碼和寄存器當(dāng)前內(nèi)容的組合來(lái)修改指定保持寄存器的內(nèi)容。 該功能可用于設(shè)置或清除寄存器中的各個(gè)位。
該請(qǐng)求指定要寫入的保持寄存器、用作 AND 掩碼的數(shù)據(jù)以及用作 OR 掩碼的數(shù)據(jù)。 寄存器從零開(kāi)始尋址。 因此寄存器 1-16 被尋址為 0-15。
該函數(shù)的算法為:
結(jié)果 = (當(dāng)前內(nèi)容 AND And_Mask) OR (Or_Mask AND (NOT And_Mask))
舉例:
注意:
如果 Or_Mask 值為零,則結(jié)果只是當(dāng)前內(nèi)容和 And_Mask 的邏輯與運(yùn)算。 如果 And_Mask 值為零,則結(jié)果等于 Or_Mask 值。
可以使用讀取保持寄存器功能(功能代碼 03)讀取寄存器的內(nèi)容。 但是,它們可以在控制器掃描其用戶邏輯程序時(shí)進(jìn)行更改。
正常響應(yīng)是請(qǐng)求的回聲。 寫入寄存器后返回響應(yīng)。
以下是使用上述掩碼值對(duì)遠(yuǎn)程設(shè)備中的寄存器 5 進(jìn)行掩碼寫入的示例。

6.17 讀寫多個(gè)寄存器(Read/Write Multiple registers) 23(0x17)
6.18 讀取FIFO隊(duì)列(Read FIFO Queue) 24(0x18)
6.19 封裝接口傳輸(Encapsulated Interface Transport ) 43(0x2B)
6.20 CANopen General Reference Request and Response PDU 43/13(0x2B/0x0D)
6.21 讀取設(shè)備標(biāo)識(shí) 43/14(0x2B/0x0E)
此功能代碼僅允許讀取與遠(yuǎn)程設(shè)備的物理和功能描述相關(guān)的標(biāo)識(shí)和附加信息。
讀取設(shè)備標(biāo)識(shí)接口被建模為由一組可尋址數(shù)據(jù)元素組成的地址空間。 數(shù)據(jù)元素稱為對(duì)象,對(duì)象 ID 標(biāo)識(shí)它們。
該界面由 3 類對(duì)象組成:
- 基本設(shè)備識(shí)別。此類別中的所有對(duì)象都是必填的:供應(yīng)商名稱、產(chǎn)品代碼和修訂號(hào)。
- 常規(guī)設(shè)備識(shí)別。除了基本數(shù)據(jù)對(duì)象之外,設(shè)備還提供附加和可選的標(biāo)識(shí)和描述數(shù)據(jù)對(duì)象。此類別的所有對(duì)象都在標(biāo)準(zhǔn)中定義了,但它們的實(shí)現(xiàn)是可選的。
- 擴(kuò)展設(shè)備標(biāo)識(shí)。除了常規(guī)數(shù)據(jù)對(duì)象外,設(shè)備還提供有關(guān)物理設(shè)備本身的附加和可選標(biāo)識(shí)和描述私有數(shù)據(jù)。 所有這些數(shù)據(jù)都依賴于設(shè)備。


請(qǐng)求參數(shù)說(shuō)明:
分配編號(hào) 14 的 MODBUS 封裝接口標(biāo)識(shí)讀取標(biāo)識(shí)請(qǐng)求。
參數(shù)“讀取設(shè)備ID碼”允許定義四種訪問(wèn)類型:
- 01: 請(qǐng)求獲取基本的設(shè)備標(biāo)識(shí)(流訪問(wèn))
- 02: 請(qǐng)求獲取常規(guī)設(shè)備標(biāo)識(shí)(流訪問(wèn))
- 03: 請(qǐng)求獲取擴(kuò)展設(shè)備標(biāo)識(shí)(流訪問(wèn))
- 04: 請(qǐng)求獲取一個(gè)特定的標(biāo)識(shí)對(duì)象(個(gè)人訪問(wèn))
如果讀取設(shè)備ID代碼為非法,則會(huì)在響應(yīng)中返回異常碼03。
如果響應(yīng)不適合于單個(gè)響應(yīng),則必須執(zhí)行幾個(gè)事務(wù)(請(qǐng)求/響應(yīng))。對(duì)象Id字節(jié)給出了要獲取的第一個(gè)對(duì)象的標(biāo)識(shí)。對(duì)于第一個(gè)事務(wù),客戶端必須將對(duì)象Id設(shè)置為0,以獲得設(shè)備標(biāo)識(shí)數(shù)據(jù)的開(kāi)始。對(duì)于后面的事務(wù),客戶端必須將對(duì)象Id設(shè)置為服務(wù)器在上一個(gè)響應(yīng)中返回的值。
備注:對(duì)象是不可分割的,因此任何對(duì)象的大小都必須與事務(wù)響應(yīng)的大小相一致。
如果對(duì)象 ID 與任何已知對(duì)象都不匹配,則服務(wù)器會(huì)像指出對(duì)象 0 一樣進(jìn)行響應(yīng)(從頭重新啟動(dòng))。
如果是單獨(dú)訪問(wèn):ReadDevId 代碼 04,請(qǐng)求中的 Object Id 給出了要獲取的對(duì)象的標(biāo)識(shí),如果 Object Id 與任何已知對(duì)象都不匹配,則服務(wù)器返回異常響應(yīng),異常代碼 = 02(非法數(shù)據(jù)地址)。
如果服務(wù)器設(shè)備被要求提供比其符合級(jí)別更高的描述級(jí)別(讀取設(shè)備代碼),則它必須根據(jù)其實(shí)際符合級(jí)別做出響應(yīng)。
響應(yīng)參數(shù)說(shuō)明:
| Function code | 0x2B(十六進(jìn)制) |
| MEI Type | 14 (0x0E) MEI 類型分配給設(shè)備識(shí)別接口的編號(hào) |
| ReadDevId code | 與請(qǐng)求ReadDevId代碼相同:01、02、03或04 |
| Conformity Level符合性水平 | 設(shè)備的標(biāo)識(shí)一致性級(jí)別和支持的訪問(wèn)類型 0x01:基本標(biāo)識(shí)(僅限流訪問(wèn)) 0x02:常規(guī)標(biāo)識(shí)(僅限流訪問(wèn)) 0x03:擴(kuò)展標(biāo)識(shí)(僅限流訪問(wèn)) 0x81:基本標(biāo)識(shí)(流訪問(wèn)和單獨(dú)訪問(wèn)) 0x82:常規(guī)標(biāo)識(shí)(流訪問(wèn)和單獨(dú)訪問(wèn)) 0x83:擴(kuò)展標(biāo)識(shí)(流訪問(wèn)和單獨(dú)訪問(wèn)) |
| More Follows | 對(duì)于ReadDevId代碼01、02或03(流訪問(wèn)),如果標(biāo)識(shí)數(shù)據(jù)不適合單個(gè)響應(yīng),則可能需要多個(gè)請(qǐng)求/響應(yīng)事務(wù)。 0x00:沒(méi)有更多的對(duì)象可用 0xFF:其他標(biāo)識(shí)對(duì)象是可用的,需要MODBUS事務(wù) 對(duì)于ReadDevId代碼04(單獨(dú)訪問(wèn)),此字段必須設(shè)置為00。 |
| Next Object Id | 如果“MoreFollows = FF”,則標(biāo)識(shí)下一個(gè)要請(qǐng)求的Object。如果“MoreFollows = 00”,則必須設(shè)置為00(無(wú)用) |
| Number Of Objects | 響應(yīng)中返回的標(biāo)識(shí)對(duì)象數(shù)(對(duì)于單個(gè)訪問(wèn),對(duì)象數(shù) = 1) |
| Object0.Id | PDU 中返回的第一個(gè)對(duì)象的標(biāo)識(shí)(流訪問(wèn))或請(qǐng)求的對(duì)象(單獨(dú)訪問(wèn)) |
| Object0.Length | 以字節(jié)表示的第一個(gè)對(duì)象的長(zhǎng)度 |
| Object0.Value | 第一個(gè)對(duì)象的值(對(duì)象0)。長(zhǎng)度的字節(jié)) |
| .... | .... |
| ObjectN.Id | 最后一個(gè)對(duì)象的標(biāo)識(shí)(在響應(yīng)范圍內(nèi)) |
| ObjectN.Length | 最后一個(gè)對(duì)象的字節(jié)的長(zhǎng)度 |
| ObjectN.Value | Value of the last Object (ObjectN.Length bytes) |
針對(duì)“基本設(shè)備標(biāo)識(shí)”的讀取設(shè)備識(shí)別請(qǐng)求的示例:在本例中,所有信息都在一個(gè)響應(yīng)PDU中發(fā)送。
如果設(shè)備需要多個(gè)事務(wù)來(lái)發(fā)送響應(yīng),則會(huì)啟動(dòng)以下事務(wù)。
第一次事務(wù):
第二次事務(wù):

7.MODBUS異常響應(yīng)
當(dāng)客戶端設(shè)備向服務(wù)器設(shè)備發(fā)送請(qǐng)求時(shí),它期望得到正常響應(yīng)。 客戶端的查詢可能會(huì)發(fā)生四種可能的事件之一:
- 如果服務(wù)器設(shè)備接收到的請(qǐng)求沒(méi)有通信錯(cuò)誤,并且可以正常處理查詢,則返回正常響應(yīng)。
- 如果服務(wù)器由于通信錯(cuò)誤而沒(méi)有收到請(qǐng)求,則不返回任何響應(yīng)??蛻舳顺绦蜃罱K將處理該請(qǐng)求的超時(shí)條件。
- 如果服務(wù)器接收到請(qǐng)求,但檢測(cè)到通信錯(cuò)誤(奇偶校驗(yàn)、LRC、CRC、……),則不返回任何響應(yīng)??蛻舳顺绦蜃罱K將處理該請(qǐng)求的超時(shí)條件。
- 如果服務(wù)器接收到的請(qǐng)求沒(méi)有通信錯(cuò)誤,但不能處理它(例如,如果請(qǐng)求是讀取一個(gè)不存在的輸出或寄存器),服務(wù)器將返回一個(gè)異常響應(yīng),通知客戶端錯(cuò)誤的性質(zhì)。
異常響應(yīng)消息有兩個(gè)字段可以將其與正常響應(yīng)區(qū)分開(kāi)來(lái):
功能碼字段:在正常響應(yīng)中,服務(wù)器在響應(yīng)的功能碼字段中回顯原始請(qǐng)求的功能碼。 所有功能代碼的最高有效位 (MSB) 均為 0(它們的值均低于 80 十六進(jìn)制)。 在異常響應(yīng)中,服務(wù)器將功能代碼的 MSB 設(shè)置為 1。這使得異常響應(yīng)中的功能碼值比正常響應(yīng)的值高 0x80。
通過(guò)設(shè)置功能碼的 MSB,客戶端的應(yīng)用程序可以識(shí)別異常響應(yīng),并可以檢查異常代碼的數(shù)據(jù)字段。
數(shù)據(jù)字段:在正常響應(yīng)中,服務(wù)器可能會(huì)返回?cái)?shù)據(jù)字段中的數(shù)據(jù)或統(tǒng)計(jì)信息(請(qǐng)求中請(qǐng)求的任何信息)。 在異常響應(yīng)中,服務(wù)器在數(shù)據(jù)字段中返回異常代碼。 這定義了導(dǎo)致異常的服務(wù)器條件。
客戶端請(qǐng)求和服務(wù)器異常響應(yīng)的示例
在此示例中,客戶端向服務(wù)器設(shè)備發(fā)送請(qǐng)求。 功能代碼 (01) 用于讀取輸出狀態(tài)。 它請(qǐng)求地址 1185(04A1 十六進(jìn)制)處的輸出狀態(tài)。 請(qǐng)注意,僅讀取一個(gè)輸出,如輸出數(shù)量字段 (0001) 所指定。
如果服務(wù)器設(shè)備中不存在輸出地址,則服務(wù)器將返回異常響應(yīng)并顯示異常代碼 (02)。 這指定了服務(wù)器的非法數(shù)據(jù)地址。
異常代碼的列表
| 異常碼 | 名稱 | 含義 |
| 01 | 非法功能 ILLEGAL FUNCTION | 查詢中收到的功能代碼不是服務(wù)器允許的操作。 這可能是因?yàn)樵摴δ艽a僅適用于較新的設(shè)備,并未在所選單元中實(shí)現(xiàn)。 它還可能表明服務(wù)器處于錯(cuò)誤狀態(tài),無(wú)法處理這種類型的請(qǐng)求,例如因?yàn)樗磁渲们冶灰蠓祷丶拇嫫髦怠?/td> |
| 02 | 非法數(shù)據(jù)地址 ILLEGAL DATA ADDRESS | 查詢中收到的數(shù)據(jù)地址不是服務(wù)器允許的地址。 更具體地說(shuō),參考號(hào)和傳輸長(zhǎng)度的組合是無(wú)效的。 對(duì)于100個(gè)寄存器的控制器,PDU將第一個(gè)寄存器尋址為0,最后一個(gè)寄存器尋址為99。如果提交的請(qǐng)求起始寄存器地址為96,寄存器數(shù)量為4,則該請(qǐng)求將成功運(yùn)行( 地址至少)在寄存器 96、97、98、99 上。如果提交的請(qǐng)求的起始寄存器地址為 96,寄存器數(shù)量為 5,則此請(qǐng)求將失敗,異常代碼為 0x02“非法數(shù)據(jù)地址” 因?yàn)樗噲D對(duì)寄存器 96、97、98、99 和 100 進(jìn)行操作,并且沒(méi)有地址為 100 的寄存器。 |
| 03 | 非法數(shù)據(jù)值ILLEGAL DATA VALUE | 數(shù)據(jù)字段中包含的值不是服務(wù)器允許的值。 這表明復(fù)雜請(qǐng)求的其余部分的結(jié)構(gòu)存在錯(cuò)誤,例如隱含長(zhǎng)度不正確。 它具體并不意味著提交存儲(chǔ)在寄存器中的數(shù)據(jù)項(xiàng)具有超出應(yīng)用程序預(yù)期的值,因?yàn)?MODBUS 協(xié)議不知道任何特定寄存器的任何特定值的重要性。 |
| 04 | 服務(wù)器設(shè)備故障SERVER DEVICE FAILURE | 當(dāng)服務(wù)器試圖執(zhí)行所請(qǐng)求的操作時(shí),發(fā)生了一個(gè)不可恢復(fù)的錯(cuò)誤。 |
| 05 | 確認(rèn)ACKNOWLEDGE | 專門與編程命令結(jié)合使用。 服務(wù)器已接受請(qǐng)求并正在處理它,但這樣做需要很長(zhǎng)時(shí)間。 返回此響應(yīng)是為了防止客戶端發(fā)生超時(shí)錯(cuò)誤。 客戶端接下來(lái)可以發(fā)出輪詢程序完成消息以確定處理是否完成。 |
| 06 | 服務(wù)器設(shè)備繁忙SERVER DEVICE BUSY | 專門與編程命令結(jié)合使用。 服務(wù)器正在處理一個(gè)長(zhǎng)時(shí)間的程序命令。 客戶端應(yīng)該稍后在服務(wù)器空閑時(shí)重新傳輸消息。 |
| 08 | 存儲(chǔ)器奇偶誤差MEMORY PARITY ERROR | 專門與功能碼 20 和 21 以及引用類型 6 結(jié)合使用,以指示擴(kuò)展文件區(qū)域未能通過(guò)一致性檢查。 服務(wù)器嘗試讀取記錄文件,但在內(nèi)存中檢測(cè)到奇偶校驗(yàn)錯(cuò)誤。 客戶端可以重試請(qǐng)求,但可能需要服務(wù)器設(shè)備上的服務(wù)。 |
| 0A | 網(wǎng)關(guān)路徑不可用GATEWAY PATH UNAVAILABLE | 專門與網(wǎng)關(guān)結(jié)合使用,表示網(wǎng)關(guān)無(wú)法分配從輸入端口到輸出端口的內(nèi)部通信路徑來(lái)處理請(qǐng)求。 通常意味著網(wǎng)關(guān)配置錯(cuò)誤或過(guò)載。 |
| 0B | 網(wǎng)關(guān)目標(biāo)設(shè)備未能響應(yīng)GATEWAY TARGET DEVICE FAILED TO RESPOND |
專門與網(wǎng)關(guān)結(jié)合使用,表示未從目標(biāo)設(shè)備獲得響應(yīng)。 通常意味著該設(shè)備不在網(wǎng)絡(luò)上。 |
附件A(信息性):MODBUS保留的功能碼、子碼和MEI類型
下列功能碼和子碼不屬于本公開(kāi)規(guī)范的一部分,這些功能碼和子碼是專門保留的。 格式為功能碼/子碼或僅保留所有子碼(0-255)的功能碼:8/19; 8/21-65535、9、10、13、14、41、42、90、91、125、126 和 127。
功能碼 43 及其用于設(shè)備識(shí)別的 MEI 類型 14 和用于 CANopen 通用參考請(qǐng)求和響應(yīng) PDU 的 MEI 類型 13 是本規(guī)范中當(dāng)前可用的封裝接口傳輸。
以下功能碼和 MEI 類型不屬于本公開(kāi)規(guī)范的一部分,這些功能碼和 MEI 類型被特別保留:43/0-12 和 43/15-255。 在本規(guī)范中,不支持具有與封裝接口傳輸相同或相似結(jié)果的用戶定義功能碼。
MODBUS是施耐德自動(dòng)化有限公司的注冊(cè)商標(biāo)。
附件 B(資料性):CANOPEN 通用參考命令
請(qǐng)參閱 MODBUS 網(wǎng)站或 CiA(自動(dòng)化中的 CAN)網(wǎng)站獲取涵蓋功能代碼 43 MEI 類型 13 的副本和使用條款。
文檔翻譯自:

浙公網(wǎng)安備 33010602011771號(hào)