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