- 1、01X 讀取一組邏輯線圈的當前狀態(ON/OFF)
- 2、0x02 讀取一組開關輸入的當前狀態(ON/OFF)
- 3、0x03 讀取一個或多個保持寄存器的數值
- 5、0x05 強置一個邏輯線圈的通斷狀態
- ** 6、0x06 寫單個保持寄存器**
- ** 7、0x0f 強置多個邏輯線圈的通斷狀態**
- 8、0x10 寫多個保持寄存器
- 9、0x2b 讀取設備ID
1、01X 讀取一組邏輯線圈的當前狀態(ON/OFF)
請求:MBAP 功能碼 起始地址H 起始地址L 數量H 數量L(共12字節)
響應:MBAP 功能碼 數據長度 數據(一個地址的數據為1位)
發送包
byte[0] byte[1] 00 02 為消息號,隨便指定,服務器返回的數據的前兩個字和這個一樣
byte[2] byte[3] 00 00 為modbus標識,強制為0即可
byte[4] byte[5] 00 06 值在06 之后所有字節的個數,大家也可以數一數哈
byte[6] 01 為站號、隨便指定。
byte[7] 01 為功能碼(這個是決定了要干什么事)
byte[8] byte[9] 00 00為起始地址,比如我們我們想讀地址0的數據就為00,讀1000地址為03 E8
byte[10] byte[11] 00 80為指定讀取數據的長度,跟地址規則一樣
回包
注:bit是一直到127的 因為圖片太大無法截到
byte[0] byte[1] 消息號,我們之前寫發送指令的時候,是多少,這里就是多少。
byte[2] byte[3] 同上
byte[4] byte[5] 指后面的字節數
byte[6] 站號
byte[7] 功能碼
byte[8] 指示在byte[8]后面的字節數量 在byte[8]后面就是真實數據
byte[9] 到結尾都是我們讀取到的數據 因為字節是8位所以是16(0-127所占了128個bit 128/8 得出16)
列子:
讀5個線圈狀態
發送:00 00 00 00 00 06 01 01 00 00 00 05
接收:00 00 00 00 00 04 01 01 01 1F
回到頂部
2、0x02 讀取一組開關輸入的當前狀態(ON/OFF)
請求:MBAP 功能碼 起始地址H 起始地址L 數量H 數量L(共12字節)
響應:MBAP 功能碼 數據長度 數據(長度:9+ceil(數量/8))
發送包
其實大家自己看與0x01是基本一樣的。只是多了個Bit Count這一個
Bit Count所代表的意思就是 讀取十個數據。
回包
跟0x01的回包也是一樣的,可能大家伙會有些迷茫,我發包的時候是讀取十個數據回包的時候Byte Count怎么會給我回復了個2呢?
細心的朋友可能也發現了、這兩個單詞是不一樣的~一個是Bit Count 一個是Byte Count,哈哈哈哈小小的幽默 。
那這個Byte Count代表的是什么意思呢。還是字節有關。
一個字節是8位、但是10個位超過了1個字節但是不滿2個字節所以占用2個字節。還有很多跟這個情況相同。
列子:
讀5個輸入狀態
發送:00 00 00 00 00 06 01 02 00 00 00 05
接收:00 00 00 00 00 04 01 02 01 15
回到頂部
3、0x03 讀取一個或多個保持寄存器的數值
請求:MBAP 功能碼 起始地址H 起始地址L 寄存器數量H 寄存器數量L(共12字節)
響應:MBAP 功能碼 數據長度 寄存器數據(長度:9+寄存器數量×2)
發包
這邊Modbus/TCP我就不再展開了、都是一樣的。
這個發包也很好去理解、根據Reference這一欄還有Word Count這一欄說明是起始位置是400讀取6個保持寄存器數值。
一通百通、Modbus在功能報文上基本都是一致的。
回包
大家伙可能有迷茫了 怎么會是12呢 這個可怎么計算呢
我把這個Register這一欄專門的點開了,大家也都能看出來了吧。
這樣就跟明了了吧,Register是占了兩個位所以呢 讀寄存器的個數6乘2 那不就是12了嗎
列子:
讀取連續三個保持寄存器的數值
發送: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 讀取一個或多個輸入寄存器的數值
請求:MBAP 功能碼 起始地址H 起始地址L 寄存器數量H 寄存器數量L(共12字節)
響應:MBAP 功能碼 數據長度 寄存器數據(長度:9+寄存器數量×2)
發送
這個意思也就是 從0的位置讀取10個輸入寄存器的數值。
一通百通、有時候這些協議的原理我們沒必要去搞明白,我們只要是知道這一塊代表什么有什么用處我該如何去利用這一塊這樣就足夠。
沒必要去研究它如何工作如何交互(其實說白了 萬變不離其宗 大部分的協議交互還是 揮手 握手)
看每個人的需求吧,可能有些工作是必須要吃透協議那只能硬著頭皮去看了。
扯遠了。
回包
這個也很好看明白了,還是跟0x03一樣。沒有變化。
列子:
讀5個輸入寄存器的數值
發送: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 強置一個邏輯線圈的通斷狀態
請求:MBAP 功能碼 輸出地址H 輸出地址L 輸出值H 輸出值L(共12字節)
響應:MBAP 功能碼 輸出地址H 輸出地址L 輸出值H 輸出值L(共12字節)
發包
05 是功能碼, 00 00是我們指定的地址,如果我們想寫地址1000,那么就為 03 E8,后四位是規定線圈的通斷狀態。
那么上面發包的意思就是 在00 00這個位置 指定線圈通斷狀態為 斷開。
舉個例子:
寫入地址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
回包
各位也發現了,回包和發包是一樣的,因為在你寫入的操作中,是不帶讀取數據的,所以服務器會直接復制一遍你的指令并返回。
例子:強置一個邏輯線圈的通斷狀態
發送: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 寫單個保持寄存器
請求:MBAP 功能碼 寄存器地址H 寄存器地址L 寄存器值H 寄存器值L(共12字節)
響應:MBAP 功能碼 寄存器地址H 寄存器地址L 寄存器值H 寄存器值L(共12字節)
發包
這個也不用過多的介紹了吧。在00 00位置 寫入 00 00
回包
也是一樣的,服務器會直接復制一遍你的指令并返回。
回到頂部
7、**0x0f **強置多個邏輯線圈的通斷狀態
請求:MBAP 功能碼 起始地址H 起始地址L 輸出數量H 輸出數量L 字節長度 輸出值H 輸出值L
響應:MBAP 功能碼 起始地址H 起始地址L 輸出數量H 輸出數量L
發送
Bit Count 10是要寫的個數
** 回包**
都一樣,直接說例子吧。
例子:強置一串連續邏輯線圈的通斷
發送:00 00 00 00 00 0B 01 0F 00 00 00 02 04 FF 00 00 00
發送:00 00 00 00 00 06 01 0F 00 00 00 02
回到頂部
8、**0x10 **寫多個保持寄存器
請求:MBAP 功能碼 起始地址H 起始地址L 寄存器數量H 寄存器數量L 字節長度 寄存器值(13+寄存器數量×2)
響應:MBAP 功能碼 起始地址H 起始地址L 寄存器數量H 寄存器數量L(共12字節)
發送
Word count為 要寫的個數
Byte count 為 要寫入的數目 1個word等于2個bytes
后面 00 00 每組為寫入的數值
回包
也是一樣的,寫了十個那么就返回十。
列子:
向起始地址為0x0000,數量為0x0001的寄存器寫入數據,數據長度為0x02,數據為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
回到頂部
9、0x2b 讀取設備ID
發送
byte[0]byte[1] 消息號 隨便指定
byte[2]byte[3] modbus的標識
byte[4]byte[5] 在此之后的長度
byte[6] 站號
byte[7] 功能碼
byte[8] 功能類型 這里是讀取設備ID
byte[9] 讀什么 這里是讀設備標識
byte[10] 設備名稱.
回包
跟發包一樣。
-
MODBUS
+關注
關注
28文章
1825瀏覽量
77356 -
TCP
+關注
關注
8文章
1381瀏覽量
79342 -
工業協議
+關注
關注
0文章
9瀏覽量
5532
發布評論請先 登錄
相關推薦
評論