Modbus協(xié)議功能碼及格式解析
發(fā)布時間:
2025-01-13
在工業(yè)自動化和設(shè)備通信中,Modbus協(xié)議作為一種常見的串行通信協(xié)議,廣泛應用于PLC、傳感器、變頻器等設(shè)備之間的數(shù)據(jù)交換。Modbus協(xié)議通過特定的功能碼來實現(xiàn)不同的操作。今天,我們就來詳細解析Modbus協(xié)議的功能碼及其格式。
一、Modbus協(xié)議格式概述
Modbus協(xié)議的數(shù)據(jù)格式主要包括以下部分:
- 地址域(Address):
1字節(jié),表示設(shè)備的地址。
- 功能碼(Function Code):
1字節(jié),表示要執(zhí)行的操作類型。
- 數(shù)據(jù)域(Data):
N字節(jié),表示操作所需要的數(shù)據(jù)或響應的數(shù)據(jù)。
- CRC校驗(CRC):
2字節(jié),用于數(shù)據(jù)完整性校驗。
Modbus協(xié)議的基本數(shù)據(jù)格式如下:
| 地址域 | 功能碼 | 數(shù)據(jù)域 | CRC校驗 |
二、常見Modbus功能碼及其含義
Modbus協(xié)議支持多種功能碼,每種功能碼對應不同的操作或請求。以下是常見功能碼的詳細介紹:
1. 功能碼0x01:讀取線圈狀態(tài)(Read Coils)
功能碼0x01用于讀取一個或多個線圈(Coils)狀態(tài)(開/關(guān))。該操作允許主機獲取從設(shè)備的輸出狀態(tài)。
- 請求格式:
| 地址域 | 功能碼 | 起始地址(2字節(jié)) | 讀取數(shù)量(2字節(jié)) | CRC校驗 |
- 響應格式:
| 地址域 | 功能碼 | 字節(jié)數(shù)(1字節(jié)) | 數(shù)據(jù) | CRC校驗 |
數(shù)據(jù):每個字節(jié)代表8個線圈的狀態(tài),按位表示(1為開,0為關(guān))。
示例:主機請求讀取地址為0x01設(shè)備的起始地址0x0000到0x0007的線圈狀態(tài)。 請求:01 01 00 00 00 07 CRC
響應:01 01 01 80 CRC
表示設(shè)備0x01的線圈狀態(tài)為:0x80(0b10000000)(即第一個線圈開,第二個線圈關(guān),依此類推)。
2. 功能碼0x02:讀取離散輸入狀態(tài)(Read Discrete Inputs)
功能碼0x02用于讀取一個或多個離散輸入(Discrete Inputs)的狀態(tài)。
- 請求格式:
| 地址域 | 功能碼 | 起始地址(2字節(jié)) | 讀取數(shù)量(2字節(jié)) | CRC校驗 |
- 響應格式:
| 地址域 | 功能碼 | 字節(jié)數(shù)(1字節(jié)) | 數(shù)據(jù) | CRC校驗 |
示例:主機請求讀取地址為0x01設(shè)備的起始地址0x0000到0x0007的離散輸入狀態(tài)。 請求:01 02 00 00 00 07 CRC
響應:01 02 01 80 CRC
表示設(shè)備0x01的離散輸入狀態(tài)為:0x80。
3. 功能碼0x03:讀取保持寄存器(Read Holding Registers)
功能碼0x03用于讀取一個或多個保持寄存器的值。保持寄存器通常用于存儲設(shè)備的配置參數(shù)或測量結(jié)果。
- 請求格式:
| 地址域 | 功能碼 | 起始地址(2字節(jié)) | 讀取數(shù)量(2字節(jié)) | CRC校驗 |
- 響應格式:
| 地址域 | 功能碼 | 字節(jié)數(shù)(1字節(jié)) | 數(shù)據(jù)(N字節(jié)) | CRC校驗 |
示例:主機請求讀取設(shè)備0x01的起始地址0x0000的2個保持寄存器。 請求:01 03 00 00 00 02 CRC
響應:01 03 04 00 01 00 02 CRC
表示第一個寄存器的值為0x0001,第二個寄存器的值為0x0002。
4. 功能碼0x04:讀取輸入寄存器(Read Input Registers)
功能碼0x04用于讀取一個或多個輸入寄存器的值。輸入寄存器通常用于讀取傳感器等設(shè)備的測量數(shù)據(jù)。
- 請求格式:
| 地址域 | 功能碼 | 起始地址(2字節(jié)) | 讀取數(shù)量(2字節(jié)) | CRC校驗 |
- 響應格式:
| 地址域 | 功能碼 | 字節(jié)數(shù)(1字節(jié)) | 數(shù)據(jù)(N字節(jié)) | CRC校驗 |
示例:主機請求讀取設(shè)備0x01的輸入寄存器值。 請求:01 04 00 00 00 02 CRC
響應:01 04 04 00 01 00 02 CRC
表示第一個輸入寄存器的值為0x0001,第二個寄存器的值為0x0002。
5. 功能碼0x05:強制單個線圈(Force Single Coil)
功能碼0x05用于強制設(shè)置單個線圈的狀態(tài)為開或關(guān)。
請求格式:
| 地址域 | 功能碼 | 起始地址(2字節(jié)) | 狀態(tài)(2字節(jié)) | CRC校驗 |
狀態(tài):0xFF00表示開,0x0000表示關(guān)。
響應格式:
| 地址域 | 功能碼 | 起始地址(2字節(jié)) | 狀態(tài)(2字節(jié)) | CRC校驗 |
示例:主機請求設(shè)置設(shè)備0x01的線圈0x0000為開狀態(tài)。 請求:01 05 00 00 FF 00 CRC
響應:01 05 00 00 FF 00 CRC
6. 功能碼0x06:寫單個寄存器(Write Single Register)
功能碼0x06用于寫入一個保持寄存器的值。
- 請求格式:
| 地址域 | 功能碼 | 寄存器地址(2字節(jié)) | 數(shù)據(jù)(2字節(jié)) | CRC校驗 |
- 響應格式:
| 地址域 | 功能碼 | 寄存器地址(2字節(jié)) | 數(shù)據(jù)(2字節(jié)) | CRC校驗 |
示例:主機請求寫入設(shè)備0x01的保持寄存器地址0x0000,值為0x0001。 請求:01 06 00 00 00 01 CRC
響應:01 06 00 00 00 01 CRC