標準Modbus通訊協議格式----古月金真
Modbus協議是請求/應答通訊協議,其中功能碼主要用於表述該資料報文執行的功能,當伺服器對客戶機進行響應時,它使用功能碼域來指示正常響應(無差錯)或者異常響應(即出現某種差錯)。
功能碼說明
Modbus協議處理的所有資料按照儲存資料的型別可分為位暫存器(1bit)和16位暫存器(16bit)。因此功能碼可分為位操作和字操作兩類。位操作的最小單位是bit,字操作的最小單位是兩個位元組。
暫存器功能碼說明
暫存器種類說明
Modbus RTU報文幀格式
地址碼(1位元組) + 功能碼(1位元組)+ 資料區(0~252位元組) + 錯誤校驗碼(2位元組)
- 1
- 地址碼
地址碼為通訊的第一位元組,每個從站都有一個唯一的地址碼,只有符合主站傳送的地址碼的從站才能響應回送。地址0為廣播地址,所有的從站都能識別,但不做響應,從站的地址範圍為(1~247)。 - 資料區
資料區根據功能碼的不同而不同。下面會結合功能碼介紹。 - 校驗碼
主站或從站通過校驗碼判別報文在通訊過程中是否出錯。RTU報文使用CRC檢測,ASCII報文使用LRC檢測。 - 功能碼
<1>功能碼01(0x01) 讀線圈狀態
傳送:
從站地址 | 功能碼 | 起始地址 | 線圈數量 | CRC |
---|---|---|---|---|
1位元組(1~147) | 1位元組(0x1) | 2位元組(0x0000~0xFFFF) | 2位元組(1~2000) | 2位元組 |
接收:
從站地址 | 功能碼 | 位元組數 | 線圈狀態 | CRC |
---|---|---|---|---|
1位元組(1~147) | 1位元組(0x1) | 1位元組(N) | N位元組 | 2位元組 |
N=讀取線圈個數/8,如果餘數不為0則N=N+1。
例子:
傳送: 01 01 00 00 00 19 FD C0 (讀取25個線圈的狀態)
接收: 01 01 04 0F 03 80 01 A8 C5
<2>功能碼02(0x02) 讀取輸入狀態
傳送:
從站地址 | 功能碼 | 起始地址 | 輸入點數量 | CRC |
---|---|---|---|---|
1位元組(1~147) | 1位元組(0x2) | 2位元組(0x0000~0xFFFF) | 2位元組(1~2000) | 2位元組 |
接收:
從站地址 | 功能碼 | 位元組數 | 輸入點狀態 | CRC |
---|---|---|---|---|
1位元組(1~147) | 1位元組(0x2) | 1位元組(N) | N位元組 | 2位元組 |
N=讀取線圈個數/8,如果餘數不為0則N=N+1。
例子:
傳送: 01 02 00 00 00 19 B9 C0 (讀取25個輸入線圈的狀態)
接收: 01 02 04 00 00
<3>功能碼03(0x03) 讀保持暫存器
傳送:
從站地址 | 功能碼 | 起始地址 | 暫存器數量 | CRC |
---|---|---|---|---|
1位元組(1~147) | 1位元組(0x3) | 2位元組(0x0000~0xFFFF) | 2位元組( 1~125) | 2位元組 |
接收:
從站地址 | 功能碼 | 位元組數 | 暫存器值 | CRC |
---|---|---|---|---|
1位元組(1~147) | 1位元組(0x3) | 1位元組(N) | 2*N位元組 | 2位元組 |
N=暫存器的數量,03碼每個暫存器是16位的。
不難看出03碼的傳送接收規律,主站傳送為固定格式的8位元組長度資料,從站返回長度隨主站讀取個數的不同而不同。
這裡舉個例子:主站向從站地址為01的裝置,請求從裝置地址 00 00 處讀取3個暫存器的值。從站接受到請後,返回主站讀取到的3個暫存器的值,每個暫存器由2個位元組組成。
傳送:01 03 00 00 00 03 05 CB
接收:01 03 06 01 2C 01 2C 01 2C 71 1A
<4>功能碼05(0x05) 寫單一線圈
傳送:
從站地址 | 功能碼 | 線圈地址 | 寫入值 | CRC |
---|---|---|---|---|
1位元組(1~147) | 1位元組(0x5) | 2位元組(0x0000~0xFFFF) | 2位元組 | 2位元組 |
線圈寫入值只能為0x0000或0xFF00
接收:
從站地址 | 功能碼 | 線圈地址 | 寫入值 | CRC |
---|---|---|---|---|
1位元組(1~147) | 1位元組(0x5) | 2位元組(0x0000~0xFFFF) | 2位元組 | 2位元組 |
05碼的傳送和接收相同。
傳送:01 05 00 00 FF 00 8C 3A (寫單個線圈的值,把地址為0的線圈置1)
接收:01 05 00 00 FF 00 8C 3A
<5>功能碼06(0x06) 寫單一暫存器
傳送:
從站地址 | 功能碼 | 暫存器地址 | 寫入值 | CRC |
---|---|---|---|---|
1位元組(1~147) | 1位元組(0x6) | 2位元組(0x0000~0xFFFF) | 2位元組( 0x0000~0xFFFF) | 2位元組 |
接收:
從站地址 | 功能碼 | 暫存器地址 | 寫入值 | CRC |
---|---|---|---|---|
1位元組(1~147) | 1位元組(0x6) | 2位元組(0x0000~0xFFFF) | 2位元組( 0x0000~0xFFFF) | 2位元組 |
06碼的傳送和接收相同。
傳送: 01 06 00 00 00 0A 09 CD (往地址為0的暫存器寫入10)
接收: 01 06 00 00 00 0A 09 CD
<6>功能碼15(0x0F) 寫多線圈
傳送:
從站地址 | 功能碼 | 起始地址 | 寫入線圈個數 | 寫入位元組數 | 寫入值 | CRC |
---|---|---|---|---|---|---|
1位元組(1~147) | 1位元組(0xF) | 2位元組(0x0000~0xFFFF) | 2位元組( 0x0001~0x07B0) | 1位元組(N) | N位元組 | 2位元組 |
N=讀取線圈個數/8,如果餘數不為0則N=N+1。
接收:
從站地址 | 功能碼 | 起始地址 | 寫入線圈個數 | CRC |
---|---|---|---|---|
1位元組(1~147) | 1位元組(0xF) | 2位元組(0x0000~0xFFFF) | 2位元組( 0x0001~0x07B0) | 2位元組 |
傳送: 01 0F 00 00 00 0A 02 01 01 25 68
返回: 01 0F 00 00 00 0A D5 CC
<7>功能碼16(0x10) 寫多暫存器
傳送:
從站地址 | 功能碼 | 起始地址 | 寫入暫存器個數 | 寫入位元組數 | 寫入值 | CRC |
---|---|---|---|---|---|---|
1位元組(1~147) | 1位元組(0x10) | 2位元組(0x0000~0xFFFF) | 2位元組( 0x0001~0x07B0) | 1位元組(N) | 2*N位元組 | 2位元組 |
接收:
從站地址 | 功能碼 | 起始地址 | 寫入暫存器個數 | CRC |
---|---|---|---|---|
1位元組(1~147) | 1位元組(0x10) | 2位元組(0x0000~0xFFFF) | 2位元組( 0x0001~0x07B0) | 2位元組 |
傳送:01 10 00 00 00 02 04 00 01 00 02 23 AE
接收:01 10 00 00 00 02 41 C8