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