Modbus 功能碼解析

Modbus協議是請求/應答通信協議,其中功能碼主要用於表述該數據報文執行的功能,當服務器對客戶機進行響應時,它使用功能碼域來指示正常響應(無差錯)或者異常響應(即出現某種差錯)。


功能碼說明

Modbus協議處理的所有數據按照存儲數據的類型可分爲位寄存器(1bit)和16位寄存器(16bit)。因此功能碼可分爲位操作和字操作兩類。位操作的最小單位是bit,字操作的最小單位是兩個字節。

寄存器功能碼說明
這裏寫圖片描述

寄存器種類說明
這裏寫圖片描述

Modbus RTU報文幀格式 

 地址碼(1字節) + 功能碼(1字節)+  數據區(0~252字節) + 錯誤校驗碼(2字節)
  1. 地址碼
    地址碼爲通信的第一字節,每個從站都有一個唯一的地址碼,只有符合主站發送的地址碼的從站才能響應回送。地址0爲廣播地址,所有的從站都能識別,但不做響應,從站的地址範圍爲(1~247)。
  2. 數據區
    數據區根據功能碼的不同而不同。下面會結合功能碼介紹。
  3. 校驗碼
    主站或從站通過校驗碼判別報文在通訊過程中是否出錯。RTU報文使用CRC檢測,ASCII報文使用LRC檢測。
  4. 功能碼

<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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章