隨著微電子技術(shù)和計算機(jī)技術(shù)的進(jìn)步,可編程控制器以其可靠性高、抗干擾強(qiáng)、開發(fā)周期短,已經(jīng)成為一種較為普及的、">

首頁 > 專家說

畢業(yè)論文 基于modbus的plc與上位機(jī)的通信

來源:新能源網(wǎng)
時間:2024-08-17 10:20:32
熱度:

畢業(yè)論文 基于modbus的plc與上位機(jī)的通信【專家解說】:1 引言
隨著微電子技術(shù)和計算機(jī)技術(shù)的進(jìn)步,可編程控制器以其可靠性高、抗干擾強(qiáng)、開發(fā)周期短,已經(jīng)成為一種較為普及的、

【專家解說】:1  引言 隨著微電子技術(shù)和計算機(jī)技術(shù)的進(jìn)步,可編程控制器以其可靠性高、抗干擾強(qiáng)、開發(fā)周期短,已經(jīng)成為一種較為普及的、適應(yīng)多種應(yīng)用環(huán)境的工業(yè)控制器?,F(xiàn)已從最初的簡單順序控制、邏輯控制發(fā)展到可進(jìn)行模擬量控制、位置控制,特別是PLC與PLC、PLC與計算機(jī)通信功能的實現(xiàn),可組成多級控制系統(tǒng),形成工廠自動化網(wǎng)絡(luò)。PLC可以多種方式如直接采用現(xiàn)有的組態(tài)監(jiān)控軟件與上位監(jiān)控機(jī)通信,但針對小規(guī)模的控制系統(tǒng),找到一種高性價比的通信方法,具有積極的實際意義。本文就是討論如何利用Modbus通信協(xié)議來實現(xiàn)施耐德電器公司的NanoPLC與上位監(jiān)控PC機(jī)的通信。2  硬件描述及串口設(shè)置 2.1 接口電路設(shè)計 PLC與PC間實現(xiàn)通信,可使二者互補(bǔ)功能上的不足,PLC用于控制方面既方便又可靠,而PC機(jī)在圖形顯示、數(shù)據(jù)處理、打印報表以及中文顯示等方面有很強(qiáng)的功能。因此,各PLC制造廠家紛紛開發(fā)了適用于本公司的各種型號PLC機(jī)通信的接口模塊,不同的通信方式,有著不同的成本價格和不同的適用范圍。NanoPLC的CPU單元本身帶有1個RS-485擴(kuò)展口,可不配備專用通訊模塊,而通過此接口與上位機(jī)進(jìn)行串行通信。在此介紹一種通過PLC的RS485擴(kuò)展口與PC機(jī)的RS-232串行口進(jìn)行通信的方法。 由于NanoPLC的擴(kuò)展口采用RS-485標(biāo)準(zhǔn),RS485是RS422的變型。RS422為全雙工,可同時發(fā)送與接收;RS485則為半雙工,在某一時刻,1個發(fā)送另1個接收。RS485是一種多發(fā)送器的電路標(biāo)準(zhǔn),允許雙導(dǎo)線上1個發(fā)送器驅(qū)動32個負(fù)載設(shè)備,負(fù)載設(shè)備可以是被動發(fā)送器、接收器或收發(fā)器。而計算機(jī)的串行口采用RS-232標(biāo)準(zhǔn)。因此,作為實現(xiàn)PLC與計算機(jī)通信的接口電路,必須將RS-485標(biāo)準(zhǔn)轉(zhuǎn)換成RS-232標(biāo)準(zhǔn)。我們利用SC-485轉(zhuǎn)換器實現(xiàn)RS485與RS232之間的轉(zhuǎn)換。轉(zhuǎn)換電路如圖1所示。圖1   RS485與RS232轉(zhuǎn)換電路圖2.2  PLC串行口設(shè)置 施耐德的NanoPLC對通信參數(shù)的設(shè)置通過設(shè)置擴(kuò)展口來實現(xiàn),系統(tǒng)采用PC 機(jī)作為Modbus通信網(wǎng)絡(luò)主站,NanoPLC作為從站。通信格式設(shè)置如下:波特率4800bps,圖2   PLC串行口設(shè)置8位數(shù)據(jù)位,1位停止位,無奇偶校驗。如圖2所示。 2.3 PC機(jī)的串口初始化 在微機(jī)數(shù)據(jù)通信中,經(jīng)常使用大規(guī)模集成串行接口電路芯片,它們的種類和型號很多,如UART、USRT、USART等。能完成異步通信的硬件電路稱為UART。作為可編程的異步串行通信芯片UART,應(yīng)根據(jù)協(xié)議的要求對其初始化??删幊檀挟惒酵ㄐ趴刂破?250是IBM PC串行通信控制器I/O接口電路的核心,通過對8250的編程,可以控制串行數(shù)據(jù)傳送格式和速度。PC機(jī)有2個串行通信接口COM1和COM2。若選COM1,則8250各寄存器地址為3F8H~3FEH;選COM2,則8250各寄存器地址為2F8H~2FEH。這里介紹用Tubro C直接對PC機(jī)中的UART 8250中各寄存器進(jìn)行初始化。本例采用COM2口,初始化如下: outportb(0x2fb,0x80);   outportb(0x2f8,0x18); outportb(0x2f9,0x0); outportb(0x2fb,0x1b);   outportb(0x2f9,0x0); outportb(0x2fc,0x3);3  軟件描述 3.1系統(tǒng)通信協(xié)議 NanoPLC采用Modbus通信協(xié)議。任何根據(jù)此通信協(xié)議進(jìn)行通信的主、從機(jī)之間進(jìn)行數(shù)據(jù)信息交換時,信息格式都必須遵守通信協(xié)議所規(guī)定的格式。Modbus的數(shù)據(jù)交換模式有2種,1種為ASCII編碼制,1種為RTU編碼制。本例采用RTU碼傳輸模式,它包括一些特殊標(biāo)志碼、PLC站號、呼叫字和校驗碼等,其數(shù)據(jù)幀格式如附表。(1) 幀開始:數(shù)據(jù)幀以至少3.5個字符間隔時間(T1-T2-T3-T4)標(biāo)志開始和結(jié)束。整個信息幀必須以連續(xù)的信號進(jìn)行傳輸,從而保證CRC的校驗正確。 (2) 從站地址:1個字節(jié)。各從站識別碼,站號取值范圍01H-F7H,共有247種不同站。但Nano系列PLC通訊網(wǎng)絡(luò)最多允許32個從站。 (3) 功能號:1個字節(jié)。表示主站對從站的各種操作工作,主機(jī)發(fā)功能號給從機(jī),如果從機(jī)響應(yīng)正常,則回送相同的功能碼;如有錯誤發(fā)生,則將原功能碼符號位置“1”后回送,并將錯誤代碼寫入數(shù)據(jù)區(qū)回送。各功能號具體功能如下: 01或02:讀n個內(nèi)部位%Mi 03或04:讀n個內(nèi)部字%Mwi 05:寫1個內(nèi)部位%Mi 06:寫1個內(nèi)部字%Mwi 15:寫n個內(nèi)部位% Mi 16:寫n個內(nèi)部字%Mwi (4) 數(shù)據(jù)區(qū):數(shù)據(jù)區(qū)由一串2位16進(jìn)制數(shù)據(jù)組成,從00-FFH。如果通信正確,數(shù)據(jù)區(qū)存放PLC回應(yīng)上位機(jī)的信息;如發(fā)送數(shù)據(jù)有誤,則返回異常代碼。 NanoPLC處理的2種異常代碼: *01:功能未知(PLC不支持的請求) 如發(fā)送: 01H 16H 00H 00H FFH 00H 09H F9H   返回: 01H 96H 01H 8EH 60H *03:無效數(shù)據(jù)(位或字的數(shù)據(jù)錯誤,如寫位時數(shù)據(jù)既非16#FF00,又非16#0000) 如發(fā)送:01H 05H 00H 00H 03H 06H 4DH 38H   返回:01H 85H 03H 02H 91H (5) 校驗碼:2個字節(jié)。采用CRC循環(huán)冗余碼。它的基本原理是將一段信息看成一個很長的二進(jìn)制數(shù),然后用一個特定的數(shù)(如11021H)去除它,最后將余數(shù)作為校驗碼附在信息代碼之后一起傳送(或存儲),在進(jìn)行接收(或讀出)時進(jìn)行同樣的處理,如有差錯就可發(fā)現(xiàn)。需特別注意的是,如果發(fā)送信息中的CRC校驗碼計算錯誤,則通信不能成功。3  按通信協(xié)議編程 根據(jù)Modbus通信協(xié)議,主、從機(jī)之間的通信過程應(yīng)為:先由PC機(jī)(主站)按協(xié)議格式發(fā)出命令幀,PLC(從站)用響應(yīng)幀應(yīng)答,PC機(jī)接收響應(yīng)幀并對其內(nèi)容作出判斷、處理。 3.1 命令幀的形成 (1) 讀PLC1個內(nèi)部位(以%M70為例)3.2 通信過程 采用Tubro C編寫主機(jī)與PLC的通信程序。首先必須對COM2口進(jìn)行初始化,前面已經(jīng)述及。PC機(jī)通過串行接口與PLC進(jìn)行通信時,首先由PC機(jī)發(fā)出命令幀給PLC(發(fā)送過程),然后PLC將立即作出響應(yīng),PC機(jī)同時接收響應(yīng)幀(接收過程),所有的通信均由PC機(jī)來啟動和接收,PLC方無需編制通信程序。所以在PC機(jī)的通信應(yīng)用程序中,在需要與PLC交換數(shù)據(jù)時,先調(diào)用發(fā)送命令幀子程序,隨后調(diào)用接收響應(yīng)幀子程序,并對響應(yīng)幀進(jìn)行處理。將8250各寄存器初始化后,就可以通過讀取并判斷狀態(tài)寄存器(2FDH)中的D5位(發(fā)送保持寄存器空)是否為1,來決定是否將要發(fā)送的數(shù)據(jù)寫入發(fā)送保持寄存器(2F8H),發(fā)送數(shù)據(jù)的子程序流程圖如圖3所示,為了避免PC機(jī)出現(xiàn)死循環(huán),在進(jìn)入循環(huán)之前,先讀取一個時間T1,進(jìn)入循環(huán)后,每循環(huán)一次讀一次當(dāng)時的時間T2,并判斷此T2與T1兩時間的差,如超過2s,則不再讀取狀態(tài),而顯示超時出錯并退出。在接收數(shù)據(jù)子程序中,通過讀取并判斷狀態(tài)寄存器(2FDH)中的D0位(接收數(shù)據(jù)就緒)是否為1,來決定是否從接收數(shù)據(jù)寄存器(2F8H)讀取一幀接收的數(shù)據(jù)。同樣,為了避免出現(xiàn)死循環(huán),設(shè)置了超時出錯處理,接收數(shù)據(jù)子程序的流程圖如圖4所示。圖3   發(fā)送數(shù)據(jù)子程序的流程圖    圖4   接收數(shù)據(jù)子程序的流程圖PC機(jī)發(fā)送1幀數(shù)據(jù)的C語言子程序(子函數(shù))如下: unsigned char fasong(char data )   {     T1=time(NULL);       While(1)         {T2=time(NULL);         if(difftime(T2-T1)>=2.00)            {              printf("over time in fasong( ) ");              exit(0);             }          st=inportb(0x2fd);          if((st&0x20)!=0)            {              outportb(0x2f8,data);              break;             }          else continue;         }    }   PC機(jī)接收1幀數(shù)據(jù)C語言子程序(子函數(shù))如下:     unsigned char jieshou(char data )   {     T1=time(NULL);       While(1)         {T2=time(NULL);         if(difftime(T2-T1)>=2.00)            {              printf("over time in jieshou( ) ");              exit(0);             }          st=inportb(0x2fd);          if((st&0x01)!=0)            {              head=inportb(0x2f8);              break;             }          }      return(head);    }                  4  結(jié)束語 用以上方法設(shè)計的通信軟件在現(xiàn)場控制系統(tǒng)已經(jīng)得到了可靠運(yùn)行,顯示出較好的實用性。