新聞中心

EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > Modbus協(xié)議的常用基本定義——(RS485總線系統(tǒng)應(yīng)用之2)續(xù)

Modbus協(xié)議的常用基本定義——(RS485總線系統(tǒng)應(yīng)用之2)續(xù)

作者: 時(shí)間:2016-12-15 來(lái)源:網(wǎng)絡(luò) 收藏

當(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è)方法

標(biāo)準(zhǔn)的Modbus串行網(wǎng)絡(luò)采用兩種錯(cuò)誤檢測(cè)方法。奇偶校驗(yàn)對(duì)每個(gè)字符都可用,幀檢測(cè)(LRC或CRC)應(yīng)用于整個(gè)消息。它們都是在消息發(fā)送前由主設(shè)備產(chǎn)生的,從設(shè)備在接收過(guò)程中檢測(cè)每個(gè)字符和整個(gè)消息幀。

用戶要給主設(shè)備配置一個(gè)預(yù)先定義的超時(shí)時(shí)間間隔,這個(gè)時(shí)間間隔要足夠長(zhǎng),以使任何從設(shè)備都能作出正常反應(yīng)。如果從設(shè)備檢測(cè)到傳輸錯(cuò)誤,消息將不會(huì)被接收,也不會(huì)向主設(shè)備作出回應(yīng)。這樣產(chǎn)生的超時(shí)事件將觸發(fā)主設(shè)備來(lái)處理錯(cuò)誤。發(fā)往不存在的從設(shè)備的地址也會(huì)產(chǎn)生超時(shí)。

4.1奇偶校驗(yàn)

用戶可以配置控制器是奇校驗(yàn)或偶校驗(yàn),也可以是無(wú)校驗(yàn)。如果指定了奇或偶校驗(yàn),將計(jì)算每個(gè)字符(8個(gè)Bit)中“1”的位數(shù)(ASCII模式7個(gè)數(shù)據(jù)Bit,RTU中8個(gè)數(shù)據(jù)Bit)。例如字符C5H包含以下8個(gè)數(shù)據(jù)Bit:

1 1 0 0 0 1 0 1

整個(gè)字符“1”的位數(shù)是4個(gè)。如果便用了偶校驗(yàn),因?yàn)?是偶數(shù),幀的奇偶校驗(yàn)位將是0,使得整個(gè)幀的“1”的個(gè)數(shù)仍是偶數(shù)(4)。如果使用了奇校驗(yàn),幀的奇偶校驗(yàn)位將是1,便得整個(gè)幀的“1”的個(gè)數(shù)是奇數(shù)(4+1=5)。

如果沒(méi)有指定奇偶校驗(yàn)位,傳輸時(shí)就沒(méi)有校驗(yàn)位,也不進(jìn)行校驗(yàn)檢測(cè)。此時(shí),在要傳輸?shù)淖址麕性黾右粋€(gè)停止位。

4.2 LRC校驗(yàn)

被應(yīng)用于ASCII模式,消息包括了一個(gè)基于LRC方法的錯(cuò)誤檢測(cè)域。LRC域檢測(cè)了消息域中除開始的冒號(hào)及結(jié)束的回車換行號(hào)以外的內(nèi)容。

LRC域是一個(gè)包含8位二進(jìn)制值的字節(jié)。LRC值由發(fā)送設(shè)備計(jì)算并放到消息幀中,接收設(shè)備在接收消息的過(guò)程中重新計(jì)算LRC,并將它和接收消息中的LRC值比較,如果兩值不等,說(shuō)明有錯(cuò)誤。

LRC方法是將消息中的8Bit的字節(jié)連續(xù)累加,丟棄了進(jìn)位。

4.3 CRC校驗(yàn)

被應(yīng)用于RTU模式,消息包括了一個(gè)基于CRC方法的錯(cuò)誤檢測(cè)域。CRC域檢測(cè)了整個(gè)消息的內(nèi)容。

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é)議中文版可在互聯(lián)網(wǎng)上下載


上一頁(yè) 1 2 下一頁(yè)

評(píng)論


技術(shù)專區(qū)

關(guān)閉