Modbus常用功能碼學習及實體
一.MODBUS暫存器種類說明
雖然MODBUS支持諸多功能碼,但其中只涉及到四種暫存器:線圈暫存器、離散輸入暫存器、保持暫存器、輸入暫存器,
只要搞清楚暫存器的本質和功能碼的聯系,其實理解功能碼就很簡單,
| 暫存器種類 | 讀寫狀態 | 位操作字操作 | 適用功能碼 |
|---|---|---|---|
| 線圈暫存器 | 讀/寫 | 位 | 01H(讀); 05H(寫單個位); 0FH(寫多個位) |
| 離散輸入暫存器 | 只讀 | 位 | 02H |
| 保持暫存器 | 讀/寫 | 字 | 03H(讀); 06H(寫單個位元組); 0FH(寫多個位元組) |
| 輸入暫存器 | 只讀 | 字 | 04H |
線圈暫存器:可以類比為開關量,每個bit都對應一個信號的開關狀態,所以一個位元組可以同時控制8路的信號,比如控制外部8路io的高低, 線圈暫存器支持讀也支持寫,比如控制或者讀取電磁閥的開關志狀態,對應的功能碼有:0x01 0x05 0x0f
離散輸入暫存器:離散輸入暫存器相當于線圈暫存器的只讀模式,每個bit表示一個開關量,而他的開關量只能讀取,不能夠寫入,只能通過外部設定改變輸入狀態,比如我可以讀取外部按鍵的按下還是松開,但是控制不了按鍵,對應的功能碼有:0x02
保持暫存器:暫存器的單位不再是bit而是兩個byte,也就是可以存放具體的資料量的,并且是可讀寫的,比如我不到那可以讀取傳感器報警上限下限,也可以設定它的大小,對應的功能碼有:0x03 0x06 0x10
輸入暫存器:輸入暫存器相當于保持暫存器的只讀模式,也是只支持讀而不能寫,一個暫存器也是占據兩個位元組的空間,比如通過讀取輸入暫存器獲取現在的模擬量采樣值,對應的功能碼有 0x04
二.MODBUS部分功能碼
MODBUS支持很多功能碼,但是在實際應用的時候常用的也就那么幾個,
上面介紹了Modbus的四個暫存器種類:線圈暫存器、離散輸入暫存器、保持暫存器、輸入暫存器,從暫存器角度理解了對應功能碼,下面列出常用功能碼,具體如下:
| 功能碼 | 名稱 | 資料型別 | 作用 |
|---|---|---|---|
| 0x01 | 讀線圈暫存器 | 位 | 取得一組邏輯線圈的當前狀態(ON/OFF ) |
| 0x02 | 讀離散輸入暫存器 | 位 | 取得一組開關輸入的當前狀態(ON/OFF ) |
| 0x03 | 讀保持暫存器 | 整型、浮點型、字符型 | 在一個或多個保持暫存器中取得當前的二進制值 |
| 0x04 | 讀輸入暫存器 | 整型、浮點型 | 在一個或多個輸入暫存器中取得當前的二進制值 |
| 0x05 | 寫單個線圈暫存器 | 位 | 強置一個邏輯線圈的通斷狀態 |
| 0x06 | 寫單個保持暫存器 | 整型、浮點型、字符型 | 把具體二進值裝入一個保持暫存器 |
| 0x0f | 寫多個線圈暫存器 | 位 | 強置一串連續邏輯線圈的通斷 |
| 0x10 | 寫多個保持暫存器 | 整型、浮點型、字符型 | 把具體的二進制值裝入一串連續的保持暫存器 |
三.MODBUS功能碼實體
1.功能碼:01H 讀線圈暫存器
1)功能:讀從站線圈暫存器,位操作,可讀單個或者多個
2)主機發送指令:
主機發送資料包括:從站地址+功能碼+暫存器起始地址+暫存器數量+校驗碼
假設從站地址為0x01,線圈暫存器開始地址0x0021,結束地址0x002c,即暫存器地址范圍為:0x0021~0x0032,總共讀取12個連續線圈的狀態值,則主機發送指令如下圖所示:
| 從站地址 | 功能碼 | 暫存器起始地址高8位 | 暫存器起始地址低8位 | 暫存器數量高8位 | 暫存器數量低8位 | CRC校驗低8位 | CRC校驗高8位 |
|---|---|---|---|---|---|---|---|
| 0x01 | 0x01 | 0x00 | 0x21 | 0x00 | 0x2c | 0xXX | 0xXX |
3)從站回應回傳:
從站回應回傳資料包括:從站地址+功能碼+回傳位元組數+資料值+校驗碼
其中,回傳資料值的每一位對應線圈狀態,線圈狀態為ON時,其值為1;狀態為OFF時,其值為0;
【資料以小端的形式進行存盤,即最低有效位存放于記憶體最低位地址(位于二進制的右側),每8個位組成一個位元組,當線圈的數量不是8的倍數時,剩余的位數添0補位,】
| 從站地址 | 功能碼 | 回傳位元組數 | data1 | data2 | CRC校驗低8位 | CRC校驗高8位 |
|---|---|---|---|---|---|---|
| 0x01 | 0x01 | 0x02 | 0xCB | 0x0B | 0xXX | 0xXX |
本例中讀取12個線圈,12/8商1余4,因此需要2個位元組存放應答資料,回傳位元組數為2,
位元組1存放線圈編號21~28的數值(小端位元組序,線圈28的值存放在bit7,線圈21的值存放在bit0);
位元組2存放線圈編號29~32的數值,剩余位數添0補位;
上表中data1表示0x0021-0x0028的線圈狀態,data1的最低位代表最低地址的線圈狀態;
data1:0xCB=1100 1011,則data1線圈狀態如下表所示:
| 線圈地址 | 功能碼 | 0x28 | 0x27 | 0x26 | 0x25 | 0x24 | 0x23 | 0x22 | 0x21 |
|---|---|---|---|---|---|---|---|---|---|
| 數值 | 0x01 | 1 | 1 | 0 | 0 | 1 | 0 | 1 | 1 |
data2表示地址0x0030-0x0038的線圈狀態,不夠8位,位元組高位填充為0,
data2:0x0B=0000 1011,則data2線圈狀態如下表所示:
| 線圈地址 | 功能碼 | 0x30 | 0x2f | 0x2e | 0x2d | 0x2c | 0x2b | 0x2a | 0x29 |
|---|---|---|---|---|---|---|---|---|---|
| 數值 | 0x01 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 1 |
2.功能碼:02H 讀離散輸入暫存器
1)功能:讀離散輸入暫存器,位操作,可讀單個或多個,類似功能碼0X01,此處省略;
3.功能碼:03H 讀保持暫存器
1)功能:讀從站保持暫存器,位元組操作,可讀單個或者多個;每個保持暫存器占2個位元組(16位);
2)主機發送指令:
主機發送資料包括:從站地址+功能碼+暫存器起始地址+暫存器數量+校驗碼
假設從站地址為0x03,保持暫存器開始地址為0x003B,結束地址0x003D,即暫存器地址范圍為:0x003B~0x003D,總共讀取3個保持暫存器的資料,則主機發送指令如下圖所示:
| 從站地址 | 功能碼 | 暫存器起始地址高8位 | 暫存器起始地址低8位 | 暫存器數量高8位 | 暫存器數量低8位 | CRC校驗低8位 | CRC校驗高8位 |
|---|---|---|---|---|---|---|---|
| 0x03 | 0x03 | 0x00 | 0x3B | 0x00 | 0x03 | 0xXX | 0xXX |
3)從站回應回傳:
從站回應回傳資料包括:從站地址+功能碼+回傳位元組數+資料值+校驗碼
| 從站地址 | 功能碼 | 回傳位元組數 | data1H | data1L | data2H | data2L | data3H | data3L | CRC校驗低8位 | CRC校驗高8位 |
|---|---|---|---|---|---|---|---|---|---|---|
| 0x03 | 0x03 | 0x06 | 0x1B | 0x0B | 0x0A | 0x01 | 0xC2 | 0xDB | 0xXX | 0xXX |
本例中讀取3個保持暫存器,每個保持暫存器占2個位元組,因此需要6個位元組存放應答資料,回傳位元組數為6,
0x003B~0x003D保持暫存器的數值如下圖所示:
| 暫存器地址 | 0x003D | 0x003C | 0x003A |
|---|---|---|---|
| 數值 | 0xC2 DB | 0x0A 01 | 0x1B 0B |
4.功能碼:04H 讀輸入暫存器
1)功能:讀輸入暫存器,位元組操作,可讀單個或多個,類似功能碼0X03,此處省略;
5.功能碼:05H 寫單個線圈暫存器
1)功能:對單個線圈進行寫操作,位操作,只能寫一個,寫入0xFF00表示將線圈置為ON,寫入0x0000表示將線圈置為OFF,其它值無效;
2)主機發送指令:
主機發送資料包括:從站地址+功能碼+暫存器起始地址+資料值+校驗碼
假設從站地址為0x03,線圈暫存器起始地址為0x0032,要將其設定為ON,則主機發送指令如下表所示:
| 從站地址 | 功能碼 | 暫存器起始地址高8位 | 暫存器起始地址低8位 | dataH | dataL | CRC校驗低8位 | CRC校驗高8位 |
|---|---|---|---|---|---|---|---|
| 0x03 | 0x05 | 0x00 | 0x32 | 0xff | 0x00 | 0xXX | 0xXX |
3)從站回應回傳:
從站應答資料包括:從站地址+功能碼+暫存器地址+寫入值+校驗碼
如果資料成功寫入,則應答資料與請求資料一樣,如下表所示:
| 從站地址 | 功能碼 | 暫存器起始地址高8位 | 暫存器起始地址低8位 | dataH | dataL | CRC校驗低8位 | CRC校驗高8位 |
|---|---|---|---|---|---|---|---|
| 0x03 | 0x05 | 0x00 | 0x32 | 0xff | 0x00 | 0xXX | 0xXX |
6.功能碼:06H 寫單個保持暫存器|
1)功能:對單個保持暫存器進行寫操作,位元組操作,只能寫一個,
2)主機發送指令:
主機發送資料包括:從站地址+功能碼+暫存器起始地址+資料值+校驗碼
假設從站地址為0x01,線圈暫存器起始地址為0x0048,寫入數值為0x1234,則主機發送指令如下表所示:
| 從站地址 | 功能碼 | 暫存器起始地址高8位 | 暫存器起始地址低8位 | dataH | dataL | CRC校驗低8位 | CRC校驗高8位 |
|---|---|---|---|---|---|---|---|
| 0x01 | 0x06 | 0x00 | 0x48 | 0x12 | 0x34 | 0xXX | 0xXX |
3)從站回應回傳:
從站應答資料包括:從站地址+功能碼+暫存器地址+寫入值+校驗碼
如果資料成功寫入,則應答資料與請求資料一樣,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/252573.html
標籤:其他
