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