ModbusRTU協(xié)議詳情簡單說明書_第1頁
ModbusRTU協(xié)議詳情簡單說明書_第2頁
ModbusRTU協(xié)議詳情簡單說明書_第3頁
ModbusRTU協(xié)議詳情簡單說明書_第4頁
ModbusRTU協(xié)議詳情簡單說明書_第5頁
已閱讀5頁,還剩7頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、實(shí)用標(biāo)準(zhǔn)文檔MODHI苫通訊協(xié)議及編程Ms出值辿訊拙議分為RTL協(xié)議和ASCI【協(xié)議,我公司的多抻儀表都乘用Mmlftus RTC 通訊梆談.如:YD加M河能電力就利儀、巡檢表.數(shù)顯表、光柱數(shù)顯表等,下面就麗d前 s RTf協(xié)設(shè)酌處介怕如Ft一,通訊協(xié)議-) . iffi也傳送方式:通訊特送分為獨(dú)立的信息頭,和發(fā)送的編檔數(shù)據(jù)以卜的通訊傳送方式定義也與峋 DBUS R1T逋玳規(guī)妁相敬容:編碼E便二-進(jìn)制起蠟位1位數(shù)據(jù)位8位奇偶校噲廬1慌t偶校賽位)停止位 R錯(cuò)誤校檢CRC (冗余的環(huán)碼)I始址造據(jù)切地用政結(jié)構(gòu)-4字節(jié)的時(shí)間 碼=1字節(jié)碼-I字節(jié)區(qū)=X學(xué) 科限校檢=15位CRC碼端期站杓=#4字節(jié)

2、曲&南地址碼:地址再為通訊樓送的第一個(gè)字這個(gè)地帶兼翡由用戶設(shè)定地址“物從機(jī)個(gè) 接收由主機(jī)發(fā)送來的信息.并且每個(gè)隊(duì)機(jī)都有具宥唯一的地址圖,并且響應(yīng)回送均以各自時(shí)他討碼開始主機(jī)發(fā)送的地M碼表明將發(fā)送到的隊(duì)機(jī)岫址,而從機(jī)發(fā)送的地址碼表明回 送的從機(jī)地址口功能碼:通訊傳送的第二個(gè)字節(jié).此:市面占通訊規(guī)約定義功能號(hào)為)到127本儀表只 利用用中的一部分功能碼*作為主機(jī)請求發(fā)攜.通時(shí)功能為告訴從機(jī)發(fā)行什么劫柞.作為 從機(jī)響應(yīng),從機(jī)發(fā)送的功能碼與從主機(jī)發(fā)送來的功能碼一樣,井表明從機(jī)己響應(yīng)主機(jī)進(jìn)行 操作.如果從機(jī)發(fā)送的功陡碼的值高也為I (比如功能碼大叮此同時(shí)127),則表明從機(jī)沒 口啊也世,”發(fā)送出情數(shù)據(jù)區(qū)

3、;數(shù)據(jù)區(qū)是根據(jù)不同的功能碼而不同.數(shù)據(jù)區(qū)可以是實(shí)際數(shù)值、設(shè)置點(diǎn)、主機(jī) 發(fā)送給從機(jī)或從用發(fā)送給t機(jī)的他*.CRC碼:二字節(jié)的錯(cuò)誤檢溯耨n(二),通訊般的土當(dāng)通訊命令發(fā)送至儀踹時(shí),符合相應(yīng)地址刊的設(shè)需接通訊卻令,井除去地址碼,讀 雙:.息,如果沒有骷鉛,則執(zhí)行相麻的任務(wù):然后把執(zhí)行片果返送給發(fā)送已,返送的儲(chǔ)思中包括地址內(nèi),執(zhí)行動(dòng)作的功能用、執(zhí)行動(dòng)作后姑果的數(shù)據(jù)以及秘誤校麴碼.如果出錯(cuò)就 不爰送任何信息.1 .信息幀結(jié)構(gòu)地址碼功修周數(shù)據(jù)區(qū)錯(cuò)誤校驗(yàn)例8RB位N X 81位164地址碼:地址檔是信息幀的第一字節(jié)由位32551這個(gè)字節(jié)表明由用戶設(shè)置地址的值機(jī)將榛收由主機(jī)發(fā)送來的信思.誨個(gè)戰(zhàn)機(jī)都必地作唯一的

4、地址碼*并且只有符會(huì) 地址碼的從機(jī)才能響府回送,,從機(jī)回送1口用.相當(dāng)?shù)牡刂反a才明該值回來自何處.功能瑪:主機(jī)發(fā)送的功能碼告訴認(rèn)機(jī)執(zhí)行什么任務(wù)B表1T列出的功能碼都有具體 的畬文及提HZ代珥含義操作。3讀取教據(jù)點(diǎn)取當(dāng)前寄存器內(nèi)一個(gè)或多個(gè)二進(jìn)制也06事置單一寄存器把收置的二進(jìn)制值寫入單一寄存需數(shù)據(jù)區(qū):數(shù)堀區(qū)包含需要從機(jī)執(zhí)行什么動(dòng)作我由從凡采集的返送精息;這些信息可以 是敵也.叁號(hào)他川箸莓,可如,功能碼告訴從機(jī)讀取寄存器的值,則初據(jù)區(qū)必需包含要讀 取寄存得的起始地址及讀取長度,對(duì)于不同的從#L地址和教第情息都不相同.錯(cuò)誤校爨碼:主機(jī)或從機(jī)可用校臉瑪遂行判別接收信息是否出錯(cuò).有時(shí),由于電子喔 小威虹

5、它一些T-擾,廛在傳輸過耀中叁量生在總的空租,粒腺科保正了生機(jī)或從機(jī) 同在傳送過程中出錯(cuò)的信息不起作用,這樣增加系統(tǒng)的安全和效率=錯(cuò)誤檢驗(yàn)采用CRC 76校驗(yàn)方法。注:信息幀的格式都基本相同:地址碼、功能碼.數(shù)據(jù)區(qū)和錯(cuò)設(shè)校險(xiǎn)碼二2 .錯(cuò)誤校驍冗余循環(huán)碼fCRC)也含2個(gè)字節(jié).一16位二進(jìn)刷.CRC碼由汲送設(shè)魯計(jì)算放置于 量送信息的尾部 接收信息的設(shè)招再垂新計(jì)算接收到信息的R匚嗎,比較計(jì)算常到的匚明 碼址古內(nèi)楂收到的相符.如果兩行不相符,期表明出霜.C近碼的計(jì)算方法是,先前置16位寄存器全為U再逐相把每X位數(shù)據(jù)信息進(jìn)行處理, 在進(jìn)行CftC科計(jì)算時(shí)只用8位數(shù)據(jù)慟.起蛤口及*ll付.如力辦理校儂伊

6、的話也包括奇鴨 校驗(yàn)位,都不毒與CRC碼計(jì)羿n在計(jì)第CRC碼時(shí). E位數(shù)據(jù)與寄存罌的數(shù)據(jù)相異或*得到的結(jié)果向低位移一字節(jié).用 口地?fù)潢晌滴?種檢較員悵位.卸果最低也為I,把寄存部的內(nèi)容耳械置數(shù)相計(jì)成.如架 鋁%捋為。一不避行導(dǎo)成運(yùn)時(shí)_文案大全這個(gè)過程 直事復(fù)&近:第8次移位后.下一個(gè)B位再與現(xiàn)在寄存器的內(nèi)容相相異 或.這個(gè)過附與以上一樣而復(fù)8次,當(dāng)所有晌數(shù)據(jù)倍息處理完后,最后寄存H1的內(nèi)容IW為 orc碼惘CR匚碼中的數(shù)據(jù)能送、揍收時(shí)抵字節(jié)在前.1算CRC-的步驟為上 飽n】5位.寄存器為入逆制即叩(即全為I,稱此寄存器為匚耽寄存梆t 把第一個(gè)西位數(shù)據(jù)與IB位C同寄存器的低位相異或.把結(jié)果放于

7、CR匚寄存器: 把寄存器的內(nèi)容右移一位(朝低位.削。填補(bǔ)最高位.檢查最低位; 如果最隹位為由卓宜第3步Wi次移位);如果最低的為1:。吃寄存器與多項(xiàng)式A001 ( 1010 0000 0000 OflOD 迎打元或* 重史少彝3和九 直型)右移后次.這樣整個(gè)X位數(shù)據(jù)全部迸行了處理: 重復(fù)步鞋2到步嘿I進(jìn)行下一個(gè)8位數(shù)據(jù)的處理; 最后鞫到的CRC需存耦即為CRC至h3,功能碼03.述取點(diǎn)和返回值:儀表果用Modbus RTU通訊規(guī)例,利用通訊命令,可以進(jìn)h法取點(diǎn)f “保持寄存器R ) 或返回值(*犍入寄存器 )的操作n保持和橇入寄存器都是16位小季節(jié),值,并且高 口在用這樣nn儀表的泳取點(diǎn)和返回

8、值都是a字節(jié)。一次最簍可讀取寄存耨數(shù)是6九由 丁5r如目擰制解不用功能碼03,視IL力能碼03被用作致收點(diǎn)和返回ft從機(jī)晌應(yīng)的 命令格式處從機(jī)地址,功地竹.放州岫及麗瑪.數(shù)WK中的寄存斯敝蝌都足用四個(gè)字小 高字節(jié)在前.4.功能碼06,單點(diǎn)快存由林利用這條命令把單點(diǎn)數(shù)據(jù)保存線儀表的存臍器從機(jī)也用這個(gè)功能碼向十機(jī)運(yùn)送 信息*:*編程小網(wǎng)F面是一個(gè)用YC編寫的瓦加U5 RTT通訊的例子(-)、通訊口設(shè)置DCB deb;hCom=Crt eFile *COM 1 GENFR1C_READ GFFRC_IRrTE.0,Mil.OFEX EXI5T1XG,0,、um ;1 f (hCo=IN ALID_H

9、ANmJ_VALU0(MessdgcRaxri Ie meum,”);ROOl. Lf r:n Itunroititii fhCoin, 102 I, 1 i .i i- * ! ei j or)McssafteBcxr sctupcoum err。/);el T01 GeiCuniniSuiti (hCtHib HrMb. .if (terror)MensarcBok ( _EguaifftHt* err oi F);deb. R3ULRiir!-2 LQQ;deb.ByteSize=8;deb. Pat i t y=EVENPART TY : /NOPAR T TY;ih:b. SLjpB

10、its=ONESTOPBIT;eiior=Sc iCommSla N (hCoiih ftdeb);(二)、CRC校騙碼計(jì)算vitrr orcvoid calccrc(BYTE errbuf) (BYTE i:C1C=CLC efebuf;for(i=0;il;i ic=ci c&0x7fft ;j|- (TT=1)crc=cic OMaOOl;cic=crcfi0xffff;)=).數(shù)據(jù)發(fā)送門期疝二】:讀取地址為的巡檢表數(shù)據(jù) zxwlQ:/讀瞰I(xiàn)力通詼的數(shù)據(jù)wr i t ebuf2,0 =工)caddr;vritehuf2l=3;wri icbul122=0;wri tebuf2L3=0;i

11、ichur24=O;wt itbunBJ=zxnum;crC=Oxffff;ck I cc J i- fwri 1aT vv i lebuf2, 8.虹口胤口口叫 Nl LL);(四),數(shù)據(jù)謨?nèi)e&dFi u (htCoii wr i tbuf, $+inui+2,良曲im. NULL);慢取 KKhum 個(gè)遺道數(shù)榭 叫增加帶囊處理程序,如地切碼狷現(xiàn),C8C碼帶程判小麻福率處理等.tIUDHUS透武力諛荷介一、精述Modtn曲過是應(yīng)用于電子控制器上的 種面用油.起過此油說.控RHM0五之間.號(hào)制器線由網(wǎng)熱(例 如以太網(wǎng)J粗M立沒都之間可以端值.它口位成為 端陽1班標(biāo)準(zhǔn).布了它.不同廠商生產(chǎn)的

12、捽制設(shè)普可變 在通I業(yè)網(wǎng)片.時(shí)吁中曲擰.此協(xié)謖定更丁一個(gè)拄制器能認(rèn)識(shí)使用的捐Jafi構(gòu)JI不管它f超S過河葉冏培述行述情的它橫述了一控制器 請求訪問其它役署的過程,M里回度來自其它設(shè)備的請求,品及息擇也翻錯(cuò)律并記錄.它制定了消息域梅局etBeans使用教程入門篇.創(chuàng)建項(xiàng)目 卜面打開NetBeans,然后點(diǎn)擊菜單“文件”- “新建項(xiàng)目”,打開“新建項(xiàng)目”對(duì)話框:請?jiān)凇邦悇e”中選擇“常規(guī)”,再從“項(xiàng)目”中選擇“Java應(yīng)用程序”,然后點(diǎn)擊“下一步”,進(jìn)入“新建 Java應(yīng)用程序”對(duì)話框:在這個(gè)對(duì)話框中需要設(shè)置項(xiàng)目的名稱以及項(xiàng)目所在目錄,我為自己的項(xiàng)目起名為JUnitTest , “項(xiàng)目位置”為 G

13、:YPJCCKJUnitNetBeans ,此外,請將“創(chuàng)建主類”前的對(duì) 號(hào)去掉。項(xiàng)目創(chuàng)建好后,已經(jīng)自帶了 JUnit 3.8.1。2 .編寫用于測試的 JavaBean用于測試的JavaBean很簡單,名為Book,只有id和name兩個(gè)屬性,這兩個(gè)屬性將分別用 于兩個(gè)用例當(dāng)中。下面開始編寫該JavaBean。請點(diǎn)擊“文件”- “新建文件”,打開“新建文件”對(duì)話框:確保“項(xiàng)目”選擇的是 JUnitTest ,然后在“類別”中選中 Java類,在“文件類型”中選中Java類,點(diǎn)擊“下一個(gè),進(jìn)入下一窗口:設(shè)置類名為Book,包為net.zheng.junit.test ,設(shè)置完成后點(diǎn)擊完成,修改

14、代碼如下:package net.zheng.junit.test;public class Book private String id = null; private String name = null;public String getId() return id;public void setId(String id) this.id = id;public String getName() return name;public void setName(String name) = name;至此,用于測試的 JavaBean編寫完成。3 .編寫測試用例這里只用

15、了一個(gè)類進(jìn)行測試,名為 BookTest,該類繼承自junit.framework.TestCase 類。BookTest類包含兩個(gè)用例,分別對(duì)應(yīng)該類的testId 和testName方法,即每個(gè)方法實(shí)現(xiàn)了一個(gè)測試用例。注意,在 JUnit中,junit.framework.TestCase的子類中每個(gè)用來實(shí)現(xiàn)測試用例的方法都必須以testXXX的格式來命名,這些方法在運(yùn)行時(shí)會(huì)被執(zhí)行。此外,BookTest還包括setUp和tearDown這兩個(gè)方法,前者在每個(gè)測試方法開始之前執(zhí)行,多用來做初始化;后者在每個(gè)測試方法完成之后執(zhí)行,多用來清理資源。下面開始編寫B(tài)ookTest。請點(diǎn)擊“文件”-

16、“新建文件”,打開“新建文件”對(duì)話框:確?!绊?xiàng)目”選擇的是 JUnitTest ,然后在“類別”中選中 JUnit類,在“文件類型”中選 中現(xiàn)有類的測試,點(diǎn)擊“下一個(gè)”,進(jìn)入下一窗口:選擇要測試的類,點(diǎn)擊“完成”,修改代碼如下: package net.zheng.junit.test;import junit.framework.TestCase;import junit.framework.Assert;public class BookTest extends TestCase Book book = null;/建議為測試類創(chuàng)建構(gòu)造public BookTest(String name

17、) super(name);protected void setUp() throws Exception /調(diào)用超類的setUp(),以確保測試環(huán)境被初始化super.setUp();System.out.println( 測試開始!);book = new Book();System.out.println(book對(duì)象被初始化!);protected void tearDown() throws Exception System.out.println(book對(duì)象將被清理!);book = null;System.out.println( 測試結(jié)束!);/調(diào)用超類的tearDown()

18、,以確保測試環(huán)境被清理super.tearDown();public void testId() book.setId(001);/ 設(shè)置 id 屬性的值為 001/使用Assert查看id屬性的值是否為001Assert.assertEquals(001, book.getId();System.out.println(id屬性被測試!);public void testName() book.setName(ASP); / 設(shè)置 name屬性的值為 ASP/使用Assert查看name屬性的值是否為JSP,這是個(gè)必 然出現(xiàn)錯(cuò)誤的測試Assert.assertEquals(JSP, book

19、.getName();System.out.println(name屬性被測試!);這里setUp和tearDown方法沒什么好說的,就是執(zhí)行了對(duì)book對(duì)象的初始化和清理,不過testId 和testName需要說明一下。前者是在對(duì)book的id屬性進(jìn)行測試,首先賦值為001”, 然后使用Assert的assertEquals 方法查看id屬性中存放的值是否是期待的值,由于我的 期待值也是“ 001”,所以執(zhí)行后這個(gè)用例應(yīng)該是成功的;后者則是對(duì)book的name屬性進(jìn)行測試,也是首先賦值為”ASP,然后使用Assert的assertEquals 方法查看其值是否是期待的,由于我特意將期待值設(shè)

20、定為根本不可能的JSP,因此這個(gè)用例執(zhí)行后會(huì)出現(xiàn)一個(gè)錯(cuò)誤。但請注意,由于我是特意要讓測試出現(xiàn)錯(cuò)誤,所以將期待值設(shè)定成了不可能的值, 如果你是測試人員,請千萬不要這么做,否則如果別的地方導(dǎo)致了錯(cuò)誤,很容易給自己造成不必要的麻煩。下面簡單介紹一下上邊用到的靜態(tài)類junit.framework.Assert。該類主要包含 8個(gè)方法:1. assertEquals() 方法,用來查看對(duì)象中存的值是否是期待的值,與字符串比較中使用的 equals()方法類似;2. assertFalse() 和assertTrue() 方法,用來查看變量是是否為false 或true ,如果assertFalse()查

21、看的變量的值是 false則測試成功,如果是 true則失敗,assertTrue()與之相反;3. assertSame()和assertNotSame()方法,用來比較兩個(gè)對(duì)象的引用是否相等和不相等, 類似于通過“=和“ != ”比較兩個(gè)對(duì)象;4. assertNull() 和assertNotNull() 方法,用來查看對(duì)象是否為空和不為空;5. fail ()方法,意為失敗,用來拋出錯(cuò)誤。我個(gè)人認(rèn)為有兩個(gè)用途:首先是在測試驅(qū)動(dòng)開發(fā)中,由于測試用例都是在被測試的類之前編寫,而寫成時(shí)又不清楚其正確與否,此時(shí)就可以使用fail方法拋出錯(cuò)誤進(jìn)行模擬;其次是拋出意外的錯(cuò)誤,比如要測試的內(nèi)容是從數(shù)

22、據(jù) 庫中讀取的數(shù)據(jù)是否正確,而導(dǎo)致錯(cuò)誤的原因卻是數(shù)據(jù)庫連接失敗。四.運(yùn)行BookTest編寫好BookTest后,就可以運(yùn)行了。請?jiān)凇绊?xiàng)目”欄中選中 BookTest,點(diǎn)擊鼠標(biāo)右鍵,選擇“運(yùn)行文件”,測試信息會(huì)從“輸出”窗口輸出:五.測試套件當(dāng)有多個(gè)測試類需要一次性進(jìn)行測試時(shí),可以使用測試套件來完成這項(xiàng)工作。在NetBeans中,點(diǎn)擊“文件”- “新建文件”,打開“新建文件”對(duì)話框:中選確?!绊?xiàng)目”選擇的是 JUnitTest ,然后在“類別”中選中 JUnit類,在“文件類型”中測試套件,點(diǎn)擊“下一個(gè)”,進(jìn)入下一窗口:修改“類名”為 AllTests ,點(diǎn)擊“完成”,然后修改代碼如下:package net.zheng.junit.test;import junit.framework.*;public class AllTests extends TestCase public AllTests(String testName) super(testName);public static Test suite() TestSuite ts= new TestSuite(AllTests);ts.addTestSuite(BookTest.class);return ts;其中TestSuite 是用來組織測試類的

溫馨提示

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

評(píng)論

0/150

提交評(píng)論