1 簡(jiǎn)述
Modbus寄存器分為四種,如表1.1所示:
表1.1 寄存器分類
寄存器種類 | 數(shù)據(jù)類型 | 訪問(wèn)類型 | 功能碼 | PLC地址 | 寄存器地址 |
---|---|---|---|---|---|
線圈寄存器 | 位 | 讀寫 | 01H 05H 0FH | 00001-09999 | 0000H-FFFFH |
離散輸入寄存器 | 位 | 只讀 | 02H | 10001-19999 | 0000H-FFFFH |
輸入寄存器 | 字 | 只讀 | 04H | 30001-39999 | 0000H-FFFFH |
保持寄存器 | 字 | 讀寫 | 03H 06H 10H | 40001-49999 | 0000H-FFFFH |
2 常用功能碼
Modbus中常用的功能碼有8個(gè),可以分為位操作和字操作兩類,如表2.1所示:
表2.1 常用功能碼
功能碼 | 描述 | PLC地址 | 寄存器地址 | 位/字操作 | 操作數(shù)量 |
---|---|---|---|---|---|
01H | 讀線圈寄存器 | 00001-09999 | 0000H-FFFFH | 位操作 | 單個(gè)或多個(gè) |
02H | 讀離散輸入寄存器 | 10001-19999 | 0000H-FFFFH | 位操作 | 單個(gè)或多個(gè) |
03H | 讀保持寄存器 | 40001-49999 | 0000H-FFFFH | 字操作 | 單個(gè)或多個(gè) |
04H | 讀輸入寄存器 | 30001-39999 | 0000H-FFFFH | 字操作 | 單個(gè)或多個(gè) |
05H | 寫單個(gè)線圈寄存器 | 00001-09999 | 0000H-FFFFH | 位操作 | 單個(gè) |
06H | 寫單個(gè)保持寄存器 | 40001-49999 | 0000H-FFFFH | 字操作 | 單個(gè) |
0FH | 寫多個(gè)線圈寄存器 | 00001-09999 | 0000H-FFFFH | 位操作 | 多個(gè) |
10H | 寫多個(gè)保持寄存器 | 40001-49999 | 0000H-FFFFH | 字操作 | 多個(gè) |
3 讀線圈寄存器(01H)
功能碼01H讀取Modbus從機(jī)中線圈寄存器的狀態(tài),可以是單個(gè)寄存器,或者多個(gè)連續(xù)的寄存器。
3.1 發(fā)送
假設(shè)從機(jī)地址為01H,讀取的線圈寄存器的起始地址為0017H,讀取38個(gè)寄存器,指令如表3.1所示:
表3.1 讀線圈寄存器指令:
從機(jī)地址 | 功能碼 |
起始地址 |
起始地址 低位 |
寄存器數(shù)量 高位 |
寄存器數(shù)量 低位 |
CRC高位 |
CRC低位 |
---|---|---|---|---|---|---|---|
01 | 01 | 00 | 17 | 00 | 26 | 0D | D4 |
3.2 響應(yīng)
各線圈的狀態(tài)與數(shù)據(jù)內(nèi)容的每個(gè)bit對(duì)應(yīng),1代表ON,0代表OFF。如果查詢的線圈數(shù)量不是8的倍數(shù),則在最后一個(gè)字節(jié)的高位補(bǔ)0。
表3.2.1 讀線圈狀態(tài)的返回結(jié)果
從機(jī)地址 | 功能碼 | 返回字節(jié)數(shù) | 數(shù)據(jù)1 | 數(shù)據(jù)2 | 數(shù)據(jù)3 | 數(shù)據(jù)4 | 數(shù)據(jù)5 | CRC高位 | CRC低位 |
---|---|---|---|---|---|---|---|---|---|
01 | 01 | 05 | CD | 6B | B2 | 0E | 1B | 44 | EA |
其中,第一個(gè)字節(jié)CDH對(duì)應(yīng)線圈0017H到001E的狀態(tài),轉(zhuǎn)為二進(jìn)制是11001101,其中bit0對(duì)應(yīng)0017H,bit7對(duì)應(yīng)001E,如表3.2.2所示:
表3.2.2 線圈0017H到001EH的狀態(tài)
001EH | 001DH | 001CH | 001BH | 001AH | 0019H | 0018H | 0017H |
---|---|---|---|---|---|---|---|
1 | 1 | 0 | 0 | 1 | 1 | 0 | 1 |
ON | ON | OFF | OFF | ON | ON | OFF | ON |
最后一個(gè)字節(jié)為1BH,對(duì)應(yīng)線圈0037H到003CH的狀態(tài),轉(zhuǎn)為二進(jìn)制是00011011,其中bit0對(duì)應(yīng)0037H,bit5對(duì)應(yīng)003CH,其余兩位用0填充,如表3.2.3所示:
表3.2.3 線圈0037H到003CH的狀態(tài)
003CH | 003BH | 003AH | 0039H | 0038H | 0037H | 0036H | 0035H |
---|---|---|---|---|---|---|---|
0 | 0 | 0 | 1 | 1 | 0 | 1 | 1 |
填充 | 填充 | OFF | ON | ON | OFF | ON | ON |
4 讀離散輸入寄存器(02H)
功能碼02H讀取Modbus從機(jī)中離散輸入寄存器的狀態(tài),可以是單個(gè)寄存器,或者多個(gè)連續(xù)的寄存器。
4.1 發(fā)送
假設(shè)從機(jī)地址為01H,讀取的離散輸入寄存器的起始地址為00C4H,讀取22個(gè)寄存器,指令如表4.1所示:
表4.1 讀離散輸入寄存器指令:
從機(jī)地址 | 功能碼 | 起始地址高位 | 起始地址低位 | 寄存器數(shù)量高位 | 寄存器數(shù)量低位 | CRC高位 | CRC低位 |
---|---|---|---|---|---|---|---|
01 | 02 | 00 | C4 | 00 | 16 | B8 | 39 |
4.2 響應(yīng)
各個(gè)離散輸入寄存器的狀態(tài)與數(shù)據(jù)內(nèi)容的每個(gè)bit對(duì)應(yīng),1代表ON,0代表OFF。如果查詢的線圈數(shù)量不是8的倍數(shù),則在最后一個(gè)字節(jié)的高位補(bǔ)0。
表4.2.1 讀離散輸入寄存器的返回結(jié)果
從機(jī)地址 | 功能碼 | 返回字節(jié)數(shù) | 數(shù)據(jù)1 | 數(shù)據(jù)2 | 數(shù)據(jù)3 | CRC高位 | CRC低位 |
---|---|---|---|---|---|---|---|
01 | 02 | 03 | AC | DB | 35 | 22 | 88 |
其中,第一個(gè)字節(jié)ACH對(duì)應(yīng)00C4H到00CBH寄存器的狀態(tài),轉(zhuǎn)為二進(jìn)制是10101100,其中bit0對(duì)應(yīng)00C4H,bit7對(duì)應(yīng)00CB,如表4.2.2所示:
表4.2.2 寄存器00C4H到00CBH的狀態(tài)
00CBH | 00CAH | 00C9H | 00C8H | 00C7H | 00C6H | 00C5H | 00C4H |
---|---|---|---|---|---|---|---|
1 | 0 | 1 | 0 | 1 | 1 | 0 | 0 |
ON | OFF | ON | OFF | ON | ON | OFF | OFF |
最后一個(gè)字節(jié)為35H,對(duì)應(yīng)寄存器00D4H到00D9H的狀態(tài),轉(zhuǎn)為二進(jìn)制是00110101,其中bit0對(duì)應(yīng)00D4H,bit5對(duì)應(yīng)00D9H,其余兩位用0填充,如表4.2.3所示:
表4.2.3 寄存器00D4H到00D9H的狀態(tài)
00DBH | 00DAH | 00D9H | 00D8H | 00D7H | 00D6H | 00D5H | 00D4H |
---|---|---|---|---|---|---|---|
0 | 0 | 1 | 1 | 0 | 1 | 0 | 1 |
填充 | 填充 | ON | ON | OFF | ON | OFF | ON |
5 讀保持寄存器(03H)
功能碼03H讀取Modbus從機(jī)中保持寄存器的數(shù)據(jù),可以是單個(gè)寄存器,或者多個(gè)連續(xù)的寄存器。
5.1 發(fā)送
假設(shè)從機(jī)地址為01H,讀取的保持寄存器的起始地址為006BH,讀取3個(gè)寄存器,指令如表5.1所示:
表5.1 讀保持寄存器指令:
從機(jī)地址 | 功能碼 | 起始地址高位 | 起始地址低位 | 寄存器數(shù)量高位 | 寄存器數(shù)量低位 | CRC高位 | CRC低位 |
---|---|---|---|---|---|---|---|
01 | 03 | 00 | 6B | 00 | 03 | 74 | 17 |
5.2 響應(yīng)
每個(gè)保持寄存器的長(zhǎng)度為2個(gè)字節(jié)。保持寄存器之間,低地址寄存器先傳輸,高地址寄存器后傳輸。單個(gè)保持寄存器,高字節(jié)數(shù)據(jù)先傳輸,低字節(jié)數(shù)據(jù)后傳輸。
表5.2.1 讀保持寄存器的返回結(jié)果
從機(jī)地址 | 功能碼 | 字節(jié)數(shù) | 006BH高字節(jié) | 006BH低字節(jié) | 006CH高字節(jié) | 006CH低字節(jié) | 006DH高字節(jié) | 006DH低字節(jié) | CRC高位 | CRC低位 |
---|---|---|---|---|---|---|---|---|---|---|
01 | 03 | 06 | 00 | 6B | 00 | 13 | 00 | 00 | F5 | 79 |
6 讀輸入寄存器(04H)
功能碼04H讀取Modbus從機(jī)中輸入寄存器的數(shù)據(jù),可以是單個(gè)寄存器,或者多個(gè)連續(xù)的寄存器。
6.1 發(fā)送
假設(shè)從機(jī)地址為01H,讀取的保持寄存器的起始地址為0008H,讀取2個(gè)寄存器,指令如表6.1所示:
表6.1 讀輸入寄存器指令:
從機(jī)地址 | 功能碼 | 起始地址高位 | 起始地址低位 | 寄存器數(shù)量高位 | 寄存器數(shù)量低位 | CRC高位 | CRC低位 |
---|---|---|---|---|---|---|---|
01 | 04 | 00 | 6B | 00 | 02 | 00 | 17 |
6.2 響應(yīng)
每個(gè)輸入寄存器的長(zhǎng)度為2個(gè)字節(jié)。輸入寄存器之間,低地址寄存器先傳輸,高地址寄存器后傳輸。單個(gè)輸入寄存器,高字節(jié)數(shù)據(jù)先傳輸,低字節(jié)數(shù)據(jù)后傳輸。
表6.2.1 讀輸入寄存器的返回結(jié)果
從機(jī)地址 | 功能碼 | 字節(jié)數(shù) | 0008H高字節(jié) | 0008H低字節(jié) | 0009H高字節(jié) | 0009H低字節(jié) | CRC高位 | CRC低位 |
---|---|---|---|---|---|---|---|---|
01 | 04 | 04 | 00 | 0A | 00 | 0B | 9A | 41 |
7 寫單個(gè)線圈寄存器(05H)
功能碼05H寫單個(gè)線圈寄存器,F(xiàn)F00H請(qǐng)求線圈處于ON狀態(tài),0000H請(qǐng)求線圈處于OFF狀態(tài)。
7.1 發(fā)送
假設(shè)從機(jī)地址為01H,線圈寄存器的地址為00ACH,使其處于ON狀態(tài)的指令如表7.1所示:
表7.1 寫單個(gè)線圈指令:
從機(jī)地址 | 功能碼 | 寄存器地址高位 | 寄存器地址低位 | 數(shù)據(jù)高位 | 數(shù)據(jù)低位 | CRC高位 | CRC低位 |
---|---|---|---|---|---|---|---|
01 | 05 | 00 | AC | FF | 00 | 4C | 1B |
7.2 響應(yīng)
如果寫入成功,返回發(fā)送的指令,即010500ACFF004C1B。
8 寫單個(gè)保持寄存器(06H)
功能碼06H寫單個(gè)保持寄存器。
8.1 發(fā)送
假設(shè)從機(jī)地址為01H,保持寄存器的地址為0001H,數(shù)據(jù)位0003H,指令如表8.1所示:
表8.1 寫單個(gè)保持寄存器指令:
從機(jī)地址 | 功能碼 | 寄存器地址高位 | 寄存器地址低位 | 數(shù)據(jù)高位 | 數(shù)據(jù)低位 | CRC高位 | CRC低位 |
---|---|---|---|---|---|---|---|
01 | 06 | 00 | 01 | 00 | 03 | 98 | 0B |
8.2 響應(yīng)
如果寫入成功,返回發(fā)送的指令,即010600010003980B。
9 寫多個(gè)線圈寄存器(0FH)
功能碼0FH寫多個(gè)線圈寄存器。如果對(duì)應(yīng)的數(shù)據(jù)位為1,表示線圈狀態(tài)為ON;如果對(duì)應(yīng)的數(shù)據(jù)位為0,表示線圈狀態(tài)為OFF。線圈寄存器之間,低地址寄存器先傳輸,高地址寄存器后傳輸。單個(gè)線圈寄存器,高字節(jié)數(shù)據(jù)先傳輸,低字節(jié)數(shù)據(jù)后傳輸。如果寫入的線圈寄存器的個(gè)數(shù)不是8的倍數(shù),則在最后一個(gè)字節(jié)的高位補(bǔ)0。
9.1 發(fā)送
假設(shè)從機(jī)地址為01H,線圈寄存器的起始地址為0013H,寫入10個(gè)寄存器,指令如表9.1.1所示:
表9.1.1 寫入多個(gè)線圈寄存器指令
從機(jī)地址 | 功能碼 | 起始地址高位 | 起始地址低位 | 數(shù)量高位 | 數(shù)量低位 | 字節(jié)數(shù) | 數(shù)據(jù)1 | 數(shù)據(jù)2 | CRC高位 | CRC低位 |
---|---|---|---|---|---|---|---|---|---|---|
01 | 0F | 00 | 13 | 00 | 0A | 02 | CD | 01 | 72 | CB |
其中,CDH對(duì)應(yīng)線圈0013H到001AH的內(nèi)容,01H對(duì)應(yīng)線圈001B到001CH的內(nèi)容,未使用位用0填充。
此時(shí),線圈寄存器的內(nèi)容如表9.1.2所示:
表9.1.2 線圈寄存器0013H到001CH的內(nèi)容
001AH | 0019H | 0018H | 0017H | 0016H | 0015H | 0014H | 0013H |
---|---|---|---|---|---|---|---|
1 | 1 | 0 | 0 | 1 | 1 | 0 | 1 |
0022H | 0021H | 0020H | 001FH | 001EH | 001DH | 001CH | 001BH |
---|---|---|---|---|---|---|---|
0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
9.2 響應(yīng)
如果寫入成功,返回寫入的寄存器數(shù)量,如表9.2所示:
表9.2 寫多個(gè)線圈寄存器的返回結(jié)果
從機(jī)地址 | 功能碼 | 起始地址高位 | 起始地址低位 | 數(shù)量高位 | 數(shù)量低位 | CRC高位 | CRC低位 |
---|---|---|---|---|---|---|---|
01 | 0F | 00 | 13 | 00 | 0A | 24 | 09 |
10 寫多個(gè)保持寄存器(10H)
功能碼10H寫多個(gè)保持寄存器,其中每個(gè)保持寄存器的長(zhǎng)度為兩個(gè)字節(jié)。
10.1 發(fā)送
假設(shè)從機(jī)地址為01H,保持寄存器的起始地址為0001H,寫入2個(gè)寄存器,指令如表10.1所示:
表10.1 寫入多個(gè)保持寄存器指令
從機(jī)地址 | 功能碼 | 起始地址高位 | 起始地址低位 | 數(shù)量高位 | 數(shù)量低位 | 字節(jié)數(shù) | 0001H高位 | 0001H低位 | 0002H高位 | 0002H低位 | CRC高位 | CRC低位 |
---|---|---|---|---|---|---|---|---|---|---|---|---|
01 | 10 | 00 | 01 | 00 | 02 | 04 | 00 | 0A | 01 | 02 | 92 | 30 |
10.2 響應(yīng)
如果寫入成功,返回寫入的寄存器數(shù)量,如表10.2所示:
表10.2 寫多個(gè)保持寄存器的返回結(jié)果
從機(jī)地址 | 功能碼 | 起始地址高位 | 起始地址低位 | 數(shù)量高位 | 數(shù)量低位 | CRC高位 | CRC低位 |
---|---|---|---|---|---|---|---|
01 | 10 | 00 | 01 | 00 | 02 | 10 | 08 |