教案-18第章rs485通信和modbus協(xié)議_第1頁
教案-18第章rs485通信和modbus協(xié)議_第2頁
教案-18第章rs485通信和modbus協(xié)議_第3頁
教案-18第章rs485通信和modbus協(xié)議_第4頁
教案-18第章rs485通信和modbus協(xié)議_第5頁
已閱讀5頁,還剩21頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

18RS485通信和Modbus協(xié)式進行。最初采用的方式是RS232接口,由于工業(yè)現(xiàn)場比較復雜,各RS232接口只能實現(xiàn)點對點通信,不具備聯(lián)網(wǎng)功能,最大傳輸距離也只能達到幾RS485則解決了這些問題,數(shù)據(jù)信號采用1200米,并且允許多個收發(fā)設備接到同一條總線上。隨著工業(yè)應用通信越來越多,1979年施Modbus協(xié)議,現(xiàn)在工業(yè)中使用RS485通信場合很多都采用Modbus協(xié)議本節(jié)課要講解一下RS485通信和Modbus協(xié)議。單單使用一塊KST-51開發(fā)板是不能夠進行RS485實驗的,應很多同學的要485通信模塊。RS485通RS485RS232RS2321、接口的信號電平值較高,達到十幾V,容易損壞接口電路的,而且TTL電平不兼容,因此和單片機電路接起來的話必須加轉(zhuǎn)換電路。2Kb/s傳輸容易產(chǎn)生干擾,并且性能也比較弱。451、在講A/D的時候,講過差分信號輸入的概念,同時也介紹了差分輸RS485ABD+和D-來表示。邏輯“1”以兩線之間的電壓差為+(0.2~6)V表示,邏輯“0”以兩線間的電壓差為-(0.2~6)V來表示,是一種典型的差分通信。2、RS48510Mb/s有的RS485來看,有可以掛32、64、128、256等不同個設備的驅(qū)動器。RS485的接口非常簡單RS232所使用的MAX232是類似的只需要一個RS485轉(zhuǎn)換器,就可以直接和單片機的UART串行接口連接起來,并且完UARTRS485RS485類的很多,這節(jié)課以MAX485為例講解RS485通信,如18-1圖18- MAX485硬件接。MAX485是美信()推出的一款常用RS485轉(zhuǎn)換器。其中5腳和8腳是電源引腳,67485AB14腳分別接到單片機的RXD和TXD引腳上,直接使用單片機UART進行數(shù)據(jù)接收和發(fā)送。而2腳和3腳就是方向引腳了,其中2腳是低電平使能,3腳是高電平使能輸出驅(qū)動器把這兩個引腳連到一起,平時不發(fā)送數(shù)據(jù)的時候,保持這兩個引腳是低電平,讓MAX485處于接收狀態(tài),當需要發(fā)送數(shù)據(jù)的時候,RS485的性能,需要在靠近MAX485的A和B引腳之間并接一個電阻,1001K都可以。。在這里還要介紹一下如何使用KST-51單片機開發(fā)板進行擴展實驗。的開發(fā)板只能把基本的功能給做出來提供實驗練習但是學習32個插針,這32個插針就是把單片機的32個IO引腳全部都引出來了。在原理圖上體現(xiàn)出來的就是的J4、J5、J6、J7這4個器件,如圖18-2所示。圖18- 單片機擴展接32個IO口不是所有的IOP3.2、P3.4、P3.6引腳,這三個引腳是不可用的。比如P3.2這個引腳,如果用來擴展,發(fā)送的信號如果和DS18B20DS18B203IO口29IO口,都可以使用杜邦線接上插針,擴展出來使用。當然了,IO口應用于擴展功能了,板子上的相應的功能就實現(xiàn)不了了,也,在進行RS485實驗中,通信用的引腳必須是P3.0和P3.1,此外還有一個方向控制引腳,使用杜邦線將其連接到P1.7上去。RS485的另外一端,大家可以使用一個USB轉(zhuǎn)485模塊絞線把開發(fā)板和模塊上的A和B分別對應連起來,USB那頭電腦,然后就可以進行通信了。,13章的實用串口通信的方法和程序后,做這種串口通信的方法就很簡單了基本是一致的使用實用串口通信的思路做了一個簡單的程序,485UartWrite()485方向引RITI就已經(jīng)置位并且馬上進入中斷(如果中斷使能的話)函數(shù)了,接收的時SBUF寫入一個字節(jié)數(shù)據(jù)時,UART硬件會在完成上一個停止位的發(fā)送后,再開始新字節(jié)的發(fā)送,485485重新處于接收狀態(tài)時就有問題了,因為這時候最后的UartWrite()函數(shù)內(nèi)DelayX10us(5)這個操作,這是人為的增加了延時50us,這50us的時間正好讓#include<reg52.h>#includesbitRS485_DIR=P1^7;//RS485==令 cntRxd= pdatabufRxd[40]; ConfigUART(unsignedint {RS485_DIR=0;//RS485設置為接收方向 =0x50; //配置串口為模式1 &=0x0F; //清零T1的控制位 |=0x20; //配置T1為模式2TH1=256-(11059200/12/32)/ TL1=TH1; ET1=0; //T1中斷 = TR1= } UartRead(unsignedchar *buf,unsigned charlen)//串口數(shù)據(jù)函數(shù),數(shù)據(jù)接收指針buf,數(shù)據(jù)長度len,返回值為實際到的數(shù)據(jù)長度{ charif >cntRxd)//長度大于接收到的數(shù)據(jù)長度時{len=cntRxd;//長度設置為實際接收到的數(shù)據(jù)長}for(i=0;i<len;i++){ =bufRxd[i];} = //返回實際長} DelayX10us(unsignedchar //延時函數(shù),延時時間{do}

}while(-- UartWrite(unsignedchar*buf,unsigned charlen)//串口數(shù)據(jù)寫入函數(shù),buflen{RS485_DIR= while(len {flagOnceTxd=0; =*buf;while} RS485_DIR=0; //RS485設置為接收} //串口驅(qū)動函數(shù),檢測接收到令并執(zhí)行相應動{ charlen; charbuf[30];if //有命令到達時,處理該命{}

=len=UartRead(buf,sizeof(buf)-2);//將接收到令 ='\r'; ='\n';UartWrite(buf,} UartRxMonitor(unsigned //串口接收函{ unsignedcharcntbkp =0; unsignedcharidletmr=if(cntRxd> //接收計數(shù)器大于零時,總線空閑時{

if(cntbkp!= {cntbkp=cntRxd;idletmr=0;

{

if(idletmr< {idletmr+=if >= 30ms}}}{

{cmdArrived=1;} =}} InterruptUART()interrupt {if {RI= if(cntRxd<sizeof(bufRxd)){bufRxd[cntRxd++]=SBUF;}}if {TI=0; flagOnceTxd=1; }} T0RH= T0RL= ConfigTimer0(unsignedintConfigUART(unsignedintUartRxMonitor(unsignedchar {EA= ConfigUART(9600);{}} ConfigTimer0(unsignedint { longtmp=11059200/12; tmp=(tmp*ms)/ tmp=65536- tmp=tmp+ =>>=TMOD&=0xF0;//清零T0的控制位TMOD|=0x01;T01TH0=T0RH;T0重載值TL0=T0RL;ET0= TR0= } InterruptTimer0()interrupt {TH0=T0RH; TL0=T0RL; }現(xiàn)在看這種串口程序是不是感覺很簡單了呢?串口通信程 反復雜的東西,現(xiàn)在就會感到簡單了。的程序模塊用的是COM4,而USB轉(zhuǎn)485虛擬的是COM5,通信的時候用的是COM5口,如圖18-3所示。圖18- RS485串行通Modbus通信協(xié)議介UART、I2C、SPI這些通信協(xié)議,都是最底層的協(xié)議,是“位”級別的協(xié)議。而在學3章實用串口通信程序的時候,通過串口發(fā)給單片機三條指令,讓單片機做了三件不同的事情,分別是"buzzon"、 off"、和"showstr"。隨著系統(tǒng)復雜性的增們希望可以實現(xiàn)更多的指令。而指令越來越多,帶來的就是非常雜亂無章,尤其是這個人喜歡 off"而另外一個人喜歡寫成"onbuzz""off 導致不同開發(fā)寫出來的代碼指令不兼容不同廠家的產(chǎn)品不能掛到一條總線UART、I2C、SPI通信協(xié)議不同的是,這種通信協(xié)議是字節(jié)級別的,叫做應用層Modbus協(xié)議。Modbus協(xié)議特Modbus業(yè)標準。有了它,不同廠商生產(chǎn)的控制設備可以連成工業(yè)網(wǎng)絡,進行集中。絡進行通信的。它描述了控制器請求其他設備的過程,如何回應來自其他設在進行多機通信的時候,Modbus協(xié)議規(guī)定每個控制器必須要知道他們的設備地Modbus協(xié)議發(fā)出。Modbus(PLC、人機界面、控制面板、驅(qū)動程序、輸入輸出設備)都能使用Modbus協(xié)議來啟動操作一些網(wǎng)關(guān)允許在幾種使用Modbus協(xié)議的總線或網(wǎng)絡之間的通信如圖18-418-4Modbus,Modbus協(xié)議的整體架構(gòu)和格式比較復雜和龐大,在的課程里重點,1.2.2RTU協(xié)議幀數(shù)Modbus有兩種通信傳輸方式,一種是ASCII模式,一種是RTU模式。由于ASCII模式的數(shù)據(jù)字節(jié)是7bit數(shù)據(jù)位,51單片機無法實現(xiàn),而且應用也相對較一條典型的RTU數(shù)據(jù)幀如圖18-5所示。18-5RTU,和實用串口通信程序類似一次發(fā)送的數(shù)據(jù)幀必須是作為續(xù)的數(shù)據(jù)流進行傳輸。在實用串口通信程序中采用的方法是定義30ms,如果Modbus的RTU模式規(guī)定不同數(shù)據(jù)幀之間的間隔是3.5個字節(jié)通信時間以一幀數(shù)據(jù)的延續(xù)。這將會導致一個錯誤,因此大家看RTU數(shù)據(jù)幀最后還有16bitCRC校驗。,起始位和結(jié)束符:圖18-5上代表的是一個數(shù)據(jù)幀,前后都至少有3.5個字節(jié)3.5個字節(jié)以上的時間,而真正有意義的第一個字節(jié)是設備地址。如果地址是0x00,則認為是一個廣播命令,就是所有的從機設備都要執(zhí)行的指功能代碼:在第二個字節(jié)功能代碼字節(jié)中,Modbus規(guī)定了部分功能代碼,去,甚至都不用去看,直到你有用到的那天再過來查這個表格即可,如表18-1所示。18-1Modbus取得一組邏輯線圈的當前狀態(tài)取得一組開關(guān)輸入的當前狀態(tài)取得8個線圈的通斷狀態(tài)這8短報文適宜于迅速狀回送校把校驗報文送從機,以對通信處PC輯任務,僅在含有功能碼9ModBus事務 484 可使主機模擬編程器功能修改PC 484定期控詢該從機是否已完成其程序操MICROPC輯通用參數(shù)顯示擴展器文件中的數(shù)據(jù)信寫入通用參數(shù)把通用參數(shù)寫入擴展文件,或修留作作數(shù)據(jù):跟在功能代碼后邊的是n8bit的數(shù)據(jù)。這個n值的到底是多少,是能碼是0x03,也就是讀保持寄存器,那么主機發(fā)送數(shù)據(jù)n2N*n的組成部2N*2N*18-6所示。18-6接收到數(shù)據(jù)后同樣會把前邊的字節(jié)進行CRC計算計算完了再和發(fā)過來的CRC2個停止位(無校驗位時)。Modbus多機通信例手,比較方便的下發(fā)多個字節(jié)的數(shù)據(jù),如圖18-7所示。先來就圖中的設置18-7ModbusUSB485COM59600,無校驗位,8位,11。寫寄存器的時候,如果要把01寫到一個地址是0000的寄存器地址里,點一下“寫入”,就會出現(xiàn)發(fā)送指令:010600000001480A。來分析一下0000表示的是要寫入的寄存器的地址,0001就是要寫入的數(shù)據(jù),480A就是CRC這是自動算出來了而根據(jù)Modbus協(xié)議當寫寄存器的時候,從機成功完成該指令的操作后,會把主機發(fā)送的指令直接返回的調(diào)試精靈會接收到這樣一幀數(shù)據(jù):010600000001480A。,假如現(xiàn)在要從寄存器地址0002開始寄存器,并且的數(shù)量是2個。點一下“讀出”,就會出現(xiàn)發(fā)送指令:01030002000265CB01是設備地址,03是功能碼,代表寫寄存器這個功能,0002就是讀寄存器的起始地到的數(shù)據(jù)是:01030400000000FA3301是設備地址,0300的寄存器的數(shù)據(jù),而FA33就是CRC校驗了似乎越來越了,所謂的Modbus這種通信協(xié)議,無非就是主機下發(fā)了不Modbus功能碼那么多相應的功能在程序中定義了一個數(shù)組regGroup[5],相當于5個寄存器,此外又定義了第6個寄存器,控制蜂鳴器,通過下發(fā)不同的。就是數(shù)組regGroup對應的值。其中地址0x00000x0004對應的就是regGroup數(shù)組中的元素,寫入的同時把數(shù)字又顯示到的LCD1602液晶上,而0x00050x00,蜂鳴器就不響,寫入任何其他數(shù)字,蜂鳴器就報警單片機的主要工作也就是解析串口接收的數(shù)據(jù)執(zhí)行不同操作,也就是主RS485.C這個文件中了。#include<reg52.h>#includesbitRS485_DIR=P1^7;//RS485bitflagOnceTxd= bitcmdArrived= //命令到達標志,即接收到上位機下發(fā) cntRxd= pdatabufRxd[40]; bit LcdShowStr(unsignedchar x,unsigned chary,constunsignedchar intGetCRC16(unsigned unsigned ConfigUART(unsignedint {RS485_DIR=0;//RS485設置為接收方向 =0x50; //配置串口為模式1 &=0x0F; //清零T1的控制位 |=0x20; //配置T1為模式2TH1=256-(11059200/12/32)/ TL1=TH1; ET1=0; //T1中斷 = TR1= } UartRead(unsignedchar *buf,unsigned charlen)//串口數(shù)據(jù)函數(shù),數(shù)據(jù)接收指針buf,數(shù)據(jù)長度len,返回值為實際到的數(shù)據(jù)長度{ charif >cntRxd)//長度大于接收到的數(shù)據(jù)長度時{len=cntRxd;//長度設置為實際接收到的數(shù)據(jù)長}for(i=0;i<len;i++){ =bufRxd[i];} = //返回實際長} DelayX10us(unsignedchar //延時函數(shù),延時時間{do}while(--} UartWrite(unsignedchar*buf,unsigned charlen)//串口數(shù)據(jù)寫入函數(shù),buflen{RS485_DIR= while(len {flagOnceTxd=0; =*buf;while} RS485_DIR=0; //RS485設置為接收} //串口驅(qū)動函數(shù),檢測接收到令并執(zhí)行相應動{ charcrch,crcl;if //有命令到達時,處理該命{

=len=UartRead(buf,sizeof(buf));//將接收到令到if(buf[0]== {crc=GetCRC16(buf,len-2);CRCcrch=crc>>8;crcl=crc&0xFF;if((buf[len-2]==crch)&&(buf[len-1]==)CRC{

{ //一個或連續(xù)的寄存if((buf[2]==0x00)&&(buf[3]<=0x05)) 0x0000~0x0005{if(buf[3]<={i=cnt//提取待的寄存器數(shù)=//數(shù)據(jù)的字節(jié)數(shù),為寄存器數(shù)*2,因Modbus定義的寄存器為16len{++]= ++]=regGroup[i++];

}}

//地址0x05{//數(shù)據(jù)的字節(jié);

=2; = =

}}

len=功能碼最置

{buf[1]=0x83; buf[2]= len=3;} if((buf[2]==0x00)&&(buf[3]<=0x05)) 0x0000~0x0005{if(buf[3]<={ >>4;//顯示到液晶上=cnt-0xA+=cnt+'0'; &0x0F;

i=buf[3];regGroup[i]=cnt=regGrouif >=cnt=regGrouif >==cnt-0xA+=cnt+

;0,

='\0'} }

//地址0x05{ }len-=2;-功能碼最置

{buf[1]= buf[2]=0x02; len=3;}

|=0x80; = //設置len=3;}crc=GetCRC16(buf,len);//計算CRC校驗值 =crc>>8; //CRC高字節(jié) =crc&0xFF; //CRC低字節(jié) }}}} UartRxMonitor(unsigned //串口接收函{ unsignedcharcntbkp =0; unsignedcharidletmr=if(cntRxd> //接收計數(shù)器大于零時,總線空閑時{

if(cntbkp!= {cntbkp=cntRxd;idletmr=0;

{

if(idletmr< {idletmr+=if >= //空閑時間超過4{}}}}{

cmdArrived=1; =}} InterruptUART()interrupt {if {RI= if(cntRxd<sizeof(bufRxd)){bufRxd[cntRxd++]=SBUF;}}if {TI=0; flagOnceTxd=1; }} #define sbitLCD1602_RS=P1^0;sbitLCD1602_RW=P1^1;sbitLCD1602_E={ =={=LCD1602_E=sta=LCD1602_DB;//狀態(tài)}while(sta=0} {=====} LcdWriteDat(unsignedchar {=====} LcdShowStr(unsignedcharx, y,constunsigned { charif(y== =0x00+x;0x00

=0x40+x;0x40LcdWriteCmd(addr|0x80);while(*str!= 符{}} {

溫馨提示

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

評論

0/150

提交評論