版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(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)用于電子控制器上的一種通用語言。通過此協(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)過何種網(wǎng)絡(luò)進(jìn)行通信的。它描述了一控制器請(qǐng)求訪問其它設(shè)備的過程,如果回應(yīng)來自其它設(shè)備的請(qǐng)求,以及怎樣偵測(cè)錯(cuò)誤并記錄。它制定了消息域格局和內(nèi)容的公共格式。 當(dāng)在一Modbus網(wǎng)絡(luò)上通信時(shí),此協(xié)議決定了每個(gè)控制器須要知道它們的設(shè)備地
2、址,識(shí)別按地址發(fā)來的消息,決定要產(chǎn)生何種行動(dòng)。如果需要回應(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口是使用一RS-232C兼容串行接口,它定義了連接口的針腳、電纜、信號(hào)位、傳輸波特率、奇偶校驗(yàn)??刂破髂苤苯踊蚪?jīng)由Modem組網(wǎng)。 控制器通信使用主從技術(shù),即僅一設(shè)備(主設(shè)備)能初始化傳輸(查詢)。其它設(shè)備(從設(shè)備)根據(jù)主設(shè)備查詢提供的數(shù)據(jù)作出相應(yīng)反應(yīng)。典型的主設(shè)備:主機(jī)和可編程儀表。典型
3、的從設(shè)備:可編程控制器。 主設(shè)備可單獨(dú)和從設(shè)備通信,也能以廣播方式和所有從設(shè)備通信。如果單獨(dú)通信,從設(shè)備返回一消息作為回應(yīng),如果是以廣播方式查詢的,則不作任何回應(yīng)。Modbus協(xié)議建立了主設(shè)備查詢的格式:設(shè)備(或廣播)地址、功能代碼、所有要發(fā)送的數(shù)據(jù)、一錯(cuò)誤檢測(cè)域。 從設(shè)備回應(yīng)消息也由Modbus協(xié)議構(gòu)成,包括確認(rèn)要行動(dòng)的域、任何要返回的數(shù)據(jù)、和一錯(cuò)誤檢測(cè)域。如果在消息接收過程中發(fā)生一錯(cuò)誤,或從設(shè)備不能執(zhí)行其命令,從設(shè)備將建立一錯(cuò)誤消息并把它作為回應(yīng)發(fā)送出去。2、在其它類型網(wǎng)絡(luò)上轉(zhuǎn)輸在其它網(wǎng)絡(luò)上,控制器使用對(duì)等技術(shù)通信,故任何控制都能初始和其它控制器的通信。這樣在單獨(dú)的通信
4、過程中,控制器既可作為主設(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ā)送的控制器。3、查詢回應(yīng)周期(1)查詢 查詢消息中的功能代碼告之被選中的從設(shè)備要執(zhí)行何種功能。數(shù)據(jù)段包含了從設(shè)備要執(zhí)行功能的任何附加信息。例如功能代碼03是要求從設(shè)備讀保持寄存器并返回 它們的內(nèi)容。數(shù)據(jù)段必須包含要告之從設(shè)備的信息:從何寄存器開始讀及要讀的寄存器數(shù)量。錯(cuò)誤檢測(cè)域?yàn)閺脑O(shè)備提供了一種驗(yàn)證
5、消息內(nèi)容是否正確的方法。(2)回應(yīng) 如果從設(shè)備產(chǎn)生一正常的回應(yīng),在回應(yīng)消息中的功能代碼是在查詢消息中的功能代碼的回應(yīng)。數(shù)據(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ò)通信。用戶選擇想要的模式,包括串口通信參數(shù)(波特率、校驗(yàn)方式等),在配置每個(gè)控制器的時(shí)候,在一個(gè)Modbus網(wǎng)絡(luò)上的所有設(shè)備都必須選擇相同的傳輸模式和串口參數(shù)。ASCII模式:地址功能代碼數(shù)據(jù)
6、數(shù)量數(shù)據(jù)1.數(shù)據(jù)nLRC高字節(jié)LRC低字節(jié)回車換行RTU模式地址功能代碼數(shù)據(jù)數(shù)量數(shù)據(jù)1.數(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)成與串行傳輸無關(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)制
7、,ASCII字符0.9,A.F · 消息中的每個(gè)ASCII字符都是一個(gè)十六進(jìn)制字符組成 每個(gè)字節(jié)的位· 1個(gè)起始位 · 7個(gè)數(shù)據(jù)位,最小的有效位先發(fā)送 · 1個(gè)奇偶校驗(yàn)位,無校驗(yàn)則無 · 1個(gè)停止位(有校驗(yàn)時(shí)),2個(gè)Bit(無校驗(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
8、.F · 消息中的每個(gè)8位域都是一個(gè)兩個(gè)十六進(jìn)制字符組成 · 每個(gè)字節(jié)的位 · 1個(gè)起始位 · 8個(gè)數(shù)據(jù)位,最小的有效位先發(fā)送 · 1個(gè)奇偶校驗(yàn)位,無校驗(yàn)則無 · 1個(gè)停止位(有校驗(yàn)時(shí)),2個(gè)Bit(無校驗(yàn)時(shí)) 錯(cuò)誤檢測(cè)域· CRC(循環(huán)冗長(zhǎng)檢測(cè)) 三、Modbus消息幀 兩種傳輸模式中(ASCII或RTU),傳輸設(shè)備以將Modbus消息轉(zhuǎn)為有起點(diǎn)和終點(diǎn)的幀,這就允許接收的設(shè)備在消息起始處開始工作,讀地址分配信息, 判斷哪一個(gè)設(shè)備被選中(廣播方式則傳給所有設(shè)備),判知何時(shí)信息已完成。部分的消息也能偵測(cè)到并且錯(cuò)誤能設(shè)置為返回結(jié)
9、果。1、ASCII幀使用ASCII模式,消息以冒號(hào)(:)字符(ASCII碼 3AH)開始,以回車換行符結(jié)束(ASCII碼 0DH,0AH)。 其它域可以使用的傳輸字符是十六進(jìn)制的0.9,A.F。網(wǎng)絡(luò)上的設(shè)備不斷偵測(cè)“:”字符,當(dāng)有一個(gè)冒號(hào)接收到時(shí),每個(gè)設(shè)備都解碼下個(gè)域(地址域)來判斷是否發(fā)給自己的。 消息中字符間發(fā)送的時(shí)間間隔最長(zhǎng)不能超過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í)間的停頓
10、間隔開始。在網(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)行解碼以判斷是否發(fā)往自己的。在最后一個(gè)傳輸字符之后,一個(gè)至少3.5個(gè)字符時(shí)間的停頓標(biāo)定了消息的結(jié)束。一個(gè)新的消息可 在此停頓后開始。 整個(gè)消息幀必須作為一連續(xù)的流轉(zhuǎn)輸。如果在幀完成之前有超過1.5個(gè)字符時(shí)間的停頓時(shí)間,接收設(shè)備將刷新不完整的消息并假定下一字節(jié)是一個(gè)新消息的地址 域。同樣地,如果一個(gè)新消息在小于3.5個(gè)字符時(shí)間內(nèi)接
11、著前個(gè)消息開始,接收的設(shè)備將認(rèn)為它是前一消息的延續(xù)。這將導(dǎo)致一個(gè)錯(cuò)誤,因?yàn)樵谧詈蟮腃RC域的 值不可能是正確的。一典型的消息幀如下所示: 起始位設(shè)備地址功能代碼數(shù)據(jù)CRC校驗(yàn)結(jié)束符T1-T2-T3-T48Bit8Bitn個(gè)8Bit16BitT1-T2-T3-T4圖3 RTU消息幀3、地址域 消息幀的地址域包含兩個(gè)字符(ASCII)或8Bit(RTU)??赡艿膹脑O(shè)備地址是0.247 (十進(jìn)制)。單個(gè)設(shè)備的地址范圍是1.247。主設(shè)備通過將要聯(lián)絡(luò)的從設(shè)備的地址放入消息中的地址域來選通從設(shè)備。當(dāng)從設(shè)備發(fā)送回應(yīng)消息時(shí),它把自己 的地址放入回應(yīng)的地址域中,以便主設(shè)備知道是哪一個(gè)設(shè)備作出回應(yīng)。&
12、#160;地址0是用作廣播地址,以使所有的從設(shè)備都能認(rèn)識(shí)。當(dāng)Modbus協(xié)議用于更高水準(zhǔn)的網(wǎng)絡(luò),廣播可能不允許或以其它方式代替。4、如何處理功能域消息幀中的功能代碼域包含了兩個(gè)字符(ASCII)或8Bits(RTU)??赡艿拇a范圍是十進(jìn)制的1.255。當(dāng)然,有些代碼是適用于所有控制器,有此是應(yīng)用于某種控制器,還有些保留以備后用。 當(dāng)消息從主設(shè)備發(fā)往從設(shè)備時(shí),功能代碼域?qū)⒏嬷畯脑O(shè)備需要執(zhí)行哪些行為。例如去讀取輸入的開關(guān)狀態(tài),讀一組寄存器的數(shù)據(jù)內(nèi)容,讀從設(shè)備的診斷狀態(tài),允許調(diào)入、記錄、校驗(yàn)在從設(shè)備中的程序等。 當(dāng)從設(shè)備回應(yīng)時(shí),它使用功能代碼域來指示是正?;貞?yīng)(無誤)還是有某種
13、錯(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è)備僅回應(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)后,典型的處理過程是重發(fā)消息,或者診斷發(fā)給從設(shè)備的消息并報(bào)告給操作員。 5、數(shù)據(jù)域 數(shù)據(jù)
14、域是由兩個(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è)備寫一組從設(shè)備的寄存器(功能代 碼10十六進(jìn)制),數(shù)據(jù)域則指明了要寫的起始寄存器以及要寫的寄存器數(shù)量,數(shù)據(jù)域的數(shù)據(jù)字節(jié)數(shù),要寫入寄存器的數(shù)據(jù)。 如果沒有錯(cuò)誤發(fā)生,從從設(shè)備返回的數(shù)據(jù)域包含請(qǐng)求的數(shù)據(jù)。如果有
15、錯(cuò)誤發(fā)生,此域包含一異議代碼,主設(shè)備應(yīng)用程序可以用來判斷采取下一步行動(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 當(dāng)選用ASCII模式作字符幀,錯(cuò)誤檢測(cè)域包含兩個(gè)ASCII字符。這是使用LRC(縱向冗長(zhǎng)檢測(cè))方法對(duì)消息內(nèi)容計(jì)算得出的,不包括開始的冒號(hào)符及回車換行符。LRC字符附加在回車換行符前面。 RTU 當(dāng)選用RTU模式作字符幀,錯(cuò)誤檢測(cè)域包含一16Bits值(用兩個(gè)8位的字符來實(shí)現(xiàn))。錯(cuò)
16、誤檢測(cè)域的內(nèi)容是通過對(duì)消息內(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ā)送(從左到右): 最低有效位.最高有效位 使用ASCII字符幀時(shí),位的序列是: 有奇偶校驗(yàn) 啟始位1234567奇偶位停止位無奇偶校驗(yàn) 啟始位1234567停止位停止位圖4. 位順序(ASCII) 使用RTU字符幀時(shí),位的序列是: 有奇偶校驗(yàn) 啟始位12345678奇偶位停止位無奇偶校驗(yàn) 啟始位12345678停止位停止位圖4. 位順序(RTU) 四
17、、錯(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è)備在接收過程中檢測(cè)每個(gè)字符和整個(gè)消息幀。 用戶要給主設(shè)備配置一預(yù)先定義的超時(shí)時(shí)間間隔,這個(gè)時(shí)間間隔要足夠長(zhǎng),以使任何從設(shè)備都能作為正常反應(yīng)。如果從設(shè)備測(cè)到一傳輸錯(cuò)誤,消息將不會(huì)接收,也不會(huì)向主設(shè)備作出回應(yīng)。這樣超時(shí)事件將觸發(fā)主設(shè)備來處理錯(cuò)誤。發(fā)往不存在的從設(shè)備的地址也會(huì)產(chǎn)生超時(shí)。 1、奇偶校驗(yàn) 用戶可以配置控制器是奇或偶校驗(yàn),或無校驗(yàn)。這將決定了每個(gè)字符中的奇偶校驗(yàn)位是如何設(shè)置的。 如果指定了奇或偶校驗(yàn),“1”的位數(shù)將算到每個(gè)
18、字符的位數(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ù)仍是4個(gè)。如果便用了奇校驗(yàn),幀的奇偶校驗(yàn)位將是1,便得整個(gè)“1”的個(gè)數(shù)是5個(gè)。 如果沒有指定奇偶校驗(yàn)位,傳輸時(shí)就沒有校驗(yàn)位,也不進(jìn)行校驗(yàn)檢測(cè)。代替一附加的停止位填充至要傳輸?shù)淖址麕小?#160;2、LRC檢測(cè) 使用ASCII模式,消息包括了一基于LRC方法的錯(cuò)誤檢測(cè)域。LRC域檢測(cè)了消息域中除開始的冒號(hào)及結(jié)束的回車換行號(hào)外的內(nèi)容。 LRC域是一個(gè)包含一個(gè)8位二進(jìn)制值
19、的字節(jié)。LRC值由傳輸設(shè)備來計(jì)算并放到消息幀中,接收設(shè)備在接收消息的過程中計(jì)算LRC,并將它和接收到消息中LRC域中的值比較,如果兩值不等,說明有錯(cuò)誤。LRC方法是將消息中的8Bit的字節(jié)連續(xù)累加,丟棄了進(jìn)位。 LRC簡(jiǎn)單函數(shù)如下: static unsigned char LRC(auchMsg,usDataLen) unsigned char *auchMsg ; /* 要進(jìn)行計(jì)算的消息 */ unsigned short usDataLen ; /* LRC 要處理的字節(jié)的數(shù)量*/ unsigned char uchLRC = 0 ; /* LRC 字節(jié)初始化 */ while (usD
20、ataLen-) /* 傳送消息 */ uchLRC += *auchMsg+ ; /* 累加*/ return (unsigned 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)用一過程將消息中連續(xù)的8位字節(jié)各當(dāng)前寄存器中的值進(jìn)行處理。僅每個(gè)字符中的8Bit數(shù)據(jù)對(duì)CRC有效,起
21、始位和停止位以及奇偶校驗(yàn)位均無效。 CRC產(chǎn)生過程中,每個(gè)8位字符都單獨(dú)和寄存器內(nèi)容相或(OR),結(jié)果向最低有效位方向移動(dòng),最高有效位以0填充。LSB被提取出來檢測(cè),如果LSB為 1,寄存器單獨(dú)和預(yù)置的值或一下,如果LSB為0,則不進(jìn)行。整個(gè)過程要重復(fù)8次。在最后一位(第8位)完成后,下一個(gè)8位字節(jié)又單獨(dú)和寄存器的當(dāng)前值相 或。最終寄存器中的值,是消息中所有的字節(jié)都執(zhí)行之后的CRC值。 CRC添加到消息中時(shí),低字節(jié)先加入,然后高字節(jié)。 MODBUS通訊協(xié)議及編程【二】ModBus通訊協(xié)議分為RTU協(xié)議和ASCII協(xié)議,我公司的多種儀表都采用ModBus RTU通訊協(xié)議,如:CH20
22、00智能電力監(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) = 4字節(jié)的時(shí)間 地址碼 = 1 字節(jié)功能碼 = 1 字節(jié)數(shù)據(jù)區(qū) = N 字節(jié)錯(cuò)誤校檢 = 16位CRC碼 結(jié)束結(jié)構(gòu) = 4字節(jié)的時(shí)間地址碼:地址碼為通訊傳送的第一個(gè)字節(jié)。這個(gè)字節(jié)表明由用戶設(shè)定地址碼的從機(jī)將接收由主機(jī)發(fā)
23、送來的信息。并且每個(gè)從機(jī)都有具有唯一的地址碼,并且響應(yīng)回送均以各自的地址碼開始。主機(jī)發(fā)送的地址碼表明將發(fā)送到的從機(jī)地址,而從機(jī)發(fā)送的地址碼表明回送的從機(jī)地址。功能碼:通訊傳送的第二個(gè)字節(jié)。ModBus通訊規(guī)約定義功能號(hào)為1 到127。本儀表只利用其中的一部分功能碼。作為主機(jī)請(qǐng)求發(fā)送,通過功能碼告訴從機(jī)執(zhí)行什么動(dòng)作。作為從機(jī)響應(yīng),從機(jī)發(fā)送的功能碼與從主機(jī)發(fā)送來的功能碼 一樣,并表明從機(jī)已響應(yīng)主機(jī)進(jìn)行操作。如果從機(jī)發(fā)送的功能碼的最高位為(比如功能碼大與此同時(shí)127),則表明從機(jī)沒有響應(yīng)操作或發(fā)送出錯(cuò)。數(shù)據(jù)區(qū):數(shù)據(jù)區(qū)是根據(jù)不同的功能碼而不同。數(shù)據(jù)區(qū)可以是實(shí)際數(shù)值、設(shè)置點(diǎn)、主機(jī)發(fā)送給從機(jī)或從機(jī)發(fā)送給主
24、機(jī)的地址。 CRC碼:二字節(jié)的錯(cuò)誤檢測(cè)碼。(二)、通訊規(guī)約: 當(dāng)通訊命令發(fā)送至儀器時(shí),符合相應(yīng)地址碼的設(shè)備接通訊命令,并除去地址碼,讀取信息,如果沒有出錯(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 × 8位16位地址碼:地址碼是信息幀的第一字節(jié)(8位),從0到255。這個(gè)字節(jié)表明由用戶設(shè)置地址的從機(jī)將接收由主機(jī)發(fā)送來的信息。每個(gè)從機(jī)都必須有唯一的地址碼,并且只有符合地址碼的從機(jī)才能響應(yīng)回送。當(dāng)從機(jī)回送信息時(shí),相當(dāng)?shù)牡刂反a表明該
25、信息來自于何處。 功能碼:主機(jī)發(fā)送的功能碼告訴從機(jī)執(zhí)行什么任務(wù)。表1-1列出的功能碼都有具體的含義及操作。 代碼含義 操作03讀取數(shù)據(jù)讀取當(dāng)前寄存器內(nèi)一個(gè)或多個(gè)二進(jìn)制值06重置單一寄存器把設(shè)置的二進(jìn)制值寫入單一寄存器數(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í),由于電子噪聲或其它一些干擾,信息在傳輸過程中會(huì)發(fā)生細(xì)微的變化,錯(cuò)誤校驗(yàn)碼保證了主機(jī)或從機(jī)對(duì)在傳送過
26、程中出錯(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)位的話也包括奇偶校驗(yàn)位,都不參與CRC碼計(jì)算。 在計(jì)算CRC碼時(shí),8位數(shù)據(jù)與寄存
27、器的數(shù)據(jù)相異或,得到的結(jié)果向低位移一字節(jié),用0填補(bǔ)最高位。再檢查最低位,如果最低位為1,把寄存器的內(nèi)容與預(yù)置數(shù)相異或,如果最低位為0,不進(jìn)行異或運(yùn)算。 這個(gè)過程一直重復(fù)8次。第8次移位后,下一個(gè)8位再與現(xiàn)在寄存器的內(nèi)容相相異或,這個(gè)過程與以上一樣重復(fù)8次。當(dāng)所有的數(shù)據(jù)信息處理完后,最后寄存器的內(nèi)容即為CRC碼值。CRC碼中的數(shù)據(jù)發(fā)送、接收時(shí)低字節(jié)在前。 計(jì)算CRC碼的步驟為:· 預(yù)置16位寄存器為十六進(jìn)制FFFF(即全為1)。稱此寄存器為CRC寄存器; · 把第一個(gè)8位數(shù)據(jù)與16位CRC寄存器的低位相異或,把結(jié)果放于CRC寄存器; · 把寄存器的內(nèi)容右移一位(朝低
28、位),用0填補(bǔ)最高位,檢查最低位; · 如果最低位為0:重復(fù)第3步(再次移位); 如果最低位為1:CRC寄存器與多項(xiàng)式A001(1010 0000 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é))值,并且高位在前。這樣用于儀表
29、的讀取點(diǎn)和返回值都是2字節(jié)。一次最多可讀取寄存器數(shù)是60。由于一些可 編程控制器不用功能碼03,所以功能碼03被用作讀取點(diǎn)和返回值。從機(jī)響應(yīng)的命令格式是從機(jī)地址、功能碼、數(shù)據(jù)區(qū)及CRC碼。數(shù)據(jù)區(qū)中的寄存器數(shù)據(jù)都是每 兩個(gè)字節(jié)高字節(jié)在前。4功能碼06,單點(diǎn)保存主機(jī)利用這條命令把單點(diǎn)數(shù)據(jù)保存到儀表的存儲(chǔ)器。從機(jī)也用這個(gè)功能碼向主機(jī)返送信息。二、編程舉例下面是一個(gè)用VC編寫的ModBus RTU通訊的例子(一)、通訊口設(shè)置DCB dcb;hCom=CreateFile("COM1", GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,
30、0,NULL);if(hCom=INVALID_HANDLE_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.Parit
31、y=EVENPARITY;/NOPARITY;dcb.StopBits=ONESTOPBIT;error=SetCommState(hCom,&dcb);(二)、CRC校驗(yàn)碼計(jì)算UINT crcvoid calccrc(BYTE crcbuf)BYTE i;crc=crc crcbuf;for(i=0;i<8;i+)BYTE TT;TT=crc&1;crc=crc>>1;crc=crc&0x7fff;if (TT=1)crc=crc0xa001;crc=crc&0xffff;(三)、數(shù)據(jù)發(fā)送zxaddr=11;/讀取地址為11的巡檢表數(shù)據(jù)zxn
32、um=10;/讀取十個(gè)通道的數(shù)據(jù)writebuf20=zxaddr;writebuf21=3;writebuf22=0;writebuf23=0;writebuf24=0;writebuf25=zxnum;crc=0xffff;calccrc(writebuf20);calccrc(writebuf21);calccrc(writebuf22);calccrc(writebuf23);calccrc(writebuf24);calccrc(writebuf25);writebuf26=crc & 0xff;writebuf27=crc/0x100;WriteFile(hCom,writ
33、ebuf2,8,&comnum,NULL);(四)、數(shù)據(jù)讀取ReadFile(hCom,writebuf,5+zxnum*2,&comnum,NULL);/讀取zxnum個(gè)通道數(shù)據(jù)可增加錯(cuò)誤處理程序,如地址碼錯(cuò)誤、CRC碼錯(cuò)誤判斷、通訊故障處理等。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 ; /
34、* 高CRC字節(jié)初始化 */ unsigned char uchCRCLo = 0xFF ; /* 低CRC 字節(jié)初始化 */ unsigned uIndex ; /* CRC循環(huán)中的索引 */ while (usDataLen-) /* 傳輸消息緩沖區(qū) */ uIndex = uchCRCHi *puchMsgg+ ; /* 計(jì)算CRC */ uchCRCHi = uchCRCLo auchCRCHiuIndex ; uchCRCLo = auchCRCLouIndex ; return (uchCRCHi << 8 | uchCRCLo) ; /* CRC 高位字節(jié)值表 */
35、static unsigned char auchCRCHi = 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x0
36、1, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x8
37、1, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x0
38、0, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x8
39、1, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x0
40、1, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 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, 0xCE, 0x0E, 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09, 0x08, 0xC8,
41、 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, 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, 0x3
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024-2025學(xué)年新教材高中政治 綜合探究一教學(xué)實(shí)錄 新人教版必修第一冊(cè)
- 專業(yè)認(rèn)識(shí)實(shí)習(xí)報(bào)告匯編6篇
- 行為目標(biāo)怎么寫
- 八年級(jí)歷史上冊(cè) 第三單元 資產(chǎn)階級(jí)民主革命與中華民國(guó)的建立 第8課 革命先行者孫中山教學(xué)實(shí)錄 新人教版
- 社會(huì)實(shí)踐活動(dòng)過程
- 6 感官總動(dòng)員 教學(xué)實(shí)錄-2024-2025學(xué)年科學(xué)一年級(jí)上冊(cè)蘇教版
- 五年級(jí)我想對(duì)您說500字滿分作文10篇參考
- 員工引咎辭職辭職報(bào)告15篇
- 第6課 認(rèn)識(shí)機(jī)器人構(gòu)件(教學(xué)實(shí)錄)2023-2024學(xué)年六年級(jí)下冊(cè)信息技術(shù)閩教版
- 個(gè)人小學(xué)述職報(bào)告范文集合七篇
- 65mn彈簧鋼熱處理工藝
- 調(diào)試人員微波技術(shù)學(xué)習(xí)課件
- 足球教練員素質(zhì)和角色
- 初中八年級(jí)語文課件 桃花源記【省一等獎(jiǎng)】
- 2024年四川成都市興蓉集團(tuán)有限公司招聘筆試參考題庫(kù)含答案解析
- 《傣族舞蹈教程》課件
- 專題19 詩(shī)詞鑒賞(考點(diǎn)精講)-【中職專用】中職高考語文一輪復(fù)習(xí)講練測(cè)(四川適用)
- 2024北京大興區(qū)初三(上)期末化學(xué)試卷及答案
- 國(guó)家開放大學(xué)2023年7月期末統(tǒng)一試《22064管理學(xué)基礎(chǔ)》試題及答案-開放???/a>
- 生物制藥行業(yè)的經(jīng)營(yíng)管理制度
- 臥式單面多軸鉆孔組合機(jī)床動(dòng)力滑臺(tái)液壓系統(tǒng)
評(píng)論
0/150
提交評(píng)論