Modbus通信協(xié)議具有多個(gè)變種,支持串口(主要是RS-485總線),以太網(wǎng)多個(gè)版本,其中最著名的是Modbus RTU,Modbus ASCII和Modbus TCP三種。
在工業(yè)現(xiàn)場(chǎng)一般都是采用Modbus RTU協(xié)議,一般而言,大家說(shuō)的基于串口通信的Modbus通信協(xié)議都是指Modbus RTU通信協(xié)議。與Modbus RTU協(xié)議相比較,
Modbus TCP協(xié)議則是在RTU協(xié)議上加一個(gè)MBAP報(bào)文頭,并且由于TCP是基于可靠連接的服務(wù),RTU協(xié)議中的CRC校驗(yàn)碼就不再需要,所以在Modbus TCP協(xié)
議中是沒(méi)有CRC校驗(yàn)碼的,所以就常用一句比較通俗的話來(lái)說(shuō):Modbus TCP協(xié)議就是Modbus RTU協(xié)議在前面加上五個(gè)0以及一個(gè)6,然后去掉兩個(gè)CRC校驗(yàn)碼
字節(jié)就OK。雖然這句話說(shuō)得不是特別準(zhǔn)確,但是也基本上把RTU與TCP之間的區(qū)別說(shuō)得比較清楚了。
Modbus的功能碼有:
功能碼 | 含義 | 功能碼 | 含義 |
0x01 | 讀線圈 | 0x04 | 讀輸入寄存器 |
0x05 | 寫單個(gè)線圈 | 0x03 | 讀保持寄存器 |
0x0F | 寫多個(gè)線圈 | 0x06 | 寫單個(gè)保持寄存器 |
0x02 | 讀離散量輸入 | 0x10 | 寫多個(gè)保持寄存器 |
一、Modbus RTU
RTU協(xié)議中的指令由地址碼(一個(gè)字節(jié)),功能碼(一個(gè)字節(jié)),起始地址(兩個(gè)字節(jié)),數(shù)據(jù)(N個(gè)字節(jié)),校驗(yàn)碼(兩個(gè)字節(jié))五個(gè)部分組成。
數(shù)據(jù)由數(shù)據(jù)長(zhǎng)度(兩個(gè)字節(jié),表示的是寄存器個(gè)數(shù),假定為M)和數(shù)據(jù)正文(M乘以2個(gè)字節(jié))組成。
發(fā):01 03 01 8E 00 04 25 DE //讀(0x03),從寄存器地址01 8E 開(kāi)始讀,讀4個(gè)寄存器00 04
回:01 03 08 00 01 00 01 00 01 00 01 28 D7 // 08表示數(shù)據(jù)長(zhǎng)度 ,00 01 00 01 00 01 00 01讀到的數(shù)據(jù)
發(fā):00 10 00 20 00 01 02 00 00 AC A0 // 寫(0x10),從寄存器地址 00 20開(kāi)始寫,寫一個(gè)寄存器 00 01,寫入值 00 00
回:00 10 00 20 00 01 01 D2
二、Modbus TCP
Modbus TCP協(xié)議是在RTU協(xié)議前面添加MBAP報(bào)文頭,由于TCP是基于可靠連接的服務(wù),RTU協(xié)議中的CRC校驗(yàn)碼就不再需要,所以在Modbus TCP協(xié)議中是沒(méi)有CRC校驗(yàn)碼。
MBAP報(bào)文頭:
事務(wù)處理標(biāo)識(shí) | 協(xié)議標(biāo)識(shí) | 長(zhǎng)度 | 單元標(biāo)識(shí)符 |
2字節(jié) | 2字節(jié) | 2字節(jié) | 1字節(jié) |
事務(wù)處理標(biāo)識(shí) | 可以理解為報(bào)文的序列號(hào),一般每次通信之后就要加1以區(qū)別不同的通信數(shù)據(jù)報(bào)文 |
協(xié)議標(biāo)識(shí)符 | 00 00表示ModbusTCP協(xié)議 |
長(zhǎng)度 | 表示接下來(lái)的數(shù)據(jù)長(zhǎng)度,單位為字節(jié) |
單元標(biāo)識(shí)符 | 可以理解為設(shè)備地址 |
發(fā):00 00 00 00 00 06 00 03 00 20 00 01
回:00 00 00 00 00 05 00 03 02 00 00
發(fā):00 00 00 00 00 06 00 04 00 30 00 01
回:00 00 00 00 00 05 00 04 02 00 08
發(fā):00 00 00 00 00 09 00 10 00 20 00 01 02 00 00
回:00 00 00 00 00 06 00 10 00 20 00 01
三、總結(jié)(注:16進(jìn)制發(fā)送)
1、讀指令對(duì)比(0x04)
MBAP報(bào)文頭 | 地址碼 | 功能碼 | 寄存器地址 | 寄存器數(shù)量 | CRC校驗(yàn) | |
Modbus RTU | 無(wú) | 01 | 04 | 00 00 | 00 16 | 71 C4 |
Modbus TCP | 00 00 00 00 00 06 01 | 04 | 00 00 | 00 16 | 無(wú) |
2、寫指令對(duì)比(0x10)
MBAP報(bào)文頭 | 地址碼 | 功能碼 | 寄存器地址 | 寄存器數(shù)量 | 數(shù)據(jù)長(zhǎng)度 | 正文 | CRC校驗(yàn) | |
Modbus RTU | 無(wú) | 00 | 10 | 00 20 | 00 01 | 02 | 00 00 | AC A0 |
Modbus TCP | 00 00 00 00 00 09 00 | 10 | 00 20 | 00 01 | 02 | 00 00 | 無(wú) |