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

下載本文檔

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

文檔簡(jiǎn)介

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

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

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

=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{

{ //一個(gè)或連續(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; = //設(shè)置len=3;}crc=GetCRC16(buf,len);//計(jì)算CRC校驗(yàn)值 =crc>>8; //CRC高字節(jié) =crc&0xFF; //CRC低字節(jié) }}}} UartRxMonitor(unsigned //串口接收函{ unsignedcharcntbkp =0; unsignedcharidletmr=if(cntRxd> //接收計(jì)數(shù)器大于零時(shí),總線空閑時(shí){

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

{

if(idletmr< {idletmr+=if >= //空閑時(shí)間超過(guò)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. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論