雖然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的四個暫存器種類:線圈暫存器、離散輸入暫存器、保持暫存器、輸入暫存器,從暫存器角度理解了對應功能碼。下面列出常用功能碼,具體如下:
功能碼名稱
資料型別
作用0x01
讀線圈暫存器
位取得一組邏輯線圈的當前狀態(on/off )
0x02
讀離散輸入暫存器
位取得一組開關輸入的當前狀態(on/off )
0x03
讀保持暫存器
整型、浮點型、字元型
在乙個或多個保持暫存器中取得當前的二進位制值
0x04
讀輸入暫存器
整型、浮點型
在乙個或多個輸入暫存器中取得當前的二進位制值
0x05
寫單個線圈暫存器
位強置乙個邏輯線圈的通斷狀態
0x06
寫單個保持暫存器
整型、浮點型、字元型
把具體二進值裝入乙個保持暫存器
0x0f
寫多個線圈暫存器
位強置一串連續邏輯線圈的通斷
0x10
寫多個保持暫存器
整型、浮點型、字元型
把具體的二進位制值裝入一串連續的保持暫存器
從站位址
功能碼暫存器起始位址高8位
暫存器起始位址低8位
暫存器數量高8位
暫存器數低8位
crc校驗低8位
crc校驗高8位
0x01
0x01
0x00
0x21
0x00
0x0c
0***
0***
其中,返回資料值的每一位對應線圈狀態,線圈狀態為on時,其值為1;狀態為off時,其值為0;
【資料以小端的形式進行儲存,即最低有效位存放於記憶體最低位位址(位於二進位制的右側)。每8個位組成乙個位元組,當線圈的數量不是8的倍數時,剩餘的位數添0補位。】
從站位址
功能碼返回位元組數
data1
data2
crc校驗低8位
crc校驗高8位
0x01
0x01
0x02
0xcb
0x0b
0***
0***
本例中讀取12個線圈,12/8商1餘4,因此需要2個位元組存放應答資料,返回位元組數為2。
位元組1存放線圈編號21~28的數值(小端位元組序,線圈28的值存放在bit7,線圈21的值存放在bit0);
位元組2存放線圈編號29~32的數值,剩餘位數添0補位;
線圈位址
功能碼0x28
0x27
0x26
0x25
0x24
0x23
0x22
0x21
數值0x0111
0010
11線圈位址
功能碼0x30
0x2f
0x2e
0x2d
0x2c
0x2b
0x2a
0x29
數值0x0100
0010
111)功能:讀離散輸入暫存器,位操作,可讀單個或多個,類似功能碼0x01,此處省略;
1)功能:讀從站保持暫存器,位元組操作,可讀單個或者多個;每個保持暫存器佔2個位元組(16位);
2)主機傳送指令:
主機傳送資料報括:從站位址+功能碼+暫存器起始位址+暫存器數量+校驗碼從站位址
功能碼暫存器起始位址高8位
暫存器起始位址低8位
暫存器數量高8位
暫存器數量低8位
crc校驗低8位
crc校驗高8位
0x03
0x03
0x00
0x3b
0x00
0x03
0***
0***
從站位址
功能碼返回位元組數
data1h
data1l
data2h
data2l
data3h
data3l
crc校驗低8位
crc校驗高8位
0x03
0x03
0x06
0x1b
0x0b
0x0a
0x01
0xc2
0xdb
0***
0***
本例中讀取3個保持暫存器,每個保持暫存器佔2個位元組,因此需要6個位元組存放應答資料,返回位元組數為6。
0x003b~0x003d保持暫存器的數值如下圖所示:
暫存器位址
0x003d
0x003c
0x003a
數值0xc2 db
0x0a 01
0x1b 0b
1)功能:讀輸入暫存器,位元組操作,可讀單個或多個,類似功能碼0x03,此處省略;
1)功能:對單個線圈進行寫操作,位操作,只能寫乙個。寫入0xff00表示將線圈置為on,寫入0x0000表示將線圈置為off,其它值無效;
2)主機傳送指令:
主機傳送資料報括:從站位址+功能碼+暫存器起始位址+資料值+校驗碼從站位址
功能碼暫存器起始位址高8位
暫存器起始位址低8位
datah
datal
crc校驗低8位
crc校驗高8位
0x03
0x05
0x00
0x32
0xff
0x00
0***
0***
如果資料成功寫入,則應答資料與請求資料一樣,如下表所示:
從站位址
功能碼暫存器起始位址高8位
暫存器起始位址低8位
datah
datal
crc校驗低8位
crc校驗高8位
0x03
0x05
0x00
0x32
0xff
0x00
0***
0***
從站位址
功能碼暫存器起始位址高8位
暫存器起始位址低8位
datah
datal
crc校驗低8位
crc校驗高8位
0x01
0x06
0x00
0x48
0x12
0x34
0***
0***
如果資料成功寫入,則應答資料與請求資料一樣。
Modbus常用功能碼簡介
下面記錄下常用modbus常用功能碼,以備後面查詢。日常開發常用的功能碼就那幾個,基本都是讀取感測器資料,配置引數。其它的功能很少用。對主裝置來說,外部輸入的變數,如開關量,感測器的資料都是唯讀的,因為這些取決於外部條件。但對從裝置來說是可以讀寫的 寫暫存器變數 因為主裝置和具體的執行裝置之間還隔了...
Modbus常用功能碼協議詳解
01h 讀線圈狀態 1 描述 讀從機線圈暫存器,位操作,可讀單個或者多個 2 傳送指令 假設從機位址位0x01,暫存器開始位址0x0023,暫存器結束抵制0x0038,總共讀取21個線圈。協議圖如下 3 響應 返回資料的每一位對應線圈狀態,1 on,0 off,如下圖 上表中data1表示0x002...
ModBus常用功能碼 功能碼為10進製
modbus常用功能碼 功能碼為10進製 01 read coil status 讀線圈暫存器 02 read input status 讀狀態暫存器 03 read holding register 讀保持暫存器 04 read input register 讀輸入暫存器 05 write sin...