标准Modbus通讯协议格式
Modbus協(xié)議是請求/應(yīng)答通信協(xié)議,其中功能碼主要用于表述該數(shù)據(jù)報文執(zhí)行的功能,當(dāng)服務(wù)器對客戶機(jī)進(jìn)行響應(yīng)時,它使用功能碼域來指示正常響應(yīng)(無差錯)或者異常響應(yīng)(即出現(xiàn)某種差錯)。
功能碼說明
Modbus協(xié)議處理的所有數(shù)據(jù)按照存儲數(shù)據(jù)的類型可分為位寄存器(1bit)和16位寄存器(16bit)。因此功能碼可分為位操作和字操作兩類。位操作的最小單位是bit,字操作的最小單位是兩個字節(jié)。
寄存器功能碼說明
寄存器種類說明
Modbus RTU報文幀格式
地址碼(1字節(jié)) + 功能碼(1字節(jié))+ 數(shù)據(jù)區(qū)(0~252字節(jié)) + 錯誤校驗(yàn)碼(2字節(jié))- 1
- 1
地址碼為通信的第一字節(jié),每個從站都有一個唯一的地址碼,只有符合主站發(fā)送的地址碼的從站才能響應(yīng)回送。地址0為廣播地址,所有的從站都能識別,但不做響應(yīng),從站的地址范圍為(1~247)。
數(shù)據(jù)區(qū)根據(jù)功能碼的不同而不同。下面會結(jié)合功能碼介紹。
主站或從站通過校驗(yàn)碼判別報文在通訊過程中是否出錯。RTU報文使用CRC檢測,ASCII報文使用LRC檢測。
<1>功能碼01(0x01) 讀線圈狀態(tài)
發(fā)送:
| 1字節(jié)(1~147) | 1字節(jié)(0x1) | 2字節(jié)(0x0000~0xFFFF) | 2字節(jié)(1~2000) | 2字節(jié) |
接收:
| 1字節(jié)(1~147) | 1字節(jié)(0x1) | 1字節(jié)(N) | N字節(jié) | 2字節(jié) |
N=讀取線圈個數(shù)/8,如果余數(shù)不為0則N=N+1。
例子:
發(fā)送: 01 01 00 00 00 19 FD C0 (讀取25個線圈的狀態(tài))
接收: 01 01 04 0F 03 80 01 A8 C5
<2>功能碼02(0x02) 讀取輸入狀態(tài)
發(fā)送:
| 1字節(jié)(1~147) | 1字節(jié)(0x2) | 2字節(jié)(0x0000~0xFFFF) | 2字節(jié)(1~2000) | 2字節(jié) |
接收:
| 1字節(jié)(1~147) | 1字節(jié)(0x2) | 1字節(jié)(N) | N字節(jié) | 2字節(jié) |
N=讀取線圈個數(shù)/8,如果余數(shù)不為0則N=N+1。
例子:
發(fā)送: 01 02 00 00 00 19 B9 C0 (讀取25個輸入線圈的狀態(tài))
接收: 01 02 04 00 00
<3>功能碼03(0x03) 讀保持寄存器
發(fā)送:
| 1字節(jié)(1~147) | 1字節(jié)(0x3) | 2字節(jié)(0x0000~0xFFFF) | 2字節(jié)( 1~125) | 2字節(jié) |
接收:
| 1字節(jié)(1~147) | 1字節(jié)(0x3) | 1字節(jié)(N) | 2*N字節(jié) | 2字節(jié) |
N=寄存器的數(shù)量,03碼每個寄存器是16位的。
不難看出03碼的發(fā)送接收規(guī)律,主站發(fā)送為固定格式的8字節(jié)長度數(shù)據(jù),從站返回長度隨主站讀取個數(shù)的不同而不同。
這里舉個例子:主站向從站地址為01的設(shè)備,請求從設(shè)備地址 00 00 處讀取3個寄存器的值。從站接受到請后,返回主站讀取到的3個寄存器的值,每個寄存器由2個字節(jié)組成。
發(fā)送:01 03 00 00 00 03 05 CB
接收:01 03 06 01 2C 01 2C 01 2C 71 1A
<4>功能碼05(0x05) 寫單一線圈
發(fā)送:
| 1字節(jié)(1~147) | 1字節(jié)(0x5) | 2字節(jié)(0x0000~0xFFFF) | 2字節(jié) | 2字節(jié) |
線圈寫入值只能為0x0000或0xFF00
接收:
| 1字節(jié)(1~147) | 1字節(jié)(0x5) | 2字節(jié)(0x0000~0xFFFF) | 2字節(jié) | 2字節(jié) |
05碼的發(fā)送和接收相同。
發(fā)送:01 05 00 00 FF 00 8C 3A (寫單個線圈的值,把地址為0的線圈置1)
接收:01 05 00 00 FF 00 8C 3A
<5>功能碼06(0x06) 寫單一寄存器
發(fā)送:
| 1字節(jié)(1~147) | 1字節(jié)(0x6) | 2字節(jié)(0x0000~0xFFFF) | 2字節(jié)( 0x0000~0xFFFF) | 2字節(jié) |
接收:
| 1字節(jié)(1~147) | 1字節(jié)(0x6) | 2字節(jié)(0x0000~0xFFFF) | 2字節(jié)( 0x0000~0xFFFF) | 2字節(jié) |
06碼的發(fā)送和接收相同。
發(fā)送: 01 06 00 00 00 0A 09 CD (往地址為0的寄存器寫入10)
接收: 01 06 00 00 00 0A 09 CD
<6>功能碼15(0x0F) 寫多線圈
發(fā)送:
| 1字節(jié)(1~147) | 1字節(jié)(0xF) | 2字節(jié)(0x0000~0xFFFF) | 2字節(jié)( 0x0001~0x07B0) | 1字節(jié)(N) | N字節(jié) | 2字節(jié) |
N=讀取線圈個數(shù)/8,如果余數(shù)不為0則N=N+1。
接收:
| 1字節(jié)(1~147) | 1字節(jié)(0xF) | 2字節(jié)(0x0000~0xFFFF) | 2字節(jié)( 0x0001~0x07B0) | 2字節(jié) |
發(fā)送: 01 0F 00 00 00 0A 02 01 01 25 68
返回: 01 0F 00 00 00 0A D5 CC
<7>功能碼16(0x10) 寫多寄存器
發(fā)送:
| 1字節(jié)(1~147) | 1字節(jié)(0x10) | 2字節(jié)(0x0000~0xFFFF) | 2字節(jié)( 0x0001~0x07B0) | 1字節(jié)(N) | 2*N字節(jié) | 2字節(jié) |
接收:
| 1字節(jié)(1~147) | 1字節(jié)(0x10) | 2字節(jié)(0x0000~0xFFFF) | 2字節(jié)( 0x0001~0x07B0) | 2字節(jié) |
發(fā)送:01 10 00 00 00 02 04 00 01 00 02 23 AE
接收:01 10 00 00 00 02 41 C8
總結(jié)
以上是生活随笔為你收集整理的标准Modbus通讯协议格式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: matlab产生泊松分布
- 下一篇: 红色警戒2修改器原理百科(七)