ModbusTCP协议
Modbus由MODICON公司于1979年開發(fā),是一種工業(yè)現(xiàn)場總線協(xié)議標(biāo)準(zhǔn)。1996年施耐德公司推出基于以太網(wǎng)TCP/IP的Modbus協(xié)議:ModbusTCP。
Modbus協(xié)議是一項(xiàng)應(yīng)用層報(bào)文傳輸協(xié)議,包括ASCII、RTU、TCP三種報(bào)文類型。
標(biāo)準(zhǔn)的Modbus協(xié)議物理層接口有RS232、RS422、RS485和以太網(wǎng)接口,采用master/slave方式通信。
ModbusTCP的數(shù)據(jù)幀可分為兩部分:MBAP+PDU。
報(bào)文頭MBAP
MBAP為報(bào)文頭,長度為7字節(jié),組成如下:
| 事務(wù)處理標(biāo)識(shí) | 協(xié)議標(biāo)識(shí) | 長度 | 單元標(biāo)識(shí)符 |
| 2字節(jié) | 2字節(jié) | 2字節(jié) | 1字節(jié) |
| 內(nèi)容 | 解釋 |
| 事務(wù)處理標(biāo)識(shí) | 可以理解為報(bào)文的序列號(hào),一般每次通信之后就要加1以區(qū)別不同的通信數(shù)據(jù)報(bào)文。 |
| 協(xié)議標(biāo)識(shí)符 | 00 00表示ModbusTCP協(xié)議。 |
| 長度 | 表示接下來的數(shù)據(jù)長度,單位為字節(jié)。 |
| 單元標(biāo)識(shí)符 | 可以理解為設(shè)備地址。 |
幀結(jié)構(gòu)PDU
PDU由功能碼+數(shù)據(jù)組成。功能碼為1字節(jié),數(shù)據(jù)長度不定,由具體功能決定。
功能碼
Modbus的操作對(duì)象有四種:線圈、離散輸入、保持寄存器、輸入寄存器。
| 對(duì)象 | 含義 |
| 線圈 | PLC的輸出位,開關(guān)量,在Modbus中可讀可寫 |
| 離散量 | PLC的輸入位,開關(guān)量,在Modbus中只讀 |
| 輸入寄存器 | PLC中只能從模擬量輸入端改變的寄存器,在Modbus中只讀 |
| 保持寄存器 | PLC中用于輸出模擬量信號(hào)的寄存器,在Modbus中可讀可寫 |
根據(jù)對(duì)象的不同,Modbus的功能碼有:
| 功能碼 | 含義 |
| 0x01 | 讀線圈 |
| 0x05 | 寫單個(gè)線圈 |
| 0x0F | 寫多個(gè)線圈 |
| 0x02 | 讀離散量輸入 |
| 0x04 | 讀輸入寄存器 |
| 0x03 | 讀保持寄存器 |
| 0x06 | 寫單個(gè)保持寄存器 |
| 0x10 | 寫多個(gè)保持寄存器 |
說明更詳細(xì)的表
| 代碼 | 中文名稱 | 英文名 | 位操作/字操作 | 操作數(shù)量 |
| 01 | 讀線圈狀態(tài) | READ COIL STATUS | 位操作 | 單個(gè)或多個(gè) |
| 02 | 讀離散輸入狀態(tài) | READ INPUT STATUS | 位操作 | 單個(gè)或多個(gè) |
| 03 | 讀保持寄存器 | READ HOLDING REGISTER | 字操作 | 單個(gè)或多個(gè) |
| 04 | 讀輸入寄存器 | READ INPUT REGISTER | 字操作 | 單個(gè)或多個(gè) |
| 05 | 寫線圈狀態(tài) | WRITE SINGLE COIL | 位操作 | 單個(gè) |
| 06 | 寫單個(gè)保持寄存器 | WRITE SINGLE REGISTER | 字操作 | 單個(gè) |
| 15 | 寫多個(gè)線圈 | WRITE MULTIPLE COIL | 位操作 | 多個(gè) |
| 16 | 寫多個(gè)保持寄存器 | WRITE MULTIPLE REGISTER | 字操作 | 多個(gè) |
PDU詳細(xì)結(jié)構(gòu)
0x01:讀線圈
在從站中讀1~2000個(gè)連續(xù)線圈狀態(tài),ON=1,OFF=0
-
請(qǐng)求:MBAP 功能碼 起始地址H 起始地址L 數(shù)量H 數(shù)量L(共12字節(jié))
-
響應(yīng):MBAP 功能碼 數(shù)據(jù)長度 數(shù)據(jù)(一個(gè)地址的數(shù)據(jù)為1位)
-
如:在從站0x01中,讀取開始地址為0x0002的線圈數(shù)據(jù),讀0x0008位
00 01 00 00 00 06 01 01 00 02 00 08
-
回:數(shù)據(jù)長度為0x01個(gè)字節(jié),數(shù)據(jù)為0x01,第一個(gè)線圈為ON,其余為OFF
00 01 00 00 00 04 01 01 01 01
0x05:寫單個(gè)線圈
將從站中的一個(gè)輸出寫成ON或OFF,0xFF00請(qǐng)求輸出為ON,0x000請(qǐng)求輸出為OFF
-
請(qǐng)求:MBAP 功能碼 輸出地址H 輸出地址L 輸出值H 輸出值L(共12字節(jié))
-
響應(yīng):MBAP 功能碼 輸出地址H 輸出地址L 輸出值H 輸出值L(共12字節(jié))
-
如:將地址為0x0003的線圈設(shè)為ON
00 01 00 00 00 06 01 05 00 03 FF 00
-
回:寫入成功
00 01 00 00 00 06 01 05 00 03 FF 00
0x0F:寫多個(gè)線圈
將一個(gè)從站中的一個(gè)線圈序列的每個(gè)線圈都強(qiáng)制為ON或OFF,數(shù)據(jù)域中置1的位請(qǐng)求相應(yīng)輸出位ON,置0的位請(qǐng)求響應(yīng)輸出為OFF
-
請(qǐng)求:MBAP 功能碼 起始地址H 起始地址L 輸出數(shù)量H 輸出數(shù)量L 字節(jié)長度 輸出值H 輸出值L
-
響應(yīng):MBAP 功能碼 起始地址H 起始地址L 輸出數(shù)量H 輸出數(shù)量L
0x02:讀離散量輸入
從一個(gè)從站中讀1~2000個(gè)連續(xù)的離散量輸入狀態(tài)
-
請(qǐng)求:MBAP 功能碼 起始地址H 起始地址L 數(shù)量H 數(shù)量L(共12字節(jié))
-
響應(yīng):MBAP 功能碼 數(shù)據(jù)長度 數(shù)據(jù)(長度:9+ceil(數(shù)量/8))
-
如:從地址0x0000開始讀0x0012個(gè)離散量輸入
00 01 00 00 00 06 01 02 00 00 00 12
-
回:數(shù)據(jù)長度為0x03個(gè)字節(jié),數(shù)據(jù)為0x01 04 00,表示第一個(gè)離散量輸入和第11個(gè)離散量輸入為ON,其余為OFF
00 01 00 00 00 06 01 02 03 01 04 00
0x04:讀輸入寄存器
從一個(gè)遠(yuǎn)程設(shè)備中讀1~2000個(gè)連續(xù)輸入寄存器
-
請(qǐng)求:MBAP 功能碼 起始地址H 起始地址L 寄存器數(shù)量H 寄存器數(shù)量L(共12字節(jié))
-
響應(yīng):MBAP 功能碼 數(shù)據(jù)長度 寄存器數(shù)據(jù)(長度:9+寄存器數(shù)量×2)
-
如:讀起始地址為0x0002,數(shù)量為0x0005的寄存器數(shù)據(jù)
00 01 00 00 00 06 01 04 00 02 00 05
-
回:數(shù)據(jù)長度為0x0A,第一個(gè)寄存器的數(shù)據(jù)為0x0c,其余為0x00
00 01 00 00 00 0D 01 04 0A 00 0C 00 00 00 00 00 00 00 00
0x03:讀保持寄存器
從遠(yuǎn)程設(shè)備中讀保持寄存器連續(xù)塊的內(nèi)容
-
請(qǐng)求:MBAP 功能碼 起始地址H 起始地址L 寄存器數(shù)量H 寄存器數(shù)量L(共12字節(jié))
-
響應(yīng):MBAP 功能碼 數(shù)據(jù)長度 寄存器數(shù)據(jù)(長度:9+寄存器數(shù)量×2)
-
如:起始地址是0x0000,寄存器數(shù)量是 0x0003
00 01 00 00 00 06 01 03 00 00 00 03
-
回:數(shù)據(jù)長度為0x06,第一個(gè)寄存器的數(shù)據(jù)為0x21,其余為0x00
00 01 00 00 00 09 01 03 06 00 21 00 00 00 00
0x06:寫單個(gè)保持寄存器
在一個(gè)遠(yuǎn)程設(shè)備中寫一個(gè)保持寄存器
-
請(qǐng)求:MBAP 功能碼 寄存器地址H 寄存器地址L 寄存器值H 寄存器值L(共12字節(jié))
-
響應(yīng):MBAP 功能碼 寄存器地址H 寄存器地址L 寄存器值H 寄存器值L(共12字節(jié))
-
如:向地址是0x0000的寄存器寫入數(shù)據(jù)0x000A
00 01 00 00 00 06 01 06 00 00 00 0A
-
回:寫入成功
00 01 00 00 00 06 01 06 00 00 00 0A
0x10:寫多個(gè)保持寄存器
在一個(gè)遠(yuǎn)程設(shè)備中寫連續(xù)寄存器塊(1~123個(gè)寄存器)
-
請(qǐng)求:MBAP 功能碼 起始地址H 起始地址L 寄存器數(shù)量H 寄存器數(shù)量L 字節(jié)長度 寄存器值(13+寄存器數(shù)量×2)
-
響應(yīng):MBAP 功能碼 起始地址H 起始地址L 寄存器數(shù)量H 寄存器數(shù)量L(共12字節(jié))
-
如:向起始地址為0x0000,數(shù)量為0x0001的寄存器寫入數(shù)據(jù),數(shù)據(jù)長度為0x02,數(shù)據(jù)為0x000F
00 01 00 00 00 09 01 10 00 00 00 01 02 00 0F
-
回:寫入成功
00 01 00 00 00 06 01 10 00 00 00 01
總結(jié)
以上是生活随笔為你收集整理的ModbusTCP协议的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [SPOJ CIRU]The area
- 下一篇: do_fork函数