MODBUS通信模式最主要有兩種:
RTU模式和ASCII模式,
RTU模式:
地址碼 功能碼 資料 校驗碼 一位元組 一位元組 n位元組 兩位元組(CRC) 從機都有相應的地址碼,便于主機識別,其中資料已幀為單位進行資料傳輸,每幀最長為252位元組,最短為0,如果一byte資料的傳輸時間為T,那么每兩幀之間的間隔最小應該要大于3.5T,否則從機不能分辨這是兩幀,第二,同一幀連續的兩個資料之間的間隔時間不能超過1.5T,否則節點會認為這一幀資料不完整,這說明我們在modbus傳輸的時候要使能一個定時器的作業,
ASCII模式:
起始 地址碼 功能碼 資料 校驗 回車換行 字符 ':'(冒號) 兩位元組 兩位元組 0到2 * 252位元組 兩位元組(LRC校驗) 兩位元組(CR,LF) 幀的起始一字符 ' : '冒號開始,結束為回車換行,其對應的16進制可以到ASCII表中進行查詢,位元組間傳輸的間隔時間不能大于1s,大于1s認為這一幀資料丟失.同樣我們可以計算出來ASCII幀的最大長度是513位元組,
RTU使用CRC校驗,ASCII使用LRC校驗,
正確的應答格式:
地址碼 功能碼 資料碼 校驗 從機自己的 與發送的保持一致(范圍:0x00-0x7f) 根據功能需求 校驗碼
錯誤應答:
功能碼加0x80,原本功能碼最高位不會為1,加0x80最高位為1,判斷出錯,資料位的例外碼可以知道大概是什么錯誤,
地址碼 功能碼 資料碼 校驗 從機自己的 與發送的保持一致(范圍:0x00-0x7f) + 0x80 例外碼 校驗碼
例外碼:
功能碼:
0x01: 讀線圈暫存器(可讀可寫線圈)
0x02: 讀離散輸入暫存器(可讀不可寫線圈)
0x03: 讀保持暫存器(可讀可寫暫存器)
0x04: 讀輸入暫存器(可讀不可寫暫存器)
0x05: 寫單個線圈暫存器(可寫單個線圈不可讀)
0x06: 寫單個保持暫存器(可寫單個暫存器不可讀)
0x0f: 寫多個線圈暫存器(可寫多個線圈不可讀)
0x10: 寫多個保持暫存器(可寫多個暫存器不可讀)
01H-->讀線圈暫存器
地址碼 功能碼 資料 校驗 發送 01 01 00 20 00 05 FD C3 回應 01 01 01 15 90 47 發送資料:讀取地址:00 20,從0x20處開始讀取,00 05 讀取5個暫存器,
回應資料:01,只有5個暫存器,小于8,5/8=0,加1,所以為1,假設有9個,則為02,以此類推,15,二進制:00010101,在5個暫存器中有3個處于開的狀態,在此功能下只能讀取從機狀態,
02H--->讀離散輸入暫存器
地址碼 功能碼 資料 校驗 發送 01 02 00 20 00 05 B9 C3 回應 01 02 01 02 20 49 發送資料:讀取地址:00 20,從0x20處開始讀取,00 05 讀取5個暫存器,
回應資料:01,只有5個暫存器,小于8,5/8=0,加1,所以為1,假設有9個,則為02,以此類推,02,二進制:00000010,在5個暫存器中有1個處于開的狀態,在此功能下只能讀取從機狀態,
03-->讀保持暫存器
地址碼 功能碼 資料 校驗 發送 01 03 00 14 00 03 45 CF 回應 01 03 06 00 14 00 1E 00 00 71 70 發送資料:讀取地址:00 20,從0x20處開始讀取,00 05 讀取3個暫存器,
回應資料:06,后面有6位,00 14,發送的資料0x14,00 1E發送的資料0x1E,00 00發送的資料0X00,
04--> 讀輸入暫存器
地址碼 功能碼 資料 校驗 發送 01 04 00 14 00 03 F0 0F 回應 01 04 06 00 14 00 1E 00 00 30 96 發送資料:讀取地址:00 20,從0x20處開始讀取,00 05 讀取3個暫存器,
回應資料:06,后面有6位,00 14,發送的資料0x14,00 1E發送的資料0x1E,00 00發送的資料0X00,
05-->寫單個線圈暫存器
地址碼 功能碼 資料 校驗 發送 01 05 00 20 00 00 CC 00 回應 01 05 00 20 00 00 CC 00 發送資料:讀取地址:00 20,從0x20處開始寫入,00 00 寫入值,
回應資料:跟發送的一樣,
06-->寫單個保持暫存器
地址碼 功能碼 資料 校驗 發送 01 06 00 01 00 03 XX XX 回應 01 06 00 01 00 03 XX XX 發送資料:讀取地址:00 20,從0x20處開始寫入,00 03 寫入值,
回應資料:跟發送的一樣,
0F-->寫多個線圈暫存器
地址碼 功能碼 資料 校驗 發送 01 0F 00 14 00 03 01 00 CC 00 回應 01 0F 00 14 00 03 CC 00 發送資料:讀取地址:00 20,從0x20處開始寫入,00 03 寫入3個值,01,3小于8,00,寫入的3個資料都為0,
回應資料:00 14,寫入地址,00 03,3個資料,
10-->寫多個保持暫存器
地址碼 功能碼 資料 校驗 發送 01 10 00 34 00 02 04 0C 02 12 45 XX XX 回應 01 10 00 34 00 02 XX XX 發送資料:讀取地址:00 34,從0x34處開始寫入,00 02 寫入2個值,04后面有4位,0C 02和12 45都為資料,
回應資料:00 14,寫入地址,00 02,2個資料,
CRC校驗:
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/190197.html
標籤:java
上一篇:C#番外篇-SpinWait



