利用VC實(shí)現(xiàn)MODBUS的兩種錯(cuò)誤檢測(cè)方法_第1頁
利用VC實(shí)現(xiàn)MODBUS的兩種錯(cuò)誤檢測(cè)方法_第2頁
利用VC實(shí)現(xiàn)MODBUS的兩種錯(cuò)誤檢測(cè)方法_第3頁
利用VC實(shí)現(xiàn)MODBUS的兩種錯(cuò)誤檢測(cè)方法_第4頁
利用VC實(shí)現(xiàn)MODBUS的兩種錯(cuò)誤檢測(cè)方法_第5頁
已閱讀5頁,還剩1頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、利用VC實(shí)現(xiàn)MODBUS的兩種錯(cuò)誤檢測(cè)方法    利用VC實(shí)現(xiàn)MODBUS的兩種錯(cuò)誤檢測(cè)方法 其其格 梁元 郭科 (成都理工大學(xué)信息管理學(xué)院 四川 成都 610059) Implementation the Double Error Detection Methods of the Modbus Protocol using Microsoft Visual C+ 摘要:Modbus協(xié)議是應(yīng)用于位數(shù)據(jù),低位先送 奇/偶校驗(yàn)時(shí)1位;無奇偶校驗(yàn)時(shí)0位 停止位1位(帶校驗(yàn));停止位2位(無校驗(yàn)) 帶校驗(yàn)時(shí)1位停止位;無校驗(yàn)時(shí)2位停止位 錯(cuò)誤校驗(yàn)區(qū):循環(huán)冗余校驗(yàn)

2、(CRC) ASCII數(shù)據(jù)幀位序: Start 1 2 3 4 5 6 7 StopStop 圖1 ASCII位序 RTU數(shù)據(jù)幀位序: Start 1 2 3 4 5 6 7 Par Stop Start 1 2 3 4 5 6 7 8 Par Stop Start 1 2 3 4 5 6 7 8 Stop Stop 無奇偶校驗(yàn)帶奇偶校驗(yàn) 無奇偶校驗(yàn) 帶奇偶校驗(yàn) 圖2 RTU位序 無論是ASCII模式還是RTU模式,Modbus信息以幀的方式傳輸,每幀有確定的起始點(diǎn)和結(jié)束點(diǎn),使接收設(shè)備在信息的起點(diǎn)開始讀地址,并確定要尋址的設(shè)備 (廣播時(shí)對(duì)全部設(shè)備),以及信息傳輸?shù)慕Y(jié)束時(shí)間.在標(biāo)準(zhǔn)的Modbus

3、上傳送的信息中,每個(gè)字符或字節(jié),按由左向右的次序傳送:最低有效位:(LSB), 最高有效位:(MSB). 1.3 Modbus信息幀 1.3.1地址設(shè)置 信息地址包括2個(gè)字符(ASCII)或8位(RTU),有效的從機(jī)設(shè)備地址范圍0-247 (十進(jìn)制),各從機(jī)設(shè)備的尋址范圍為1-247.主機(jī)把從機(jī)地址放入信息幀的地址區(qū),并向從機(jī)尋址.從機(jī)響應(yīng)時(shí),把自己的地址放入響應(yīng)信息的地址區(qū),讓主機(jī)識(shí)別已做出響應(yīng)的從機(jī)地址.地址0為于廣播地址,所有從機(jī)均能識(shí)別.當(dāng)Modbus協(xié)議用于高級(jí)網(wǎng)絡(luò)時(shí),則不允許廣播或其它方式替代. 1.3.2功能碼設(shè)置 信息幀功能代碼包括兩個(gè)字符(ASCII)或8位(RTU).有效碼

4、范圍1-225(十進(jìn)制),其中有些代碼適用全部型號(hào)的Modicon控制器,而有些代碼僅適用于某些型號(hào)的控制器.當(dāng)主機(jī)向從機(jī)發(fā)送信息時(shí),功能代碼向從機(jī)說明應(yīng)執(zhí)行的動(dòng)作.當(dāng)從機(jī)響應(yīng)主機(jī)時(shí),功能代碼可說明從機(jī)正常響應(yīng)或出現(xiàn)錯(cuò)誤(即不正常響應(yīng)),正常響應(yīng)時(shí),從句簡(jiǎn)單返回原始功能代碼;不正常響應(yīng)時(shí),從機(jī)返回與原始代碼相等效的一個(gè)碼,并把最高有效位設(shè)定為"1".如主機(jī)要求從機(jī)讀一組保持寄存器時(shí),則發(fā)送信息的功能碼為:0000 0011 (十六進(jìn)制03).若從機(jī)正確接收請(qǐng)求的動(dòng)作信息后,則返回相同的代碼值作為正常響應(yīng).發(fā)現(xiàn)錯(cuò)時(shí),則返回一個(gè)不正常響信息:1000 0011(十六進(jìn)制83).

5、從機(jī)對(duì)功能代碼作了修改,此外,還把一個(gè)特殊碼放入響應(yīng)信息的數(shù)據(jù)區(qū)中,告訴主機(jī)出現(xiàn)的錯(cuò)誤類型和不正常響應(yīng)的原因.主機(jī)設(shè)備的應(yīng)用程序負(fù)責(zé)處理不正常響應(yīng),典型處理過程是主機(jī)把對(duì)信息的測(cè)試和診斷送給從機(jī),并通知操作者. 1.3.3數(shù)據(jù)區(qū)的內(nèi)容 數(shù)據(jù)區(qū)有2個(gè)16進(jìn)制的數(shù)據(jù)位,數(shù)據(jù)范圍為00-FF(16進(jìn)制),根據(jù)網(wǎng)絡(luò)串行傳輸?shù)姆绞?數(shù)據(jù)區(qū)可由一對(duì)ASCII字符組成或由一個(gè)RTU 字符組成.主機(jī)向從機(jī)設(shè)備發(fā)送的信息數(shù)據(jù)中包含了從機(jī)執(zhí)行主機(jī)功能代碼中規(guī)定的請(qǐng)求動(dòng)作,如離散量寄存器地址,處理對(duì)象的數(shù)目,以及實(shí)際的數(shù)據(jù)字節(jié)數(shù)等. 2錯(cuò)誤校驗(yàn) 2.1 LRC縱向冗余校驗(yàn) 2.1.1 LRC校驗(yàn) ASCII方式時(shí),

6、數(shù)據(jù)中包含錯(cuò)誤校驗(yàn)碼,采用LRC校驗(yàn)方法時(shí),LRC校驗(yàn)信息以冒號(hào)":"開始,以CRLF字符作為結(jié)束.它忽略了單個(gè)字符數(shù)據(jù)的奇偶校驗(yàn)的方法. 縱向冗余校驗(yàn)區(qū)為1個(gè)字節(jié),8位二進(jìn)制數(shù)據(jù),由發(fā)送設(shè)備計(jì)算LRC值,并把計(jì)算值附到信息中.接收設(shè)備在接收信息時(shí),重新計(jì)算LRC值,并把計(jì)算值與LRC區(qū)中接收的實(shí)際值進(jìn)行比較,若兩者不相同,則產(chǎn)生一個(gè)錯(cuò)誤.信息中的相鄰2個(gè)8位字節(jié)相加,丟棄進(jìn)位,然后進(jìn)行二進(jìn)制補(bǔ)碼,運(yùn)算計(jì)算出LRC值.LRC是一個(gè)8位數(shù)據(jù)區(qū),因此每加一個(gè)新字符,會(huì)產(chǎn)生大于十進(jìn)制255的數(shù)值而溢出,因?yàn)闆]有第9位,自動(dòng)放棄進(jìn)位. 2.1.2產(chǎn)生LRC的過程: 1. 相加信息中

7、的全部字節(jié),包括起始":"號(hào)和結(jié)束符CRLF,并把結(jié)果送入8位數(shù)據(jù)區(qū),放棄進(jìn)位. 2. 由FFH減去最終的數(shù)據(jù)值,產(chǎn)生補(bǔ)碼. 3. 加"1"產(chǎn)生二進(jìn)制補(bǔ)碼. 發(fā)送8位LRC(2個(gè)ASCII字符)時(shí),先送高位字符,后送低位字符, 2.2 CRC 循環(huán)冗余校驗(yàn) 2.2.1 CRC校驗(yàn) RTU方式時(shí),采用CRC方法計(jì)算錯(cuò)誤校驗(yàn)碼,CRC校驗(yàn)傳送的全部數(shù)據(jù).它忽略信息中單個(gè)字符數(shù)據(jù)的奇偶校驗(yàn)方法. 循環(huán)冗余校驗(yàn)CRC區(qū)為2字節(jié),含一個(gè)16位二進(jìn)制數(shù)據(jù).由發(fā)送設(shè)備計(jì)算CRC值,并把計(jì)算值附在信息中,接收設(shè)備在接收信息時(shí),重新計(jì)算CRC值,并把計(jì)算值與接收的在CRC

8、區(qū)中實(shí)際值進(jìn)行比較,若兩者不相同,則產(chǎn)生一個(gè)錯(cuò)誤. CRC開始時(shí)先把寄存器的16位全部置成"1",然后把相鄰2個(gè)8位字節(jié)的數(shù)據(jù)放入當(dāng)前寄存器中,只有每個(gè)字符的8位數(shù)據(jù)用作產(chǎn)生CRC,起始位,停止位和奇偶校驗(yàn)位不加到CRC中. CRC校驗(yàn)時(shí),每個(gè)8位數(shù)據(jù)與該寄存器的內(nèi)容進(jìn)行異或運(yùn)算,然后向最低有效位(LSB)方向移位,用零填入最高有效位(MSB)后,再對(duì)LSB檢查,若LSB=1,則寄存器與預(yù)置的固定值異或,若LSB=0,不作異或運(yùn)算. 重復(fù)上述處理過程,直至移位8次,最后一次(第8次)移位后,下一個(gè)8位字節(jié)數(shù)據(jù)與寄存器的當(dāng)前值異或,再重復(fù)上述過程.全部處理完信息中的數(shù)據(jù)字節(jié)后

9、,最終得到的寄存器值為CRC值. CRC值附加到信息時(shí),低位在先,高位在后. 2.2.2產(chǎn)生CRC的過程: 1. 把16位CRC寄存器置成FFFFH. 2. 第一個(gè)8位數(shù)據(jù)與CRC寄存器低8位進(jìn)行異或運(yùn)算,把結(jié)果放入CRC寄存器. 3. CRC寄存器向右移一位,MSB填零,檢查L(zhǎng)SB. 4. (若LSB為0):重復(fù)3,再右移一位. (若LSB為1):CRC寄存器與Aool H 進(jìn)行異或運(yùn)算 5. 重復(fù)3和4直至完成8次移位,完成8位字節(jié)的處理. 6. 重復(fù)2至5步,處理下一個(gè)8位數(shù)據(jù),直至全部字節(jié)處理完畢. 7. CRC寄存器的最終值為CRC值. 8. 把CRC值放入信息時(shí),高8位和低8位應(yīng)分

10、開放置. 發(fā)送信息中的16位CRC值時(shí),先送低8位,后送高8位. 各種可能的CRC值,按兩列裝入,一列在16位CRC的高8位區(qū),為(0-256的)CRC值,另一類為低8位區(qū),為CRC的低位值.用這種方法得到的CRC其執(zhí)行速度快于計(jì)算緩沖器中每個(gè)新字符得到一個(gè)新CRC值的方法.且該功能內(nèi)部交換CRC中的高,低字節(jié),返回的CRC值中,其字節(jié)已交換.因此,由功能碼返回的CRC值,能直接放在信息中傳送. 2.3實(shí)現(xiàn)校驗(yàn)的程序 下面給出了程序中與本文相關(guān)的部分程序,其它部分可參考相關(guān)方面的資料. void CModbusProBaseObj : CheckCRC(BYTE *pInfo, int &am

11、p;nLen) BYTE *pData=pInfo;/為生成LRC值,把指針指向含有二進(jìn)制數(shù)據(jù)的緩沖器 int nCRCLoc=nLen;/緩存器中的字節(jié)數(shù) int m_nComMode=1; BYTE nRef1=0; BYTE nRef2=0; if(m_nComMode=1) / 16位CRC unsigned char uchCRCHi=0xff;/ 把16位CRC寄存器置成FFFFH unsigned char uchCRCLo=0xff; WORD uIndex; while(nLen>0) nLen- -; uIndex=uchCRCHi*(pInfo+); uchCRCH

12、i=uchCRCLoauchCRCHiuIndex; uchCRCLo=auchCRCLouIndex; pDatanCRCLoc=uchCRCHi; pDatanCRCLoc+1=uchCRCLo; nLen=nCRCLoc+2; else if(m_nComMode=0)/ASCII LRC BYTE uchLRC=0; while(nLen-) uchLRC+=*pInfo+;/1. 相加信息中的全部字節(jié),包括起始":"號(hào)和結(jié)束符CRLF. pDatanCRCLoc=(BYTE)(-(char)uchLRC);/并把結(jié)果送入8位數(shù)據(jù)區(qū),放棄進(jìn)位 / Transfer

13、to ASCII; char *szResult=(char *)malloc(2*(nCRCLoc+1)+2); szResult0=0x3A;信息開始 szResult1='0' for(int i=0; ichar szTemp2048; sprintf(szTemp, "%s%02x", szResult,pDatai); strcpy(szResult, szTemp); ; memcpy(pData, (BYTE*)szResult,2*(nCRCLoc+1)+1); /比較兩個(gè) nLen=(nCRCLoc+1)*2+1; pDatanLen=0

14、x0D;/信息結(jié)束 nLen+; pDatanLen=0x0A; nLen+; free(szResult); 3 結(jié)論 標(biāo)準(zhǔn)的Modbus串行通訊網(wǎng)絡(luò)采用兩種錯(cuò)誤校驗(yàn)方法,奇偶校驗(yàn)(奇或偶)可用于校驗(yàn)每一個(gè)字符,信息幀校驗(yàn)(LRC或CRC)適用整個(gè)信息的校驗(yàn),字符校驗(yàn)和信息幀校驗(yàn)均由主機(jī)設(shè)備產(chǎn)生,并在傳送前加到信息中去.從機(jī)設(shè)備在接收信息過程中校驗(yàn)每個(gè)字符和整個(gè)信息. Modbus協(xié)議根據(jù)傳輸方式的不同有兩種錯(cuò)誤檢測(cè)方法.當(dāng)選用ASCII模式時(shí),錯(cuò)誤檢測(cè)域包含兩個(gè)使用LRC(縱向冗長(zhǎng)校驗(yàn))方法對(duì)消息內(nèi)容(不包括開始的冒號(hào)符及回車換行符)計(jì)算得出ASCII字符.LRC字符附加在回車換行符前面.當(dāng)選用RTU模式作字符幀,錯(cuò)誤檢測(cè)域是對(duì)消息內(nèi)容用CRC16計(jì)算出的16Bits值(用兩個(gè)8位的字符來實(shí)現(xiàn)).CRC域附加在消息的最后,添加時(shí)先是低字節(jié)然后是高字節(jié),故CRC的高位字節(jié)是發(fā)送消息的最后一個(gè)字節(jié).這點(diǎn)在程序設(shè)計(jì)是很重要的,不然校驗(yàn)的結(jié)果雖然是正確的,但控制器卻認(rèn)為消息在發(fā)送過程中出了錯(cuò). 參考文獻(xiàn): 1Modicon modbus protocol reference guide. Modicon, INC, Industrial automation system. June,1996. 2Davis Chapman,Visual C+ 6

溫馨提示

  • 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. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論