Modbus-TCP/IP

功能碼詳解


對於modbus來說,設計的功能碼也就是0x01、0x02、0x03、0x04、0x05、0x06、0x0F、0x10,其實分類來說只有兩種,即線圈(開關量)和寄存器(模擬量),也就是位讀寫和字節讀寫,首先要弄清楚功能碼不一樣,對應數據的解析規則也不一樣,下面就針對不同的情況來說明:

  • 在modbus服務端,數據是使用地址的方式來公開的,因爲服務端保存了很多數據,你想要訪問某個數據,肯定需要制定唯一的身份標識。

  • 對於位操作來說(各種線圈和離散量),一個地址代表一個bool變量,即0和1.一個地址代表了2個byte,共有65536中方式。比如我們讀取地址0的寄存器,返回00 00 及代表寄存器0數據爲0,如果返回 01 00,那麼代表寄存器數據爲 256

  • 功能碼 0x01 讀線圈

byte[0] byte[1] :消息號,發送指令的時候是多少就是多少
byte[2] byte[3] :必須都爲0,代表這是modbus通訊
byte[4] byte[5] :byte[5]後面的數字是所有的字節數,如果後面有100個,那麼這裏就是00 64
byte[6] :站號,之前寫FF 那麼這裏也寫FF
byte[7] :功能碼,之前寫01功能碼,這裏就是01,和我們發送的指令一致
byte[8] 指示後面跟隨的字節數量,因爲byte[8]後面的就是真實的數據,我們最終想要的結果就在byte[8]後面
byte[9]:真實數據,我們真正想要的東西,我們知道一個byte有8位,但是我們讀取了一個位數據(開關量),所以這裏有效值是byte[9]的最低位,二進制爲0000 0000 我們看到最低位爲0,所以最終我們讀取的地址0的線圈爲斷。

假設我們要讀取地址10開始的共10個線圈,我們發送
00 00 00 00 00 06 FF 01 00 0A 00 0A
接收到的是:
00 00 00 00 00 05 FF 01 02 79 01
我們讀取了10個位,那麼一個byte可以表示8個位,因此需要2個byte,所以數據長度爲02,想要的數據是 79 01
0111 1001 0000 0001
將二進制的順序顛倒:
1001 1110 1000 0000
線圈10-線圈19的通斷情況是:通斷斷通 通通通斷 通斷 再後面的0是無效的,這裏讀取10個位長度

  • 功能碼 0x02

和上面基本一致

  • 功能碼 0x05

這個功能碼是實現數據寫入,他能實現什麼功能呢?我們可以利用這個功能來制定謀略線圈通或斷
比如我們要制定地址0的寄存器爲通:00 00 00 00 00 06 FF 05 00 00 FF 00 含義和前面都是一致的,我們分析05 00 00 FF 00
05 是功能碼 00 00 是我們指定的地址,如果我們想寫地址1000通,那麼就是03 E8,至於FF 00是規定的數據,如果你想地址線圈通,就填這個值,想制定線圈爲斷開,就填00 00 其他任何值都對結果無效。

  • 功能碼0x0F

前面已經實現了0x05單線圈寫入,我們可以指定線圈100爲通,其實就兩個信息需要指定,線圈地址是什麼,通還是斷,然後我們就可以自然而然的寫出指令碼了。但是現在我們需要實現一個功能時,將地址0...999共計1000個線圈全部爲off這時候就用到0x0f這個功能碼,就是批量寫入。
00 00 00 00 00 84 FF 0F 00 00 03 E8 7D ...後面就是125個byte,都是00

  • 功能碼 0x03

該功能實現寄存器的數據讀取,我們需要知道的是,一個寄存器佔2個字節,而且是高位在前,低位在後,那麼如果寄存器0的數據是1000,那麼我們讀取的數據就是03 E8,03功能碼和01功能碼很接近,就是功能碼替換一下,返回的數據解析不一樣而已。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章