- 1、01X 讀取一組邏輯線圈的當(dāng)前狀態(tài)(ON/OFF)
- 2、0x02 讀取一組開關(guān)輸入的當(dāng)前狀態(tài)(ON/OFF)
- 3、0x03 讀取一個(gè)或多個(gè)保持寄存器的數(shù)值
- 5、0x05 強(qiáng)置一個(gè)邏輯線圈的通斷狀態(tài)
- ** 6、0x06 寫單個(gè)保持寄存器**
- ** 7、0x0f 強(qiáng)置多個(gè)邏輯線圈的通斷狀態(tài)**
- 8、0x10 寫多個(gè)保持寄存器
- 9、0x2b 讀取設(shè)備ID
1、01X 讀取一組邏輯線圈的當(dāng)前狀態(tài)(ON/OFF)
請(qǐng)求:MBAP 功能碼 起始地址H 起始地址L 數(shù)量H 數(shù)量L(共12字節(jié))
響應(yīng):MBAP 功能碼 數(shù)據(jù)長度 數(shù)據(jù)(一個(gè)地址的數(shù)據(jù)為1位)
發(fā)送包
byte[0] byte[1] 00 02 為消息號(hào),隨便指定,服務(wù)器返回的數(shù)據(jù)的前兩個(gè)字和這個(gè)一樣
byte[2] byte[3] 00 00 為modbus標(biāo)識(shí),強(qiáng)制為0即可
byte[4] byte[5] 00 06 值在06 之后所有字節(jié)的個(gè)數(shù),大家也可以數(shù)一數(shù)哈
byte[6] 01 為站號(hào)、隨便指定。
byte[7] 01 為功能碼(這個(gè)是決定了要干什么事)
byte[8] byte[9] 00 00為起始地址,比如我們我們想讀地址0的數(shù)據(jù)就為00,讀1000地址為03 E8
byte[10] byte[11] 00 80為指定讀取數(shù)據(jù)的長度,跟地址規(guī)則一樣
回包
注:bit是一直到127的 因?yàn)閳D片太大無法截到
byte[0] byte[1] 消息號(hào),我們之前寫發(fā)送指令的時(shí)候,是多少,這里就是多少。
byte[2] byte[3] 同上
byte[4] byte[5] 指后面的字節(jié)數(shù)
byte[6] 站號(hào)
byte[7] 功能碼
byte[8] 指示在byte[8]后面的字節(jié)數(shù)量 在byte[8]后面就是真實(shí)數(shù)據(jù)
byte[9] 到結(jié)尾都是我們讀取到的數(shù)據(jù) 因?yàn)樽止?jié)是8位所以是16(0-127所占了128個(gè)bit 128/8 得出16)
列子:
讀5個(gè)線圈狀態(tài)
發(fā)送:00 00 00 00 00 06 01 01 00 00 00 05
接收:00 00 00 00 00 04 01 01 01 1F
回到頂部
2、0x02 讀取一組開關(guān)輸入的當(dāng)前狀態(tài)(ON/OFF)
請(qǐng)求:MBAP 功能碼 起始地址H 起始地址L 數(shù)量H 數(shù)量L(共12字節(jié))
響應(yīng):MBAP 功能碼 數(shù)據(jù)長度 數(shù)據(jù)(長度:9+ceil(數(shù)量/8))
發(fā)送包
其實(shí)大家自己看與0x01是基本一樣的。只是多了個(gè)Bit Count這一個(gè)
Bit Count所代表的意思就是 讀取十個(gè)數(shù)據(jù)。
回包
跟0x01的回包也是一樣的,可能大家伙會(huì)有些迷茫,我發(fā)包的時(shí)候是讀取十個(gè)數(shù)據(jù)回包的時(shí)候Byte Count怎么會(huì)給我回復(fù)了個(gè)2呢?
細(xì)心的朋友可能也發(fā)現(xiàn)了、這兩個(gè)單詞是不一樣的~一個(gè)是Bit Count 一個(gè)是Byte Count,哈哈哈哈小小的幽默 。
那這個(gè)Byte Count代表的是什么意思呢。還是字節(jié)有關(guān)。
一個(gè)字節(jié)是8位、但是10個(gè)位超過了1個(gè)字節(jié)但是不滿2個(gè)字節(jié)所以占用2個(gè)字節(jié)。還有很多跟這個(gè)情況相同。
列子:
讀5個(gè)輸入狀態(tài)
發(fā)送:00 00 00 00 00 06 01 02 00 00 00 05
接收:00 00 00 00 00 04 01 02 01 15
回到頂部
3、0x03 讀取一個(gè)或多個(gè)保持寄存器的數(shù)值
請(qǐng)求:MBAP 功能碼 起始地址H 起始地址L 寄存器數(shù)量H 寄存器數(shù)量L(共12字節(jié))
響應(yīng):MBAP 功能碼 數(shù)據(jù)長度 寄存器數(shù)據(jù)(長度:9+寄存器數(shù)量×2)
發(fā)包
這邊Modbus/TCP我就不再展開了、都是一樣的。
這個(gè)發(fā)包也很好去理解、根據(jù)Reference這一欄還有Word Count這一欄說明是起始位置是400讀取6個(gè)保持寄存器數(shù)值。
一通百通、Modbus在功能報(bào)文上基本都是一致的。
回包
大家伙可能有迷茫了 怎么會(huì)是12呢 這個(gè)可怎么計(jì)算呢
我把這個(gè)Register這一欄專門的點(diǎn)開了,大家也都能看出來了吧。
這樣就跟明了了吧,Register是占了兩個(gè)位所以呢 讀寄存器的個(gè)數(shù)6乘2 那不就是12了嗎
列子:
讀取連續(xù)三個(gè)保持寄存器的數(shù)值
發(fā)送:00 00 00 00 00 06 01 03 00 00 00 03
接收:00 00 00 00 00 09 01 03 06 03 E8 13 88 02 8A
4、0x04 讀取一個(gè)或多個(gè)輸入寄存器的數(shù)值
請(qǐng)求:MBAP 功能碼 起始地址H 起始地址L 寄存器數(shù)量H 寄存器數(shù)量L(共12字節(jié))
響應(yīng):MBAP 功能碼 數(shù)據(jù)長度 寄存器數(shù)據(jù)(長度:9+寄存器數(shù)量×2)
發(fā)送
這個(gè)意思也就是 從0的位置讀取10個(gè)輸入寄存器的數(shù)值。
一通百通、有時(shí)候這些協(xié)議的原理我們沒必要去搞明白,我們只要是知道這一塊代表什么有什么用處我該如何去利用這一塊這樣就足夠。
沒必要去研究它如何工作如何交互(其實(shí)說白了 萬變不離其宗 大部分的協(xié)議交互還是 揮手 握手)
看每個(gè)人的需求吧,可能有些工作是必須要吃透協(xié)議那只能硬著頭皮去看了。
扯遠(yuǎn)了。
回包
這個(gè)也很好看明白了,還是跟0x03一樣。沒有變化。
列子:
讀5個(gè)輸入寄存器的數(shù)值
發(fā)送:00 00 00 00 00 06 01 04 00 00 00 05
接收:00 00 00 00 00 0D 01 04 0A 00 00 00 01 00 02 00 03 00 04
回到頂部
5、0x05 強(qiáng)置一個(gè)邏輯線圈的通斷狀態(tài)
請(qǐng)求:MBAP 功能碼 輸出地址H 輸出地址L 輸出值H 輸出值L(共12字節(jié))
響應(yīng):MBAP 功能碼 輸出地址H 輸出地址L 輸出值H 輸出值L(共12字節(jié))
發(fā)包
05 是功能碼, 00 00是我們指定的地址,如果我們想寫地址1000,那么就為 03 E8,后四位是規(guī)定線圈的通斷狀態(tài)。
那么上面發(fā)包的意思就是 在00 00這個(gè)位置 指定線圈通斷狀態(tài)為 斷開。
舉個(gè)例子:
寫入地址100為通: 00 00 00 00 00 06 FF 05 00 64 FF 00
寫入地址1000為斷:00 00 00 00 00 06 FF 05 03 E8 00 00
回包
各位也發(fā)現(xiàn)了,回包和發(fā)包是一樣的,因?yàn)樵谀銓懭氲牟僮髦校遣粠ёx取數(shù)據(jù)的,所以服務(wù)器會(huì)直接復(fù)制一遍你的指令并返回。
例子:強(qiáng)置一個(gè)邏輯線圈的通斷狀態(tài)
發(fā)送:00 00 00 00 00 06 01 05 00 00 FF 00
接收:00 00 00 00 00 06 01 05 00 00 FF 00
回到頂部
6、0x06 寫單個(gè)保持寄存器
請(qǐng)求:MBAP 功能碼 寄存器地址H 寄存器地址L 寄存器值H 寄存器值L(共12字節(jié))
響應(yīng):MBAP 功能碼 寄存器地址H 寄存器地址L 寄存器值H 寄存器值L(共12字節(jié))
發(fā)包
這個(gè)也不用過多的介紹了吧。在00 00位置 寫入 00 00
回包
也是一樣的,服務(wù)器會(huì)直接復(fù)制一遍你的指令并返回。
回到頂部
7、**0x0f **強(qiáng)置多個(gè)邏輯線圈的通斷狀態(tài)
請(qǐng)求:MBAP 功能碼 起始地址H 起始地址L 輸出數(shù)量H 輸出數(shù)量L 字節(jié)長度 輸出值H 輸出值L
響應(yīng):MBAP 功能碼 起始地址H 起始地址L 輸出數(shù)量H 輸出數(shù)量L
發(fā)送
Bit Count 10是要寫的個(gè)數(shù)
** 回包**
都一樣,直接說例子吧。
例子:強(qiáng)置一串連續(xù)邏輯線圈的通斷
發(fā)送:00 00 00 00 00 0B 01 0F 00 00 00 02 04 FF 00 00 00
發(fā)送:00 00 00 00 00 06 01 0F 00 00 00 02
回到頂部
8、**0x10 **寫多個(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é))
發(fā)送
Word count為 要寫的個(gè)數(shù)
Byte count 為 要寫入的數(shù)目 1個(gè)word等于2個(gè)bytes
后面 00 00 每組為寫入的數(shù)值
回包
也是一樣的,寫了十個(gè)那么就返回十。
列子:
向起始地址為0x0000,數(shù)量為0x0001的寄存器寫入數(shù)據(jù),數(shù)據(jù)長度為0x02,數(shù)據(jù)為0x000F
發(fā)送 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
回到頂部
9、0x2b 讀取設(shè)備ID
發(fā)送
byte[0]byte[1] 消息號(hào) 隨便指定
byte[2]byte[3] modbus的標(biāo)識(shí)
byte[4]byte[5] 在此之后的長度
byte[6] 站號(hào)
byte[7] 功能碼
byte[8] 功能類型 這里是讀取設(shè)備ID
byte[9] 讀什么 這里是讀設(shè)備標(biāo)識(shí)
byte[10] 設(shè)備名稱.
回包
跟發(fā)包一樣。
-
MODBUS
+關(guān)注
關(guān)注
28文章
2115瀏覽量
79521 -
TCP
+關(guān)注
關(guān)注
8文章
1402瀏覽量
80997 -
工業(yè)協(xié)議
+關(guān)注
關(guān)注
0文章
13瀏覽量
5644
發(fā)布評(píng)論請(qǐng)先 登錄
圖文詳解ModbusTCP協(xié)議
ProfibusDP主站轉(zhuǎn)ModbusTCP協(xié)議轉(zhuǎn)換網(wǎng)關(guān)技術(shù)需求干貨講解
采用ModbusRTU或ModbusTCP通訊協(xié)議與下位機(jī)進(jìn)行通信
ModbusTCP轉(zhuǎn)CanOpen網(wǎng)關(guān)助力工控行業(yè)
關(guān)于MODBUSRTU通訊協(xié)議的提問?
一文知道ModbusTCP協(xié)議和上位機(jī)編寫
基于工控協(xié)議功能碼特征的同源攻擊分析方法

ModbusTCP報(bào)文詳解
一文詳解ModbusTCP協(xié)議

智能樓宇系統(tǒng)canopen協(xié)議與ModbusTCP協(xié)議進(jìn)行通訊
智能樓宇系統(tǒng)canopen協(xié)議與ModbusTCP協(xié)議進(jìn)行通訊

【實(shí)用篇】ModbusTCP協(xié)議詳解

modbus協(xié)議功能碼分類 modbus協(xié)議功能碼是什么,有什么作用
實(shí)現(xiàn)ModbusTCP轉(zhuǎn)Profinet網(wǎng)關(guān)協(xié)議轉(zhuǎn)換功能的網(wǎng)關(guān)設(shè)備

評(píng)論