![Modbus通信協(xié)議及編程舉例_第1頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2021-12/24/40c806c9-6927-4b43-96e9-0d2d49f3d0e4/40c806c9-6927-4b43-96e9-0d2d49f3d0e41.gif)
![Modbus通信協(xié)議及編程舉例_第2頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2021-12/24/40c806c9-6927-4b43-96e9-0d2d49f3d0e4/40c806c9-6927-4b43-96e9-0d2d49f3d0e42.gif)
![Modbus通信協(xié)議及編程舉例_第3頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2021-12/24/40c806c9-6927-4b43-96e9-0d2d49f3d0e4/40c806c9-6927-4b43-96e9-0d2d49f3d0e43.gif)
![Modbus通信協(xié)議及編程舉例_第4頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2021-12/24/40c806c9-6927-4b43-96e9-0d2d49f3d0e4/40c806c9-6927-4b43-96e9-0d2d49f3d0e44.gif)
![Modbus通信協(xié)議及編程舉例_第5頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2021-12/24/40c806c9-6927-4b43-96e9-0d2d49f3d0e4/40c806c9-6927-4b43-96e9-0d2d49f3d0e45.gif)
版權(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é)議一、Modbus協(xié)議簡(jiǎn)介Modbus協(xié)議是應(yīng)用于電子控制器上的一種通用語(yǔ)言。通過(guò)此協(xié)議,控制器相互之間、控制器 經(jīng)由網(wǎng)絡(luò)(例如以太網(wǎng))和其它設(shè)備之間可以通信。它已經(jīng)成為一通用工業(yè)標(biāo)準(zhǔn)。有了它,不同廠商生產(chǎn)的控制設(shè)備可以連成工業(yè)網(wǎng)絡(luò),進(jìn)行集中監(jiān)控。此協(xié)議定義了一個(gè)控制器能認(rèn)識(shí)使用的消息結(jié)構(gòu),而不管它們是經(jīng)過(guò)何種網(wǎng)絡(luò)進(jìn)行通信的 .它描述了一控制器請(qǐng)求訪(fǎng)問(wèn)其它設(shè)備的過(guò)程,如果回應(yīng)來(lái)自其它設(shè)備的請(qǐng)求,以及怎樣偵測(cè)錯(cuò)誤并記錄.它制定了消息域格局和內(nèi)容的公共格式。當(dāng)在一 Modbus網(wǎng)絡(luò)上通信時(shí),此協(xié)議決定了每個(gè)控制器須要知道它們的設(shè)備地址,識(shí)別按地址 發(fā)來(lái)的消息,決定要產(chǎn)生何種行動(dòng).
2、如果需要回應(yīng),控制器將生成反饋信息并用Modbus協(xié)議發(fā)出.在其它網(wǎng)絡(luò)上,包含了 Modbus協(xié)議的消息轉(zhuǎn)換為在此網(wǎng)絡(luò)上使用的幀或包結(jié)構(gòu)。這種轉(zhuǎn)換也擴(kuò)展了根據(jù)具體的網(wǎng)絡(luò)解決節(jié)地址、路由路徑及錯(cuò)誤檢測(cè)的方法。1、在Modbus網(wǎng)絡(luò)上轉(zhuǎn)輸標(biāo)準(zhǔn)的Modbus 口是使用一 RS232C兼容串行接口,它定義了連接口的針腳、電纜、信號(hào)位、 傳輸波特率、奇偶校驗(yàn)??刂破髂苤苯踊蚪?jīng)由 Modem組網(wǎng)??刂破魍ㄐ攀褂弥饕粡募夹g(shù),即僅一設(shè)備(主設(shè)備 )能初始化傳輸(查詢(xún))。其它設(shè)備(從設(shè)備) 根據(jù)主設(shè)備查詢(xún)提供的數(shù)據(jù)作出相應(yīng)反應(yīng)。典型的主設(shè)備:主機(jī)和可編程儀表。典型的從設(shè)備 :可編程控制器。主設(shè)備可單獨(dú)和從設(shè)備通
3、信,也能以廣播方式和所有從設(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ò)上,控制器使用對(duì)等技術(shù)通信,故任何控制都能初始和其它控制器的通信。這樣在 單獨(dú)的通信過(guò)程中,控制器既可作為主設(shè)備也可作為從設(shè)備。提供的多個(gè)內(nèi)部通道
4、可允許同時(shí)發(fā)生的 傳輸進(jìn)程。在消息位,Modbus協(xié)議仍提供了主 一從原則,盡管網(wǎng)絡(luò)通信方法是對(duì)等"。如果一控制器發(fā)送一消息,它只是作為主設(shè)備 ,并期望從從設(shè)備得到回應(yīng).同樣,當(dāng)控制器接收到一消息,它將建立一從 設(shè)備回應(yīng)格式并返回給發(fā)送的控制器。3、查詢(xún)一回應(yīng)周期圖1主一從查詢(xún)一回應(yīng)周期表(1)查詢(xún)查詢(xún)消息中的功能代碼告之被選中的從設(shè)備要執(zhí)行何種功能。數(shù)據(jù)段包含了從設(shè)備要執(zhí)行功能的任何附加信息.例如功能代碼03是要求從設(shè)備讀保持寄存器并返回它們的內(nèi)容.數(shù)據(jù)段必須包含要告之從設(shè)備的信息:從何寄存器開(kāi)始讀及要讀的寄存器數(shù)量。錯(cuò)誤檢測(cè)域?yàn)閺脑O(shè)備提供了一種驗(yàn)證消息內(nèi)容是否正確的方法。(2)回
5、應(yīng)如果從設(shè)備產(chǎn)生一正常的回應(yīng),在回應(yīng)消息中的功能代碼是在查詢(xún)消息中的功能代碼的回應(yīng) 據(jù)段包括了從設(shè)備收集的數(shù)據(jù):象寄存器值或狀態(tài)。如果有錯(cuò)誤發(fā)生,功能代碼將被修改以用于指出 回應(yīng)消息是錯(cuò)誤的,同時(shí)數(shù)據(jù)段包含了描述此錯(cuò)誤信息的代碼。錯(cuò)誤檢測(cè)域允許主設(shè)備確認(rèn)消息內(nèi)容 是否可用。、兩種傳輸方式控制器能設(shè)置為兩種傳輸模式(ASCII或RTU)中的任何一種在標(biāo)準(zhǔn)的Modbus網(wǎng)絡(luò)通信。用戶(hù)選擇想要的模式,包括串口通信參數(shù)(波特率、校驗(yàn)方式等),在配置每個(gè)控制器的時(shí)候,在一個(gè) Modbus網(wǎng)絡(luò)上的所有設(shè)備都必須選擇相同的傳輸模式和串口參數(shù)。ASCII模式:地址功能代碼數(shù)據(jù)數(shù)量數(shù)據(jù)1O . O數(shù)據(jù)nLRC高
6、字節(jié)LRC低字節(jié)回車(chē)換行RTU模式地址功能代碼數(shù)據(jù)數(shù)量數(shù)據(jù)1O . O數(shù)據(jù)nCRC低字節(jié)CRC高字節(jié)所選的ASCII或RTU方式僅適用于標(biāo)準(zhǔn)的Modbus網(wǎng)絡(luò),它定義了在這些網(wǎng)絡(luò)上連續(xù)傳輸?shù)南⒍蔚拿恳晃?,以及決定怎樣將信息打包成消息域和如何解碼。在其它網(wǎng)絡(luò)上(象 MAP和Modbus Plus) Modbus消息被轉(zhuǎn)成與串行傳輸無(wú)關(guān)的幀。1、ASCII 模式當(dāng)控制器設(shè)為在 Modbus網(wǎng)絡(luò)上以ASCII(美國(guó)標(biāo)準(zhǔn)信息交換代碼)模式通信,在消息中的每個(gè) 8Bit字節(jié)都作為兩個(gè) ASCII字符發(fā)送。這種方式的主要優(yōu)點(diǎn)是字符發(fā)送的時(shí)間間隔可達(dá)到1秒而不產(chǎn)生錯(cuò)誤。代碼系統(tǒng)? 十六進(jìn)制,ASCII字符
7、0。.9,A。 .F? 消息中的每個(gè)ASCII字符都是一個(gè)十六進(jìn)制字符組成每個(gè)字節(jié)的位?1個(gè)起始位?7個(gè)數(shù)據(jù)位,最小的有效位先發(fā)送?1個(gè)奇偶校驗(yàn)位,無(wú)校驗(yàn)則無(wú)? 1個(gè)停止位(有校驗(yàn)時(shí)),2個(gè)Bit (無(wú)校驗(yàn)時(shí))錯(cuò)誤檢測(cè)域? LRC(縱向冗長(zhǎng)檢測(cè))2、RTU模式當(dāng)控制器設(shè)為在 Modbus網(wǎng)絡(luò)上以RTU (遠(yuǎn)程終端單元)模式通信,在消息中的每個(gè)8Bit字節(jié)包含兩個(gè)4Bit的十六進(jìn)制字符.這種方式的主要優(yōu)點(diǎn)是:在同樣的波特率下,可比 ASCII方式傳送更 多的數(shù)據(jù).代碼系統(tǒng)? 8位二進(jìn)制,十六進(jìn)制數(shù) 0.。.9, A。.。F? 消息中的每個(gè)8位域都是一個(gè)兩個(gè)十六進(jìn)制字符組成? 每個(gè)字節(jié)的位?1個(gè)起
8、始位?8個(gè)數(shù)據(jù)位,最小的有效位先發(fā)送?1個(gè)奇偶校驗(yàn)位,無(wú)校驗(yàn)則無(wú)?1個(gè)停止位(有校驗(yàn)時(shí)),2個(gè)Bit (無(wú)校驗(yàn)時(shí))錯(cuò)誤檢測(cè)域? CRC(循環(huán)冗長(zhǎng)檢測(cè))三、Modbus消息幀兩種傳輸模式中(ASCII或RTU ),傳輸設(shè)備以將 Modbus消息轉(zhuǎn)為有起點(diǎn)和終點(diǎn)的幀,這就 允許接收的設(shè)備在消息起始處開(kāi)始工作,讀地址分配信息,判斷哪一個(gè)設(shè)備被選中(廣播方式則傳給所有設(shè)備),判知何時(shí)信息已完成。部分的消息也能偵測(cè)到并且錯(cuò)誤能設(shè)置為返回結(jié)果。1、ASCII 幀使用ASCII模式,消息以冒號(hào)(:)字符(ASCII碼3AH)開(kāi)始,以回車(chē)換行符結(jié)束(ASCII碼 0DH,0AH )。其它域可以使用的傳輸字符是
9、十六進(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ò)誤。一個(gè)典型消息幀如下所示:起始位設(shè)備地址功能代碼數(shù)據(jù)LRC校驗(yàn)結(jié)束符1個(gè)字符2個(gè)字符2個(gè)字符n個(gè)字符2個(gè)字符2個(gè)字符圖2 ASCII消息幀2、RTU 幀使用RTU模式,消息發(fā)送至少要以 3.5個(gè)字符時(shí)間的停頓間隔開(kāi)始。在網(wǎng)絡(luò)波特率下多樣的字 符時(shí)間,這是最容易實(shí)現(xiàn)的(如下圖的T1-T2-T3-T4所示)。傳輸?shù)牡谝粋€(gè)域是設(shè)備地址。可以使用的 傳輸字符是十六進(jìn)制的 0.。9, A.
10、。F。網(wǎng)絡(luò)設(shè)備不斷偵測(cè)網(wǎng)絡(luò)總線(xiàn),包括停頓間隔時(shí)間內(nèi)。當(dāng)?shù)?一個(gè)域(地址域)接收到,每個(gè)設(shè)備都進(jìn)行解碼以判斷是否發(fā)往自己的。在最后一個(gè)傳輸字符之后, 一個(gè)至少3.5個(gè)字符時(shí)間的停頓標(biāo)定了消息的結(jié)束。一個(gè)新的消息可在此停頓后開(kāi)始。整個(gè)消息幀必須作為一連續(xù)的流轉(zhuǎn)輸。如果在幀完成之前有超過(guò)1。5個(gè)字符時(shí)間的停頓時(shí)間,接收設(shè)備將刷新不完整的消息并假定下一字節(jié)是一個(gè)新消息的地址域。同樣地,如果一個(gè)新消息在小于3.5個(gè)字符時(shí)間內(nèi)接著前個(gè)消息開(kāi)始,接收的設(shè)備將認(rèn)為它是前一消息的延續(xù)。這將導(dǎo)致一個(gè)錯(cuò)誤,因?yàn)樵谧詈蟮腃RC域的值不可能是正確的。一典型的消息幀如下所示:起始位設(shè)備地址功能代碼數(shù)據(jù)CRC校驗(yàn)結(jié)束符T1
11、-T2 T3-T48Bit8Bitn 個(gè) 8Bit16BitT1 T2 T3 T4圖3 RTU消息幀3、地址域消息幀的地址域包含兩個(gè)字符(ASCII )或8Bit(RTU ).可能的從設(shè)備地址是 0。.。247 (十進(jìn)制)。單個(gè)設(shè)備的地址范圍是 1。.247.主設(shè)備通過(guò)將要聯(lián)絡(luò)的從設(shè)備的地址放入消息中的地址域來(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è)字符(ASC
12、II)或8Bits (RTU)??赡艿拇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è)備中的程序等。當(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)生如下功
13、能代碼:0 0 0 0 0 0 1 1 (十六進(jìn)制 03H)對(duì)正?;貞?yīng),從設(shè)備僅回應(yīng)同樣的功能代碼.對(duì)異議回應(yīng),它返回:1 0 0 0 0 0 1 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)告給操作員。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è)備必須用
14、于進(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ù)域包含請(qǐng)求的數(shù)據(jù)。如果有錯(cuò)誤發(fā)生,此域包含一異議 代碼,主設(shè)備應(yīng)用程序可以用來(lái)判斷采取下一步行動(dòng)。在某種消息中數(shù)據(jù)域可以是不存在的(0長(zhǎng)度).例如,主設(shè)備要求從設(shè)備回應(yīng)通信事件記錄(功能代碼0B十六進(jìn)制),從
15、設(shè)備不需任何附加的信息。6、錯(cuò)誤檢測(cè)域標(biāo)準(zhǔn)的Modbus網(wǎng)絡(luò)有兩種錯(cuò)誤檢測(cè)方法.錯(cuò)誤檢測(cè)域的內(nèi)容視所選的檢測(cè)方法而定。ASCII當(dāng)選用ASCII模式作字符幀,錯(cuò)誤檢測(cè)域包含兩個(gè) ASCII字符。這是使用LRC (縱向冗長(zhǎng)檢測(cè)) 方法對(duì)消息內(nèi)容計(jì)算得出的,不包括開(kāi)始的冒號(hào)符及回車(chē)換行符。LRC字符附加在回車(chē)換行符前面。RTU當(dāng)選用RTU模式作字符幀,錯(cuò)誤檢測(cè)域包含一 16Bits值(用兩個(gè)8位的字符來(lái)實(shí)現(xiàn))。錯(cuò)誤檢 測(cè)域的內(nèi)容是通過(guò)對(duì)消息內(nèi)容進(jìn)行循環(huán)冗長(zhǎng)檢測(cè)方法得出的。CRC域附加在消息的最后,添加時(shí)先是低字節(jié)然后是高字節(jié).故CRC的高位字節(jié)是發(fā)送消息的最后一個(gè)字節(jié) .7、字符的連續(xù)傳輸當(dāng)消息在
16、標(biāo)準(zhǔn)的 Modbus系列網(wǎng)絡(luò)傳輸時(shí),每個(gè)字符或字節(jié)以如下方式發(fā)送(從左到右):最低有效位。最高有效位使用ASCII字符幀時(shí),位的序列是:有奇偶校驗(yàn)啟始位123456 .I奇偶位停止位無(wú)奇偶校驗(yàn)啟始位1234567停止位停止位圖4.位順序(ASCII)使用RTU字符幀時(shí),位的序列是:有奇偶校驗(yàn)啟始位12345678奇偶位停止位無(wú)奇偶校驗(yàn)啟始位12345678停止位停止位圖4。位順序(RTU )四、錯(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è)消
17、息幀。用戶(hù)要給主設(shè)備配置一預(yù)先定義的超時(shí)時(shí)間間隔,這個(gè)時(shí)間間隔要足夠長(zhǎng),以使任何從設(shè)備都能作為正常反應(yīng)。如果從設(shè)備測(cè)到一傳輸錯(cuò)誤,消息將不會(huì)接收,也不會(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 1 0 0 0 1 0 1整個(gè)“1的數(shù)目是4個(gè).如果便用了偶校驗(yàn),幀的奇偶校驗(yàn)位將是0,便得整個(gè)“1的個(gè)數(shù)
18、仍是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è)。代替一附加的停止位填充 至要傳輸?shù)淖址麕?2、LRC檢測(cè)使用ASCII模式,消息包才了一基于LRC方法的錯(cuò)誤檢測(cè)域.LRC域檢測(cè)了消息域中除開(kāi)始的冒號(hào)及結(jié)束的回車(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 u
19、nsigned char LRC (auchMsg , usDataLen)unsigned char * auchMsg ; /* 要進(jìn)行計(jì)算的消息*/unsigned short usDataLen ;/* LRC 要處理的字節(jié)的數(shù)量 */ unsigned char uchLRC = 0 ;/* LRC 字節(jié)初始化 */while (usDataLen -) /* 傳送消息 */uchLRC += * auchMsg+ ; /* 累力口 * / return ( (unsigned char) ( (char_uchLRC); 3、CRC檢測(cè)使用RTU模式,消息包才了一基于CRC方法的錯(cuò)
20、誤檢測(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ò)程將消息中連續(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)行。整
21、個(gè)過(guò)程要重復(fù)8次。在最后一位(第8位)完成后,下一個(gè) 8位字節(jié)又單獨(dú)和寄存器的當(dāng)前值相或。最終寄存器中的值,是消息中所有的字節(jié)都執(zhí)行之后的CRC值。CRC添加到消息中時(shí),低字節(jié)先加入,然后高字節(jié) CRC簡(jiǎn)單函數(shù)如下:unsigned short CRC16 ( puchMsg , usDataLen)unsigned char * puchMsg ; /* 要進(jìn)行 CRC 校驗(yàn)的消息 * /unsigned short usDataLen ; / * 消息中字節(jié)數(shù) * / unsigned char uchCRCHi = 0xFF ; / * 高 CRC 字節(jié)初始化 */unsigned ch
22、ar uchCRCLo = 0xFF ; /* 低 CRC 字節(jié)初始化 */ unsigned uIndex ;/* CRC 循環(huán)中的索引 */while (usDataLen -) /*傳輸消息緩沖區(qū) */ (uIndex = uchCRCHi A *puchMsgg+ ; /* 計(jì)算 CRC */ uchCRCHi = uchCRCLo a auchCRCHiuIndex;uchCRCLo = auchCRCLouIndex; return (uchCRCHi < < 8 | uchCRCLo); /* CRC 高位字節(jié)值表 * /static unsigned char au
23、chCRCHi口 = 0x00, 0xC1, 0x81,0x40 , 0x01,0xC0, 0x80 , 0x41 , 0x01 , 0xC0, 0x80, 0x41, 0x00 , 0xC1 , 0x81,0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x810x400x00, 0xC1, 0x810x400x01 0xC00x800x410x01,0xC0 0x800x41, 0x00, 0xC10x81,0x400x00, 0xC1, 0x81, 0x400x01, 0xC0 0x800x410x00, 0xC1,0x810x400x01,0xC0,
24、 0x80, 0x410x01 0xC00x800x41,0x000xC10x810x40, 0x01, 0xC0 0x80, 0x410x000xC10x81, 0x40, 0x00, 0xC1 0x81, 0x40, 0x01, 0xC0 0x800x41,0x00, 0xC1, 0x810x40, 0x01, 0xC0 0x800x410x010xC0,0x800x41, 0x00, 0xC1 0x81, 0x400x000xC1, 0x81, 0x400x01 0xC0 0x800x410x01, 0xC0, 0x800x41, 0x00 0xC10x81, 0x40, 0x01 0x
25、C0 0x800x410x00, 0xC1 0x810x400x00, 0xC1 0x810x400x01, 0xC0 0x800x410x010xC0,0x80, 0x41, 0x00, 0xC1 0x81, 0x40, 0x00, 0xC1 0x810x40,0x01 0xC0 0x800x41, 0x00, 0xC1, 0x81, 0x400x01 0xC00x800x41, 0x01, 0xC0, 0x800x41, 0x00, 0xC1, 0x810x400x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x410x01, 0xC00x800x41,
26、 0x00 0xC1 0x81, 0x400x01, 0xC0, 0x800x410x00 0xC1 0x810x40, 0x00 0xC1 0x81, 0x400x01, 0xC00x80, 0x41, 0x00, 0xC1, 0x81, 0x400x010xC0, 0x80, 0x410x01, 0xC0 0x80, 0x41, 0x00, 0xC1 0x81, 0x40, 0x01, 0xC0 0x800x41, 0x000xC1, 0x810x400x00, 0xC1 0x810x40,0x010xC0 0x80, 0x410x01 0xC0 0x80, 0x41, 0x000xC10
27、x810x400x00 0xC1 0x810x400x01, 0xC0 0x800x410x000xC1, 0x810x40, 0x010xC0, 0x80, 0x41, 0x010xC0,0x80, 0x41, 0x000xC1, 0x81, 0x40;/* CRC低位字節(jié)值表*/static char auchCRCLo =0x00, 0xC0 , 0xC1, 0x01,0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06, 0x07, 0xC7, 0x05, 0xC5, 0xC4 ,0x04, 0xCC, 0x0C , 0x0D , 0xCD ,0x0F, 0xCF, 0
28、xCE, 0x0E, 0x0A , 0xCA, 0xCB , 0x0B, 0xC9, 0x09 , 0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9 , 0x1B, 0xDB, 0xDA, 0x1A , 0x1E , 0xDE, 0xDF, 0x1F , 0xDD , 0x1D , 0x1C, 0xDC ,0x14, 0xD4,0xD5 , 0x15, 0xD7, 0x17, 0x16 , 0xD6 , 0xD2 , 0x12, 0x13, 0xD3 , 0x11, 0xD1 , 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1 , 0x33, 0xF3
29、, 0xF2,0x32, 0x36, 0xF6, 0xF7, 0x37 , 0xF5, 0x35, 0x34, 0xF4, 0x3C, 0xFC, 0xFD , 0x3D, 0xFF, 0x3F , 0x3E, 0xFE, 0xFA , 0x3A , 0x3B , 0xFB , 0x39, 0xF9, 0xF8, 0x38 , 0x28 , 0xE8, 0xE9 , 0x29, 0xEB, 0x2B, 0x2A , 0xEA, 0xEE, 0x2E , 0x2F, 0xEF, 0x2D, 0xED , 0xEC , 0x2C, 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE
30、7 ,0xE6, 0x26 ,0x22, 0xE2, 0xE3, 0x23 , 0xE1, 0x21 , 0x20, 0xE0 , 0xA0, 0x60, 0x61, 0xA1 , 0x63, 0xA3 , 0xA2 , 0x62, 0x66, 0xA6, 0xA7 , 0x67, 0xA5, 0x65, 0x64, 0xA4, 0x6C, 0xAC , 0xAD , 0x6D , 0xAF , 0x6F , 0x6E , 0xAE, 0xAA , 0x6A, 0x6B , 0xAB, 0x69, 0xA9 , 0xA8 , 0x68, 0x78, 0xB8 , 0xB9, 0x79, 0xB
31、B, 0x7B , 0x7A, 0xBA , 0xBE, 0x7E , 0x7F , 0xBF, 0x7D, 0xBD, 0xBC, 0x7C , 0xB4, 0x74, 0x75, 0xB5 , 0x77, 0xB7 , 0xB6, 0x76, 0x72 , 0xB2, 0xB3, 0x73 , 0xB1,0x71, 0x70, 0xB0, 0x50, 0x90, 0x91,0x51, 0x93, 0x53,0x52, 0x92,0x96,0x56, 0x57, 0x97 ,0x55,0x95,0x94,0x54,0x9C , 0x5C,0x5D ,0x9D, 0x5F,0x9F ,0x9E
32、,0x5E,0x5A ,0x9A ,0x9B, 0x5B ,0x99, 0x59 , 0x58, 0x98 , 0x88, 0x48 ,0x49, 0x89, 0x4B, 0x8B ,0x8A ,0x4A, 0x4E,0x8E ,0x8F ,0x4F,0x8D ,0x4D ,0x4C, 0x8C,0x44,0x84, 0x85, 0x45,0x87 ,0x47, 0x46, 0x86 , 0x82, 0x42 ,0x43, 0x83, 0x41,0x81,0x80 , 0x40 ;MODBUS通訊協(xié)議及編程ModBus通訊協(xié)議分為 RTU協(xié)議和ASCII協(xié)議,我公司的多種儀表都采用 ModBu
33、s RTU通訊協(xié)議, 如:CH2000智能電力監(jiān)測(cè)儀、CH2000M電力參數(shù)采集模塊、巡檢表、數(shù)顯表、光柱數(shù)顯表等。下面 就ModBus RTU協(xié)議簡(jiǎn)要介紹如下:一、通訊協(xié)議(一)、通訊傳送方式 :通訊傳送分為獨(dú)立的信息頭,和發(fā)送的編碼數(shù)據(jù)。以下的通訊傳送方式定義也與MODBUS RTU通訊規(guī)約相兼容:編碼8位二進(jìn)制起始位1位數(shù)據(jù)位8位奇偶校驗(yàn)位1位(偶校驗(yàn)位)停止位1位錯(cuò)誤校檢CRC (冗余循環(huán)碼)初始結(jié)構(gòu)= 此節(jié)的時(shí)間地址碼=1字節(jié)功能碼=1字節(jié)數(shù)據(jù)區(qū)=N字節(jié)錯(cuò)誤校檢 =16位CRC碼結(jié)束結(jié)構(gòu)= 序節(jié)的時(shí)間地址碼:地址碼為通訊傳送的第一個(gè)字節(jié).這個(gè)字節(jié)表明由用戶(hù)設(shè)定地址碼的從機(jī)將接收由主機(jī)
34、發(fā) 送來(lái)的信息。并且每個(gè)從機(jī)都有具有唯一的地址碼,并且響應(yīng)回送均以各自的地址碼開(kāi)始。主機(jī)發(fā)送 的地址碼表明將發(fā)送到的從機(jī)地址,而從機(jī)發(fā)送的地址碼表明回送的從機(jī)地址功能碼:通訊傳送的第二個(gè)字節(jié).ModBus通訊規(guī)約定義功能號(hào)為 1到127。本儀表只利用其中的 一部分功能碼。作為主機(jī)請(qǐng)求發(fā)送,通過(guò)功能碼告訴從機(jī)執(zhí)行什么動(dòng)作。作為從機(jī)響應(yīng),從機(jī)發(fā)送的 功能碼與從主機(jī)發(fā)送來(lái)的功能碼一樣,并表明從機(jī)已響應(yīng)主機(jī)進(jìn)行操作。如果從機(jī)發(fā)送的功能碼的最 高位為1 (比如功能碼大與此同時(shí) 127),則表明從機(jī)沒(méi)有響應(yīng)操作或發(fā)送出錯(cuò)。數(shù)據(jù)區(qū):數(shù)據(jù)區(qū)是根據(jù)不同白功能碼而不同.數(shù)據(jù)區(qū)可以是實(shí)際數(shù)值、設(shè)置點(diǎn)、主機(jī)發(fā)送給從機(jī)
35、或 從機(jī)發(fā)送給主機(jī)的地址。CRC碼:二字節(jié)的錯(cuò)誤檢測(cè)碼.(二)、通訊規(guī)約:當(dāng)通訊命令發(fā)送至儀器時(shí),符合相應(yīng)地址碼的設(shè)備接通訊命令,并除去地址碼,讀取信息,如果沒(méi)有出錯(cuò),則執(zhí)行相應(yīng)的任務(wù);然后把執(zhí)行結(jié)果返送給發(fā)送者。返送的信息中包括地址碼、執(zhí)行動(dòng)作 的功能碼、執(zhí)行動(dòng)作后結(jié)果的數(shù)據(jù)以及錯(cuò)誤校驗(yàn)碼.如果出錯(cuò)就不發(fā)送任何信息。1 .信息幀結(jié)構(gòu)地址碼功能碼數(shù)據(jù)區(qū)錯(cuò)誤校驗(yàn)碼8位8位N X8位16位地址碼:地址碼是信息幀的第一字節(jié)(8位),從0到255。這個(gè)字節(jié)表明由用戶(hù)設(shè)置地址的從機(jī)將接收由主機(jī)發(fā)送來(lái)的信息。每個(gè)從機(jī)都必須有唯一的地址碼,并且只有符合地址碼的從機(jī)才能響 應(yīng)回送。當(dāng)從機(jī)回送信息時(shí),相當(dāng)?shù)牡刂?/p>
36、碼表明該信息來(lái)自于何處。功能碼:主機(jī)發(fā)送的功能碼告訴從機(jī)執(zhí)行什么任務(wù)。表11列出的功能碼都有具體的含義及操作.代碼含義操作03讀取數(shù)據(jù)讀取當(dāng)前寄存器內(nèi)一個(gè)或多個(gè)二進(jìn)制值06重置單一寄存器把設(shè)置的二進(jìn)制值寫(xiě)入單一寄存器數(shù)據(jù)區(qū):數(shù)據(jù)區(qū)包含需要從機(jī)執(zhí)行什么動(dòng)作或由從機(jī)采集的返送信息。這些信息可以是數(shù)值、參 考地址等等。例如,功能碼告訴從機(jī)讀取寄存器的值,則數(shù)據(jù)區(qū)必需包含要讀取寄存器的起始地址及讀 取長(zhǎng)度.對(duì)于不同的從機(jī),地址和數(shù)據(jù)信息都不相同。錯(cuò)誤校驗(yàn)碼:主機(jī)或從機(jī)可用校驗(yàn)碼進(jìn)行判別接收信息是否出錯(cuò).有時(shí),由于電子噪聲或其它一些干擾 信息在傳輸過(guò)程中會(huì)發(fā)生細(xì)微的變化,錯(cuò)誤校驗(yàn)碼保證了主機(jī)或從機(jī)對(duì)在傳
37、送過(guò)程中出錯(cuò)的信息不起作用。這樣增加了系統(tǒng)的安全和效率。錯(cuò)誤校驗(yàn)采用CRC-16校驗(yàn)方法.注:信息幀的格式都基本相同:地址碼、功能碼、數(shù)據(jù)區(qū)和錯(cuò)誤校驗(yàn)碼2 .錯(cuò)誤校驗(yàn)冗余循環(huán)碼(CRC)包含2個(gè)字節(jié),即16位二進(jìn)制。CRC碼由發(fā)送設(shè)備計(jì)算,放置于發(fā)送信息 的尾部。接收信息的設(shè)備再重新計(jì)算接收到信息的CRC碼,比較計(jì)算得到的 CRC碼是否與接收到的相符,如果兩者不相符,則表明出錯(cuò)。CRC碼的計(jì)算方法是,先預(yù)置 16位寄存器全為1。再逐步把每8位數(shù)據(jù)信息進(jìn)行處理。在進(jìn)行 CRC碼計(jì)算時(shí)只用8位數(shù)據(jù)位,起始位及停止位,如有奇偶校驗(yàn)位的話(huà)也包括奇偶校驗(yàn)位,都不參與CRC碼計(jì)算。在計(jì)算CRC碼時(shí),8位數(shù)
38、據(jù)與寄存器的數(shù)據(jù)相異或 得到的結(jié)果向低位移一字節(jié),用0填補(bǔ)最高位。再檢查最低位,如果最低位為1,把寄存器的內(nèi)容與預(yù)置數(shù)相異或,如果最低位為0,不進(jìn)行異或運(yùn)算。這個(gè)過(guò)程一直重復(fù) 8次.第8次移位后,下一個(gè) 8位再與現(xiàn)在寄存器的內(nèi)容相相異或,這個(gè)過(guò)程 與以上一樣重復(fù) 8次。當(dāng)所有的數(shù)據(jù)信息處理完后,最后寄存器的內(nèi)容即為CRC碼值。CRC碼中的數(shù)據(jù)發(fā)送、接收時(shí)低字節(jié)在前。計(jì)算CRC碼的步驟為:? 預(yù)置16位寄存器為十六進(jìn)制 FFFF(即全為1)。稱(chēng)此寄存器為 CRC寄存器;? 把第一個(gè)8位數(shù)據(jù)與16位CRC寄存器的低位相異或,把結(jié)果放于CRC寄存器;? 把寄存器的內(nèi)容右移一位(朝低位),用0填補(bǔ)最高
39、位,檢查最低位;?如果最低位為0:重復(fù)第3步(再次移位);如果最低位為1:CRC寄存器與多項(xiàng)式 A001(10100000 0000 0001 )進(jìn)行異或;?重復(fù)步驟3和4,直到右移8次,這本¥整個(gè)8位數(shù)據(jù)全部進(jìn)行了處理;?重復(fù)步驟2到步驟5,進(jìn)行下一個(gè)8位數(shù)據(jù)的處理;?最后得到的CRC寄存器即為CRC碼。3 .功能碼03,讀取點(diǎn)和返回值:儀表采用Modbus RTU通訊規(guī)約,利用通訊命令,可以進(jìn)行讀取點(diǎn)(保持寄存器”)或返回值(輸 入寄存器”)的操作。保持和輸入寄存器都是16位(2字節(jié))值,并且高位在前。這樣用于儀表的讀取點(diǎn)和返回值都是 2字節(jié)。一次最多可讀取寄存器數(shù)是60。由于一
40、些可編程控制器不用功能碼03,所以功能碼03被用作讀取點(diǎn)和返回值.從機(jī)響應(yīng)的命令格式是從機(jī)地址、功能碼、數(shù)據(jù)區(qū)及CRC碼.數(shù)據(jù)區(qū)中的寄存器數(shù)據(jù)都是每?jī)蓚€(gè)字節(jié)高字節(jié)在前。4 .功能碼06,單點(diǎn)保存主機(jī)利用這條命令把單點(diǎn)數(shù)據(jù)保存到儀表的存儲(chǔ)器。從機(jī)也用這個(gè)功能碼向主機(jī)返送信息二、編程舉例下面是一個(gè)用VC編寫(xiě)的ModBus RTU通訊的例子(一)、通訊口設(shè)置DCB dcb;hCom=CreateFile (" COM1 , GENERIC_READ|GENERIC_WRITE, 0, NULL ,OPEN_EXISTING, 0, NULL);if (hCom=INVALID_HANDLE
41、_VALUE )MessageBox("createfile error , error ) ; BOOL error=SetupComm(hCom,1024,1024); if (!error)MessageBox (" setupcomm error "); error=GetCommState(hCom, &dcb); if (! error)MessageBox(' getcommstate error"); dcb.BaudRate=2400;dcb.ByteSize=8;dcb o Parity=EVENPARITY;/NOP
42、ARITY dcbo StopBits=ONESTOPBIT ;error=SetCommState (hCom, &dcb);(二)、CRC校驗(yàn)碼計(jì)算UINT crcvoid calccrc ( BYTE crcbuf)BYTE i;crc=crc A crcbuf ;for (i=0 ; i<8 ; i+)BYTE TT;TT=crc & 1;crc=crc>1;crc=crc & 0x7fff;if (TT=1)crc=crcA0xa001;crc=crc & Oxffff;)(三)、數(shù)據(jù)發(fā)送zxaddr=11;/讀取地址為11的巡檢表數(shù)據(jù)zx
43、num=10; 讀取十個(gè)通道的數(shù)據(jù)writebuf20 =zxaddr;writebuf2 1 =3 ;writebuf22 =0;writebuf23 =0;writebuf24 =0;writebuf25 =zxnum;crc=0xffff ;calccrc(writebuf2 0);calccrc (writebuf21 );calccrc(writebuf22);calccrc (writebuf2 3);calccrc(writebuf24);calccrc (writebuf2 5); writebuf2 6 =crc & 0xff;writebuf2 7 =crc/0x1
44、00 ;WriteFile(hCom , writebuf2 , 8, &comnum,NULL);(四)、數(shù)據(jù)讀取ReadFile (hCom, writebuf,5+zxnum *2, & comnum, NULL); 讀取 zxnum 個(gè)通道數(shù)據(jù)可增加錯(cuò)誤處理程序,如地址碼錯(cuò)誤、CRC碼錯(cuò)誤判斷、通訊故障處理等。Modbus協(xié)議Modbus協(xié)議最初由Modicon公司開(kāi)發(fā)出來(lái),在 1979年末該公司成為施耐德自動(dòng)化( Schneider Automation )部 門(mén)的一部分,現(xiàn)在 Modbus已經(jīng)是工業(yè)領(lǐng)域全球最流行的協(xié)議。此協(xié)議支持傳統(tǒng)的RS-232、RS-422、R
45、S-485和以太網(wǎng)設(shè)備。許多工業(yè)設(shè)備,包PLC DCS智能儀表等都在使用 Modbus協(xié)議作為他們之間的通訊標(biāo)準(zhǔn)。 有了它,不同 廠商生產(chǎn)的控制設(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í)和使用的消息結(jié)構(gòu),而不管它們是經(jīng)過(guò)何種網(wǎng)絡(luò)進(jìn)行通信的。標(biāo)準(zhǔn)的Modicon控制器使用RS232C$現(xiàn)串行的Modbu* Modbus的ASCI
46、I、RTU協(xié)議規(guī)定了消息、數(shù)據(jù)的結(jié)構(gòu)、命令和就答的方式,數(shù)據(jù)通訊采用Maser/Slave方式,Master端發(fā)出數(shù)據(jù)請(qǐng)求消息,Slave端接收到正確消息后就可以發(fā)送數(shù)據(jù)到Master端以響應(yīng)請(qǐ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),RTUII式采用16位CRC 校驗(yàn),但TCP模式?jīng)]有額外規(guī)定校驗(yàn),因?yàn)?TCP議是一個(gè)面向連接的可靠協(xié)議。另外,Modbus采用主從方式定時(shí)收發(fā)數(shù)據(jù),在實(shí)際使用中如果某Slave站點(diǎn)斷開(kāi)后(如故障或關(guān)機(jī)),Master端可以診斷出來(lái),而當(dāng)故障
47、修復(fù)后,網(wǎng)絡(luò)又可自動(dòng)接通。因此,Modbus協(xié)議的可靠性較好。下面我來(lái)簡(jiǎn)單的給大家介紹一下,對(duì)于Modbus的ASCII、RTU和TCP協(xié)議來(lái)說(shuō),其中TCP和RTU協(xié)議非常類(lèi)似,我們只要把RTU協(xié)議的兩個(gè)字節(jié)的校驗(yàn)碼去掉, 然后在RTU議的開(kāi)始加上5個(gè)0和一個(gè)6并通過(guò)TCP/IP網(wǎng)絡(luò)協(xié)議發(fā) 送出去即可。所以在這里我僅介紹一下Modbus的ASCII和RTU議。下表是ASCII協(xié)議和RTU議進(jìn)行的比較:協(xié)議開(kāi)始標(biāo)記結(jié)束標(biāo)記校驗(yàn)傳輸效率程序處理ASCII:(冒號(hào))CR LFLRC低直觀,簡(jiǎn)單,易調(diào)試RTU無(wú)無(wú)CRC高不直觀,稍復(fù)雜通過(guò)比較可以看到,ASCII協(xié)議和RTU議相比擁有開(kāi)始和結(jié)束標(biāo)記,因
48、此在進(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è)字節(jié)來(lái)傳輸,比如RTU專(zhuān)輸一個(gè)十六進(jìn)制數(shù) 0xF9,ASCII就需要傳輸F' ' 9'的 ASCII碼0x39和0x46兩個(gè)字節(jié),這樣它的傳輸?shù)男示捅容^低。所以一般來(lái)說(shuō), 如果所需要傳輸?shù)臄?shù)據(jù)量較小可以考慮使用ASCII協(xié)議,如果所需傳輸?shù)臄?shù)據(jù)量比較大,最好能使用RTU議.下面對(duì)兩種協(xié)議的校驗(yàn)進(jìn)行一下介紹o1、LRC校驗(yàn)LRC域是一個(gè)包含一個(gè)8位二進(jìn)制
49、值的字節(jié).LRC值由傳輸設(shè)備來(lái)計(jì)算并放到消息幀中,接收設(shè)備在接收消息的過(guò)程 中計(jì)算LRC并將它和接收到消息中 LRC域中的值比較,如果兩值不等,說(shuō)明有錯(cuò)誤。LRC校驗(yàn)比較簡(jiǎn)單,它在ASCII協(xié)議中使用,檢測(cè)了消息域中除開(kāi)始的冒號(hào)及結(jié)束的回車(chē)換行號(hào)外的內(nèi)容。它僅僅是把每一個(gè)需要傳輸?shù)臄?shù)據(jù)按字節(jié)疊加后取反加1即可。下面是它的 VC代碼:BYTE GetCheckCode(const char * pSendBuf , int nEnd ) / 獲得校驗(yàn)碼BYTE byLrc = 0 ;char pBuf 4;int nData = 0;for (i=1 ; i < end; i+=2) /i
50、初始為1,避開(kāi)“開(kāi)始標(biāo)記"冒號(hào)/每?jī)蓚€(gè)需要發(fā)送的 ASCII碼轉(zhuǎn)化為一個(gè)十六進(jìn)制數(shù)pBuf 0 = pSendBuf i;pBuf 1 = pSendBuf i+1 ;pBuf 2 =' 0' ;sscanf(pBuf , " %x" , & nData );byLrc += nData; byLrc = byLrc ;byLrc +;return byLrc ;2、CR或驗(yàn)CRCM是兩個(gè)字節(jié),包含一 16位的二進(jìn)制值。它由傳輸設(shè)備計(jì)算后加入到消息中。接收設(shè)備重新計(jì)算收到消息的CRC并與接收到的CRCM中的彳!比較,如果兩值不同,則有誤。C
51、RC是先調(diào)入一值是全" 1”的16位寄存器,然后調(diào)用一過(guò)程將消息中連續(xù)的8位字節(jié)各當(dāng)前寄存器中的值進(jìn)行處理.僅每個(gè)字符中的8Bit數(shù)據(jù)對(duì)CRCT效,起始位和停止位以及奇偶校驗(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é)。下面是
52、它的VC代碼:WORD GetCheckCode(const char * pSendBuf , int nEnd)/獲得校驗(yàn)碼(WORD wCrc = WORD(0xFFFF);for(int i=0; i nEnd; i+ )wCrc 人=WORD ( BYTE(pSendBuf i);for(int j=0; j 8; j+ )if (wCrc & 1)wCrc >>= 1 ;wCrc 人=0xA001;else(wCrc= 1;)return wCrc ;)對(duì)于一條RTUB議的命令可以簡(jiǎn)單的通過(guò)以下的步驟轉(zhuǎn)化為ASCII協(xié)議的命令:1、 把命令的CRO驗(yàn)去掉,并且計(jì)
53、算出LRC校驗(yàn)取代.2、 把生成的命令串的每一個(gè)字節(jié)轉(zhuǎn)化成對(duì)應(yīng)的兩個(gè)字節(jié)的ASCII碼,比如0x03轉(zhuǎn)化成0x30,0x33 (0的ASCII 碼和 3 的 ASCII 碼)o3、 在命令的開(kāi)頭加上起始標(biāo)記:",它的ASCII碼為0x3A。4、 在命令的尾部加上結(jié)束標(biāo)記CR,LF (0xD,0xA),此處的CR LF表示回車(chē)和換行的 ASCII碼.所以以下我彳門(mén)僅介紹RTUB議即可,對(duì)應(yīng)的 ASCII協(xié)議可以使用以上的步驟來(lái)生成。下表是Modbus支持的功能碼:功能碼名稱(chēng)作用01讀取線(xiàn)圈狀態(tài)取得一組邏輯線(xiàn)圈的當(dāng)前狀態(tài)(ON/OFF02讀取輸入狀態(tài)取得一組開(kāi)關(guān)輸入的當(dāng)前狀態(tài)(ON/OF
54、F03讀取保持寄存器在一個(gè)或多個(gè)保持寄存器中取得當(dāng)前的二進(jìn)制值04讀取輸入寄存器在一個(gè)或多個(gè)輸入寄存器中取得當(dāng)前的二進(jìn)制值05強(qiáng)置單線(xiàn)圈強(qiáng)置一個(gè)邏輯線(xiàn)圈的通斷狀態(tài)06預(yù)置單寄存器把具體二進(jìn)值裝入一個(gè)保持寄存器07讀取異常狀態(tài)取彳導(dǎo)8個(gè)內(nèi)部線(xiàn)圈的通斷狀態(tài),這8個(gè)線(xiàn)圈的地址由控制器決 08回送診斷校驗(yàn)把診斷校驗(yàn)報(bào)文送從機(jī),以對(duì)通信處理進(jìn)行評(píng)鑒09編程(只用于484)使主機(jī)模擬編程器作用,修改 PC從機(jī)邏輯10控詢(xún)(只用于484)可使主機(jī)與一臺(tái)正在執(zhí)行長(zhǎng)程序任務(wù)從機(jī)通信, 探詢(xún)?cè)搹臋C(jī)是 否已完成其操作任務(wù), 僅在含有功能碼9的報(bào)文發(fā)送后,本功 能碼才發(fā)送11讀取事件計(jì)數(shù)可使主機(jī)發(fā)出單詢(xún)問(wèn),并隨即判定
55、操作是否成功,尤其是該命 令或其他應(yīng)答產(chǎn)生通信錯(cuò)誤時(shí)12讀取通信事件記錄可是主機(jī)檢索每臺(tái)從機(jī)的 ModBus事務(wù)處理通信事件記錄。如 果某項(xiàng)事務(wù)處理完成,記錄會(huì)給出有關(guān)錯(cuò)誤13編程(184/384 484 584 )可使主機(jī)模擬編程器功能修改 PC從機(jī)邏輯14探詢(xún)(184/384 484 584 )可使主機(jī)與正在執(zhí)行任務(wù)的從機(jī)通信, 定期控詢(xún)?cè)搹臋C(jī)是否已 完成其程序操作,僅在含有功能 13的報(bào)文發(fā)送后,本功能碼 才得發(fā)送15強(qiáng)置多線(xiàn)圈強(qiáng)置一串連續(xù)邏輯線(xiàn)圈的通斷16預(yù)置多寄存器把具體的二進(jìn)制值裝入一串連續(xù)的保持寄存器17報(bào)告從機(jī)標(biāo)識(shí)可使主機(jī)判斷編址從機(jī)的類(lèi)型及該從機(jī)運(yùn)行指示燈的狀態(tài)18(884 和 MICRO
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 加工安裝服務(wù)合同范本
- 別墅家具購(gòu)買(mǎi)合同范本
- 公司舊車(chē)銷(xiāo)售合同范例
- 乙方工地材料合同范例
- 養(yǎng)生館共享店鋪合同范例
- 電源防雷插座板行業(yè)深度研究報(bào)告
- 中國(guó)電動(dòng)拉鉚槍項(xiàng)目投資可行性研究報(bào)告
- led設(shè)備購(gòu)買(mǎi)合同范本
- 制種水稻合同范本
- 公司外聘員工合同范例
- 2023年上海青浦區(qū)區(qū)管企業(yè)統(tǒng)一招考聘用筆試題庫(kù)含答案解析
- 2023版押品考試題庫(kù)必考點(diǎn)含答案
- 植物之歌觀后感
- 空氣能熱泵安裝示意圖
- 建筑工程施工質(zhì)量驗(yàn)收規(guī)范檢驗(yàn)批填寫(xiě)全套表格示范填寫(xiě)與說(shuō)明
- 2020年中秋國(guó)慶假日文化旅游市場(chǎng)安全生產(chǎn)檢查表
- 昆明天大礦業(yè)有限公司尋甸縣金源磷礦老廠箐-小凹子礦段(擬設(shè))采礦權(quán)出讓收益評(píng)估報(bào)告
- 心有榜樣行有力量 -從冬奧冠軍徐夢(mèng)桃身上感受青春奮斗初中主題班會(huì)
- GB/T 3860-1995文獻(xiàn)敘詞標(biāo)引規(guī)則
- 七年級(jí)英語(yǔ)下冊(cè)閱讀理解10篇
- 設(shè)計(jì)質(zhì)量、進(jìn)度保證措施
評(píng)論
0/150
提交評(píng)論