1. 程式人生 > 其它 >標準Modbus通訊協議格式----古月金真

標準Modbus通訊協議格式----古月金真

技術標籤:西門子PLC

Modbus協議是請求/應答通訊協議,其中功能碼主要用於表述該資料報文執行的功能,當伺服器對客戶機進行響應時,它使用功能碼域來指示正常響應(無差錯)或者異常響應(即出現某種差錯)。


功能碼說明

Modbus協議處理的所有資料按照儲存資料的型別可分為位暫存器(1bit)和16位暫存器(16bit)。因此功能碼可分為位操作和字操作兩類。位操作的最小單位是bit,字操作的最小單位是兩個位元組。

暫存器功能碼說明
這裡寫圖片描述

暫存器種類說明
這裡寫圖片描述

Modbus RTU報文幀格式 

 地址碼(1位元組) + 功能碼(1位元組)+  資料區(0~252位元組) + 錯誤校驗碼(2位元組)
  • 1
  1. 地址碼
    地址碼為通訊的第一位元組,每個從站都有一個唯一的地址碼,只有符合主站傳送的地址碼的從站才能響應回送。地址0為廣播地址,所有的從站都能識別,但不做響應,從站的地址範圍為(1~247)。
  2. 資料區
    資料區根據功能碼的不同而不同。下面會結合功能碼介紹。
  3. 校驗碼
    主站或從站通過校驗碼判別報文在通訊過程中是否出錯。RTU報文使用CRC檢測,ASCII報文使用LRC檢測。
  4. 功能碼

<1>功能碼01(0x01) 讀線圈狀態

傳送:

從站地址功能碼起始地址線圈數量CRC
1位元組(1~147)1位元組(0x1)2位元組(0x0000~0xFFFF)2位元組(1~2000)2位元組

接收:

從站地址功能碼位元組數線圈狀態CRC
1位元組(1~147)1位元組(0x1)1位元組(N)N位元組2位元組

N=讀取線圈個數/8,如果餘數不為0則N=N+1。

例子:
傳送: 01 01 00 00 00 19 FD C0 (讀取25個線圈的狀態)
接收: 01 01 04 0F 03 80 01 A8 C5


<2>功能碼02(0x02) 讀取輸入狀態
傳送:

從站地址功能碼起始地址輸入點數量CRC
1位元組(1~147)1位元組(0x2)2位元組(0x0000~0xFFFF)2位元組(1~2000)2位元組

接收:

從站地址功能碼位元組數輸入點狀態CRC
1位元組(1~147)1位元組(0x2)1位元組(N)N位元組2位元組

N=讀取線圈個數/8,如果餘數不為0則N=N+1。

例子:
傳送: 01 02 00 00 00 19 B9 C0 (讀取25個輸入線圈的狀態)
接收: 01 02 04 00 00


<3>功能碼03(0x03) 讀保持暫存器

傳送:

從站地址功能碼起始地址暫存器數量CRC
1位元組(1~147)1位元組(0x3)2位元組(0x0000~0xFFFF)2位元組( 1~125)2位元組

接收:

從站地址功能碼位元組數暫存器值CRC
1位元組(1~147)1位元組(0x3)1位元組(N)2*N位元組2位元組

N=暫存器的數量,03碼每個暫存器是16位的。

不難看出03碼的傳送接收規律,主站傳送為固定格式的8位元組長度資料,從站返回長度隨主站讀取個數的不同而不同。
這裡舉個例子:主站向從站地址為01的裝置,請求從裝置地址 00 00 處讀取3個暫存器的值。從站接受到請後,返回主站讀取到的3個暫存器的值,每個暫存器由2個位元組組成。

傳送:01 03 00 00 00 03 05 CB
接收:01 03 06 01 2C 01 2C 01 2C 71 1A


<4>功能碼05(0x05) 寫單一線圈
傳送:

從站地址功能碼線圈地址寫入值CRC
1位元組(1~147)1位元組(0x5)2位元組(0x0000~0xFFFF)2位元組2位元組

線圈寫入值只能為0x0000或0xFF00

接收:

從站地址功能碼線圈地址寫入值CRC
1位元組(1~147)1位元組(0x5)2位元組(0x0000~0xFFFF)2位元組2位元組

05碼的傳送和接收相同。

傳送:01 05 00 00 FF 00 8C 3A (寫單個線圈的值,把地址為0的線圈置1)
接收:01 05 00 00 FF 00 8C 3A


<5>功能碼06(0x06) 寫單一暫存器
傳送:

從站地址功能碼暫存器地址寫入值CRC
1位元組(1~147)1位元組(0x6)2位元組(0x0000~0xFFFF)2位元組( 0x0000~0xFFFF)2位元組

接收:

從站地址功能碼暫存器地址寫入值CRC
1位元組(1~147)1位元組(0x6)2位元組(0x0000~0xFFFF)2位元組( 0x0000~0xFFFF)2位元組

06碼的傳送和接收相同。

傳送: 01 06 00 00 00 0A 09 CD (往地址為0的暫存器寫入10)
接收: 01 06 00 00 00 0A 09 CD


<6>功能碼15(0x0F) 寫多線圈
傳送:

從站地址功能碼起始地址寫入線圈個數寫入位元組數寫入值CRC
1位元組(1~147)1位元組(0xF)2位元組(0x0000~0xFFFF)2位元組( 0x0001~0x07B0)1位元組(N)N位元組2位元組

N=讀取線圈個數/8,如果餘數不為0則N=N+1。

接收:

從站地址功能碼起始地址寫入線圈個數CRC
1位元組(1~147)1位元組(0xF)2位元組(0x0000~0xFFFF)2位元組( 0x0001~0x07B0)2位元組

傳送: 01 0F 00 00 00 0A 02 01 01 25 68
返回: 01 0F 00 00 00 0A D5 CC


<7>功能碼16(0x10) 寫多暫存器
傳送:

從站地址功能碼起始地址寫入暫存器個數寫入位元組數寫入值CRC
1位元組(1~147)1位元組(0x10)2位元組(0x0000~0xFFFF)2位元組( 0x0001~0x07B0)1位元組(N)2*N位元組2位元組

接收:

從站地址功能碼起始地址寫入暫存器個數CRC
1位元組(1~147)1位元組(0x10)2位元組(0x0000~0xFFFF)2位元組( 0x0001~0x07B0)2位元組

傳送:01 10 00 00 00 02 04 00 01 00 02 23 AE
接收:01 10 00 00 00 02 41 C8