Modbus協議分析——TCP/RTU
兩種傳輸方式
控制器能設定為兩種傳輸模式(ASCII或RTU)中的任何一種在標準的Modbus網路通訊。使用者選擇想要的模式,包括串列埠通訊引數(波特率、校驗方式等),在配置每個控制器的時候,在一個Modbus網路上的所有裝置都必須選擇相同的傳輸模式和串列埠引數。所選的ASCII或RTU方式僅適用於標準的Modbus網路,它定義了在這些網路上連續傳輸的訊息段的每一位,以及決定怎樣將資訊打包成訊息域和如何解碼。在其它網路上(象MAP和Modbus Plus)Modbus訊息被轉成與序列傳輸無關的幀。
1、ASCII模式
當控制器設為在Modbus網路上以ASCII(美國標準資訊交換程式碼)模式通訊,在訊息中的每個8Bit位元組都作為兩個ASCII字元傳送。這種方式的主要優點是字元傳送的時間間隔可達到1秒而不產生
錯誤。
程式碼系統
· 十六進位制,ASCII字元0...9,A...F
· 訊息中的每個ASCII字元都是一個十六進位制字元組成
每個位元組的位
· 1個起始位
· 7個數據位,最小的有效位先發送
· 1個奇偶校驗位,無校驗則無
· 1個停止位(有校驗時),2個Bit(無校驗時)
錯誤檢測域
· LRC(縱向冗長檢測)
2、RTU模式
當控制器設為在Modbus網路上以RTU(遠端終端單元)模式通訊,在訊息中的每個8Bit位元組包含兩
個4Bit的十六進位制字元。這種方式的主要優點是:在同樣的波特率下,可比ASCII方式傳送更多的
資料。
程式碼系統
· 8位二進位制,十六進位制數0...9,A...F
· 訊息中的每個8位域都是一個兩個十六進位制字元組成
每個位元組的位
· 1個起始位
· 8個數據位,最小的有效位先發送
· 1個奇偶校驗位,無校驗則無
· 1個停止位(有校驗時),2個Bit(無校驗時)
錯誤檢測域
· CRC(迴圈冗長檢測)
Modbus訊息幀
兩種傳輸模式中(ASCII或RTU),傳輸裝置以將Modbus訊息轉為有起點和終點的幀,這就允許接1、ASCII幀
使用ASCII模式,訊息以冒號(:)字元(ASCII碼 3AH)開始,以回車換行符結束(ASCII碼 0DH,0AH)。其它域可以使用的傳輸字元是十六進位制的0...9,A...F。網路上的裝置不斷偵測“:”字元,當有一個冒號接收到時,每個裝置都解碼下個域(地址域)來判斷是否發給自己的。訊息中字元間傳送的時間間隔最長不能超過1秒,否則接收的裝置將認為傳輸錯誤。一個典型訊息幀如下所示:
2、RTU幀
使用RTU模式,訊息傳送至少要以3.5個字元時間的停頓間隔開始。在網路波特率下多樣的字元時間,這是最容易實現的(如下圖的T1-T2-T3-T4所示)。傳輸的第一個域是裝置地址。可以使用的傳輸字元是十六進位制的0...9,A...F。網路裝置不斷偵測網路匯流排,包括停頓間隔時間內。當第一個域(地址域)接收到,每個裝置都進行解碼以判斷是否發往自己的。在最後一個傳輸字元之後,一個至少3.5個字元時間的停頓標定了訊息的結束。一個新的訊息可在此停頓後開始。整個訊息幀必須作為一連續的流轉輸。如果在幀完成之前有超過1.5個字元時間的停頓時間,接收裝置將重新整理不完整的訊息並假定下一位元組是一個新訊息的地址域。同樣地,如果一個新訊息在小於3.5個字元時間內接著前個訊息開始,接收的裝置將認為它是前一訊息的延續。這將導致一個錯誤,因為在最後的CRC域的值不可能是正確的。一典型的訊息幀如下所示:
Modbus RTU協議格式:
請求和響應帶有六個位元組的字首,如下: byte 0: 裝置地址 byte 1: 功能碼 byte 2: 暫存器地址 byte 3: 暫存器地址 byte 4: 資料長度 byte 5: 資料長度 byte 6: CRC校驗 byte 7: CRC校驗舉例:Modbus-RTU讀取溫溼度儀表
Modbus TCP協議格式:
TCP和RTU協議非常類似,只要把RTU協議的兩個位元組的校驗碼去掉,然後在RTU協議的開始加上5個0和一個6並通過TCP/IP網路協議傳送出去即可
MBAP Header長度共7個位元組,分別為Transaction identifier(事務識別符號),Protocol identifier(協議識別符號),Length(長度),
Unitidentifier(單元識別符號)組成,具體如下表所示:
地址碼:地址碼為通訊傳送的第一個位元組。這個位元組表明由使用者設定地址碼的從機將接收由主機發送來的資訊。並且每個從機都有具有唯一的地址碼,並且響應回送均以各自的地址碼開始。主機發送的地址碼錶明將傳送到的從機地址,而從機發送的地址碼錶明回送的從機地址。
功能碼:主機發送的功能碼告訴從機執行什麼任務。下表列出的功能碼都有具體的含義及操作。
資料區:資料區是根據不同的功能碼而不同。資料區可以是實際數值、設定點、主機發送給從機或從機發送給主機的地址。
舉例:Modbus-TCP讀取溫溼度儀表(注:通訊涉及的均為 6 16 進位制)
溼度: 等於(實際值 *100 ),單位為百分號。溫度:等於(實際值 *100 + 27315 )。
溫度舉例: :
假如 軟體 讀取到溫度 值 為6 : 75 C1 (16 進位制) ) – 轉換為 30145 ( 十進位制) )
實際溫度用 T T 表示 :T = (30145 – 27315)/100 = 28.3 ( ( ℃) )
暫存器內容定義:
只讀物件:
0x0000: 當前溼度值,
0x0001: 當前溫度值,
讀取溫溼度資料舉例 ( 讀取1 號儀表的溫溼度值 ,03 命令) :
起始地址 讀取個數
請求: 00 00 00 00 00 06 01 03 00 00 00 02
響應: 00 00 00 00 00 07 01 03 04 18 3E 77 51
協議解析:
請求:
00 00 00 00 固定碼
00 06 資料長度
01 裝置地址
03 功能碼
00 00 起始暫存器地址
00 02 讀取暫存器個數
響應:
00 00 00 00 固定碼
00 07 資料長度
01 裝置地址
03 功能碼
04 返回暫存器資料長度
18 3E 溼度(實際溼度 = 6206/100 = 62.06%)
77 51 溫度(實際溫度 = (30545 -27315)/100 = 31.30℃)
說明:
實際上Modbus協議包括ASCII、RTU、TCP。
標準的Modicon控制器使用RS232C實現序列的Modbus。Modbus的ASCII、RTU協議規定了訊息、資料的結構、命令和就答的方式,資料通訊採用Maser/Slave方式。
Modbus協議需要對資料進行校驗,序列協議中除有奇偶校驗外,ASCII模式採用LRC校驗,RTU模式採用16位CRC校驗.
ModbusTCP模式沒有額外規定校驗,因為TCP協議是一個面向連線的可靠協議。
MODBUS TCP和MODBUS RTU的差別不是很大。
二者相同的地方是應用資料單元是一致的。
差別是MODBUS TCP是傳輸在TCP/IP網路上的,多了一個報文頭,少了CRC校驗,採用TCP的502埠
RTU多了裝置地址和CRC校驗