Modbus協議的常用基本定義——(RS485總線系統應用之2)續
當消息從主設備發往從設備時,功能代碼域將告之從設備需要執行哪些行為。例如去讀取輸入的開關狀態,或讀一組寄存器的數據內容,或讀從設備的診斷狀態,或允許在從設備中調入、記錄、校驗程序等。
當從設備回應時,它使用功能代碼域來指示是正常回應(無誤)還是有某種錯誤發生(稱作異議回應)。對正常回應,從設備僅回應相應的功能代碼。對異議回應,從設備返回功能代碼的最高位為“1”。例如:
一條主設備發往從設備的消息要求讀一組保持寄存器,將產生如下功能代碼:
0 0 0 0 0 0 1 1(十六進制03H)
對正常回應,從設備返回同樣的功能代碼。對異議回應,它將返回:
1 0 0 0 0 0 1 1(十六進制83H)
除功能代碼因異議回應作了修改外,從設備還將一個獨特的代碼放到回應消息的數據域中,告訴主設備發生了什么錯誤。
主設備得到異議回應后,典型的處理過程是重發消息。或者請求技術員,幫助診斷發給從設備的消息是否有錯。
3.5數據域
根據網絡傳輸模式,數據域可以由若干個ASCII字符或RTU字節組成。數據域的值由十六進制數構成,范圍為00H~FFH。
主設備發給從設備消息的數據域包含從設備必須完成的由功能代碼所定義的行為。其中包括了不連續的寄存器地址、要處理項的數目、域中實際數據字節數。
例如,如果主設備需要從從設備讀取一組保持寄存器(功能代碼03),則必須在數據域中指定起始寄存器地址以及要讀的寄存器個數。如果主設備需要向從設備寫一組的寄存器(功能代碼10十六進制),則必須在數據域中指明要寫的寄存器起始地址、要寫的寄存器個數以及要寫入的數據。
在某種消息中,數據域可以是不存在的(0長度)。例如,主設備要求從設備回應通信事件記錄(功能代碼0BH),從設備不需任何附加的信息。
3.6錯誤檢測域
標準的Modbus網絡有兩種錯誤檢測模式。錯誤檢測域的內容視所選的檢測模式而定。
ASCII模式:
當選用ASCII模式時,錯誤檢測域包含兩個ASCII字符。這是使用LRC(縱向冗長檢測)方法對消息內容計算得出的,不包括開始的冒號符及回車換行符。LRC字符處在回車換行符前面。
RTU模式:
當選用RTU模式時,錯誤檢測域包含一個16Bits值(用兩個8位的字符來實現)。錯誤檢測域的內容是通過CRC(循環冗長檢測)方法得出的。CRC域附加在消息的最后,CRC的高位字節是發送消息的最后一個字節。
4. Modbus的錯誤檢測方法
4.1奇偶校驗
1 1 0 0 0 1 0 1
4.2 LRC校驗
LRC方法是將消息中的8Bit的字節連續累加,丟棄了進位。
4.3 CRC校驗
CRC域是兩個字節,包含一個16位的二進制值。它由傳輸設備計算后加入到消息中。接收設備重新計算收到消息的CRC,并與接收到的CRC域中的值比較,如果兩值不同,則有誤。
CRC方法比LRC方法繁瑣得多,受篇幅限制在此不作介紹。如需了解,請參見本人發表的《CRC校驗原理與程序設計》一文。
一個通信實例:
表3是一個以RTU方式讀取整數數據的例子。主機向01H號從機發出04H號(讀取輸入寄存器)功能碼,要求讀取從0000H地址開始的2個(16Bit)輸入寄存器的值。CB71H是01H、04H、00H、00H、00H、02H六個數據的CRC校驗值。從機應答時將地址和功能碼原樣發回,并將2個(16Bit)輸入寄存器的值0107H和0251H分成4個(8Bit)數據01H、07H、02H、51H發回。258BH是01H、04H、04H、01H、07H、02H、51H七個數據的CRC校驗值。
主機請求消息幀(8個字節)
地址 | 功能碼 | 被讀首個寄存器的高位地址 | 被讀首個寄存器的低位地址 | 被讀寄存器的數量的高位 | 被讀寄存器的數量的低位 | CRC低位 | CRC高位 | |
01 | 04 | 00 | 00 | 00 | 02 | 71 | CB |
從機應答消息幀(9個字節)
地址 | 功能碼 | 數據個數 | 第1個數據 | 第2個數據 | 第3個數據 | 第4個數據 | CRC低位 | CRC高位 |
01 | 04 | 04 | 01 | 07 | 02 | 51 | 8B | 25 |
表3.以RTU方式讀取整數數據
參考文獻:
①GB/T 19582.1-2008《基于Modbus協議的工業自動化網絡規范》
②Modbus協議中文版
評論