新聞中心
PRESS CENTER一、引言
1.1 范圍
MODBUS 是 OSI 模型第 7 層上的應(yīng)用層報(bào)文傳輸協(xié)議,它在連接至不同類型總線或網(wǎng)絡(luò)的設(shè)備 之間提供客戶機(jī)/服務(wù)器通信。
自從 1979 年出現(xiàn)工業(yè)串行鏈路的事實(shí)標(biāo)準(zhǔn)以來,MODBUS 使成千上萬(wàn)的自動(dòng)化設(shè)備能夠通信。 目前,繼續(xù)增加對(duì)簡(jiǎn)單而雅觀的 MODBUS 結(jié)構(gòu)支持。互聯(lián)網(wǎng)組織能夠使 TCP/IP 棧上的保留系統(tǒng)端 口 502 訪問 MODBUS。
MODBUS 是一個(gè)請(qǐng)求/應(yīng)答協(xié)議,并且提供功能碼規(guī)定的服務(wù)。MODBUS 功能碼是 MODBUS 請(qǐng)求/應(yīng)答 PDU 的元素。本文件的作用是描述 MODBUS 事務(wù)處理框架內(nèi)使用的功能碼。 1.2 規(guī)范性引用文件 1.RFC791,互聯(lián)網(wǎng)協(xié)議,Sep81 DARPA 2.MODBUS 協(xié)議參考指南 Rev J,MODICON,1996 年 6 月,doc#PI_MBUS_300 MODBUS 是一項(xiàng)應(yīng)用層報(bào)文傳輸協(xié)議,用于在通過不同類型的總線或網(wǎng)絡(luò)連接的設(shè)備之間的客 戶機(jī)/服務(wù)器通信。 目前,使用下列情況實(shí)現(xiàn) MODBUS: 以太網(wǎng)上的 TCP/IP。 各種媒體(有線:EIA/TIA-232-E、EIA-422、EIA/TIA-485-A;光纖、無線等等)上的異步串行 傳輸。 MODBUS PLUS,一種高速令牌傳遞網(wǎng)絡(luò)。
1.2 規(guī)范性引用文件
1.RFC791,互聯(lián)網(wǎng)協(xié)議,Sep81 DARPA
2.MODBUS 協(xié)議參考指南 Rev J,MODICON,1996 年 6 月,doc#PI_MBUS_300 MODBUS 是一項(xiàng)應(yīng)用層報(bào)文傳輸協(xié)議,用于在通過不同類型的總線或網(wǎng)絡(luò)連接的設(shè)備之間的客 戶機(jī)/服務(wù)器通信。
目前,使用下列情況實(shí)現(xiàn) MODBUS: 以太網(wǎng)上的 TCP/IP。
各種媒體(有線:EIA/TIA-232-E、EIA-422、EIA/TIA-485-A;光纖、無線等等)上的異步串行 傳輸。 MODBUS PLUS,一種高速令牌傳遞網(wǎng)絡(luò)。
2 縮略語(yǔ)
ADU 應(yīng)用數(shù)據(jù)單元
HDLC 高級(jí)數(shù)據(jù)鏈路控制
HMI 人機(jī)界面
IETF 因特網(wǎng)工程工作組 I/O 輸入/輸出設(shè)備 IP 互連網(wǎng)協(xié)議
MAC 介質(zhì)訪問控制
MB MODBUS 協(xié)議
MBAP MODBUS 協(xié)議
PDU 協(xié)議數(shù)據(jù)單元
PLC 可編程邏輯控制器
TCP 傳輸控制協(xié)議
3 背景概要
MODBUS 協(xié)議允許在各種網(wǎng)絡(luò)體系結(jié)構(gòu)內(nèi)進(jìn)行簡(jiǎn)單通信。
每種設(shè)備(PLC、HMI、控制面板、驅(qū)動(dòng)程序、動(dòng)作控制、輸入/輸出設(shè)備)都能使用 MODBUS 協(xié)議來啟動(dòng)遠(yuǎn)程操作。
在基于串行鏈路和以太 TCP/IP 網(wǎng)絡(luò)的 MODBUS 上可以進(jìn)行相同通信。
一些網(wǎng)關(guān)允許在幾種使用 MODBUS 協(xié)議的總線或網(wǎng)絡(luò)之間進(jìn)行通信。
4 總體描述
4.1 協(xié)議描述
MODBUS 協(xié)議定義了一個(gè)與基礎(chǔ)通信層無關(guān)的簡(jiǎn)單協(xié)議數(shù)據(jù)單元(PDU)。特定總線或網(wǎng)絡(luò)上
的 MODBUS 協(xié)議映射能夠在應(yīng)用數(shù)據(jù)單元(ADU)上引入一些附加域。
啟動(dòng) MODBUS 事務(wù)處理的客戶機(jī)創(chuàng)建 MODBUS 應(yīng)用數(shù)據(jù)單元。功能碼向服務(wù)器指示將執(zhí)行哪 種操作。
MODBUS 協(xié)議建立了客戶機(jī)啟動(dòng)的請(qǐng)求格式。
用一個(gè)字節(jié)編碼 MODBUS 數(shù)據(jù)單元的功能碼域。有效的碼字范圍是十進(jìn)制 1-255(128-255 為 異常響應(yīng)保留)。當(dāng)從客戶機(jī)向服務(wù)器設(shè)備發(fā)送報(bào)文時(shí),功能碼域通知服務(wù)器執(zhí)行哪種操作。
向一些功能碼加入子功能碼來定義多項(xiàng)操作。
從客戶機(jī)向服務(wù)器設(shè)備發(fā)送的報(bào)文數(shù)據(jù)域包括附加信息,服務(wù)器使用這個(gè)信息執(zhí)行功能碼定義 的操作。這個(gè)域還包括離散項(xiàng)目和寄存器地址、處理的項(xiàng)目數(shù)量以及域中的實(shí)際數(shù)據(jù)字節(jié)數(shù)。
在某種請(qǐng)求中,數(shù)據(jù)域可以是不存在的(0 長(zhǎng)度),在此情況下服務(wù)器不需要任何附加信息。功 能碼僅說明操作。
如果在一個(gè)正確接收的 MODBUS ADU 中,不出現(xiàn)與請(qǐng)求 MODBUS 功能有關(guān)的差錯(cuò),那么服 務(wù)器至客戶機(jī)的響應(yīng)數(shù)據(jù)域包括請(qǐng)求數(shù)據(jù)。如果出現(xiàn)與請(qǐng)求 MODBUS 功能有關(guān)的差錯(cuò),那么域包 括一個(gè)異常碼,服務(wù)器應(yīng)用能夠使用這個(gè)域確定下一個(gè)執(zhí)行的操作。
例如,客戶機(jī)能夠讀一組離散量輸出或輸入的開/關(guān)狀態(tài),或者客戶機(jī)能夠讀/寫一組寄存器的數(shù) 據(jù)內(nèi)容。
當(dāng)服務(wù)器對(duì)客戶機(jī)響應(yīng)時(shí),它使用功能碼域來指示正常(無差錯(cuò))響應(yīng)或者出現(xiàn)某種差錯(cuò)(稱 為異常響應(yīng))。對(duì)于一個(gè)正常響應(yīng)來說,服務(wù)器僅對(duì)原始功能碼響應(yīng)。
對(duì)于異常響應(yīng),服務(wù)器返回一個(gè)與原始功能碼等同的碼,設(shè)置該原始功能碼的最高有效位為邏 輯 1。
注釋:需要管理超時(shí),以便明確地等待可能不會(huì)出現(xiàn)的應(yīng)答。
串行鏈路上第一個(gè) MODBUS 執(zhí)行的長(zhǎng)度約束限制了 MODBUS PDU 大小(最大 RS485ADU=256 字節(jié))。
因此,對(duì)串行鏈路通信來說,MODBUS PDU=256-服務(wù)器地址(1 字節(jié))-CRC(2 字節(jié))=253 字節(jié)。
從而:
RS232 / RS485 ADU = 253 字節(jié)+服務(wù)器地址(1 byte) + CRC (2 字節(jié)) = 256 字節(jié)。
TCP MODBUS ADU = 249 字節(jié)+ MBAP (7 字節(jié)) = 256 字節(jié)。
MODBUS 協(xié)議定義了三種 PDU。它們是:
MODBUS 請(qǐng)求 PDU,mb_req_pdu
MODBUS 響應(yīng) PDU,mb_rsp_pdu
MODBUS 異常響應(yīng) PDU,mb_excep_rsp_pdu
定義 mb_req_pdu 為: mb_req_pdu = { function_code, request_data},其中
function_code - [1 個(gè)字節(jié)] MODBUS 功能碼
request_data - [n 個(gè)字節(jié)],這個(gè)域與功能碼有關(guān),并且通常包括諸如可變參考、變量、數(shù)據(jù)偏移 量、子功能碼等信息。
定義 mb_rsp_pdu 為:
mb_rsp_pdu = { function_code, response_ data},其中
function_code - [1 個(gè)字節(jié)] MODBUS 功能碼
response_data - [n 個(gè)字節(jié)],這個(gè)域與功能碼有關(guān),并且通常包括諸如可變參考、變量、數(shù)據(jù)偏 移量、子功能碼等信息。
定義 mb_excep_rsp_pdu 為:
mb_excep_rsp_pdu = { function_code, request_data},其中
function_code - [1 個(gè)字節(jié)] MODBUS 功能碼 + 0x80
exception_code - [1 個(gè)字節(jié)],在下表中定義了 MODBUS 異常碼。
4.2 數(shù)據(jù)編碼
MODBUS 使用一個(gè)‘big-Endian’ 表示地址和數(shù)據(jù)項(xiàng)。這意味著當(dāng)發(fā)射多個(gè)字節(jié)時(shí),首先發(fā) 送最高有效位。例如: 寄存器大小 值
16 – 比特 0x1234 發(fā)送的第一字節(jié)為 0x12 然后 0x34
注釋:更詳細(xì)的信息參見[1]。
4.3 MODBUS數(shù)據(jù)模型
MODBUS 以一系列具有不同特征表格上的數(shù)據(jù)模型為基礎(chǔ)。四個(gè)基本表格為:
基本表格 | 對(duì)象類型 | 訪問類型 | 內(nèi)容 |
離散量輸入 | 單個(gè)比特 | 只讀 | I/O 系統(tǒng)提供這種類型數(shù)據(jù) |
線圈 | 單個(gè)比特 | 讀寫 | 通過應(yīng)用程序改變這種類型數(shù)據(jù) |
輸入寄存器 | 16-比特字 | 只讀 | I/O 系統(tǒng)提供這種類型數(shù)據(jù) |
保持寄存器 | 16-比特字 | 讀寫 | 通過應(yīng)用程序改變這種類型數(shù)據(jù) |
輸入與輸出之間以及比特尋址的和字尋址的數(shù)據(jù)項(xiàng)之間的區(qū)別并沒有暗示任何應(yīng)用操作。如果 這是對(duì)可疑對(duì)象核心部分最自然的解釋,那么這種區(qū)別是可完全接受的,而且很普通,以便認(rèn)為四 個(gè)表格全部覆蓋了另外一個(gè)表格。
對(duì)于基本表格中任何一項(xiàng),協(xié)議都允許單個(gè)地選擇 65536 個(gè)數(shù)據(jù)項(xiàng),而且設(shè)計(jì)那些項(xiàng)的讀寫操 作可以越過多個(gè)連續(xù)數(shù)據(jù)項(xiàng)直到數(shù)據(jù)大小規(guī)格限制,這個(gè)數(shù)據(jù)大小規(guī)格限制與事務(wù)處理功能碼有關(guān)。
很顯然,必須將通過 MODBUS 處理的所有數(shù)據(jù)放置在設(shè)備應(yīng)用存儲(chǔ)器中。但是,存儲(chǔ)器的物 理地址不應(yīng)該與數(shù)據(jù)參考混淆。要求僅僅是數(shù)據(jù)參考與物理地址的鏈接。
MODBUS 功能碼中使用的 MODBUS 邏輯參考數(shù)字是以 0 開始的無符號(hào)整數(shù)索引。
MODBUS 模型實(shí)現(xiàn)的實(shí)例
下例實(shí)例示出了兩種在設(shè)備中構(gòu)造數(shù)據(jù)的方法??赡苡胁煌慕Y(jié)構(gòu),這個(gè)文件中沒有全部描述 出來。每個(gè)設(shè)備根據(jù)其應(yīng)用都有它自己的數(shù)據(jù)結(jié)構(gòu)。
實(shí)例 1:有 4 個(gè)獨(dú)立塊的設(shè)備
下例實(shí)例示出了設(shè)備中的數(shù)據(jù)結(jié)構(gòu),這個(gè)設(shè)備含有數(shù)字量和模擬量、輸入量和輸出量。由于不 同塊中的數(shù)據(jù)不相關(guān),每個(gè)塊是相互獨(dú)立。按不同 MODBUS 功能碼訪問每個(gè)塊。
實(shí)例 2:僅有 1 個(gè)塊的設(shè)備
在這個(gè)實(shí)例中,設(shè)備僅有 1 個(gè)數(shù)據(jù)塊。通過幾個(gè) MODBUS 功能碼可能得到一個(gè)相同數(shù)據(jù),或 者通過 16 比特訪問或 1 個(gè)訪問比特。
4.4 MODBUS 事務(wù)處理的定義
下列狀態(tài)圖描述了在服務(wù)器側(cè) MODBUS 事務(wù)處理的一般處理過程。
一旦服務(wù)器處理請(qǐng)求,使用合適的 MODBUS 服務(wù)器事務(wù)建立 MODBUS 響應(yīng)。
根據(jù)處理結(jié)果,可以建立兩種類型響應(yīng):
● 一個(gè)正 MODBUS 響應(yīng):
● 響應(yīng)功能碼 = 請(qǐng)求功能碼
● 一個(gè) MODBUS 異常響應(yīng)(參見第 6.14 節(jié))
● 用來為客戶機(jī)提供處理過程中與被發(fā)現(xiàn)的差錯(cuò)相關(guān)的信息;
● 響應(yīng)功能碼 = 請(qǐng)求功能碼 + 0x80;
● 提供一個(gè)異常碼來指示差錯(cuò)原因。
5 功能碼分類
有三類 MODBUS 功能碼。它們是:
● 是較好地被定義的功能碼,
● 保證是唯一的,
● MODBUS 組織可改變的,
● 公開證明的,
● 具有可用的一致性測(cè)試,
● MB IETF RFC 中證明的,
● 包含已被定義的公共指配功能碼和未來使用的未指配保留供功能碼。
用戶定義功能碼
● 有兩個(gè)用戶定義功能碼的定義范圍,即 65 至 72 和十進(jìn)制 100 至 110。
● 用戶沒有 MODBUS 組織的任何批準(zhǔn)就可以選擇和實(shí)現(xiàn)一個(gè)功能碼
● 不能保證被選功能碼的使用是唯一的。
● 如果用戶要重新設(shè)置功能作為一個(gè)公共功能碼,那么用戶必須啟動(dòng) RFC,以便將改變引入 公共分類中,并且指配一個(gè)新的公共功能碼。
保留功能碼
● 一些公司對(duì)傳統(tǒng)產(chǎn)品通常使用的功能碼,并且對(duì)公共使用是無效的功能碼。
5.1 公共功能碼定義
6 功能碼描述
6.1 01 (0x01)讀線圈
在一個(gè)遠(yuǎn)程設(shè)備中,使用該功能碼讀取線圈的 1 至 2000 連續(xù)狀態(tài)。請(qǐng)求 PDU 詳細(xì)說明了起始 地址,即指定的第一個(gè)線圈地址和線圈編號(hào)。從零開始尋址線圈。因此尋址線圈 1-16 為 0-15。
根據(jù)數(shù)據(jù)域的每個(gè)比特將響應(yīng)報(bào)文中的線圈分成為一個(gè)線圈。指示狀態(tài)為 1= ON 和 0= OFF。 第一個(gè)數(shù)據(jù)字節(jié)的 LSB(最低有效位)包括在詢問中尋址的輸出。其它線圈依次類推,一直到這個(gè) 字節(jié)的高位端為止,并在后續(xù)字節(jié)中從低位到高位的順序。
如果返回的輸出數(shù)量不是八的倍數(shù),將用零填充最后數(shù)據(jù)字節(jié)中的剩余比特(一直到字節(jié)的高 位端)。字節(jié)數(shù)量域說明了數(shù)據(jù)的完整字節(jié)數(shù)。
請(qǐng)求 PDU
功能碼 | 1 個(gè)字節(jié) | 0x01 |
起始地址 | 2 個(gè)字節(jié) | 0x0000 至 0xFFFF |
線圈數(shù)量 | 2 個(gè)字節(jié) | 1 至 2000(0x7D0) |
響應(yīng) PDU
功能碼 | 1 個(gè)字節(jié) | 0x01 |
字節(jié)數(shù) | 1 個(gè)字節(jié) | N* |
線圈狀態(tài) | N 個(gè)字節(jié) | n=N 或 N+1 |
*N=輸出數(shù)量/8,如果余數(shù)不等于 0,那么?N = N+1
錯(cuò)誤
功能碼 | 1 個(gè)字節(jié) | 功能碼+0x80 |
異常碼 | 1 個(gè)字節(jié) | 01 或 02 或 03 或 04 |
這是一個(gè)請(qǐng)求讀離散量輸出 20-38 的實(shí)例:
請(qǐng)求 | 響應(yīng) |
域名 | (十六進(jìn)制) | 域名 | (十六進(jìn)制) |
功能 | 01 | 功能 | 01 |
起始地址 Hi | 00 | 字節(jié)數(shù) | 03 |
起始地址 Lo | 13 | 輸出狀態(tài) 27-20 | CD |
輸出數(shù)量 Hi | 00 | 輸出狀態(tài) 35-28 | 6B |
輸出數(shù)量 Lo | 13 | 輸出狀態(tài) 38-36 | 05 |
將輸出 27-20 的狀態(tài)表示為十六進(jìn)制字節(jié)值 CD,或二進(jìn)制 1100 1101。輸出 27 是這個(gè)字節(jié)的 MSB,輸出 20 是 LSB。
通常,將一個(gè)字節(jié)內(nèi)的比特表示為 MSB 位于左側(cè),LSB 位于右側(cè)。第一字節(jié)的輸出從左至右 為 27 至 20。下一個(gè)字節(jié)的輸出從左到右為 35 至 28。當(dāng)串行發(fā)射比特時(shí),從 LSB 向 MSB 傳輸:20 . . . 27、28 . . . 35 等等。
在最后的數(shù)據(jù)字節(jié)中,將輸出狀態(tài) 38-36 表示為十六進(jìn)制字節(jié)值 05,或二進(jìn)制 0000 0101。輸出 38 是左側(cè)第六個(gè)比特位置,輸出 36 是這個(gè)字節(jié)的 LSB。用零填充五個(gè)剩余高位比特。
注:用零填充五個(gè)剩余比特(一直到高位端)。