版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
PAGE45基于PLC的立體車庫控制程序的設(shè)計摘要隨著國民經(jīng)濟(jì)的高速發(fā)展,我國轎車保有量直線上升,因此,停車問題也就逐漸成為大城市迫切需要解決的難題。為了解決停車難的問題,車庫開始向高層發(fā)展,充分利用土地資源,提高城市土地的利用率,在有限的土地上停放更多的車輛,于是便發(fā)展出了立體車庫。在科技發(fā)展迅速的今天,自動化控制技術(shù)越來越多的應(yīng)用到了人們的生活生產(chǎn)中,而PLC控制技術(shù)已經(jīng)成為了自動化控制的主要方式之一,本文以三菱PLC控制為例,結(jié)合3X3升降橫移式立體車庫來介紹PLC控制技術(shù)在立體車庫控制方面的應(yīng)用。立體車庫的控制面板是利用MCGS組態(tài)軟件制作而成的。關(guān)鍵字立體車庫、PLC控制系統(tǒng)、升降橫移、MCGSAbstractWiththerapiddevelopmentofnationaleconomy,Chinesecarincreasessharply.therefore,Parkingproblemhasgraduallybecometheurgentproblemofsomebigcity.Inordertosolvetheproblemofparking,thegaragebegantodevelopthehighlevel,madefulluseoflandresourcesandimprovethelandutilizationrate.Weshouldparkmorecarsonthelimitedland.Peopleinventedstereogarage.Withtherapiddevelopmentoftechnology,automaticcontroltechniquewasappliedtopeople'slifeandproduction.PLCcontroltechnologyhasbecomeoneofthemainmethodsofautomaticcontrol.ThispaperbasedontheMITSUBISHIPLCcontrolandcombinedwiththetypical3X3up-downandtranslationstereogaragetointroducePLCcontroltechnologyintheapplicationofstereogaragecontrol.stereogaragecontrolpanelisbasedonMCGSsoftwaretomake.Keywordstereogarage、PLCcontrolsystem、up-downandtranslation、MCGS目錄TOC\o"1-3"\h\u4502第一章緒論 1121781.1課題研究的目的和意義 130401.2論文的主要研究內(nèi)容 123587第二章PLC、GXDeveloper軟件及MCGS軟件簡介 3256062.1PLC簡介 3106992.1.1PLC的定義 3107212.1.2PLC的編程語言 3144352.2GXDeveloper編程軟件簡介 460802.2.1GXDeveloper編程軟件的特點 4295502.3MCGS組態(tài)軟件簡介 5255432.3.1MCGS嵌入式組態(tài)軟件的特點 530338第三章立體車庫控制組態(tài)的設(shè)計 623473.1工程的新建 6199883.1.1觸摸屏型號選擇 6123753.1.2設(shè)備組態(tài) 6162613.1.3窗口組態(tài) 8218283.1.4基本元件的建立 8231963.1.5基本元件數(shù)據(jù)的鏈接 1014183.2動畫腳本程序的設(shè)計 11265793.2.1移動屬性設(shè)置 1171513.2.2動畫腳本程序設(shè)計 128744第四章立體車庫PLC控制程序的設(shè)計 14198434.1設(shè)計思路 14246544.2流程圖 15123934.3分配表 17101794.4主程序設(shè)計 18170914.5功能程序設(shè)計 22165844.5.1快速切換程序設(shè)計 2289894.5.2載車板切換程序設(shè)計 22191044.5.3急停及報警程序設(shè)計 23321324.5.4延時程序設(shè)計 2327069第五章立體車庫PLC程序和組態(tài)的模擬與調(diào)試 25212055.1PLC寫入 2563875.2組態(tài)寫入 26251715.3PLC與組態(tài)的整體模擬 264917總結(jié) 3030972參考文獻(xiàn) 3316402致謝 347298附錄 35第一章緒論1.1課題研究的目的和意義隨著國民經(jīng)濟(jì)的高速發(fā)展,我國轎車保有量直線上升。據(jù)中國汽車工業(yè)協(xié)會公布的數(shù)據(jù)表明,1997年全國汽車保有量1100萬輛,其中轎車萬400輛,當(dāng)年轎車生產(chǎn)量48.2萬輛,微型車生產(chǎn)量38.2萬輛,1998年轎車生產(chǎn)量50萬輛,1999年55萬輛,2000年57萬輛。2002年中國汽車產(chǎn)量達(dá)到了325萬輛,比上年增長38%,全球排位由2001年的第八位上升至第五位。2005年的轎車保有量已達(dá)到1108萬輛。由于中國加入世貿(mào)關(guān)稅進(jìn)一步降低,2008年北京奧運及2010年上海世界博覽會等重大事件的影響,以及國內(nèi)需求的進(jìn)一步拉動和“費改稅”等政策的驅(qū)動,我國的汽車工業(yè)仍將具有很大的發(fā)展空間并將繼續(xù)保持快速平穩(wěn)發(fā)展。按前述數(shù)據(jù)預(yù)測,2010年將達(dá)到2000萬輛。城市中停車位需求按1:1.2(100%的基本停車位和20%的公共停車位計算,將增加停車位480萬個,平均每年需求96萬個。因此,停車問題也就逐漸成為大城市迫切需要解決的難題。城市和已建小區(qū)有限的地面面積己無法提供足夠的停車車位,向空間發(fā)展成為當(dāng)前解決問題的一條重要途徑。在現(xiàn)在這個社會,隨著經(jīng)濟(jì)的不斷發(fā)展,科技的不斷進(jìn)步,人們的生活水平越來越高,慢慢的,人們開始選擇汽車作為出行工具,因此私家車日益增多。隨著私家車的不斷增加,漸漸地,人們發(fā)現(xiàn),城市里的停車位越來越少了,經(jīng)常會出現(xiàn)開著車沒地方停的尷尬局面。由于現(xiàn)在城市發(fā)展很快,土地越來越緊缺,于是,如何讓停車場能停更多的車而不占用更多的土地便成為了一個問題,于是,立體車庫便成為了一種可能的選擇。立體車庫擁有占同樣的土地面積,卻能容納更多汽車的特點,它可以在大廈林立的小區(qū)中擺放,也可以大面積的組合使用,還能和地下停車場,車庫等組合使用,能有效的解決停車難的問題。在當(dāng)今社會,自動化控制技術(shù)使用的地方越來越多,而PLC技術(shù)已經(jīng)成為了自動化控制的主要方式之一。將PLC控制技術(shù)應(yīng)用到立體車庫上,可以大大的方便人們停車的過程。本文中立體車庫控制面板是利用MCGS組態(tài)軟件制作的觸摸屏控制面板,利用觸摸屏控制的話可以使立體車庫的操作變得更加簡單易懂,一目了然。1.2論文的主要研究內(nèi)容立體車庫的出現(xiàn),很好的解決了大城市停車難的問題。但是利用什么來控制立體車庫呢?答案就是PLC。PLC可靠性高,抗干擾能力強(qiáng),能實現(xiàn)很復(fù)雜的動作,這使得PLC在立體車庫控制系統(tǒng)中的應(yīng)用十分廣泛。在程序設(shè)計之前,我首先是利用MCGS組態(tài)軟件設(shè)計立體車庫的控制面板及動畫。我可以根據(jù)我所制作的控制面板來設(shè)計程序。整個車庫由一臺PLC對其進(jìn)行管理,由PLC來控制載車板升降橫移電機(jī)正反轉(zhuǎn),完成車輛的存取操作,各車位車輛的存取按照相應(yīng)的策略來調(diào)動載車板,以存取車輛。本文所用PLC型號為三菱FX2N-48MR。本文設(shè)計的程序要求完成立體車庫自動運行功能如:自動/手動切換、載車板升降橫移、延時自動運行、快速切換、載車板切換、急停等。第二章PLC、GXDeveloper軟件及MCGS軟件簡介2.1PLC簡介2.1.1PLC的定義可編程控制器,簡稱PLC,是指以計算機(jī)技術(shù)為基礎(chǔ)的新型工業(yè)控制裝置。在1987年國際電工委員會頒布的PLC標(biāo)準(zhǔn)草案中對PLC做了如下定義:“PLC是一種專門為在工業(yè)環(huán)境下應(yīng)用而設(shè)計的數(shù)字運算操作的電子裝置。它采用可以編制程序的存儲器,用來在其內(nèi)部存儲執(zhí)行邏輯運算、順序運算、計時、計數(shù)和算術(shù)運算等操作的指令,并能通過數(shù)字式或模擬式的輸入和輸出,控制各種類型的機(jī)械或生產(chǎn)過程。PLC及其有關(guān)的外圍設(shè)備都應(yīng)該按易于與工業(yè)控制系統(tǒng)形成一個整體,易于擴(kuò)展其功能的原則而設(shè)計。”2.1.2PLC的編程語言不同的商家的PLC有不同的編程語言,但就某個商家而言,PLC的編程語言也就那么幾種。順序功能圖(SFC)這是位于其它編程語言之上的圖形語言,用來編程順序控制的程序(如:機(jī)械手控制程序)。編寫時,工藝過程被劃分為若干個順序出現(xiàn)的步,每步中包括控制輸出的動作,從一步到另一步的轉(zhuǎn)換由轉(zhuǎn)換條件來控制,特別適合于生產(chǎn)制造過程。2、語句表(STL)是一種類似于微機(jī)匯編語言的一種文本編程語言,由多條語句組成一個程序段。語言表適合于經(jīng)驗豐富的程序員使用,可以實現(xiàn)某些梯形圖不能實現(xiàn)的功能。3、梯形圖(LAD)這是使用最多的PLC編程語言。因與繼電器電路很相似,具有直觀易懂的特點,很容易被熟悉繼電器控制的電氣人員所掌握,特別適合于數(shù)字量邏輯控制。梯形圖由觸點、線圈和用方框表示的指令構(gòu)成。觸點代表邏輯輸入條件,線圈代表邏輯運算結(jié)果,常用來控制的指示燈,開關(guān)和內(nèi)部的標(biāo)志位等。指令框用來表示定時器、計數(shù)器或數(shù)學(xué)運算等附加指令。在程序中,最左邊是主信號流,信號流總是從左向右流動的,不適合于編寫大型控制程序。正因為梯形圖具有直觀易懂的特點,所以本文中的PLC程序就是運用梯形圖來編寫的。2.2GXDeveloper編程軟件簡介GXDeveloper是三菱PLC的編程軟件。適用于三菱Q、QnU、QS、QnA、AnS、AnA、FX等全系列可編程控制器。支持梯形圖、指令表、順序功能圖程序設(shè)計,網(wǎng)絡(luò)參數(shù)設(shè)定,可進(jìn)行程序的線上更改、監(jiān)控及調(diào)試,具有異地讀寫PLC程序功能。2.2.1GXDeveloper編程軟件的特點1、軟件的共通化GXDeveloper能夠制作Q系列,QnA系列,A系列(包括運動控制(SCPU)),FX系列的數(shù)據(jù),能夠轉(zhuǎn)換成GPPQ,GPPA格式的文檔。此外,選擇FX系列的情況下,還能變換成FXGP(DOS),FXGP(WIN)格式的文檔。2、利用Windows的優(yōu)越性,使操作性飛躍上升能夠?qū)xcel,Word等作成的說明數(shù)據(jù)進(jìn)行復(fù)制,粘貼,并有效利用。3、程序的標(biāo)準(zhǔn)化(1)標(biāo)號編程用標(biāo)號編程制作可編程控制器程序的話,就不需要認(rèn)識軟元件的號碼而能夠根據(jù)標(biāo)示制作成標(biāo)準(zhǔn)程序。用標(biāo)號編程做成的程序能夠依據(jù)匯編從而作為實際的程序來使用。(2)功能塊(以下稱作FB)FB是以提高順序程序的開發(fā)效率為目的而開發(fā)的一種功能。把開發(fā)順序程序時反復(fù)使用的順序程序回路塊零件化,使得順序程序的開發(fā)變得容易。此外,零件化后,能夠防止將其運用到別的順序程序時的順序輸入錯誤。(3)宏只要在任意的回路模式上加上名字(宏定義名)登錄(宏登錄)到文檔,然后輸入簡單的命令就能夠讀出登錄過的回路模式,變更軟元件就能夠靈活利用了。4、能夠簡單設(shè)定和其他站點的鏈接由于連接對象的指定被圖形化而構(gòu)筑成復(fù)雜的系統(tǒng)的情況下也能夠簡單的設(shè)定。5、能夠用各種方法和可編程控制器CPU連接(1)經(jīng)由串行通訊口(2)經(jīng)由USB(3)經(jīng)由MELSECNET/10(H)計算機(jī)插板(4)經(jīng)由MELSECNET(Ⅱ)計算機(jī)插板(5)經(jīng)由CC-Link計算機(jī)插板(6)經(jīng)由Ethernet計算機(jī)插板(7)經(jīng)由CPU計算機(jī)插板(8)經(jīng)由AF計算機(jī)插板6、豐富的調(diào)試功能(1)由于運用了梯形圖邏輯測試功能,能夠更加簡單的進(jìn)行調(diào)試作業(yè)。(2)在幫助中有CPU錯誤,特殊繼電器/特殊寄存器的說明,所以對于在線中發(fā)生錯誤,或者是程序制作中想知道特殊繼電器/特殊寄存器的內(nèi)容的情況下提供非常大的便利。(3)數(shù)據(jù)制作中發(fā)生錯誤況時,會顯示是什么原因或是顯示消息,所以數(shù)據(jù)制作的時間能夠大幅度縮短。2.3MCGS組態(tài)軟件簡介MCGS嵌入版組態(tài)軟件是基于RTOS實時多任務(wù)操作系統(tǒng)的專門應(yīng)用于嵌入式操作系統(tǒng)的組態(tài)軟件,通過簡單的模塊化組態(tài)就可構(gòu)造用戶自己的應(yīng)用系統(tǒng),使用戶從繁瑣的編程中解脫出來,讓用戶在使用嵌入式系統(tǒng)時得心應(yīng)手。 2.3.1MCGS嵌入式組態(tài)軟件的特點MCGS嵌入式系統(tǒng)體系結(jié)構(gòu)MCGS嵌入式體系結(jié)構(gòu)分為組態(tài)環(huán)境和運行環(huán)境兩部分,組態(tài)環(huán)境相當(dāng)于一套完整的工具軟件,可以在PC機(jī)上運行,用簡單的模塊化設(shè)計幫助用戶構(gòu)造自己的應(yīng)用系統(tǒng),組態(tài)好的應(yīng)用系統(tǒng)通過串口線或以太網(wǎng)下載到嵌入式系統(tǒng)中實時運行。MCGS嵌入版組態(tài)軟件分為人機(jī)界面組態(tài)和控制流程組態(tài)兩部分,用戶可以根據(jù)實際情況裁減所需內(nèi)容。其中人機(jī)界面組態(tài)與通用版類似,可以組態(tài)出動畫窗口、曲線、報表,并可以設(shè)置用戶權(quán)限,安全級別等等。控制流程組態(tài)是嵌入式組態(tài)系統(tǒng)特有的功能,主要用于組態(tài)實現(xiàn)各種控制流程和控制邏輯。系統(tǒng)提供了豐富的功能模塊和控制邏輯,來幫助用戶快速的實現(xiàn)各種控制功能,是構(gòu)成用戶應(yīng)用系統(tǒng)實時控制的核心。在控制流程中可以利用MCGS提供的100多種功能模塊組成各種應(yīng)用系統(tǒng),嵌入式系統(tǒng)中的MCGS實時數(shù)據(jù)庫可以用作人機(jī)界面和控制流程數(shù)據(jù)交換的樞紐,控制流程可以通過實時數(shù)據(jù)庫在人機(jī)界面上顯示控制過程,并實現(xiàn)數(shù)據(jù)后處理。組態(tài)好的應(yīng)用系統(tǒng)下載到內(nèi)嵌了實時多任務(wù)嵌入式操作系統(tǒng)中實時運行,從而實現(xiàn)了控制系統(tǒng)的可靠性、實時性、確定性、安全性。第三章立體車庫控制組態(tài)的設(shè)計本文中立體車庫控制面板及演示畫面的設(shè)計是運用MCGSE組態(tài)軟件制作的。MCGSE組態(tài)軟件具有全中文、面向窗口的可視化操作界面,實時性強(qiáng),有良好的并行處理性能和豐富多彩的多媒體畫面。該組態(tài)軟件的開放式結(jié)構(gòu)擁有廣泛的數(shù)據(jù)獲取和強(qiáng)大的數(shù)據(jù)處理功能。3.1工程的新建3.1.1觸摸屏型號選擇MCGS組態(tài)軟件有“MCGS組態(tài)環(huán)境”和“MCGS運行環(huán)境”兩部分組成,雙擊桌面上的“MCGS組態(tài)環(huán)境”圖標(biāo),單擊文件菜單中“新建工程”選項,彈出如圖3-1所示對話框,TPC選擇為“TPC7062K”,單擊確認(rèn)。圖3-1新建工程設(shè)置3.1.2設(shè)備組態(tài)在工作臺中激活設(shè)備窗口,如圖3-2所示。鼠標(biāo)雙擊“設(shè)備窗口”進(jìn)入設(shè)備組態(tài)畫面,如圖3-3所示。圖3-2工作臺激活設(shè)備窗口圖3-3設(shè)備組態(tài)畫面在設(shè)備工具箱中按先后順序雙擊“通用窗口父設(shè)備”和“三菱_FX系列編程口”,把它們添加到組態(tài)畫面,如圖3-4所示。圖3-4添加設(shè)備后的設(shè)備組態(tài)畫面提示是否使用三菱FX系列編程口默認(rèn)通訊參數(shù)設(shè)置串口父設(shè)備參數(shù),選擇“是”,如圖3-5所示。圖3-5是否默認(rèn)參數(shù)所有工作完成后關(guān)閉設(shè)備窗口,返回工作臺。3.1.3窗口組態(tài)在工作臺中激活用戶窗口,鼠標(biāo)單擊“新建窗口”按鈕,建立新畫面“窗口0”,接下來單擊“窗口屬性”按鈕,彈出“用戶窗口屬性設(shè)置”對話框,在基本屬性頁,將“窗口名稱”修改為“立體車庫控制面板”,點擊確認(rèn)進(jìn)行保存,如圖3-6所示。圖3-6建立用戶窗口3.1.4基本元件的建立按鈕:從“工具箱”中選中“標(biāo)準(zhǔn)按鈕”構(gòu)件,在窗口編輯位置按住鼠標(biāo)左鍵,拖放出一定大小后,松開鼠標(biāo)左鍵,這樣一個按鈕就繪制在窗口畫面中了,接下來雙擊該按鈕,打開“標(biāo)準(zhǔn)按鈕構(gòu)件屬性設(shè)置”對話框,在基本屬性頁中將“文本”修改為“1號車位”,背景色改為淺綠色,如圖3-7所示。圖3-7按鈕屬性設(shè)置按照同樣的方法依次繪制另外按鈕,如圖3-8.圖3-8全部按鈕標(biāo)簽:單擊選中工具箱中的“標(biāo)簽”構(gòu)件,在窗口按住鼠標(biāo)左鍵,拖放出一定大小的“標(biāo)簽”,雙擊進(jìn)入該標(biāo)簽彈出“標(biāo)簽動畫組態(tài)屬性設(shè)置”對話框,在擴(kuò)展屬性頁,在“文本內(nèi)容輸入”中輸入“立體車庫模擬演示”,在屬性設(shè)置頁,填充顏色選擇“沒有填充”,邊線顏色選擇“沒有邊線”,點擊確認(rèn),如圖3-9所示。圖3-9標(biāo)簽繪制“立體車庫控制面板”窗口就完成了,如圖3-10所示。圖3-10立體車庫控制面板“動畫演示畫面”和“限位開關(guān)”兩個用戶窗口中的按鈕按照上述方法繪制,然后“動畫演示畫面”中的小車通過以下步驟繪制。鼠標(biāo)單擊工具箱中的“插入元件”按鈕,打開“對象元件庫管理”對話框,選中圖形對象庫車中的一款,點擊確認(rèn)添加到畫面窗口中,調(diào)整到適當(dāng)大小,利用復(fù)制再添加里六個小車,如圖3-11所示。圖3-11小車?yán)L制3.1.5基本元件數(shù)據(jù)的鏈接按鈕:雙擊“1號車位”按鈕,彈出“標(biāo)準(zhǔn)按鈕構(gòu)件屬性設(shè)置”對話框,在操作屬性頁,點擊“按下功能”,勾選“數(shù)據(jù)對象值”操作,選擇“清0”操作,勾選“打開用戶窗口”,選擇“動畫演示畫面”,如圖3-12所示。圖3-12按鈕數(shù)據(jù)鏈接點擊問號彈出“變量選擇”對話框,選擇“根據(jù)采集信息生成”,通道類型選擇“M輔助寄存器”,通道地址為“81”,讀寫類型選擇“讀寫”,點擊確認(rèn),如圖3-13所示。圖3-13變量選擇通過以上設(shè)置后如圖3-14所示。圖3-14按鈕設(shè)置完成3.2動畫腳本程序的設(shè)計3.2.1移動屬性設(shè)置雙擊1號車位中的小車,在屬性設(shè)置頁中的“位置動畫鏈接”選中“水平移動”,這時會自動生成一個水平移動頁,點擊水平移動頁,在表達(dá)式中輸入“車位1水平移動”,如圖3-15所示。圖3-15水平移動屬性設(shè)置點擊圖3-15中確認(rèn),這時會彈出一個窗口,如圖3-16所示。圖3-16組態(tài)錯誤接下來單擊“是”按鈕,彈出一個窗口,如圖3-17所示,單擊確認(rèn)。圖3-17添加水平移動數(shù)據(jù)對象其它小車設(shè)置可按照上述方法設(shè)置。3.2.2動畫腳本程序設(shè)計雙擊窗口空白處,進(jìn)入“用戶窗口屬性設(shè)置”對話框,在循環(huán)腳本頁添加1號車位小車水平移動的腳本,如圖3-18所示。圖3-18水平移動腳本設(shè)置比如3號車位呼叫時動畫演示時的腳本程序如下:if設(shè)備0_讀寫M0003=1thenif車位1水平移動<130then車位1水平移動=車位1水平移動+3endifendifif設(shè)備0_讀寫M0120=1thenif車位3垂直移動<90then車位3垂直移動=車位3垂直移動+3endifendifif設(shè)備0_讀寫M0121=1AND車位3垂直移動>0then車位3垂直移動=車位3垂直移動-3endifif設(shè)備0_讀寫M0003=0AND車位1水平移動>0then車位1水平移動=車位1水平移動-3endif第四章立體車庫PLC控制程序的設(shè)計PLC在控制系統(tǒng)的應(yīng)用中,外部硬件接線部分較為簡單,對被控對象的控制作用,都體現(xiàn)在PLC的程序上。因此,PLC程序設(shè)計的好壞,直接影響控制系統(tǒng)的性能。4.1設(shè)計思路本文中設(shè)想的立體車庫是一個3X3型七車位的升降橫移式立體車庫,其工作原理是:第三層載車板可以做升降運動,第二層載車板可以做升降運動和橫移運動,第一層載車板只能做橫移運動。通過第二層和第一層的空位,利用載車板橫移變換空位,將汽車停到第二、第三層或降至第一層,第一層的汽車可直接開進(jìn)和開出,無需變換位置,如圖4-1所示。圖4-1立體車庫模擬圖因為本文中設(shè)計的是立體車庫的PLC控制程序,所以立體車庫的硬件構(gòu)造我們就不考慮了。立體車庫存車時,如果第一層有空的車位,那就先停在第一層車位,第一層車位停滿之后停第二層車位,第二層車位停滿之后再考慮停第三層車位。立體車庫存取車過程:小車從出入口處進(jìn)入立體車庫主通道,我們在出入口處設(shè)有一個觸摸屏顯示面板和道閘,駕駛員可以根據(jù)立體車庫的停車情況按下相應(yīng)的車位呼叫按鈕,然后道閘打開,這時相應(yīng)的出入庫通道指示燈點亮,小車按照指示燈駛?cè)肓Ⅲw車庫出入庫通道,將車開進(jìn)車位載車板上后,停放在合適的位置,拉好手剎,然后駕駛員下車,立體車庫就可以根據(jù)車位呼叫的信息將車停放在相應(yīng)的車位。我們就拿5號車位存取車的過程來舉例說明立體車庫存取車過程,5號車位存車時,駕駛員按下觸摸屏上面的5號車位呼叫按鈕,道閘打開,小車從出入口進(jìn)入立體車庫主通道,出入庫通道指示燈點亮,小車停在1號車位前面。立體車庫中,1號車位載車板向右移動至空位,3號車位載車板也向右移動至空位,然后5號車位載車板向下移動至第一層,接下來小車開到5號車位載車板上,5號車位載車板又向上移動復(fù)位,最后依次是3號載車板左移復(fù)位,1號載車板左移復(fù)位,這樣,5號車位存車就完成了;當(dāng)5號車位取車時,1號車位載車板向右移動至空位,2號車位載車板也向右移動至空位,然后5號車位載車板向下移動至第一層,小車從立體車庫內(nèi)開出,最后從出入口處開出。1號車位和2號車位載車板分別用一臺電機(jī)來控制其左右橫移,3號車位和4號車位載車板各用兩臺電機(jī)控制,一臺電機(jī)控制其左右橫移,一臺電機(jī)控制其升降移動,5號車位、6號車位和7號車位載車板分別用一臺電機(jī)控制其升降移動。小車停車情況是通過裝在每個車位載車板上的傳感器來顯示的,當(dāng)車位上有車時,控制面板指示燈顯示紅色,并指示該車位有車,當(dāng)車位上無車時,指示燈顯示綠色。為了防止汽車在載車板上面滑動而造成損失,應(yīng)該在載車板后端和前端位置各裝一個高25mm左右的阻車擋板,司機(jī)在將車開到載車板上時,應(yīng)該將車停在合適的位置上,并拉好手剎。本文所設(shè)計的PLC存取車控制程序只針對第2層和第3層的載車板,而對于底層車位載車板,存取車直接開進(jìn)開出即可。第二層車位以上的載車板上都裝有一個防墜掛鉤,是由電磁鐵控制的,當(dāng)載車板要下降時,電磁鐵得電,防墜掛鉤就收回,載車板可以下降;當(dāng)載車板上升到原來位置后,電磁鐵就失電,防墜掛鉤就彈出,掛住載車板防止其掉落。程序中車位載車板的到位停止是通過16個限位開關(guān)完成的,限位開關(guān)位置圖如圖4-2所示。圖中三角形表示限位開關(guān)。圖4-2限位開關(guān)位置圖4.2流程圖啟動啟動自動/手動自動/手動載車板切換載車板切換按下所需呼叫的車位按鈕按下所需呼叫的車位按鈕下降上升下降上升左移右移左移右移被呼叫的車位載車板移動被呼叫的車位載車板移動圖4-3手動模式立體車庫流程圖啟動N定時90S被呼叫載車板上升啟動N定時90S被呼叫載車板上升按下所需呼叫的車位按鈕按下所需呼叫的車位按鈕下方載車板移開下方載車板移開載車板是否被上升到原位載車板是否被上升到原位防墜掛鉤收回防墜掛鉤收回被呼叫載車板下降Y被呼叫載車板下降Y彈出防墜掛鉤彈出防墜掛鉤NN載車板下降是否到位載車板下降是否到位結(jié)束結(jié)束YY圖4-4自動模式立體車庫流程圖4.3分配表PLC內(nèi)部輔助觸點分配表:PLC內(nèi)部元件組態(tài)按鈕輸入組態(tài)按鈕M119自動/手動M1255號限位開關(guān)M0急停M1206號限位開關(guān)M12910號限位開關(guān)M1267號限位開關(guān)M13011號限位開關(guān)M1278號限位開關(guān)M13112號限位開關(guān)M1289號限位開關(guān)M13213號限位開關(guān)M811號載車板呼叫M13314號限位開關(guān)M822號載車板呼叫M13415號限位開關(guān)M33號載車板呼叫M13516號限位開關(guān)M44號載車板呼叫M136快速切換M55號載車板呼叫M138上升M66號載車板呼叫M139下降M77號載車板呼叫M140左移M81號車位傳感器M141右移M92號車位傳感器M137手動載車板切換M1103號車位傳感器M1211號限位開關(guān)M1114號車位傳感器M1222號限位開關(guān)M1125號車位傳感器M1233號限位開關(guān)M1136號車位傳感器M1244號限位開關(guān)M1147號車位傳感器PLC輸出分配表:輸出輸出設(shè)備輸出輸出設(shè)備Y01號載車板左移Y145號載車板上升Y11號載車板右移Y155號載車板下降Y22號載車板左移Y166號載車板上升Y32號載車板右移Y176號載車板下降Y43號載車板左移Y207號載車板上升Y53號載車板右移Y217號載車板下降Y63號載車板上升Y223號防墜電磁鐵Y73號載車板下降Y234號防墜電磁鐵Y104號載車板左移Y245號防墜電磁鐵Y114號載車板右移Y256號防墜電磁鐵Y124號載車板上升Y267號防墜電磁鐵Y134號載車板下降Y27報警4.4主程序設(shè)計主程序的設(shè)計我就利用3號車位存取車程序的設(shè)計來簡單說明。3號車位載車板呼叫,M3得電:1號載車板右移:1號載車板右移到位后,6號常閉限位開關(guān)斷開,停止右移:6號常閉限位開關(guān)閉合,3號載車板下降,3號防墜電磁閥得電,掛鉤收回,3號載車板下降到位后,1號常閉限位開關(guān)斷開,停止下降:1號限位開關(guān)閉合,計時器T2得電開始計時,計時時間到之后,3號載車板上升:3號載車板上升到位后,12號限位開關(guān)斷開,3號載車板停止上升,3號防墜電磁閥失電,彈出掛鉤:1號載車板向左移動,當(dāng)移動到位后,4號限位開關(guān)打開,停止左移:3號呼叫周期結(jié)束:3號車位存取車程序設(shè)計完成。完整主程序見附錄。4.5功能程序設(shè)計4.5.1快速切換程序設(shè)計當(dāng)車位3、4、5、6和7的載車板降至最底層時會有一個延時程序,這一段延時時間是用來存車或者取車的,當(dāng)存車或取車完成了,但是延時時間還沒到的時候,我們就可以利用快速切換程序使車位載車板快速上升,這樣的設(shè)計可以提高立體車庫的存取車效率。程序如下:就拿3號車位而言,當(dāng)3號車位載車板降至最底層時,計時器T2開始計時,當(dāng)計時時間還沒到時,按下快速切換按鈕,常開觸點M136閉合,使M31導(dǎo)通,3號車位載車板上升。4.5.2載車板切換程序設(shè)計載車板切換是在手動模式下才使用的,例如:3號車位載車板恢復(fù)到原位后,需要將1號車位載車板也恢復(fù)到原位時就需要載車板切換觸點來斷開手動信號,因為手動信號都是自鎖的。程序如下:就拿2號手動信號而言,當(dāng)2號車位載車板恢復(fù)到原位時,需要常閉觸點M137使2號手動信號M82失電,然后再按其它車位呼叫,這樣就完成了手動模式時車位載車板的切換。4.5.3急停及報警程序設(shè)計當(dāng)出現(xiàn)緊急情況時,我們需要急停程序來使整個立體車庫運行停止。程序如下:按下急停的時候,M0得電,程序中的常閉觸點M0就打開,切斷全部信號,使立體車庫停止運行。4.5.4延時程序設(shè)計使用自動模式,當(dāng)車位載車板到達(dá)最底層時,車輛存取需要一定時間,這就要延時程序來使載車板停留在最底層一段時間。程序如下:就拿3號車位載車板而言,當(dāng)3號車位載車板到達(dá)最底層后,計時器T2得電,開始計時,計時時間到后常開觸點T2閉合使M31得電,3號車位載車板上升。第五章立體車庫PLC程序和組態(tài)的模擬與調(diào)試本文中立體車庫PLC程序的調(diào)試不是在PLC輸入端接上手動按鈕,而是利用觸摸屏寫入信號,然后在PLC的輸出指示燈上看輸出。5.1PLC寫入單擊菜單“在線”中的“傳輸設(shè)置”,跳出傳輸設(shè)置窗口,單擊“通信測試”,彈出如圖5-1所示窗口說明與PLC連接成功。圖5-1傳輸設(shè)置單擊菜單“在線”中的“PLC寫入”,跳出PLC寫入窗口,單擊“參數(shù)+程序”按鈕,選擇要寫入的信息,然后單擊“執(zhí)行”,最后彈出如圖5-2所示窗口,表明PLC程序?qū)懭胪瓿?。圖5-2PLC寫入5.2組態(tài)寫入單擊工具欄中的“下載工程并進(jìn)入運行環(huán)境”圖標(biāo),彈出如圖5-3的窗口。依次單擊“連機(jī)運行”、“通訊測試”、“工程下載”,等工程下載完成后,組態(tài)寫入就完成了。圖5-3組態(tài)寫入 總結(jié)為期兩個多月的畢業(yè)設(shè)計即將結(jié)束了,經(jīng)過兩個多月的努力,我終于在同學(xué)和老師的幫助下完成了立體車庫控制程序的設(shè)計。回想起這兩個多月的時間,我感覺收獲頗豐。畢業(yè)設(shè)計作為綜合性的設(shè)計,與以前教學(xué)中的實驗、課程設(shè)計相比難度要大很多。畢業(yè)設(shè)計不同于我們平時做的課程設(shè)計可以根據(jù)課本和老師所提供的相關(guān)資料去完成設(shè)計,它是我們大學(xué)四年所學(xué)知識的一個綜合的訓(xùn)練,它所涉及的有些知識是我們不曾學(xué)習(xí)的,這就需要我們有良好的自學(xué)能力。比如本文中PLC編程軟件和MCGS組態(tài)軟件都是我不曾接觸過的。剛開始確定畢業(yè)設(shè)計課題那段時間,我首先是去圖書館查找一些相關(guān)的書籍和資料,然后分析設(shè)計,根據(jù)實際情況擬定程序設(shè)計方案。畢業(yè)設(shè)計中期階段,我需要做的是在實驗室不斷調(diào)試程序,然后發(fā)現(xiàn)問題,解決問題。最難解決的問題就是動畫腳本的編寫,因為我對于動畫腳本編寫一點基礎(chǔ)都沒有,但是通過一段時間的自學(xué)以后,我現(xiàn)在已經(jīng)能簡單的編寫腳本程序了。畢業(yè)設(shè)計最后階段就是寫畢業(yè)論文了,畢業(yè)論文就是把自己所做的事情通過書面的形式表達(dá)出來。通過這次畢業(yè)設(shè)計,我在各個方面都有了很大的提高,特別是在理論和實踐結(jié)合方面使我受益匪淺,使大學(xué)里學(xué)習(xí)的理論知識在根本上得到一次最完整的實踐和提高,也為我即將面臨的工作奠定了很好的基礎(chǔ)。
參考文獻(xiàn)[1]許廖,王淑英.電器控制與PLC控制技術(shù)[M].北京.機(jī)械工業(yè)出版社,2005[2]肖峰,賀哲榮.PLC編程100例[J].北京.中國電力出版社,2009[3]MCGSE培訓(xùn)教程.北京昆侖通態(tài)自動化軟件科技有限公司.2003[4]范次猛.可編程控制器實訓(xùn)指導(dǎo)[J].哈爾濱.哈爾濱工程大學(xué)出版社,2007[5]鄒金慧.可編程控制器及其系統(tǒng)[M].重慶.重慶大學(xué)出版社,2002[6]姜治臻.PLC項目實訓(xùn)[J].北京.高等教育出版社,2008[7]楊青杰.三菱FX系列PLC應(yīng)用系統(tǒng)設(shè)計指南[J].北京.機(jī)械工業(yè)出版社,2008[8]宋小春.三菱FX2NPLC技術(shù)與應(yīng)用[M].廣東.人民郵電出版社,2007[9]GXDeveloper用戶操作手冊[10]三菱微型可編程控制器編程手冊致謝這篇論文在設(shè)計過程中遇到了許多的問題,在解決問題的過程中,我的指導(dǎo)老師和同學(xué)給了我很多的幫助,在這里我表示對他們深深的謝意。首先感謝我的指導(dǎo)老師王老師,因為有了您的指導(dǎo),這篇論文才能順利完成。其次感謝班主任和所有教過我的老師,在這四年的學(xué)習(xí)生活中,你們教給了我很多的知識。再次感謝我身邊的同學(xué)和朋友,謝謝你們對我的幫助和寬容,和你們在一起的時間,將是我最珍貴的回憶。附錄資料:不需要的可以自行刪除C語言中如何獲取時間?精度如何?1使用time_ttime(time_t*timer)精確到秒2使用clock_tclock()得到的是CPU時間精確到1/CLOCKS_PER_SEC秒3計算時間差使用doubledifftime(time_ttimer1,time_ttimer0)4使用DWORDGetTickCount()精確到毫秒5如果使用MFC的CTime類,可以用CTime::GetCurrentTime()精確到秒6要獲取高精度時間,可以使用BOOLQueryPerformanceFrequency(LARGE_INTEGER*lpFrequency)獲取系統(tǒng)的計數(shù)器的頻率BOOLQueryPerformanceCounter(LARGE_INTEGER*lpPerformanceCount)獲取計數(shù)器的值然后用兩次計數(shù)器的差除以Frequency就得到時間。7MultimediaTimerFunctionsThefollowingfunctionsareusedwithmultimediatimers.timeBeginPeriod/timeEndPeriod/timeGetDevCaps/timeGetSystemTime//*********************************************************************//用標(biāo)準(zhǔn)C實現(xiàn)獲取當(dāng)前系統(tǒng)時間的函數(shù)一.time()函數(shù)time(&rawtime)函數(shù)獲取當(dāng)前時間距1970年1月1日的秒數(shù),以秒計數(shù)單位,存于rawtime中。#include"time.h"voidmain(){time_trawtime;structtm*timeinfo;time(&rawtime);timeinfo=localtime(&rawtime);printf("\007Thecurrentdate/timeis:%s",asctime(timeinfo));exit(0);}=================#include--必須的時間函數(shù)頭文件time_t--時間類型(time.h定義是typedeflongtime_t;追根溯源,time_t是long)structtm--時間結(jié)構(gòu),time.h定義如下:inttm_sec;inttm_min;inttm_hour;inttm_mday;inttm_mon;inttm_year;inttm_wday;inttm_yday;inttm_isdst;time(&rawtime);--獲取時間,以秒計,從1970年1月一日起算,存于rawtimelocaltime(&rawtime);--轉(zhuǎn)為當(dāng)?shù)貢r間,tm時間結(jié)構(gòu)asctime()--轉(zhuǎn)為標(biāo)準(zhǔn)ASCII時間格式:星期月日時:分:秒年二.clock()函數(shù),用clock()函數(shù),得到系統(tǒng)啟動以后的毫秒級時間,然后除以CLOCKS_PER_SEC,就可以換成“秒”,標(biāo)準(zhǔn)c函數(shù)。clock_tclock(void);#includeclock_tt=clock();longsec=t/CLOCKS_PER_SEC;他是記錄時鐘周期的,實現(xiàn)看來不會很精確,需要試驗驗證;三.gettime(&t);據(jù)說tc2.0的time結(jié)構(gòu)含有毫秒信息#include#includeintmain(void){structtimet;gettime(&t);printf("Thecurrenttimeis:-:d:d.d\n",t.ti_hour,t.ti_min,t.ti_sec,t.ti_hund);return0;}time是一個結(jié)構(gòu)體,,其中成員函數(shù)ti_hund是毫秒。。。四.GetTickCount(),這個是windows里面常用來計算程序運行時間的函數(shù);DWORDdwStart=GetTickCount();//這里運行你的程序代碼DWORDdwEnd=GetTickCount();則(dwEnd-dwStart)就是你的程序運行時間,以毫秒為單位這個函數(shù)只精確到55ms,1個tick就是55ms。五.timeGetTime()t,imeGetTime()基本等于GetTickCount(),但是精度更高DWORDdwStart=timeGetTime();//這里運行你的程序代碼DWORDdwEnd=timeGetTime();則(dwEnd-dwStart)就是你的程序運行時間,以毫秒為單位雖然返回的值單位應(yīng)該是ms,但傳說精度只有10ms。=========================================//*****************************************************************Unix##unix時間相關(guān),也是標(biāo)準(zhǔn)庫的//*********************************************************************1.timegm函數(shù)只是將structtm結(jié)構(gòu)轉(zhuǎn)成time_t結(jié)構(gòu),不使用時區(qū)信息;time_ttimegm(structtm*tm);2.mktime使用時區(qū)信息time_tmktime(structtm*tm);timelocal函數(shù)是GNU擴(kuò)展的與posix函數(shù)mktime相當(dāng)time_ttimelocal(structtm*tm);3.gmtime函數(shù)只是將time_t結(jié)構(gòu)轉(zhuǎn)成structtm結(jié)構(gòu),不使用時區(qū)信息;structtm*gmtime(consttime_t*clock);4.localtime使用時區(qū)信息structtm*localtime(consttime_t*clock);1.time獲取時間,stime設(shè)置時間time_tt;t=time(&t);2.stime其參數(shù)應(yīng)該是GMT時間,根據(jù)本地時區(qū)設(shè)置為本地時間;intstime(time_t*tp)3.UTC=true表示采用夏時制;4.文件的修改時間等信息全部采用GMT時間存放,不同的系統(tǒng)在得到修改時間后通過localtime轉(zhuǎn)換成本地時間;5.設(shè)置時區(qū)推薦使用setup來設(shè)置;6.設(shè)置時區(qū)也可以先更變/etc/sysconfig/clock中的設(shè)置再將ln-fs/usr/share/zoneinfo/xxxx/xxx/etc/localtime才能重效time_t只能表示68年的范圍,即mktime只能返回1970-2038這一段范圍的time_t看看你的系統(tǒng)是否有time_t64,它能表示更大的時間范圍//***************************************************************windows##Window里面的一些不一樣的//*********************************************************************一.CTime()類VC編程一般使用CTime類獲得當(dāng)前日期和時間CTimet=GetCurrentTime();SYSTEMTIME結(jié)構(gòu)包含毫秒信息typedefstruct_SYSTEMTIME{WORDwYear;WORDwMonth;WORDwDayOfWeek;WORDwDay;WORDwHour;WORDwMinute;WORDwSecond;WORDwMilliseconds;}SYSTEMTIME,*PSYSTEMTIME;SYSTEMTIMEt1;GetSystemTime(&t1)CTimecurTime(t1);WORDms=t1.wMilliseconds;SYSTEMTIMEsysTm;::GetLocalTime(&sysTm);在time.h中的_strtime()//只能在windows中用chart[11];_strtime(t);puts(t);//*****************************獲得當(dāng)前日期和時間CTimetm=CTime::GetCurrentTime();CStringstr=tm.Format("%Y-%m-%d");在VC中,我們可以借助CTime時間類,獲取系統(tǒng)當(dāng)前日期,具體使用方法如下:CTimet=CTime::GetCurrentTime();//獲取系統(tǒng)日期,存儲在t里面intd=t.GetDay();//獲得當(dāng)前日期inty=t.GetYear();//獲取當(dāng)前年份intm=t.GetMonth();//獲取當(dāng)前月份inth=t.GetHour();//獲取當(dāng)前為幾時intmm=t.GetMinute();//獲取當(dāng)前分鐘ints=t.GetSecond();//獲取當(dāng)前秒intw=t.GetDayOfWeek();//獲取星期幾,注意1為星期天,7為星期六二.CTimeSpan類如果想計算兩段時間的差值,可以使用CTimeSpan類,具體使用方法如下:CTimet1(1999,3,19,22,15,0);CTimet=CTime::GetCurrentTime();CTimeSpanspan=t-t1;//計算當(dāng)前系統(tǒng)時間與時間t1的間隔intiDay=span.GetDays();//獲取這段時間間隔共有多少天intiHour=span.GetTotalHours();//獲取總共有多少小時intiMin=span.GetTotalMinutes();//獲取總共有多少分鐘intiSec=span.GetTotalSeconds();//獲取總共有多少秒三._timeb()函數(shù)_timeb定義在SYS\TIMEB.H,有四個fieldsdstflagmillitmtimetimezonevoid_ftime(struct_timeb*timeptr);struct_timebtimebuffer;_ftime(&timebuffer);取當(dāng)前時間:文檔講可以到ms,有人測試,好象只能到16ms!四.設(shè)置計時器定義TIMERID#defineTIMERID_JISUANFANGSHI2在適當(dāng)?shù)牡胤皆O(shè)置時鐘,需要開始其作用的地方;SetTimer(TIMERID_JISUANFANGSHI,200,NULL);在不需要定時器的時候的時候銷毀掉時鐘KillTimer(TIMERID_JISUANFANGSHI);對應(yīng)VC程序的消息映射voidCJisuan::OnTimer(UINTnIDEvent){switch(nIDEvent)}##如何設(shè)定當(dāng)前系統(tǒng)時間windowsSYSTEMTIMEm_myLocalTime,*lpSystemTime;m_myLocalTime.wYear=2003;m_myLocalTime.wM;m_myLocalTime.wDay=1;m_myLocalTime.wHour=0;m_myLocalTime.wMinute=0;m_myLocalTime.wSec;m_myLocalTime.wMillisec;lpSystemTime=&m_myLocalTime;if(SetLocalTime(lpSystemTime))//此處換成SetSystemTime()也不行MessageBox("OK!");elseMessageBox("Error!");SYSTEMTIMEm_myLocalTime,*lpSystemTime;m_myLocalTime.wYear=2003;m_myLocalTime.wM;m_myLocalTime.wDay=1;lpSystemTime=&m_myLocalTime;if(SetDate(lpSystemTime))//此處換成SetSystemTime()也不行MessageBox("OK!");elseMessageBox("Error!");本文來自CSDN博客,轉(zhuǎn)載請標(biāo)明出處:/khuang2008/archive/2008/12/09/3483274.aspx一種制作微秒級精度定時器的方法當(dāng)使用定時器時,在很多情況下只用到毫秒級的時間間隔,所以只需用到下面的兩種常用方式就滿足要求了。一是用SetTimer函數(shù)建立一個定時器后,在程序中通過處理由定時器發(fā)送到線程消息隊列中的WM_TIMER消息,而得到定時的效果(退出程序時別忘了調(diào)用和SetTimer配對使用的KillTimer函數(shù))。二是利用GetTickCount函數(shù)可以返回自計算機(jī)啟動后的時間,通過兩次調(diào)用GetTickCount函數(shù),然后控制它們的差值來取得定時效果,此方式跟第一種方式一樣,精度也是毫秒級的。用這兩種方式取得的定時效果雖然在許多場合已經(jīng)滿足實際的要求,但由于它們的精度只有毫秒級的,而且在要求定時時間間隔小時,實際定時誤差大。下面介紹一種能取得高精度定時的方法。在一些計算機(jī)硬件系統(tǒng)中,包含有高精度運行計數(shù)器(high-resolutionperformancecounter),利用它可以獲得高精度定時間隔,其精度與CPU的時鐘頻率有關(guān)。采用這種方法的步驟如下:1、首先調(diào)用QueryPerformanceFrequency函數(shù)取得高精度運行計數(shù)器的頻率f。單位是每秒多少次(n/s),此數(shù)一般很大。2、在需要定時的代碼的兩端分別調(diào)用QueryPerformanceCounter以取得高精度運行計數(shù)器的數(shù)值n1,n2。兩次數(shù)值的差值通過f換算成時間間隔,t=(n2-n1)/f。下面舉一個例子來演示這種方法的使用及它的精確度。在VC6.0下用MFC建立一個對話框工程,取名為HightTimer.在對話框面板中控件的布局如下圖:其中包含兩個靜態(tài)文本框,兩個編輯框和兩個按紐。上面和下面位置的編輯框的ID分別為IDC_E_TEST和IDC_E_ACTUAL,通過MFCClassWizard添加的成員變量也分別對應(yīng)為DWORDm_dwTest和DWORDm_dwAct.“退出”按紐的ID為IDOK,“開始測試”按紐ID為IDC_B_TEST,用MFCClassWizard添加此按紐的單擊消息處理函數(shù)如下:voidCHightTimerDlg::OnBTest(){//TODO:AddyourcontrolnotificationhandlercodehereUpdateData(TRUE);//取輸入的測試時間值到與編輯框相關(guān)聯(lián)的成員變量m_dwTest中LARGE_INTEGERfrequence;if(!QueryPerformanceFrequency(&frequence))//取高精度運行計數(shù)器的頻率,若硬件不支持則返回FALSEMessageBox("Yourcomputerhardwaredoesn'tsupportthehigh-resolutionperformancecounter","NotSupport",MB_ICONEXCLAMATION|MB_OK);LARGE_INTEGERtest,ret;test.QuadPart=frequence.QuadPart*m_dwTest/1000000;//通過頻率換算微秒數(shù)到對應(yīng)的數(shù)量(與CPU時鐘有關(guān)),1秒=1000000微秒ret=MySleep(test);//調(diào)用此函數(shù)開始延時,返回實際花銷的數(shù)量m_dwAct=(DWORD)(1000000*ret.QuadPart/frequence.QuadPart);//換算到微秒數(shù)UpdateData(FALSE);//顯示到對話框面板}其中上面調(diào)用的MySleep函數(shù)如下:LARGE_INTEGERCHightTimerDlg::MySleep(LARGE_INTEGERInterval)///////////////////////////////////////////////////////////////////////////////////////////////////////////////功能:執(zhí)行實際的延時功能
//參數(shù):Interval參數(shù)為需要執(zhí)行的延時與時間有關(guān)的數(shù)量
//返回值:返回此函數(shù)執(zhí)行后實際所用的時間有關(guān)的數(shù)量
///////////////////////////////////////////////////////////////////////////////////////////////////////////{LARGE_INTEGERprivious,current,Elapse;QueryPerformanceCounter(&privious);current=privious;while(current.QuadPart-privious.QuadPart<Interval.QuadPart)QueryPerformanceCounter(¤t);Elapse.QuadPart=current.QuadPart-privious.QuadPart;returnElapse;}注:別忘了在頭文件中為此函數(shù)添加函數(shù)聲明。至此,可以編譯和執(zhí)行此工程了,結(jié)果如上圖所示。在本人所用的機(jī)上(奔騰366,64M內(nèi)存)測試,當(dāng)測試時間超過3微秒時,準(zhǔn)確度已經(jīng)非常高了,此時機(jī)器執(zhí)行本身延時函數(shù)代碼的時間對需要延時的時間影響很小了。上面的函數(shù)由于演示測試的需要,沒有在函數(shù)級封裝,下面給出的函數(shù)基本上可以以全局函數(shù)的形式照搬到別的程序中。BOOLMySleep(DWORDdwInterval)///////////////////////////////////////////////////////////////////////////////////////////////////////////////功能:執(zhí)行微秒級的延時功能
//參數(shù):Interval參數(shù)為需要的延時數(shù)(單位:微秒)
//返回值:若計算機(jī)硬件不支持此功能,返回FALSE,若函數(shù)執(zhí)行成功,返回TRUE
///////////////////////////////////////////////////////////////////////////////////////////////////////////{BOOLbNormal=TRUE;LARGE_INTEGERfrequence,privious,current,interval;if(!QueryPerformanceFrequency(&frequence)){::MessageBox(NULL,"Yourcomputerhardwaredoesn'tsupportthehigh-resolutionperformancecounter","NotSupport",MB_ICONEXCLAMATION|MB_OK);//或其它的提示信息returnFALSE;}interval.QuadPart=frequence.QuadPart*dwInterval/1000000;bNormal=bNormal&&QueryPerformanceCounter(&privious);current=privious;while(current.QuadPart-privious.QuadPart<interval.QuadPart)bNormal=bNormal&&QueryPerformanceCounter(¤t);returnbNormal;}需要指出的是,由于在此函數(shù)中的代碼很多,機(jī)器在執(zhí)行這些代碼所花費的時間也很長,所以在需要幾個微秒的延時時,會影響精度。實際上,讀者在熟悉這種方法后,只要使用QueryPerformanceFrequency和QueryPerformanceCounter這兩個函數(shù)就能按實際需要寫出自己的延時代碼了。使用CPU時間戳進(jìn)行高精度計時對關(guān)注性能的程序開發(fā)人員而言,一個好的計時部件既是益友,也是良師。計時器既可以作為程序組件幫助程序員精確的控制程序進(jìn)程,又是一件有力的調(diào)試武器,在有經(jīng)驗的程序員手里可以盡快的確定程序的性能瓶頸,或者對不同的算法作出有說服力的性能比較。在Windows平臺下,常用的計時器有兩種,一種是timeGetTime多媒體計時器,它可以提供毫秒級的計時。但這個精度對很多應(yīng)用場合而言還是太粗糙了。另一種是QueryPerformanceCount計數(shù)器,隨系統(tǒng)的不同可以提供微秒級的計數(shù)。對于實時圖形處理、多媒體數(shù)據(jù)流處理、或者實時系統(tǒng)構(gòu)造的程序員,善用QueryPerformanceCount/QueryPerformanceFrequency是一項基本功。本文要介紹的,是另一種直接利用PentiumCPU內(nèi)部時間戳進(jìn)行計時的高精度計時手段。以下討論主要得益于《Windows圖形編程》一書,第15頁-17頁,有興趣的讀者可以直接參考該書。關(guān)于RDTSC指令的詳細(xì)討論,可以參考Intel產(chǎn)品手冊。本文僅僅作拋磚之用。在IntelPentium以上級別的CPU中,有一個稱為“時間戳(TimeStamp)”的部件,它以64位無符號整型數(shù)的格式,記錄了自CPU上電以來所經(jīng)過的時鐘周期數(shù)。由于目前的CPU主頻都非常高,因此這個部件可以達(dá)到納秒級的計時精度。這個精確性是上述兩種方法所無法比擬的。在Pentium以上的CPU中,提供了一條機(jī)器指令RDTSC(ReadTimeStampCounter)來讀取這個時間戳的數(shù)字,并將其保存在EDX:EAX寄存器對中。由于EDX:EAX寄存器對恰好是Win32平臺下C++語言保存函數(shù)返回值的寄存器,所以我們可以把這條指令看成是一個普通的函數(shù)調(diào)用。像這樣:inlineunsigned__int64GetCycleCount(){__asmRDTSC}但是不行,因為RDTSC不被C++的內(nèi)嵌匯編器直接支持,所以我們要用_emit偽指令直接嵌入該指令的機(jī)器碼形式0X0F、0X31,如下:inlineunsigned__int64GetCycleCount()
{
__asm_emit0x0F
__asm_emit0x31
}
以后在需要計數(shù)器的場合,可以像使用普通的Win32API一樣,調(diào)用兩次GetCycleCount函數(shù),比較兩個返回值的差,像這樣:
unsignedlongt;
t=(unsignedlong)GetCycleCount();
//DoSomethingtime-intensive...
t-=(unsignedlong)GetCycleCount();
《Windows圖形編程》第15頁編寫了一個類,把這個計數(shù)器封裝起來。有興趣的讀者可以去參考那個類的代碼。作者為了更精確的定時,做了一點小小的改進(jìn),把執(zhí)行RDTSC指令的時間,通過連續(xù)兩次調(diào)用GetCycleCount函數(shù)計算出來并保存了起來,以后每次計時結(jié)束后,都從實際得到的計數(shù)中減掉這一小段時間,以得到更準(zhǔn)確的計時數(shù)字。但我個人覺得這
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 空房家具租房合同范例
- 合同范例范例含附件
- 應(yīng)急抽水設(shè)備銷售合同范例
- 購冰淇淋合同范例
- 門店項目合同范例
- 代辦房屋過戶服務(wù)合同范例
- 商鋪搬遷轉(zhuǎn)讓合同范例
- 物管費補償合同范例
- 貴州省清潔工合同范例
- 借款代付合同范例
- MOOC 信息安全-復(fù)旦大學(xué) 中國大學(xué)慕課答案
- 2024入團(tuán)積極分子考試題庫答案
- 共情傳播的理論基礎(chǔ)與實踐路徑探索
- 日本企業(yè)文化與禮儀智慧樹知到期末考試答案2024年
- MOOC 古詩的魅力-哈爾濱師范大學(xué) 中國大學(xué)慕課答案
- 七年級期中考試考后分析主題班會課件
- 農(nóng)科大學(xué)生創(chuàng)業(yè)基礎(chǔ)智慧樹知到期末考試答案2024年
- MOOC 電子線路仿真與設(shè)計-南京理工大學(xué)紫金學(xué)院 中國大學(xué)慕課答案
- 企業(yè)社會責(zé)任對消費者購買意愿的影響研究
- 社區(qū)矯正知識課件
- 安環(huán)部經(jīng)理崗位職責(zé)范本
評論
0/150
提交評論