第三章Modbus協(xié)議與現場總線-1_第1頁
第三章Modbus協(xié)議與現場總線-1_第2頁
第三章Modbus協(xié)議與現場總線-1_第3頁
第三章Modbus協(xié)議與現場總線-1_第4頁
第三章Modbus協(xié)議與現場總線-1_第5頁
已閱讀5頁,還剩30頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第三章Modbus協(xié)議與現場總線-1第一頁,共35頁。Modbus在OSI模型中所使用的層第二頁,共35頁。3.1.1Modbus協(xié)議的物理層

1.網絡結構

總線式主從結構主設備:PC機,PLC從設備:PLC,智能儀表一個主站可有1—253個從站,從站之間不能相互通訊。

2.通訊方式

(a)一對一:主設備可以和從設備通訊,從設備響應。(b)一對N(廣播):主設備對N個從設備,從設備無響應。0地址表示廣播地址。

3.物理層

支持RS-485、RS-232C。

第三頁,共35頁。CRLF0D0A

COLON3A3.1.2Modbus協(xié)議的幀格式Modbus有兩種格式:ASCII格式;RTU格式1.ASCII碼幀格式(用ASCII表示數據)(1).字節(jié)格式(2).數據表示方法地址:21表示ASCII碼32H,31H(:)第四頁,共35頁。(2)說明:a.地址域:從設備地址0-253,地址0為廣播地址。b.功能域:代碼范圍1-255,命令從設備執(zhí)行哪些功能(如讀測量值,讀開關量狀態(tài))c.數據域:(兩部分內容)主設備到從設備:變量起始地址、變量個數。從設備到主設備:字節(jié)數n、數據n。

d.檢錯:CRC-16,生成多項式Y=X^16+X^15+X^2+1。

2.RTU格式(用二進制數表示數據)(1)RTU幀格式第五頁,共35頁。3.1.3ModBus功能碼

1.Modbus功能碼第六頁,共35頁。2.功能碼3:讀取在一個或多個保持寄存器中取得當前的二進制值該功能碼主要用于讀取設備參數例:主機命令:讀6BH開始的3個寄存器內容從機響應:回傳6個字節(jié)數據說明(1)應用層:寄存器中存儲的內容用戶定義。(2)寄存器地址與寄存器:寄存器號減1為寄存器地址

第七頁,共35頁。3.功能碼4:讀取一個或多個輸入寄存器值主要用于讀取設備測量數據從寄存器8開始讀一個寄存器值第八頁,共35頁。4.功能6:寫單個寄存器例:從寄存器地址1開始,寫一個寄存器值03寄存器地址:0001H寄存器:0002H第九頁,共35頁。5.功能碼16:寫多個寄存器主機從01H地址開始寫2個寄存器從機響應主機第十頁,共35頁。3.1.4應用舉例

題:有某地址為1的從設備,其變量定義如下:

例1:主設備用3號命令尋址地址為1的從設備,讀取寄存器地址為0000H的量程.

主設備命令幀從設備響應幀變量定義主機請求從機響應量程(參數)寄存器地址0000H測量值0002H字節(jié)數2byte

2byte主從地址功能碼變量地址高變量數高CRC校驗01H03H00H00H變量數低地址功能碼01H03H字節(jié)數02H數據103HCRC校驗**流量=3E8H=1000變量地址低00H01H**數據2E8H第十一頁,共35頁。例2:主設備用4號命令尋址地為1的從設備,讀取地址為0002H的測量值

01H04H0002H0001H##地址功能碼變量地址變量數CRC校驗地址功能碼字節(jié)數數據1數據2CRCCRC01H04H02H03H20H****

從設備響應主設備命令幀測量值=320H=800問題:測量值有小數和正負怎么辦?第十二頁,共35頁。3.1.5CRC-16校驗

1.說明:

(1)CRC校驗=地址碼+功能碼+數據(2)生成多項式G(x)=X^16+X^15+X^2+1(11000000000000101)(3)生成多項式最高位總是1,所以實際中的生成多項式為1000000000000101(4)Modbus采用逆序生成多項式1010000000000001(5)CRC本質:移位異,是1與生成多項式或和

第十三頁,共35頁。2:CRC方法0211第十四頁,共35頁。07第十五頁,共35頁。3.CRC計算程序(標準程序)數據指針數據長度CRC低位表CRC高位表第十六頁,共35頁。auchCRCHi[0xFD]auchCRCHi[0x39]第十七頁,共35頁。auchCRCLo[0xFD]auchCRCLo[0x39]第十八頁,共35頁。CRCLo111111111ST00000010XORuIndex11111101auchCRCHi[0xFD]=0xC1uchCRCHi11111111XOR11000001uchCRCLo00111110uchCRCHi=auchCRCLo[0xFD]100000012ST00000111uchCRCLo00111110XOR

uIndex00111001auchCRCH[0x39]=0xC0uchCRCHi100000001110000000XORuchCRCLo010000001

uchCRCHi=auchCRCLo[0x39]=0x12結果0x1241例:x[2]={0x02,0x07};CRC_n=CRC16(x,2);第十九頁,共35頁。壓3.2Modbus協(xié)議通訊從站軟件設計(1).主站使用Modbus04號命令采集從站測量數據(2).寄存器應用層定義3.2.1從站軟件設計要求寄存器內容壓力溫度液位流量2000HModbus寄存器實際設計考慮問題(1).Modbus命令幀結束判定方法,(2).幀間隔控制方法(3)如何解決通訊數據串位及數據殘缺等異常情況對通訊的影響.3.2.2從站軟件設計內容2004H2008H200CH寄存器地址1.接收數據(1)串口接收數據(2)根據主站MODUBS命令讀寄存器。(2)發(fā)送數據將所讀寄存器發(fā)送出去主站一次可能讀一個寄存器,也可能讀多個寄存器。第二十頁,共35頁。3.2.3從站接收命令幀方法(1).設置一個定時器,定時3.5char時間(2).每接收一個數據,啟動定時器定時.(3).定時時間到,說明在3.5char時間里沒有通訊數據,表明幀結束,在定時中斷服務程序中處理Modbus命令.定時中斷幀結束,讀命令回答數據啟動定時器3.5char地址功能碼變量地址變量數CRC校驗主站發(fā)給從站讀寄存器命令8byte,從站3.5char后回答數據如何確定MODBUS幀結束?第二十一頁,共35頁。幀間隔3.5char定時方法ICR1(觸發(fā)寄存器)計數器PWM輸出第二十二頁,共35頁。3.2.4從站程序設計(AVRMEGA64CPU)voidmain(void){unsignedchari=0;unsignedlongnum=0;OutSet1480;/*R485接收方向*/Set1480Rxd;Delays(100);_CLI();/*關中斷UartInit();/*UART初始化TimeDelay=OscF*10/BaudRate0;/*根據波特率設置定時時間*/TCCR1B=(1<<CS11)|(1<<WGM12)|(1<<WGM13);/*設置3.5char定時器*/TIM16_WriteTCNT1(0x0000);/*清計數器TIM16_WriteICR1(TimeDelay);/*設計數觸發(fā)值

_SEI();/*開中斷WDTCR=(1<<WDCE)|(1<<WDE);/*看門狗允許*/WDTCR=(1<<WDP2)|(1<<WDP1)|(1<<WDP0);/*看門狗2.2秒復位*/WDTCR=(1<<WDCE)|(1<<WDE);OpenINT0();while(1){num++;......./*處理數據采集等功能*/if(num>=1000)/*若沒有通訊,則定時初始化串口*/{num=0;/*防止通訊死機*/CloseINT0();/*關通訊中斷*/UartInit();/*初始化串口*/OutSet1480;/*設置I/O口為輸出方向*/Set1480Rxd;/*設置RS485接收方向控制*/OpenINT0();/*開通訊中斷*/}}}(1).主程序第二十三頁,共35頁。voidUartInit(void){/*設置通訊波特率*/UBRR0L=(OscF/16/(BaudRate0+1))%256;UBRR0H=(OscF/16/(BaudRate0+1))/256;/*Uart0發(fā)送和接收引腳使能*/UCSR0B=(1<<RXEN0)|(1<<TXEN0);/*設置幀格式:8個數據位,1個停止位*/UCSR0C=(1<<URSEL0)|(1<<UCSZ01)|(1<<UCSZ00);UCSR0A=(1<<RXC0)|(1<<TXC0)|(1<<UDRE0)|(1<<FE0);}#pragmainterrupt_handlerusart0:iv_USART0_RXCvoidusart0(void){unsignedcharcombuf;combuf=UDR0;/*讀通訊數據*/TIM16_WriteTCNT1(0x0000);/*清定時時間常數*/TIM16_WriteICR1(TimeDelay);/*設置定時3.5char時間常數*/TIFR|=(1<<ICF1);/*定時記數器加,上限捕捉*/TIMSK|=(1<<TICIE1);/*啟動定時中斷*/ReciveBuff_485[ReceiveNum_485++]=combuf;/*存儲通訊數據*/}(2).串口初始化(3).UART0中斷接收(只接收一個字節(jié)數據)第二十四頁,共35頁。#pragmainterrupt_handlertimedelay:iv_TIMER1_CAPTvoidtimedelay(void){unsignedinti,x;unsignedintlen;unsignedintstart;unsignedintCheckSum;unsignedintbuff[2];if(ReceiveNum_485==8){TIMSK&=~(1<<TICIE1);ReceiveNum_485=0;if(ReciveBuff_485[0]!=Address)return;/*非本站地址返回*/if(ReciveBuff_485[1]!=0x04)return;/*非04命令返回*/CheckSum=CRC16(ReciveBuff_485,6);/*計算接收命令的CRC*/CRC16Value.OTT[1]=ReciveBuff_485[6];/*CRC16Value.OTT[0]=ReciveBuff_485[7];if(CheckSum!=CRC16Value.TTO)return;/*CRC錯返回*/len=ReciveBuff_485[4]*256+ReciveBuff_485[5];/*寄存器長度*/buff[0]=ReciveBuff_485[2];buff[1]=ReciveBuff_485[3];start=buff[0]*256+buff[1];/*寄存器啟始地址*/start=start*2;/*BYTE地址*/(D).定時3.5char中斷服務,幀結束unionIntToChar{U8OTT[2];U16TTO;};第二十五頁,共35頁。SendBuff_485[0]=Address;SendBuff_485[1]=0x04;SendBuff_485[2]=len*2;/*字節(jié)數*/for(i=0;i<(len*2);i++){x=start+i;SendBuff_485[3+i]=LMAG_Cache[x];/*取數據*/}CheckSum=CRC16(SendBuff_485,(len*2)+3);/*計算CRC*/CRC16Value.TTO=CheckSum;SendBuff_485[(len*2)+3]=CRC16Value.OTT[1];SendBuff_485[(len*2)+4]=CRC16Value.OTT[0];SendLen_485=(len*2)+5;/*發(fā)送字節(jié)長度*/SendNum_485=0;UCSR0A|=(1<<TXC0);/*設置發(fā)送完成中斷*/UCSR0A|=(1<<UDRE0);/*設置發(fā)送寄存器空中斷*/UCSR0B|=(1<<UDRIE0);/*允許發(fā)送寄存器空中斷*/}ReceiveNum_485=0;TIMSK&=~(1<<TICIE1);/*關閉3.5char定時中斷*/}第二十六頁,共35頁。#pragmainterrupt_handlersend0:iv_USART0_UDRE/*發(fā)送寄存器空中斷服務*/voidsend0(void){Set1480Txd;/*RS485發(fā)送方向控制*/UDR0=SendBuff_485[SendNum_485++];/*發(fā)送數據*/if(SendNum_485==SendLen_485)/*發(fā)送數據結束*/{UCSR0B&=~(1<<UDRIE0);/*發(fā)送寄存器空中斷關閉*/UCSR0B|=(1<<TXCIE0);/*發(fā)送完成中斷打開*/}}#pragmainterrupt_handlersendover:iv_USART0_TXC/*發(fā)送完成中斷服務*/voidsendover(void){UCSR0B&=~(1<<TXCIE0);/*關閉發(fā)送完成中斷*/Set1480Rxd;/*改變通訊方向為接收*/}(4).中斷發(fā)送數據(F).發(fā)送結束,通訊轉為接收第二十七頁,共35頁。unsignedintCRC16(unsignedchar*puchMsg,unsignedintusDataLen){unsignedcharuchCRCHi=0xFF;/*高CRC字節(jié)初始化*/unsignedcharuchCRCLo=0xFF;/*低CRC字節(jié)初始化*/unsignedcharuIndex;/*CRC循環(huán)中的索引*/while(usDataLen--){uIndex=uchCRCHi^*puchMsg++;/*計算CRC*/uchCRCHi=uchCRCLo^auchCRCHi[uIndex];uchCRCLo=auchCRCLo[uIndex];}return(uchCRCHi<<8|uchCRCLo);}(5).CRC校驗第二十八頁,共35頁。3.2.5ARM下的Modbus幀間隔處理方法NXPLPC2478ARM7TDI核(208腳)1.UART特性(16c550)16字節(jié)收發(fā)FIFO接收器FIFO觸發(fā)點可為1、4、8、14字節(jié)接收到有效字符中斷達到FIFO觸發(fā)點中斷具有3.5CHAR超時中斷2.Modbus從站幀接收方法:(1)上位機發(fā)送命令幀8byte(2)下位機接收FIFO觸發(fā)點設為14(3)當下位機接收到8byte后,超過3.5char產生超時中斷.(4)在超時中斷處理中接收FIFO數據,并發(fā)送響應幀第二十九頁,共35頁。3.相關UART寄存器(1)中斷使能寄存器第三十頁,共35頁。(2)

溫馨提示

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

評論

0/150

提交評論