MODBUS常用功能碼學習及例項

2021-10-17 03:09:56 字數 4168 閱讀 4855

雖然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...