MODBUS串行通信协议详细说明
第一章 簡介
本文詳細地描述了裝置在MODBUS 通訊模式下的輸入和輸出命令、信息和數據,以便第三方使用和開發。
1.1 串行通訊協議的目的
通信協議的作用是使信息和數據在上位機主站和裝置之間有效地傳遞,它包括:
(1) 允許主站訪問和設定所接裝置的全部設置參數;
(2) 允許訪問裝置的所有測量數據。
第二章 裝置 MODBUS串行通信協議詳細說明
2.1協議基本規則
以下規則確定在RS485 或者RS232C 回路控制器和其他RS485 串行通信回路中設備的通信規則:
(1) 所有RS485 回路通信應遵照主/從方式。在這種方式下,信息和數據在單個主站和最多32 個從站監控設備之間傳遞;
(2) 主站將初始化和控制所有在RS485通信回路上傳遞的信息;
(3) 無論如何都不能從一個從站開始通信;
(4) 所有RS485環路上的通信都以“打包”方式發生,一個包裹就是一個簡單的字符串(每個字符8位),一個包裹中最多可含255個字節。組成這個包裹的字節構成標準異步串行數據,并按8位數據位,1位停止位,無校驗位的方式傳遞。串行數據流由類似于RS232C中使用的設備產生;
(5) 主站發送包裹稱為請求,從站發送包裹稱為響應;
(6) 任何情況只能有一個從站響應主站的請求。
2.2 傳送模式
MODBUS協議可以采用ASCII或者RTU模式傳送數據。本文僅僅針對RTU模式,8位數據位,無校驗位,1位停止位。
2.3 MODBUS 包裹結構描述
每個MODBUS 包裹都由以下幾個部分組成:
(1) 地址域
(2) 功能碼域
(3) 數據域
(4) 校驗域
2.3.1 地址域
MODBUS的從站地址域長度為一個字節,包含包裹傳送的從站地址。有效的從站地址范圍從1~247。從站如果接收到一幀從站地址域信息與自身地址相符合的包裹時,應當執行包裹中所包含的命令。從站所響應的包裹中該域為自身地址。
2.3.2 功能碼域
MODBUS包裹中功能域長度為一個字節,用以通知從站應當執行何操作。從站響應包裹中應當包含主站所請求操作的相同功能域字節。有關裝置用到的功能碼參照下表:
|
功能碼 |
含義 |
功能 |
|
0x03 |
讀取寄存器 |
獲得當前裝置內部一個或多個當前寄存器值 |
|
0x05 |
設置繼電器 |
將指定的繼電器設置為ON或OFF |
|
0x10 |
設置寄存器 |
將指定數值寫入裝置內部一個或多個寄存器內 |
2.3.3 數據域
MODBUS 數據域長度不定,依據其具體功能而定。MODBUS數據域采用”BIG INDIAN”模式,即是高位字節在前低位字節在后。舉例如下:
Example 2.1
1 個16 位寄存器包含數值為0x12AB 寄存器數值發送順序為
高位字節= 0x12
低位字節= 0x0AB
2.3.4 校驗域
MODBUS-RTU模式采用16 位CRC 校驗。發送設備應當對包裹中的每一個數據都進行CRC16計算,最后結果存放入檢驗域中。接收設備也應當對包裹中的每一個數據(除校驗域以外)進行CRC16計算,將結果域校驗域進行比較。只有相同的包裹才可以被接受。具體的CRC校驗算法參照附錄。
2.4 網絡時間考慮
在RS485 網絡上傳送包裹需要遵循以下有關時間的規定:
(1) 主站請求包裹結束到從站響應包裹開始之間的時間最小為20毫秒,最大為250毫秒,典型值為60毫秒;
(2) 從站響應包裹結束到主站下一請求包裹開始之間的時間典型值為100 毫秒;
(3) 包裹中相鄰兩個字節之間的最大時間依據通訊波特率不同而不同,一般來說最大字節時間為3倍的字節發送時間 (例如9600 波特率下,字節間隔為3毫秒;4800波特率時,字節間隔為6 毫秒 )。
2.5 異常響應
如果主站發送了一個非法的包裹給裝置或者是主站請求一個無效的數據寄存器時,異常的數據響應就會產生。這個異常數據響應由從站地址、功能碼、故障碼和校驗域組成。當功能碼域的高比特位置為1時,說明此時的數據幀為異常響應。下表說明異常功能碼的含義:
|
故障碼名稱 |
說 明 (field of the request packet.) |
|
01 非法功能碼 |
表示從站接收到非法的功能碼(03H,10H以外)或者是裝置接收到一個錯誤的操作密碼 |
|
02 非法數據地址 |
說明裝置接收到無效的數據地址或者是請求寄存器不在有效的寄存器范圍內;或者寄存器個數與字節數不相符合; 或者寫寄存器時,寄存器范圍超出 |
|
03 非法的數據值 |
由主機傳來的參數值不在所選中的數據地址允許范圍內 |
|
05 密碼寄存器錯誤 |
給密碼包裹寄存器寫入時,密碼不正確;或者未寫入正確密碼就去寫需要密碼的寄存器;或者讀取密碼寄存器時,未正確寫入密碼包 |
第三章 通訊包裹
標準的MODBUS協議僅支持16位數據模式,也就說傳輸任何數據最大為65535。對于更大的數據,則分成多個寄存器讀寫。比如,對于32位數據,則高字占一個寄存器,低字占一個寄存器。64位數據則用4個寄存器表示。
3.1設置繼電器輸出狀態(功能碼0X05)
主站指定要操作的繼電器的地址,繼電器的地址從0開始編址,1號繼電器的地址為0。數據域的內容指定繼電器的動作,0XFF00為“ON”,0X0000為“OFF”。發送其他的數據不會影響繼電器的狀態。
從站響應數據中,對正確設置的數據,返回請求幀。如果設置值無效,則返回錯誤的功能碼。
例如:設置17的4號繼電器為“ON”,則通訊請求和響應如下:
|
請求格式(主機→裝置) |
響應格式(裝置→主機) |
|||
|
從站地址 |
0x11 |
從站地址 |
0x11 |
|
|
功能碼 |
0x05 |
功能碼 |
0x05 |
|
|
地址高 |
0x00 |
地址高 |
0x00 |
|
|
地址低 |
0x03 |
地址低 |
0x03 |
|
|
設置數據高 |
0XFF |
設置數據高 |
0XFF |
|
|
設置數據低 |
0x00 |
設置數據低 |
0x00 |
|
|
CRC 校驗碼 |
-- |
CRC 校驗碼 |
-- |
|
3.2讀寄存器(功能碼03)
由主站機發送讀寄存器的包裹請求,裝置響應所有有效的寄存器(在起始寄存器和終止寄存器之間)。讀寄存器不需要密碼,報文格式如下:
|
讀寄存器包裹格式(主機→裝置) |
響應格式(裝置→主機) |
|||
|
從站地址 |
1 字節 |
從站地址 |
1 字節 |
|
|
功能碼03H |
1 字節 |
功能碼03H |
1 字節 |
|
|
開始地址 |
2 字節 |
字節數(2*寄存器數目) |
1 字節 |
|
|
寄存器個數 |
2 字節 |
第一個寄存器數據 |
2 字節 |
|
|
CRC 校驗碼 |
2 字節 |
第二個寄存器數據 |
2 字節 |
|
|
…… |
…… |
|||
|
CRC校驗碼 |
2 字節 |
|||
如:1.<DATA Send="1C 03 0B B9 00 06 15 84" Recv="1C 03 0C 00 01 00 00 00 40 00 00 00 00 25 80 71 10" />
2.<DATA Send="1C 03 03 85 00 03 17 EB" Recv="1C 03 06 00 00 00 00 00 00 25 B4" />
3.<DATA Send="1C 03 00 0A 00 0C 66 40" Recv="1C 03 18 55 8C 55 8C 55 8C 55 8C 7C 9C 7C 9C 7C 9C 7C 9C 9C 40 9C 40 9C 40 9C 40 DB 26" /> 等。
備注:
(1) 響應包裹中對無效的寄存器一律上傳0;
(2) 讀寄存器一般不需要密碼,但在以下情況時,需要密碼。
a) 讀面板操作密碼寄存器(43020)
由于MODBUS規約中沒有密碼域,通過以下特殊程序完成這種情況的讀。
首先寫包裹密碼寄存器(40319),如果密碼設置正確(面板操作密碼或萬能密碼),則可以正確讀寄存器,如果密碼不正確,讀寄存器時會返回“錯誤功能碼”響應。
(3) 一次最多讀60個寄存器。
3.3 寫寄存器(功能碼16)
該命令允許主站配置裝置工作參數,以下為數據格式:
|
寫寄存器包裹格式(主機→裝置) |
響應格式(裝置→主機) |
|||
|
從站地址 |
1 字節 |
從站地址 |
1 字節 |
|
|
功能碼10H |
1 字節 |
功能碼10H |
1 字節 |
|
|
開始地址 |
2 字節 |
開始地址 |
2 字節 |
|
|
寄存器個數 |
2 字節 |
寄存器個數 |
2 字節 |
|
|
字節個數(2*寄存器個數) |
1 字節 |
CRC校驗碼 |
2 字節 |
|
|
第一個寄存器數據 |
||||
|
第一個寄存器數據 |
||||
|
…… |
||||
|
CRC 校驗碼 |
2 字節 |
|||
備注:
(1) 裝置假定寫入的寄存器從第一個寄存器開始是連續的;
(2) 寫寄存器都需要密碼,首先要將用戶密碼或萬能密碼寫入通訊密碼寄存器(43019),然后再寫目標寄存器。
第四章 計算CRC-16
算法
該部分將描述計算的過程。在幀中的有關的字節被義為是一串2進制數據(0,1)。第16位校驗和是這樣得到的:該串數據流被216乘,然后除以發生器多項式(X16+X15+X2+1),該式以2進制表示為1100000000000101。商被忽略,16位的余數就是CRC的值,在計算CRC-16值時,全部算術運算用modulo two或者異或(X0R)算法。
按照下列步驟產生CRC-16 的校驗和:
(1) 省略發生器最有意義的位并且把位的順序顛倒過來形成一個新的多項式,結果是1010000000000001或者16進制的A001。
(2) 將全部1或者16進制FFFF裝入16位寄存器。
(3) 用16 位寄存器中低階字節對第一個數據字節進行XOR 運算,把結果存入16 位寄存器。
(4) 把16 位寄存器向右移一位。如果溢出位為1,則轉向第5 步驟,否則轉向第6 步驟。
(5) 用新的發生器多項式對16 位寄存器執行MOR 運算,并且把結果存入16 步驟。
(6) 重復步驟4 直到移位8 次為止。
(7) 用16 位寄存器的第階字節對下一個數據字節進行XOR 運算,將結果存入16 位寄存器。
(8) 重復步驟4-7,直到小包的所有字節都已經用16 位寄存器執行了XOR 運算為止。
(9) 16 位寄存器的內容就是CRC-16。
unsigned int formcrc16(unsigned char * startaddress, unsigned char bytecount)
{ unsigned char i, j ;
unsigned int crc16value = 0xffff ;
unsigned int polynomial = 0xa001 ;
for ( i = 0 ; i < bytecount ; i ++ )
{ crc16value = crc16value ^ ( * ( startaddress + i ) ) ;
for ( j = 0 ; j < 8 ; j ++ )
{ if ( ( crc16value & 1 ) == 1 )
crc16value = ( crc16value >> 1 ) ^ polynomial ;
else
crc16value = crc16value >> 1 ;
}
}
return crc16value ;
}
總結
以上是生活随笔為你收集整理的MODBUS串行通信协议详细说明的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 参茸强肾片_功效作用注意事项用药禁忌用法
- 下一篇: Antd