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