MODBUS通訊協(xié)議簡(jiǎn)介_(kāi)第1頁(yè)
MODBUS通訊協(xié)議簡(jiǎn)介_(kāi)第2頁(yè)
MODBUS通訊協(xié)議簡(jiǎn)介_(kāi)第3頁(yè)
MODBUS通訊協(xié)議簡(jiǎn)介_(kāi)第4頁(yè)
MODBUS通訊協(xié)議簡(jiǎn)介_(kāi)第5頁(yè)
已閱讀5頁(yè),還剩8頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、.MODBUS通訊協(xié)議簡(jiǎn)介MODBUS通訊協(xié)議簡(jiǎn)介MODBUS通訊協(xié)議簡(jiǎn)介工業(yè)控制已從單機(jī)控制走向集中監(jiān)控、集散控制,如今已進(jìn)入網(wǎng)絡(luò)時(shí)代,工業(yè)控制器連網(wǎng)也為網(wǎng)絡(luò)管理提供了方便。Modbus就是工業(yè)控制器的網(wǎng)絡(luò)協(xié)議中的一種。一、概述Modbus協(xié)議是應(yīng)用于電子控制器上的一種通用語(yǔ)言。通過(guò)此協(xié)議,控制器互相之間、控制器經(jīng)由網(wǎng)絡(luò)例如以太網(wǎng)和其它設(shè)備之間可以通信。它已經(jīng)成為一通用工業(yè)標(biāo)準(zhǔn)。有了它,不同廠商消費(fèi)的控制設(shè)備可以連成工業(yè)網(wǎng)絡(luò),進(jìn)展集中監(jiān)控。此協(xié)議定義了一個(gè)控制器能認(rèn)識(shí)使用的消息構(gòu)造,而不管它們是經(jīng)過(guò)何種網(wǎng)絡(luò)進(jìn)展通信的。它描繪了一控制器懇求訪問(wèn)其它設(shè)備的過(guò)程,假如回應(yīng)來(lái)自其它設(shè)備的懇求,以及怎

2、樣偵測(cè)錯(cuò)誤并記錄。它制定了消息域格局和內(nèi)容的公共格式。當(dāng)在一Modbus網(wǎng)絡(luò)上通信時(shí),此協(xié)議決定了每個(gè)控制器需要知道它們的設(shè)備地址,識(shí)別按地址發(fā)來(lái)的消息,決定要產(chǎn)生何種行動(dòng)。假如需要回應(yīng),控制器將生成反響信息并用Modbus協(xié)議發(fā)出。在其它網(wǎng)絡(luò)上,包含了Modbus協(xié)議的消息轉(zhuǎn)換為在此網(wǎng)絡(luò)上使用的幀或包構(gòu)造。這種轉(zhuǎn)換也擴(kuò)展了根據(jù)詳細(xì)的網(wǎng)絡(luò)解決節(jié)地址、路由途徑及錯(cuò)誤檢測(cè)的方法。1、在Modbus網(wǎng)絡(luò)上轉(zhuǎn)輸標(biāo)準(zhǔn)的Modbus口是使用一RS-232C兼容串行接口,它定義了連接口的針腳、電纜、信號(hào)位、傳輸波特率、奇偶校驗(yàn)??刂破髂苤苯踊蚪?jīng)由Modem組網(wǎng)??刂破魍ㄐ攀褂弥?從技術(shù),即僅一設(shè)備主設(shè)備能初

3、始化傳輸查詢(xún)。其它設(shè)備從設(shè)備根據(jù)主設(shè)備查詢(xún)提供的數(shù)據(jù)作出相應(yīng)反響。典型的主設(shè)備:主機(jī)和可編程儀表。典型的從設(shè)備:可編程控制器。主設(shè)備可單獨(dú)和從設(shè)備通信,也能以播送方式和所有從設(shè)備通信。假如單獨(dú)通信,從設(shè)備返回一消息作為回應(yīng),假如是以播送方式查詢(xún)的,那么不作任何回應(yīng)。Modbus協(xié)議建立了主設(shè)備查詢(xún)的格式:設(shè)備或播送地址、功能代碼、所有要發(fā)送的數(shù)據(jù)、一錯(cuò)誤檢測(cè)域。從設(shè)備回應(yīng)消息也由Modbus協(xié)議構(gòu)成,包括確認(rèn)要行動(dòng)的域、任何要返回的數(shù)據(jù)、和一錯(cuò)誤檢測(cè)域。假如在消息接收過(guò)程中發(fā)生一錯(cuò)誤,或從設(shè)備不能執(zhí)行其命令,從設(shè)備將建立一錯(cuò)誤消息并把它作為回應(yīng)發(fā)送出去。2、在其它類(lèi)型網(wǎng)絡(luò)上轉(zhuǎn)輸在其它網(wǎng)絡(luò)上,控

4、制器使用對(duì)等技術(shù)通信,故任何控制都能初始和其它控制器的通信。這樣在單獨(dú)的通信過(guò)程中,控制器既可作為主設(shè)備也可作為從設(shè)備。提供的多個(gè)內(nèi)部通道可允許同時(shí)發(fā)生的傳輸進(jìn)程。在消息位,Modbus協(xié)議仍提供了主-從原那么,盡管網(wǎng)絡(luò)通信方法是對(duì)等。假如一控制器發(fā)送一消息,它只是作為主設(shè)備,并期望從從設(shè)備得到回應(yīng)。同樣,當(dāng)控制器接收到一消息,它將建立一從設(shè)備回應(yīng)格式并返回給發(fā)送的控制器。Modbus是Modicon公司為其PLC與主機(jī)之間的通訊而創(chuàng)造的串行通訊協(xié)議。其物理層采用RS232、485等異步串行標(biāo)準(zhǔn)。由于其開(kāi)放性而被大量的PLC及RTU廠家采用。Modbus通訊方式采用主從方式的查詢(xún)-相應(yīng)機(jī)制,只

5、有主站發(fā)出查詢(xún)時(shí),從站才能給出響應(yīng),從站不能主動(dòng)發(fā)送數(shù)據(jù)。主站可以向某一個(gè)從站發(fā)出查詢(xún),也可以向所有從站播送信息。從站只響應(yīng)單獨(dú)發(fā)給它的查詢(xún),而不響應(yīng)播送消息。Modbus的串行口的通訊參數(shù)如波特率、奇偶校驗(yàn)可由用戶(hù)選擇。二、MODBUS協(xié)議傳送方式MODBUS通訊協(xié)議有兩種傳送方式:RTU方式和ASCII方式,兩種方式如下所示:工程RTU方式ASCII方式字節(jié)長(zhǎng)度8 BITS 7BITS奇偶校驗(yàn)1 BIT OR 0BIT 1BIT OR 0BIT字節(jié)中止1 BIT OR 2BITS 1BIT OR 2BITS開(kāi)場(chǎng)標(biāo)記不要:冒號(hào)完畢標(biāo)記不要CR,LF數(shù)據(jù)間隔24 BIT 1S出錯(cuò)檢驗(yàn)方式CRC

6、-16 LRC控制器能設(shè)置為兩種傳輸形式ASCII或RTU中的任何一種在標(biāo)準(zhǔn)的Modbus網(wǎng)絡(luò)通信。用戶(hù)選擇想要的形式,包括串口通信參數(shù)波特率、校驗(yàn)方式等,在配置每個(gè)控制器的時(shí)候,在一個(gè)Modbus網(wǎng)絡(luò)上的所有設(shè)備都必須選擇一樣的傳輸形式和串口參數(shù)。三、Modbus消息幀兩種傳輸形式中ASCII或RTU,傳輸設(shè)備以將Modbus消息轉(zhuǎn)為有起點(diǎn)和終點(diǎn)的幀,這就允許接收的設(shè)備在消息起始處開(kāi)場(chǎng)工作,讀地址分配信息,判斷哪一個(gè)設(shè)備被選中播送方式那么傳給所有設(shè)備,判知何時(shí)信息已完成。部分的消息也能偵測(cè)到并且錯(cuò)誤能設(shè)置為返回結(jié)果。1、ASCII幀使用ASCII形式,消息以冒號(hào):字符ASCII碼3AH開(kāi)場(chǎng),

7、以回車(chē)換行符完畢ASCII碼0DH,0AH。其它域可以使用的傳輸字符是十六進(jìn)制的0.9,A.F。網(wǎng)絡(luò)上的設(shè)備不斷偵測(cè):字符,當(dāng)有一個(gè)冒號(hào)接收到時(shí),每個(gè)設(shè)備都解碼下個(gè)域地址域來(lái)判斷是否發(fā)給自己的。消息中字符間發(fā)送的時(shí)間間隔最長(zhǎng)不能超過(guò)1秒,否那么接收的設(shè)備將認(rèn)為傳輸錯(cuò)誤。2、RTU幀使用RTU形式,消息發(fā)送至少要以3.5個(gè)字符時(shí)間的停頓間隔開(kāi)場(chǎng)。在網(wǎng)絡(luò)波特率下多樣的字符時(shí)間,這是最容易實(shí)現(xiàn)的如以下圖的T1-T2-T3-T4所示。傳輸?shù)牡谝粋€(gè)域是設(shè)備地址??梢允褂玫膫鬏斪址鞘M(jìn)制的0.9,A.F。網(wǎng)絡(luò)設(shè)備不斷偵測(cè)網(wǎng)絡(luò)總線,包括停頓間隔時(shí)間內(nèi)。當(dāng)?shù)谝粋€(gè)域地址域接收到,每個(gè)設(shè)備都進(jìn)展解碼以判斷是否

8、發(fā)往自己的。在最后一個(gè)傳輸字符之后,一個(gè)至少3.5個(gè)字符時(shí)間的停頓標(biāo)定了消息的完畢。一個(gè)新的消息可在此停頓后開(kāi)場(chǎng)。整個(gè)消息幀必須作為一連續(xù)的流轉(zhuǎn)輸。假如在幀完成之前有超過(guò)1.5個(gè)字符時(shí)間的停頓時(shí)間,接收設(shè)備將刷新不完好的消息并假定下一字節(jié)是一個(gè)新消息的地址域。同樣地,假如一個(gè)新消息在小于3.5個(gè)字符時(shí)間內(nèi)接著前個(gè)消息開(kāi)場(chǎng),接收的設(shè)備將認(rèn)為它是前一消息的延續(xù)。這將導(dǎo)致一個(gè)錯(cuò)誤,因?yàn)樵谧詈蟮腃RC域的值不可能是正確的。3、地址域消息幀的地址域包含兩個(gè)字符ASCII或8BitRTU??赡艿膹脑O(shè)備地址是0.247十進(jìn)制。單個(gè)設(shè)備的地址范圍是1.247。主設(shè)備通過(guò)將要聯(lián)絡(luò)的從設(shè)備的地址放入消息中的地址域

9、來(lái)選通從設(shè)備。當(dāng)從設(shè)備發(fā)送回應(yīng)消息時(shí),它把自己的地址放入回應(yīng)的地址域中,以便主設(shè)備知道是哪一個(gè)設(shè)備作出回應(yīng)。地址0是用作播送地址,以使所有的從設(shè)備都能認(rèn)識(shí)。當(dāng)Modbus協(xié)議用于更高水準(zhǔn)的網(wǎng)絡(luò),播送可能不允許或以其它方式代替。4、如何處理功能域消息幀中的功能代碼域包含了兩個(gè)字符ASCII或8BitsRTU??赡艿拇a范圍是十進(jìn)制的1.255。當(dāng)然,有些代碼是適用于所有控制器,有此是應(yīng)用于某種控制器,還有些保存以備后用。當(dāng)消息從主設(shè)備發(fā)往從設(shè)備時(shí),功能代碼域?qū)⒏嬷畯脑O(shè)備需要執(zhí)行哪些行為。例如去讀取輸入的開(kāi)關(guān)狀態(tài),讀一組存放器的數(shù)據(jù)內(nèi)容,讀從設(shè)備的診斷狀態(tài),允許調(diào)入、記錄、校驗(yàn)在從設(shè)備中的程序等。

10、當(dāng)從設(shè)備回應(yīng)時(shí),它使用功能代碼域來(lái)指示是正常回應(yīng)無(wú)誤還是有某種錯(cuò)誤發(fā)生稱(chēng)作異議回應(yīng)。對(duì)正?;貞?yīng),從設(shè)備僅回應(yīng)相應(yīng)的功能代碼。對(duì)異議回應(yīng),從設(shè)備返回一等同于正常代碼的代碼,但最重要的位置為邏輯1。例如:一從主設(shè)備發(fā)往從設(shè)備的消息要求讀一組保持存放器,將產(chǎn)生如下功能代碼:0 00 00 01 1十六進(jìn)制03H對(duì)正?;貞?yīng),從設(shè)備僅回應(yīng)同樣的功能代碼。對(duì)異議回應(yīng),它返回:1 00 00 01 1十六進(jìn)制83H除功能代碼因異議錯(cuò)誤作了修改外,從設(shè)備將一獨(dú)特的代碼放到回應(yīng)消息的數(shù)據(jù)域中,這能告訴主設(shè)備發(fā)生了什么錯(cuò)誤。主設(shè)備應(yīng)用程序得到異議的回應(yīng)后,典型的處理過(guò)程是重發(fā)消息,或者診斷發(fā)給從設(shè)備的消息并報(bào)告給

11、操作員。5、數(shù)據(jù)域數(shù)據(jù)域是由兩個(gè)十六進(jìn)制數(shù)集合構(gòu)成的,范圍00.FF。根據(jù)網(wǎng)絡(luò)傳輸形式,這可以是由一對(duì)ASCII字符組成或由一RTU字符組成。從主設(shè)備發(fā)給從設(shè)備消息的數(shù)據(jù)域包含附加的信息:從設(shè)備必須用于進(jìn)展執(zhí)行由功能代碼所定義的所為。這包括了象不連續(xù)的存放器地址,要處理項(xiàng)的數(shù)目,域中實(shí)際數(shù)據(jù)字節(jié)數(shù)。例如,假如主設(shè)備需要從設(shè)備讀取一組保持存放器功能代碼03,數(shù)據(jù)域指定了起始存放器以及要讀的存放器數(shù)量。假如主設(shè)備寫(xiě)一組從設(shè)備的存放器功能代碼10十六進(jìn)制,數(shù)據(jù)域那么指明了要寫(xiě)的起始存放器以及要寫(xiě)的存放器數(shù)量,數(shù)據(jù)域的數(shù)據(jù)字節(jié)數(shù),要寫(xiě)入存放器的數(shù)據(jù)。假如沒(méi)有錯(cuò)誤發(fā)生,從從設(shè)備返回的數(shù)據(jù)域包含懇求的數(shù)據(jù)

12、。假如有錯(cuò)誤發(fā)生,此域包含一異議代碼,主設(shè)備應(yīng)用程序可以用來(lái)判斷采取下一步行動(dòng)。在某種消息中數(shù)據(jù)域可以是不存在的0長(zhǎng)度。例如,主設(shè)備要求從設(shè)備回應(yīng)通信事件記錄功能代碼0B十六進(jìn)制,從設(shè)備不需任何附加的信息。6、錯(cuò)誤檢測(cè)域標(biāo)準(zhǔn)的Modbus網(wǎng)絡(luò)有兩種錯(cuò)誤檢測(cè)方法。錯(cuò)誤檢測(cè)域的內(nèi)容視所選的檢測(cè)方法而定。ASCII中選用ASCII形式作字符幀,錯(cuò)誤檢測(cè)域包含兩個(gè)ASCII字符。這是使用LRC縱向冗長(zhǎng)檢測(cè)方法對(duì)消息內(nèi)容計(jì)算得出的,不包括開(kāi)場(chǎng)的冒號(hào)符及回車(chē)換行符。LRC字符附加在回車(chē)換行符前面。RTU中選用RTU形式作字符幀,錯(cuò)誤檢測(cè)域包含一16Bits值用兩個(gè)8位的字符來(lái)實(shí)現(xiàn)。錯(cuò)誤檢測(cè)域的內(nèi)容是通過(guò)對(duì)

13、消息內(nèi)容進(jìn)展循環(huán)冗長(zhǎng)檢測(cè)方法得出的。CRC域附加在消息的最后,添加時(shí)先是低字節(jié)然后是高字節(jié)。故CRC的高位字節(jié)是發(fā)送消息的最后一個(gè)字節(jié)。7、字符的連續(xù)傳輸當(dāng)消息在標(biāo)準(zhǔn)的Modbus系列網(wǎng)絡(luò)傳輸時(shí),每個(gè)字符或字節(jié)以如下方式發(fā)送從左到右:最低有效位.最高有效位四、錯(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è)消息幀。用戶(hù)要給主設(shè)備配置一預(yù)先定義的超時(shí)時(shí)間間隔,這個(gè)時(shí)間間隔要足夠長(zhǎng),以使任何從設(shè)備都能作為正常反響。假如從設(shè)備測(cè)到一傳輸錯(cuò)誤,消息將不會(huì)接收

14、,也不會(huì)向主設(shè)備作出回應(yīng)。這樣超時(shí)事件將觸發(fā)主設(shè)備來(lái)處理錯(cuò)誤。發(fā)往不存在的從設(shè)備的地址也會(huì)產(chǎn)生超時(shí)。1、奇偶校驗(yàn)用戶(hù)可以配置控制器是奇或偶校驗(yàn),或無(wú)校驗(yàn)。這將決定了每個(gè)字符中的奇偶校驗(yàn)位是如何設(shè)置的。假如指定了奇或偶校驗(yàn),1的位數(shù)將算到每個(gè)字符的位數(shù)中ASCII形式7個(gè)數(shù)據(jù)位,RTU中8個(gè)數(shù)據(jù)位。例如RTU字符幀中包含以下8個(gè)數(shù)據(jù)位:1 10 00 10 1整個(gè)1的數(shù)目是4個(gè)。假如便用了偶校驗(yàn),幀的奇偶校驗(yàn)位將是0,便得整個(gè)1的個(gè)數(shù)仍是4個(gè)。假如便用了奇校驗(yàn),幀的奇偶校驗(yàn)位將是1,便得整個(gè)1的個(gè)數(shù)是5個(gè)。假如沒(méi)有指定奇偶校驗(yàn)位,傳輸時(shí)就沒(méi)有校驗(yàn)位,也不進(jìn)展校驗(yàn)檢測(cè)。代替一附加的停頓位填充至要傳

15、輸?shù)淖址麕小?、LRC檢測(cè)使用ASCII形式,消息包括了一基于LRC方法的錯(cuò)誤檢測(cè)域。LRC域檢測(cè)了消息域中除開(kāi)場(chǎng)的冒號(hào)及完畢的回車(chē)換行號(hào)外的內(nèi)容。LRC域是一個(gè)包含一個(gè)8位二進(jìn)制值的字節(jié)。LRC值由傳輸設(shè)備來(lái)計(jì)算并放到消息幀中,接收設(shè)備在接收消息的過(guò)程中計(jì)算LRC,并將它和接收到消息中LRC域中的值比較,假如兩值不等,說(shuō)明有錯(cuò)誤。LRC方法是將消息中的8Bit的字節(jié)連續(xù)累加,丟棄了進(jìn)位。LRC簡(jiǎn)單函數(shù)如下:static unsigned char LRCauchMsg,usDataLenunsigned char*auchMsg;/*要進(jìn)展計(jì)算的消息*/unsigned short usD

16、ataLen;/*LRC要處理的字節(jié)的數(shù)量*/unsigned char uchLRC=0;/*LRC字節(jié)初始化*/whileusDataLen-/*傳送消息*/uchLRC+=*auchMsg+;/*累加*/returnunsigned char-char_uchLRC;3、CRC檢測(cè)使用RTU形式,消息包括了一基于CRC方法的錯(cuò)誤檢測(cè)域。CRC域檢測(cè)了整個(gè)消息的內(nèi)容。CRC域是兩個(gè)字節(jié),包含一16位的二進(jìn)制值。它由傳輸設(shè)備計(jì)算后參加到消息中。接收設(shè)備重新計(jì)算收到消息的CRC,并與接收到的CRC域中的值比較,假如兩值不同,那么有誤。CRC是先調(diào)入一值是全1的16位存放器,然后調(diào)用一過(guò)程將消息

17、中連續(xù)的8位字節(jié)各當(dāng)前存放器中的值進(jìn)展處理。僅每個(gè)字符中的8Bit數(shù)據(jù)對(duì)CRC有效,起始位和停頓位以及奇偶校驗(yàn)位均無(wú)效。CRC產(chǎn)生過(guò)程中,每個(gè)8位字符都單獨(dú)和存放器內(nèi)容相或OR,結(jié)果向最低有效位方向挪動(dòng),最高有效位以0填充。LSB被提取出來(lái)檢測(cè),假如LSB為1,存放器單獨(dú)和預(yù)置的值或一下,假如LSB為0,那么不進(jìn)展。整個(gè)過(guò)程要重復(fù)8次。在最后一位第8位完成后,下一個(gè)8位字節(jié)又單獨(dú)和存放器的當(dāng)前值相或。最終存放器中的值,是消息中所有的字節(jié)都執(zhí)行之后的CRC值。CRC添加到消息中時(shí),低字節(jié)先參加,然后高字節(jié)。ModBus網(wǎng)絡(luò)是一個(gè)工業(yè)通信系統(tǒng),由帶智能終端的可編程序控制器和計(jì)算機(jī)通過(guò)公用線路或部分

18、專(zhuān)用線路連接而成。其系統(tǒng)構(gòu)造既包括硬件、亦包括軟件。它可應(yīng)用于各種數(shù)據(jù)采集和過(guò)程監(jiān)控。ModBus網(wǎng)絡(luò)只有一個(gè)主機(jī),所有通信都由他發(fā)出。網(wǎng)絡(luò)可支持247個(gè)之多的遠(yuǎn)程附屬控制器,但實(shí)際所支持的從機(jī)數(shù)要由所用通信設(shè)備決定。采用這個(gè)系統(tǒng),各PC可以和中心主機(jī)交換信息而不影響各PC執(zhí)行本身的控制任務(wù)。1ModBus的傳輸方式在ModBus系統(tǒng)中有2種傳輸形式可選擇。這2種傳輸形式與從機(jī)PC通信的才能是同等的。選擇時(shí)應(yīng)視所用ModBus主機(jī)而定,每個(gè)ModBus系統(tǒng)只能使用一種形式,不允許2種形式混用。一種形式是ASCII美國(guó)信息交換碼,另一種形式是RTU遠(yuǎn)程終端設(shè)備。ASCII可打印字符便于故障檢測(cè),

19、而且對(duì)于用高級(jí)語(yǔ)言如Fortan編程的主計(jì)算機(jī)及主PC很適宜。RTU那么適用于機(jī)器語(yǔ)言編程的計(jì)算機(jī)和PC主機(jī)。用RTU形式傳輸?shù)臄?shù)據(jù)是8位二進(jìn)制字符。如欲轉(zhuǎn)換為ASCII形式,那么每個(gè)RTU字符首先應(yīng)分為高位和低位兩部分,這兩部分各含4位,然后轉(zhuǎn)換成十六進(jìn)制等量值。用以構(gòu)成報(bào)文的ASCII字符都是十六進(jìn)制字符。ASCII形式使用的字符雖是RTU形式的兩倍,但ASCII數(shù)據(jù)的譯瑪和處理更為容易一些,此外,用RTU形式時(shí)報(bào)文字符必須以連續(xù)數(shù)據(jù)流的形式傳送,用ASCII形式,字符之間可產(chǎn)生長(zhǎng)達(dá)1s的間隔,以適應(yīng)速度較快的機(jī)器。2ModBus的數(shù)據(jù)校驗(yàn)方式CRC-16循環(huán)冗余錯(cuò)誤校驗(yàn)CRC-16錯(cuò)誤校

20、驗(yàn)程序如下:報(bào)文此處只涉及數(shù)據(jù)位,不指起始位、停頓位和任選的奇偶校驗(yàn)位被看作是一個(gè)連續(xù)的二進(jìn)制,其最高有效位MSB首選發(fā)送。報(bào)文先與X16相乘左移16位,然后看X16+X15+X2+1除,X16+X15+X2+1可以表示為二進(jìn)制數(shù)11000000000000101。整數(shù)商位忽略不記,16位余數(shù)參加該報(bào)文MSB先發(fā)送,成為2個(gè)CRC校驗(yàn)字節(jié)。余數(shù)中的1全部初始化,以免所有的零成為一條報(bào)文被接收。經(jīng)上述處理而含有CRC字節(jié)的報(bào)文,假設(shè)無(wú)錯(cuò)誤,到接收設(shè)備后再被同一多項(xiàng)式X16+X15+X2+1除,會(huì)得到一個(gè)零余數(shù)接收設(shè)備核驗(yàn)這個(gè)CRC字節(jié),并將其與被傳送的CRC比較。全部運(yùn)算以2為模無(wú)進(jìn)位。習(xí)慣于成

21、串發(fā)送數(shù)據(jù)的設(shè)備會(huì)首選送出字符的最右位LSB-最低有效位。而在生成CRC情況下,發(fā)送首位應(yīng)是被除數(shù)的最高有效位MSB。由于在運(yùn)算中不用進(jìn)位,為便于操作起見(jiàn),計(jì)算CRC時(shí)設(shè)MSB在最右位。生成多項(xiàng)式的位序也必須反過(guò)來(lái),以保持一致。多項(xiàng)式的MSB略去不記,因其只對(duì)商有影響而不影響余數(shù)。生成CRC-16校驗(yàn)字節(jié)的步驟如下:裝如一個(gè)16位存放器,所有數(shù)位均為1。該16位存放器的高位字節(jié)與開(kāi)場(chǎng)8位字節(jié)進(jìn)展異或運(yùn)算。運(yùn)算結(jié)果放入這個(gè)16位存放器。把這個(gè)16存放器向右移一位。假設(shè)向右標(biāo)記位移出的數(shù)位是1,那么生成多項(xiàng)式1010000000000001和這個(gè)存放器進(jìn)展異或運(yùn)算;假設(shè)向右移出的數(shù)位是0,那么返回

22、。重復(fù)和,直至移出8位。另外8位與該十六位存放器進(jìn)展異或運(yùn)算。重復(fù),直至該報(bào)文所有字節(jié)均與16位存放器進(jìn)展異或運(yùn)算,并移位8次。這個(gè)16位存放器的內(nèi)容即2字節(jié)CRC錯(cuò)誤校驗(yàn),被加到報(bào)文的最高有效位。另外,在某些非ModBus通信協(xié)議中也經(jīng)常使用CRC16作為校驗(yàn)手段,而且產(chǎn)生了一些CRC16的變種,他們是使用CRC16多項(xiàng)式X16+X15+X2+1,單首次裝入的16位存放器為0000;使用CRC16的反序X16+X14+X1+1,首次裝入存放器值為0000或FFFFH。LRC縱向冗余錯(cuò)誤校驗(yàn)LRC錯(cuò)誤校驗(yàn)用于ASCII形式。這個(gè)錯(cuò)誤校驗(yàn)是一個(gè)8位二進(jìn)制數(shù),可作為2個(gè)ASCII十六進(jìn)制字節(jié)傳送。

23、把十六進(jìn)制字符轉(zhuǎn)換成二進(jìn)制,加上無(wú)循環(huán)進(jìn)位的二進(jìn)制字符和二進(jìn)制補(bǔ)碼結(jié)果生成LRC錯(cuò)誤校驗(yàn)參見(jiàn)圖。這個(gè)LRC在接收設(shè)備進(jìn)展核驗(yàn),并與被傳送的LRC進(jìn)展比較,冒號(hào):、回車(chē)符號(hào)CR、換行字符LF和置入的其他任何非ASCII十六進(jìn)制字符在運(yùn)算時(shí)忽略不計(jì)。Modbus通訊協(xié)議圖片:圖片:圖片:Modbus協(xié)議最初由Modicon公司開(kāi)發(fā)出來(lái),在1979年末該公司成為施耐德自動(dòng)化Schneider Automation部門(mén)的一部分,如今Modbus已經(jīng)是工業(yè)領(lǐng)域全球最流行的協(xié)議。此協(xié)議支持傳統(tǒng)的RS-232、RS-422、RS-485和以太網(wǎng)設(shè)備。許多工業(yè)設(shè)備,包括PLC,DCS,智能儀表等都在使用Mod

24、bus協(xié)議作為他們之間的通訊標(biāo)準(zhǔn)。有了它,不同廠商消費(fèi)的控制設(shè)備可以連成工業(yè)網(wǎng)絡(luò),進(jìn)展集中監(jiān)控。當(dāng)在網(wǎng)絡(luò)上通信時(shí),Modbus協(xié)議決定了每個(gè)控制器需要知道它們的設(shè)備地址,識(shí)別按地址發(fā)來(lái)的消息,決定要產(chǎn)生何種行動(dòng)。假如需要回應(yīng),控制器將生成應(yīng)答并使用Modbus協(xié)議發(fā)送給詢(xún)問(wèn)方。Modbus協(xié)議包括ASCII、RTU、TCP等,并沒(méi)有規(guī)定物理層。此協(xié)議定義了控制器可以認(rèn)識(shí)和使用的消息構(gòu)造,而不管它們是經(jīng)過(guò)何種網(wǎng)絡(luò)進(jìn)展通信的。標(biāo)準(zhǔn)的Modicon控制器使用RS232C實(shí)現(xiàn)串行的Modbus。Modbus的ASCII、RTU協(xié)議規(guī)定了消息、數(shù)據(jù)的構(gòu)造、命令和就答的方式,數(shù)據(jù)通訊采用Maser/Sla

25、ve方式,Master端發(fā)出數(shù)據(jù)懇求消息,Slave端接收到正確消息后就可以發(fā)送數(shù)據(jù)到Master端以響應(yīng)懇求;Master端也可以直接發(fā)消息修改Slave端的數(shù)據(jù),實(shí)現(xiàn)雙向讀寫(xiě)。Modbus協(xié)議需要對(duì)數(shù)據(jù)進(jìn)展校驗(yàn),串行協(xié)議中除有奇偶校驗(yàn)外,ASCII形式采用LRC校驗(yàn),RTU形式采用16位CRC校驗(yàn),但TCP形式?jīng)]有額外規(guī)定校驗(yàn),因?yàn)門(mén)CP協(xié)議是一個(gè)面向連接的可靠協(xié)議。另外,Modbus采用主從方式定時(shí)收發(fā)數(shù)據(jù),在實(shí)際使用中假如某Slave站點(diǎn)斷開(kāi)后如故障或關(guān)機(jī),Master端可以診斷出來(lái),而當(dāng)故障修復(fù)后,網(wǎng)絡(luò)又可自動(dòng)接通。因此,Modbus協(xié)議的可靠性較好。下面我來(lái)簡(jiǎn)單的給大家介紹一下,對(duì)

26、于Modbus的ASCII、RTU和TCP協(xié)議來(lái)說(shuō),其中TCP和RTU協(xié)議非常類(lèi)似,我們只要把RTU協(xié)議的兩個(gè)字節(jié)的校驗(yàn)碼去掉,然后在RTU協(xié)議的開(kāi)場(chǎng)加上5個(gè)0和一個(gè)6并通過(guò)TCP/IP網(wǎng)絡(luò)協(xié)議發(fā)送出去即可。所以在這里我僅介紹一下Modbus的ASCII和RTU協(xié)議。下表是ASCII協(xié)議和RTU協(xié)議進(jìn)展的比較:通過(guò)比較可以看到,ASCII協(xié)議和RTU協(xié)議相比擁有開(kāi)場(chǎng)和完畢標(biāo)記,因此在進(jìn)展程序處理時(shí)能更加方便,而且由于傳輸?shù)亩际强梢?jiàn)的ASCII字符,所以進(jìn)展調(diào)試時(shí)就更加的直觀,另外它的LRC校驗(yàn)也比較容易。但是因?yàn)樗鼈鬏數(shù)亩际强梢?jiàn)的ASCII字符,RTU傳輸?shù)臄?shù)據(jù)每一個(gè)字節(jié)ASCII都要用兩個(gè)字

27、節(jié)來(lái)傳輸,比方RTU傳輸一個(gè)十六進(jìn)制數(shù)0xF9,ASCII就需要傳輸F9的ASCII碼0x39和0x46兩個(gè)字節(jié),這樣它的傳輸?shù)男示捅容^低。所以一般來(lái)說(shuō),假如所需要傳輸?shù)臄?shù)據(jù)量較小可以考慮使用ASCII協(xié)議,假如所需傳輸?shù)臄?shù)據(jù)量比較大,最好能使用RTU協(xié)議。下面對(duì)兩種協(xié)議的校驗(yàn)進(jìn)展一下介紹。1、LRC校驗(yàn)LRC域是一個(gè)包含一個(gè)8位二進(jìn)制值的字節(jié)。LRC值由傳輸設(shè)備來(lái)計(jì)算并放到消息幀中,接收設(shè)備在接收消息的過(guò)程中計(jì)算LRC,并將它和接收到消息中LRC域中的值比較,假如兩值不等,說(shuō)明有錯(cuò)誤。LRC校驗(yàn)比較簡(jiǎn)單,它在ASCII協(xié)議中使用,檢測(cè)了消息域中除開(kāi)場(chǎng)的冒號(hào)及完畢的回車(chē)換行號(hào)外的內(nèi)容。它僅僅

28、是把每一個(gè)需要傳輸?shù)臄?shù)據(jù)按字節(jié)疊加后取反加1即可。下面是它的VC代碼:BYTE GetCheckCodeconst char*pSendBuf,int nEnd/獲得校驗(yàn)碼BYTE byLrc=0;char pBuf4;int nData=0;fori=1;i end;i+=2/i初始為1,避開(kāi)開(kāi)場(chǎng)標(biāo)記冒號(hào)/每?jī)蓚€(gè)需要發(fā)送的ASCII碼轉(zhuǎn)化為一個(gè)十六進(jìn)制數(shù)pBuf0=pSendBuf;pBuf1=pSendBuf;pBuf2=message;sscanfpBuf,%x,&nData;byLrc+=nData;byLrc=byLrc;byLrc+;return byLrc;2、CRC校驗(yàn)CRC域

29、是兩個(gè)字節(jié),包含一16位的二進(jìn)制值。它由傳輸設(shè)備計(jì)算后參加到消息中。接收設(shè)備重新計(jì)算收到消息的CRC,并與接收到的CRC域中的值比較,假如兩值不同,那么有誤。CRC是先調(diào)入一值是全1的16位存放器,然后調(diào)用一過(guò)程將消息中連續(xù)的8位字節(jié)各當(dāng)前存放器中的值進(jìn)展處理。僅每個(gè)字符中的8Bit數(shù)據(jù)對(duì)CRC有效,起始位和停頓位以及奇偶校驗(yàn)位均無(wú)效。CRC產(chǎn)生過(guò)程中,每個(gè)8位字符都單獨(dú)和存放器內(nèi)容相或OR,結(jié)果向最低有效位方向挪動(dòng),最高有效位以0填充。LSB被提取出來(lái)檢測(cè),假如LSB為1,存放器單獨(dú)和預(yù)置的值或一下,假如LSB為0,那么不進(jìn)展。整個(gè)過(guò)程要重復(fù)8次。在最后一位第8位完成后,下一個(gè)8位字節(jié)又單獨(dú)

30、和存放器的當(dāng)前值相或。最終存放器中的值,是消息中所有的字節(jié)都執(zhí)行之后的CRC值。CRC添加到消息中時(shí),低字節(jié)先參加,然后高字節(jié)。下面是它的VC代碼:WORD GetCheckCodeconst char*pSendBuf,int nEnd/獲得校驗(yàn)碼WORD wCrc=WORD0xFFFF;forint i=0;i nEnd;i+wCrc=WORDBYTEpSendBuf;forint j=0;j 8;j+ifwCrc&1wCrc=1;wCrc=0xA001;elsewCrc=1;return wCrc;對(duì)于一條RTU協(xié)議的命令可以簡(jiǎn)單的通過(guò)以下的步驟轉(zhuǎn)化為ASCII協(xié)議的命令:1、把命令的C

31、RC校驗(yàn)去掉,并且計(jì)算出LRC校驗(yàn)取代。2、把生成的命令串的每一個(gè)字節(jié)轉(zhuǎn)化成對(duì)應(yīng)的兩個(gè)字節(jié)的ASCII碼,比方0x03轉(zhuǎn)化成0x30,0x330的ASCII碼和3的ASCII碼。3、在命令的開(kāi)頭加上起始標(biāo)記:,它的ASCII碼為0x3A。4、在命令的尾部加上完畢標(biāo)記CR,LF0xD,0xA,此處的CR,LF表示回車(chē)和換行的ASCII碼。所以以下我們僅介紹RTU協(xié)議即可,對(duì)應(yīng)的ASCII協(xié)議可以使用以上的步驟來(lái)生成。下表是Modbus支持的功能碼:在這些功能碼中較長(zhǎng)使用的是1、2、3、4、5、6號(hào)功能碼,使用它們即可實(shí)現(xiàn)對(duì)下位機(jī)的數(shù)字量和模擬量的讀寫(xiě)操作。1、讀可讀寫(xiě)數(shù)字量存放器線圈狀態(tài):計(jì)算機(jī)

32、發(fā)送命令:設(shè)備地址命令號(hào)01起始存放器地址高8位低8位讀取的存放器數(shù)高8位低8位CRC校驗(yàn)的低8位CRC校驗(yàn)的高8位例:110100130025CRC低CRC高意義如下:1設(shè)備地址:在一個(gè)485總線上可以?huà)旖佣鄠€(gè)設(shè)備,此處的設(shè)備地址表示想和哪一個(gè)設(shè)備通訊。例子中為想和17號(hào)十進(jìn)制的17是十六進(jìn)制的11通訊。2命令號(hào)01:讀取數(shù)字量的命令號(hào)固定為01。3起始地址高8位、低8位:表示想讀取的開(kāi)關(guān)量的起始地址起始地址為0。比方例子中的起始地址為19。4存放器數(shù)高8位、低8位:表示從起始地址開(kāi)場(chǎng)讀多少個(gè)開(kāi)關(guān)量。例子中為37個(gè)開(kāi)關(guān)量。5 CRC校驗(yàn):是從開(kāi)頭一直校驗(yàn)到此之前。在此協(xié)議的最后再作介紹。此處

33、需要注意,CRC校驗(yàn)在命令中的上下字節(jié)的順序和其他的相反。設(shè)備響應(yīng):設(shè)備地址命令號(hào)01返回的字節(jié)個(gè)數(shù)數(shù)據(jù)1數(shù)據(jù)2.數(shù)據(jù)nCRC校驗(yàn)的低8位CRC校驗(yàn)的高8位例:110105CD6BB20E1BCRC低CRC高意義如下:1設(shè)備地址和命令號(hào)和上面的一樣。2返回的字節(jié)個(gè)數(shù):表示數(shù)據(jù)的字節(jié)個(gè)數(shù),也就是數(shù)據(jù)1,2.n中的n的值。3數(shù)據(jù)1.n:由于每一個(gè)數(shù)據(jù)是一個(gè)8位的數(shù),所以每一個(gè)數(shù)據(jù)表示8個(gè)開(kāi)關(guān)量的值,每一位為0表示對(duì)應(yīng)的開(kāi)關(guān)斷開(kāi),為1表示閉合。比方例子中,表示20號(hào)索引號(hào)為19開(kāi)關(guān)閉合,21號(hào)斷開(kāi),22閉合,23閉合,24斷開(kāi),25斷開(kāi),26閉合,27閉合.假如詢(xún)問(wèn)的開(kāi)關(guān)量不是8的整倍數(shù),那么最后一個(gè)字節(jié)的高位部分無(wú)意義,置為0。4 CRC校驗(yàn)同上。2、讀只可讀數(shù)字量存放器輸入狀態(tài):和讀取線圈狀態(tài)類(lèi)似,只是第二個(gè)字節(jié)的命令號(hào)不再是1而是2。3、寫(xiě)數(shù)字量線圈狀態(tài):計(jì)算機(jī)發(fā)送命令:設(shè)備地址命令號(hào)05需下置的存放器地址高8位低8位下置的數(shù)據(jù)高8位低8位CRC

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論