基于PLC的PID恒溫控制系統(tǒng)_第1頁(yè)
基于PLC的PID恒溫控制系統(tǒng)_第2頁(yè)
基于PLC的PID恒溫控制系統(tǒng)_第3頁(yè)
基于PLC的PID恒溫控制系統(tǒng)_第4頁(yè)
基于PLC的PID恒溫控制系統(tǒng)_第5頁(yè)
已閱讀5頁(yè),還剩27頁(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)介

1、四川師范大學(xué)成都學(xué)院電子工程系課程設(shè)計(jì)基于S7-200型PLC的PID恒溫箱控制 學(xué)生姓名范永林學(xué) 號(hào)2008103054所 在 系電子工程系專業(yè)名稱自動(dòng)化班 級(jí)2008級(jí)1班指導(dǎo)教師程 誠(chéng) 段純爽成 績(jī) 四川師范大學(xué)成都學(xué)院二一一年六月四川師范大學(xué)成都學(xué)院電子工程系課程設(shè)計(jì)報(bào)告摘要:本論文闡述了利用PLC模塊通過(guò)數(shù)模轉(zhuǎn)換模塊和溫度檢測(cè)模塊等,并運(yùn)用梯形圖編寫程序,實(shí)現(xiàn)對(duì)液體加熱及對(duì)溫度的保持。本系統(tǒng)的適用性很強(qiáng),穩(wěn)定性、精確性良好,程序開(kāi)發(fā)通俗易懂,可以適應(yīng)農(nóng)業(yè)和工業(yè)生產(chǎn)中恒溫系統(tǒng)的需求。本文主要介紹了恒溫系統(tǒng)的硬件及軟件設(shè)計(jì)方案。關(guān)鍵字:PLC,數(shù)模轉(zhuǎn)換,恒溫系統(tǒng)Abstract: Thi

2、s paper discusses how to use the PLC module through the analog-to-digital conversion module and temperature detection module, and used the ladder-diagram programming, realize the liquid heating and temperature is maintained. This system applicability is very strong, stability, accuracy, good program

3、 development understandable, can adapt to the agricultural production constant temperature that required by the system. This article mainly introduced the constant temperature and the hardware and software of the system design. Key words: PLC、Analog-to-digital、The constant temperature目錄 TOC o 1-3 h

4、z u HYPERLINK l _Toc295936531 前言 PAGEREF _Toc295936531 h 1 HYPERLINK l _Toc295936532 1PLC簡(jiǎn)介 PAGEREF _Toc295936532 h 2 HYPERLINK l _Toc295936533 2PID指令與模擬量控制 PAGEREF _Toc295936533 h 3 HYPERLINK l _Toc295936534 2.1 PID算法 PAGEREF _Toc295936534 h 3 HYPERLINK l _Toc295936535 2.2 PID控制回路選項(xiàng) PAGEREF _Toc295

5、936535 h 3 HYPERLINK l _Toc295936536 2.3 回路輸入量轉(zhuǎn)化和標(biāo)準(zhǔn)化 PAGEREF _Toc295936536 h 4 HYPERLINK l _Toc295936537 2.4 PID回路輸出轉(zhuǎn)換成比例的整數(shù) PAGEREF _Toc295936537 h 4 HYPERLINK l _Toc295936538 3控制方案設(shè)計(jì) PAGEREF _Toc295936538 h 5 HYPERLINK l _Toc295936539 3.1 任務(wù)及器件選型 PAGEREF _Toc295936539 h 5 HYPERLINK l _Toc295936540

6、 3.1.1 任務(wù)要求 PAGEREF _Toc295936540 h 5 HYPERLINK l _Toc295936541 3.1.2 PLC選型 PAGEREF _Toc295936541 h 5 HYPERLINK l _Toc295936542 3.1.3 加熱器件選型 PAGEREF _Toc295936542 h 5 HYPERLINK l _Toc295936543 3.1.4 溫度傳感器選擇 PAGEREF _Toc295936543 h 5 HYPERLINK l _Toc295936544 3.1.5 繼電器選型 PAGEREF _Toc295936544 h 6 HYP

7、ERLINK l _Toc295936545 3.2具體方案 PAGEREF _Toc295936545 h 6 HYPERLINK l _Toc295936546 3.2.1 方案簡(jiǎn)介 PAGEREF _Toc295936546 h 6 HYPERLINK l _Toc295936547 3.2.2地址分配及符號(hào)表 PAGEREF _Toc295936547 h 7 HYPERLINK l _Toc295936548 3.3 放大電路圖 PAGEREF _Toc295936548 h 8 HYPERLINK l _Toc295936549 3.4 流程圖 PAGEREF _Toc295936

8、549 h 8 HYPERLINK l _Toc295936550 3.5 程序梯形圖 PAGEREF _Toc295936550 h 9 HYPERLINK l _Toc295936551 4系統(tǒng)功能 PAGEREF _Toc295936551 h 11 HYPERLINK l _Toc295936552 5設(shè)計(jì)總結(jié) PAGEREF _Toc295936552 h 12 HYPERLINK l _Toc295936553 6參考文獻(xiàn) PAGEREF _Toc295936553 h 12 PAGE 29前言恒溫系統(tǒng)裝置是一個(gè)模擬生產(chǎn)使用恒溫系統(tǒng)。他使用了PLC,數(shù)模轉(zhuǎn)換功能模塊,溫度傳感器,電

9、熱棒等。實(shí)現(xiàn)系統(tǒng)的加熱,以及恒溫保持。使用PID算法可以精確的控制系統(tǒng)溫度。該模擬系統(tǒng)可用于對(duì)室溫的加熱,以及保溫。外面雖然可以買到類似的商品,但是卻不如該系統(tǒng)靈活。隨著經(jīng)濟(jì)的增長(zhǎng),有些農(nóng)業(yè)生產(chǎn)對(duì)溫度的要求相當(dāng)嚴(yán)格,例如,農(nóng)場(chǎng)的養(yǎng)殖場(chǎng)就對(duì)溫度非常講究。據(jù)研究表明禽類不僅對(duì)光照有嚴(yán)格要求,對(duì)溫度更有嚴(yán)格要求,溫度會(huì)下降到15度左右,禽類的產(chǎn)蛋率成明顯下降趨勢(shì),而溫度高于30度左右,禽類的產(chǎn)蛋率同樣受到影響,此時(shí)我們就得嚴(yán)格控制室溫在20-25攝氏度為最佳溫度,才能提高養(yǎng)殖場(chǎng)的經(jīng)濟(jì)效益。該系統(tǒng)主要?jiǎng)澐譃镻LC主模塊,數(shù)模轉(zhuǎn)換功能模塊,溫度監(jiān)控模塊,加熱模塊。主要功能有:PLC模塊將數(shù)據(jù)信號(hào)傳送到功

10、能模塊使之轉(zhuǎn)換成模擬信號(hào)使溫度傳感器工作,溫度傳感器檢測(cè)當(dāng)前系統(tǒng)溫度,轉(zhuǎn)化成模擬電壓信號(hào),然后通過(guò)EM235CN模塊將溫度信號(hào)轉(zhuǎn)化成數(shù)據(jù)信號(hào),從而達(dá)到控制溫度的目的。1PLC簡(jiǎn)介PLC英文全稱Programmable Logic Controller ,中文全稱為可編程邏輯控制器,定義是:一種數(shù)字運(yùn)算操作的電子系統(tǒng),專為在工業(yè)環(huán)境應(yīng)用而設(shè)計(jì)的。它采用一類可編程的存儲(chǔ)器,用于其內(nèi)部存儲(chǔ)程序,執(zhí)行邏輯運(yùn)算,順序控制,定時(shí),計(jì)數(shù)與算術(shù)操作等面向用戶的指令,并通過(guò)數(shù)字或模擬式輸入/輸出控制各種類型的機(jī)械或生產(chǎn)過(guò)程.PLC是可編程邏輯電路,也是一種和硬件結(jié)合很緊密的語(yǔ)言,在半導(dǎo)體方面有很重要的應(yīng)用,可以

11、說(shuō)有半導(dǎo)體的地方就有PLC。PLC是一種專門為在工業(yè)環(huán)境下應(yīng)用而設(shè)計(jì)的數(shù)字運(yùn)算操作的電子裝置。它采用可以編制程序的存儲(chǔ)器,用來(lái)在其內(nèi)部存儲(chǔ)執(zhí)行邏輯運(yùn)算、順序運(yùn)算、計(jì)時(shí)、計(jì)數(shù)和算術(shù)運(yùn)算等操作的指令,并能通過(guò)數(shù)字式或模擬式的輸入和輸出,控制各種類型的機(jī)械或生產(chǎn)過(guò)程。PLC及其有關(guān)的外圍設(shè)備都應(yīng)該按易于與工業(yè)控制系統(tǒng)形成一個(gè)整體,易于擴(kuò)展其功能的原則而設(shè)計(jì)。國(guó)際電工委員會(huì)(IEC)在其標(biāo)準(zhǔn)中將PLC定義為: 可程式邏輯控制器是一種數(shù)位運(yùn)算操作的電子系統(tǒng),專為在工業(yè)環(huán)境應(yīng)用而設(shè)計(jì)的。它采用一類可編程的存儲(chǔ)器,用于其內(nèi)部存儲(chǔ)程序,執(zhí)行邏輯運(yùn)算、順序控制、定時(shí)、計(jì)數(shù)與算術(shù)操作等面向用戶的指令,并通過(guò)數(shù)字或

12、模擬式輸入/輸出控制各種類型的機(jī)械或生產(chǎn)過(guò)程??沙淌竭壿嬁刂破骷捌溆嘘P(guān)外部設(shè)備,都按易于與工業(yè)控制系統(tǒng)聯(lián)成一個(gè)整體,易于擴(kuò)充其功能的原則設(shè)計(jì)。2PID指令與模擬量控制2.1 PID算法典型PID算法包括三項(xiàng):比例項(xiàng)、積分項(xiàng)和微分項(xiàng)。即:輸出=比例項(xiàng)+積分項(xiàng)+微分項(xiàng)計(jì)算機(jī)在周期性地采樣并離散化后進(jìn)行PID運(yùn)算,算法如下:Mn=Kc*(SPn-PVn)+Kc*(Ts/Ti)*(SPn-PVn)+Mx+Kc*(Td/Ts)*(PVn-1-PVn)比例項(xiàng):Kc*(SPn-PVn)積分項(xiàng):Kc*(Ts/Ti)* (SPn-PVn)+Mx微分項(xiàng):Mx+Kc*(Td/Ts)*(PVn-1-PVn)2.2 P

13、ID控制回路選項(xiàng)常用的控制回路有PI、PID。(1)如果不需要積分回路(即在PID算法中無(wú)“I”),則應(yīng)將積分時(shí)間Ti設(shè)為無(wú)窮大。由于積分項(xiàng)Mx的初始值,雖然沒(méi)有積分運(yùn)算,積分項(xiàng)的數(shù)值也可能不為零。(2)如果不需要微分運(yùn)算,則應(yīng)將微分時(shí)間Td設(shè)定為0.02.3 回路輸入量轉(zhuǎn)化和標(biāo)準(zhǔn)化在PLC進(jìn)行PID控制之前,必須將其轉(zhuǎn)換成標(biāo)準(zhǔn)化浮點(diǎn)表示法。(1)將回路輸入量數(shù)值從16位整數(shù)轉(zhuǎn)換成32位浮點(diǎn)數(shù)或?qū)崝?shù)。如下:ITD AIW0 , AC0 /將輸入數(shù)值轉(zhuǎn)化成雙字DTR AC0 ,AC0 /將32位整數(shù)轉(zhuǎn)換成實(shí)數(shù)(2)將實(shí)數(shù)轉(zhuǎn)換成0.0-1.0之間的標(biāo)準(zhǔn)化數(shù)值。/R 32000.0,AC0 /是累加

14、器中數(shù)值標(biāo)準(zhǔn)化+R 0, AC0 /加偏移量0 MOVR AC0, VD100 /將標(biāo)準(zhǔn)化數(shù)值寫入PID回路參數(shù)表中2.4 PID回路輸出轉(zhuǎn)換成比例的整數(shù)程序執(zhí)行后,PID回路輸出0.0-1.0之間的標(biāo)準(zhǔn)化實(shí)數(shù)值,必須被轉(zhuǎn)換成16位成比例整數(shù)數(shù)值,才能驅(qū)動(dòng)模擬輸出。PID回路輸出成比例實(shí)數(shù)數(shù)值=(PID回路輸出標(biāo)準(zhǔn)化實(shí)數(shù)值-偏移量)*取值范圍MOVR VD108,AC0 /將PID回路輸出送入AC0*R 32000.0, AC0 /將實(shí)數(shù)四舍五入取整,變?yōu)?2位整數(shù)DTI AC0,AC0 /32位整數(shù)轉(zhuǎn)換成16位整數(shù)MOVW AC0,AQW0 /16位整數(shù)寫入AQW03控制方案設(shè)計(jì)3.1 任務(wù)

15、及器件選型3.1.1 任務(wù)要求對(duì)恒溫箱進(jìn)行恒溫控制,對(duì)溫度進(jìn)行PID調(diào)節(jié),PID運(yùn)算結(jié)果去控制接通電加熱器或者制冷風(fēng)扇,但由于電加熱器或制冷風(fēng)扇只能為OFF和ON,為開(kāi)關(guān)量,不能接受模擬量調(diào)節(jié),故采用“占空比”的調(diào)節(jié)方法。溫度傳感器檢測(cè)到的溫度值送入PLC后,若經(jīng)過(guò)PID指令運(yùn)算得到一個(gè)0-1的實(shí)數(shù),把該實(shí)數(shù)按比例換算成一個(gè)0100的整數(shù),把該整數(shù)作為一個(gè)范圍為1-10S的時(shí)間。設(shè)計(jì)一個(gè)時(shí)間周期為10S的脈沖,脈沖寬度為,把該脈沖加給電加熱器或制冷風(fēng)扇,即可控制溫度。3.1.2 PLC選型 選用實(shí)驗(yàn)室具備的SIEMENS S7-200 CN(CPU 226)型PLC及EM235CN模塊。3.1

16、.3 加熱器件選型電熱棒的功率考慮到繼電器的成本隨負(fù)載功率的增大而增大應(yīng)盡量選擇小功率的電熱棒3.1.4 溫度傳感器選擇使用Pt100熱敏電阻傳感器。用高純度鉑做電阻導(dǎo)體,具有非常好的線性、高溫穩(wěn)定性和復(fù)現(xiàn)性。在現(xiàn)代工業(yè)生產(chǎn)過(guò)程中具有十分廣泛的應(yīng)用。測(cè)量范圍:-200C+850C允許偏差0.15C3.1.5 繼電器選型選擇驅(qū)動(dòng)電壓為24V的繼電器,負(fù)載考慮到使用電熱棒功率較大,選擇使用10A的負(fù)載避免繼電器被燒壞。3.2具體方案3.2.1 方案簡(jiǎn)介在恒溫箱內(nèi)有一個(gè)加熱元件和一個(gè)制冷風(fēng)扇,電加熱元件和風(fēng)扇的工作狀態(tài)只有OFF和ON,即不能自行調(diào)節(jié),現(xiàn)要使恒溫箱的溫度恒定,且能在25100攝氏度范

17、圍內(nèi)可調(diào)節(jié),如圖所示:3.2.2地址分配及符號(hào)表(1)地址分配:Q1.0:控制接通加熱器;Q1.1:控制接通制冷風(fēng)扇;AIW0:接收溫度傳感器的溫度檢測(cè)值(2)符號(hào)表:符號(hào)地址符號(hào)地址設(shè)定值VD 204微分時(shí)間VD224回路增益VD212控制量輸出VD208采樣時(shí)間VD216檢測(cè)值VD200積分時(shí)間VD2203.3 放大電路圖3.4 流程圖給點(diǎn)溫度T1給點(diǎn)溫度T1溫度檢測(cè)T2=T1?T2T1啟動(dòng)制冷風(fēng)扇T2T1啟動(dòng)加熱裝置溫度恒定在T1相等3.5 程序梯形圖 4系統(tǒng)功能系統(tǒng)開(kāi)始運(yùn)行時(shí),在編程軟件上修改初始設(shè)定溫度T1,T1應(yīng)該比常溫高,例如取T1=50度,電熱棒開(kāi)始加熱,當(dāng)室溫別加熱到50度時(shí)

18、,電熱棒停止加熱。若檢測(cè)溫度高于50度時(shí),啟動(dòng)制冷風(fēng)扇,使溫度下降,保持在T1附近不變;具體過(guò)程是:溫度傳感器檢測(cè)到的溫度值送入PLC后,若經(jīng)過(guò)PID指令運(yùn)算得到一個(gè)0-1的實(shí)數(shù),把該實(shí)數(shù)按比例換算成一個(gè)0100的整數(shù),把該整數(shù)作為一個(gè)范圍為1-10S的時(shí)間。設(shè)計(jì)一個(gè)時(shí)間周期為10S的脈沖,脈沖寬度為,把該脈沖加給電加熱器或制冷風(fēng)扇,即可控制溫度。5設(shè)計(jì)總結(jié)完成本次課程設(shè)計(jì)過(guò)程中遇到很多實(shí)際問(wèn)題,如放大電路的設(shè)計(jì),溫度傳感器的信號(hào)采集電路設(shè)計(jì),都遇到不小問(wèn)題,但在老師的指導(dǎo)下,以及同學(xué)的配合下,這些問(wèn)題都逐一解決,最終使恒溫系統(tǒng),達(dá)到一個(gè)讓大家滿意的效果。通過(guò)本次課程設(shè)計(jì),讓我在實(shí)踐當(dāng)中運(yùn)用了

19、PLC和PID調(diào)節(jié),對(duì)PLC的編程方面,也有所提升;熟悉掌握了溫度傳感器的工作原理,并對(duì)一些電路的設(shè)計(jì)有所了解,相信在以后的學(xué)習(xí)中,這次的經(jīng)驗(yàn)會(huì)帶給我很多啟迪,且為以后工作奠定一定實(shí)踐基礎(chǔ)。6參考文獻(xiàn)1 吳建強(qiáng),可編程序控制器原理及其應(yīng)用M.哈爾濱:哈爾濱工業(yè)大學(xué)出版社,2004.2 陳宇.可編程控制器基礎(chǔ)及編程技巧M.廣州:華南理工大學(xué)出版社,2000. 1.3 魏志精.可編程控制器應(yīng)用技術(shù)M.北京:電子工業(yè)出版社,2003.4 何衍慶,俞金壽.可編程控制器原理及應(yīng)用技巧M.北京:化學(xué)工業(yè)出版社,2007.5 周淵深.可編程控制器應(yīng)用技術(shù)M.北京:化學(xué)工業(yè)出版社,2002.6 黃凈主編.電器

20、及PLC控制技術(shù)M.北京:北京工業(yè)出版社,2005.7 廖常初.可編程控制器應(yīng)用技術(shù)(第6版)M.重慶:重慶大學(xué)出版社,2008.附錄資料:不需要的可以自行刪除C語(yǔ)言中如何獲取時(shí)間?精度如何?1 使用time_t time( time_t * timer ) 精確到秒2 使用clock_t clock() 得到的是CPU時(shí)間精確到1/CLOCKS_PER_SEC秒3 計(jì)算時(shí)間差使用double difftime( time_t timer1, time_t timer0 )4 使用DWORD GetTickCount() 精確到毫秒5 如果使用MFC的CTime類,可以用CTime:GetCu

21、rrentTime() 精確到秒6 要獲取高精度時(shí)間,可以使用BOOL QueryPerformanceFrequency(LARGE_INTEGER *lpFrequency)獲取系統(tǒng)的計(jì)數(shù)器的頻率BOOL QueryPerformanceCounter(LARGE_INTEGER *lpPerformanceCount)獲取計(jì)數(shù)器的值然后用兩次計(jì)數(shù)器的差除以Frequency就得到時(shí)間。7 Multimedia Timer FunctionsThe following functions are used with multimedia timers.timeBeginPeriod/tim

22、eEndPeriod/timeGetDevCaps/timeGetSystemTime/*/用標(biāo)準(zhǔn)C實(shí)現(xiàn)獲取當(dāng)前系統(tǒng)時(shí)間的函數(shù)一.time()函數(shù)time(&rawtime)函數(shù)獲取當(dāng)前時(shí)間距1970年1月1日的秒數(shù),以秒計(jì)數(shù)單位,存于rawtime 中。#include time.hvoid main ()time_t rawtime;struct tm * timeinfo;time ( &rawtime );timeinfo = localtime ( &rawtime );printf ( 007The current date/time is: %s, asctime (timein

23、fo) );exit(0);=#include - 必須的時(shí)間函數(shù)頭文件time_t - 時(shí)間類型(time.h 定義是typedef long time_t; 追根溯源,time_t是long)struct tm - 時(shí)間結(jié)構(gòu),time.h 定義如下:int tm_sec;int tm_min;int tm_hour;int tm_mday;int tm_mon;int tm_year;int tm_wday;int tm_yday;int tm_isdst;time ( &rawtime ); - 獲取時(shí)間,以秒計(jì),從1970年1月一日起算,存于rawtimelocaltime ( &ra

24、wtime ); - 轉(zhuǎn)為當(dāng)?shù)貢r(shí)間,tm 時(shí)間結(jié)構(gòu)asctime ()- 轉(zhuǎn)為標(biāo)準(zhǔn)ASCII時(shí)間格式:星期 月 日 時(shí):分:秒 年二.clock()函數(shù),用clock()函數(shù),得到系統(tǒng)啟動(dòng)以后的毫秒級(jí)時(shí)間,然后除以CLOCKS_PER_SEC,就可以換成“秒”,標(biāo)準(zhǔn)c函數(shù)。clock_t clock ( void );#includeclock_t t = clock();long sec = t / CLOCKS_PER_SEC;他是記錄時(shí)鐘周期的,實(shí)現(xiàn)看來(lái)不會(huì)很精確,需要試驗(yàn)驗(yàn)證;三.gettime(&t); 據(jù)說(shuō)tc2.0的time結(jié)構(gòu)含有毫秒信息#include#includeint

25、main(void)struct time t;gettime(&t);printf(The current time is: -:d:d.dn,t.ti_hour, t.ti_min, t.ti_sec, t.ti_hund);return 0;time 是一個(gè)結(jié)構(gòu)體, 其中成員函數(shù) ti_hund 是毫秒。四.GetTickCount(),這個(gè)是windows里面常用來(lái)計(jì)算程序運(yùn)行時(shí)間的函數(shù);DWORD dwStart = GetTickCount();/這里運(yùn)行你的程序代碼DWORD dwEnd = GetTickCount();則(dwEnd-dwStart)就是你的程序運(yùn)行時(shí)間, 以

26、毫秒為單位這個(gè)函數(shù)只精確到55ms,1個(gè)tick就是55ms。五.timeGetTime()t,imeGetTime()基本等于GetTickCount(),但是精度更高DWORD dwStart = timeGetTime();/這里運(yùn)行你的程序代碼DWORD dwEnd = timeGetTime();則(dwEnd-dwStart)就是你的程序運(yùn)行時(shí)間, 以毫秒為單位雖然返回的值單位應(yīng)該是ms,但傳說(shuō)精度只有10ms。=/*Unix#unix時(shí)間相關(guān),也是標(biāo)準(zhǔn)庫(kù)的/*1.timegm函數(shù)只是將struct tm結(jié)構(gòu)轉(zhuǎn)成time_t結(jié)構(gòu),不使用時(shí)區(qū)信息;time_t timegm(stru

27、ct tm *tm);2.mktime使用時(shí)區(qū)信息time_t mktime(struct tm *tm);timelocal 函數(shù)是GNU擴(kuò)展的與posix函數(shù)mktime相當(dāng)time_t timelocal (struct tm *tm);3.gmtime函數(shù)只是將time_t結(jié)構(gòu)轉(zhuǎn)成struct tm結(jié)構(gòu),不使用時(shí)區(qū)信息;struct tm * gmtime(const time_t *clock);4.localtime使用時(shí)區(qū)信息struct tm * localtime(const time_t *clock);1.time獲取時(shí)間,stime設(shè)置時(shí)間time_t t;t = ti

28、me(&t);2.stime其參數(shù)應(yīng)該是GMT時(shí)間,根據(jù)本地時(shí)區(qū)設(shè)置為本地時(shí)間;int stime(time_t *tp)3.UTC=true 表示采用夏時(shí)制;4.文件的修改時(shí)間等信息全部采用GMT時(shí)間存放,不同的系統(tǒng)在得到修改時(shí)間后通過(guò)localtime轉(zhuǎn)換成本地時(shí)間;5.設(shè)置時(shí)區(qū)推薦使用setup來(lái)設(shè)置;6.設(shè)置時(shí)區(qū)也可以先更變/etc/sysconfig/clock中的設(shè)置再將ln -fs /usr/share/zoneinfo/xxxx/xxx /etc/localtime 才能重效time_t只能表示68年的范圍,即mktime只能返回1970-2038這一段范圍的time_t看看你

29、的系統(tǒng)是否有time_t64,它能表示更大的時(shí)間范圍/*windows#Window里面的一些不一樣的/*一.CTime () 類VC編程一般使用CTime類 獲得當(dāng)前日期和時(shí)間CTime t = GetCurrentTime();SYSTEMTIME 結(jié)構(gòu)包含毫秒信息typedef struct _SYSTEMTIME WORD wYear;WORD wMonth;WORD wDayOfWeek;WORD wDay;WORD wHour;WORD wMinute;WORD wSecond;WORD wMilliseconds; SYSTEMTIME, *PSYSTEMTIME;SYSTEMT

30、IME t1;GetSystemTime(&t1)CTime curTime(t1);WORD ms = t1.wMilliseconds;SYSTEMTIME sysTm;:GetLocalTime(&sysTm);在time.h中的_strtime() /只能在windows中用char t11;_strtime(t);puts(t);/*獲得當(dāng)前日期和時(shí)間CTime tm=CTime:GetCurrentTime();CString str=tm.Format(%Y-%m-%d);在VC中,我們可以借助CTime時(shí)間類,獲取系統(tǒng)當(dāng)前日期,具體使用方法如下:CTime t = CTime:

31、GetCurrentTime(); /獲取系統(tǒng)日期,存儲(chǔ)在t里面int d=t.GetDay(); /獲得當(dāng)前日期int y=t.GetYear(); /獲取當(dāng)前年份int m=t.GetMonth(); /獲取當(dāng)前月份int h=t.GetHour(); /獲取當(dāng)前為幾時(shí)int mm=t.GetMinute(); /獲取當(dāng)前分鐘int s=t.GetSecond(); /獲取當(dāng)前秒int w=t.GetDayOfWeek(); /獲取星期幾,注意1為星期天,7為星期六二.CTimeSpan類如果想計(jì)算兩段時(shí)間的差值,可以使用CTimeSpan類,具體使用方法如下:CTime t1( 1999

32、, 3, 19, 22, 15, 0 );CTime t = CTime:GetCurrentTime();CTimeSpan span=t-t1; /計(jì)算當(dāng)前系統(tǒng)時(shí)間與時(shí)間t1的間隔int iDay=span.GetDays(); /獲取這段時(shí)間間隔共有多少天int iHour=span.GetTotalHours(); /獲取總共有多少小時(shí)int iMin=span.GetTotalMinutes();/獲取總共有多少分鐘int iSec=span.GetTotalSeconds();/獲取總共有多少秒三._timeb()函數(shù)_timeb定義在SYSTIMEB.H,有四個(gè)fieldsdst

33、flagmillitmtimetimezonevoid _ftime( struct _timeb *timeptr );struct _timeb timebuffer;_ftime( &timebuffer );取當(dāng)前時(shí)間:文檔講可以到ms,有人測(cè)試,好象只能到16ms!四.設(shè)置計(jì)時(shí)器定義TIMER ID#define TIMERID_JISUANFANGSHI 2在適當(dāng)?shù)牡胤皆O(shè)置時(shí)鐘,需要開(kāi)始其作用的地方;SetTimer(TIMERID_JISUANFANGSHI,200,NULL);在不需要定時(shí)器的時(shí)候的時(shí)候銷毀掉時(shí)鐘KillTimer(TIMERID_JISUANFANGSHI);

34、對(duì)應(yīng)VC程序的消息映射void CJisuan:OnTimer(UINT nIDEvent)switch(nIDEvent)#如何設(shè)定當(dāng)前系統(tǒng)時(shí)間windowsSYSTEMTIME m_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;i

35、f( SetLocalTime(lpSystemTime) ) /此處換成 SetSystemTime( )也不行MessageBox(OK !);elseMessageBox(Error !);SYSTEMTIME m_myLocalTime,*lpSystemTime;m_myLocalTime.wYear=2003;m_myLocalTime.wM;m_myLocalTime.wDay=1;lpSystemTime=&m_myLocalTime;if( SetDate(lpSystemTime) ) /此處換成 SetSystemTime( )也不行MessageBox(OK !);el

36、seMessageBox(Error !);本文來(lái)自CSDN博客,轉(zhuǎn)載請(qǐng)標(biāo)明出處:HYPERLINK /khuang2008/archive/2008/12/09/3483274.aspx/khuang2008/archive/2008/12/09/3483274.aspx一種制作微秒級(jí)精度定時(shí)器的方法當(dāng)使用定時(shí)器時(shí),在很多情況下只用到毫秒級(jí)的時(shí)間間隔,所以只需用到下面的兩種常用方式就滿足要求了。一是用SetTimer函數(shù)建立一個(gè)定時(shí)器后,在程序中通過(guò)處理由定時(shí)器發(fā)送到線程消息隊(duì)列中的WM_TIMER消息,而得到定時(shí)的效果(退出程序時(shí)別忘了調(diào)用和SetTimer配對(duì)使用的KillTimer函數(shù)

37、)。二是利用GetTickCount函數(shù)可以返回自計(jì)算機(jī)啟動(dòng)后的時(shí)間,通過(guò)兩次調(diào)用GetTickCount函數(shù),然后控制它們的差值來(lái)取得定時(shí)效果,此方式跟第一種方式一樣,精度也是毫秒級(jí)的。用這兩種方式取得的定時(shí)效果雖然在許多場(chǎng)合已經(jīng)滿足實(shí)際的要求,但由于它們的精度只有毫秒級(jí)的,而且在要求定時(shí)時(shí)間間隔小時(shí),實(shí)際定時(shí)誤差大。下面介紹一種能取得高精度定時(shí)的方法。在一些計(jì)算機(jī)硬件系統(tǒng)中,包含有高精度運(yùn)行計(jì)數(shù)器(high-resolution performance counter),利用它可以獲得高精度定時(shí)間隔,其精度與CPU的時(shí)鐘頻率有關(guān)。采用這種方法的步驟如下:1、首先調(diào)用QueryPerform

38、anceFrequency函數(shù)取得高精度運(yùn)行計(jì)數(shù)器的頻率f。單位是每秒多少次(n/s),此數(shù)一般很大。2、在需要定時(shí)的代碼的兩端分別調(diào)用QueryPerformanceCounter以取得高精度運(yùn)行計(jì)數(shù)器的數(shù)值n1,n2。兩次數(shù)值的差值通過(guò)f換算成時(shí)間間隔,t=(n2-n1)/f。下面舉一個(gè)例子來(lái)演示這種方法的使用及它的精確度。在VC 6.0 下用MFC建立一個(gè)對(duì)話框工程,取名為HightTimer.在對(duì)話框面板中控件的布局如下圖:其中包含兩個(gè)靜態(tài)文本框,兩個(gè)編輯框和兩個(gè)按紐。上面和下面位置的編輯框的ID分別為IDC_E_TEST和IDC_E_ACTUAL,通過(guò)MFC ClassWizard添

39、加的成員變量也分別對(duì)應(yīng)為DWORD m_dwTest和DWORD m_dwAct. “退出”按紐的ID為IDOK,“開(kāi)始測(cè)試”按紐ID為IDC_B_TEST,用MFC ClassWizard添加此按紐的單擊消息處理函數(shù)如下:void CHightTimerDlg:OnBTest()/ TODO: Add your control notification handler code hereUpdateData(TRUE); /取輸入的測(cè)試時(shí)間值到與編輯框相關(guān)聯(lián)的成員變量m_dwTest中LARGE_INTEGER frequence;if(!QueryPerformanceFrequency(

40、 &frequence) /取高精度運(yùn)行計(jì)數(shù)器的頻率,若硬件不支持則返回FALSEMessageBox(Your computer hardware doesnt support the high-resolution performance counter,Not Support, MB_ICONEXCLAMATION | MB_OK);LARGE_INTEGER test, ret;test.QuadPart = frequence.QuadPart * m_dwTest / 1000000; /通過(guò)頻率換算微秒數(shù)到對(duì)應(yīng)的數(shù)量(與CPU時(shí)鐘有關(guān)),1秒=1000000微秒ret = MyS

41、leep( test ); /調(diào)用此函數(shù)開(kāi)始延時(shí),返回實(shí)際花銷的數(shù)量m_dwAct = (DWORD)(1000000 * ret.QuadPart / frequence.QuadPart ); /換算到微秒數(shù)UpdateData(FALSE); /顯示到對(duì)話框面板其中上面調(diào)用的MySleep函數(shù)如下:LARGE_INTEGER CHightTimerDlg:MySleep(LARGE_INTEGER Interval)/ 功能:執(zhí)行實(shí)際的延時(shí)功能 / 參數(shù):Interval 參數(shù)為需要執(zhí)行的延時(shí)與時(shí)間有關(guān)的數(shù)量 / 返回值:返回此函數(shù)執(zhí)行后實(shí)際所用的時(shí)間有關(guān)的數(shù)量 / LARGE_INTE

42、GER privious, current, Elapse;QueryPerformanceCounter( &privious );current = privious;while( current.QuadPart - privious.QuadPart Interval.QuadPart )QueryPerformanceCounter( t );Elapse.QuadPart = current.QuadPart - privious.QuadPart;return Elapse;注:別忘了在頭文件中為此函數(shù)添加函數(shù)聲明。至此,可以編譯和執(zhí)行此工程了,結(jié)果如上圖所示。在本人所用的機(jī)上(

43、奔騰366, 64M內(nèi)存)測(cè)試,當(dāng)測(cè)試時(shí)間超過(guò)3微秒時(shí),準(zhǔn)確度已經(jīng)非常高了,此時(shí)機(jī)器執(zhí)行本身延時(shí)函數(shù)代碼的時(shí)間對(duì)需要延時(shí)的時(shí)間影響很小了。上面的函數(shù)由于演示測(cè)試的需要,沒(méi)有在函數(shù)級(jí)封裝,下面給出的函數(shù)基本上可以以全局函數(shù)的形式照搬到別的程序中。BOOL MySleep(DWORD dwInterval)/ 功能:執(zhí)行微秒級(jí)的延時(shí)功能 / 參數(shù):Interval 參數(shù)為需要的延時(shí)數(shù)(單位:微秒) / 返回值:若計(jì)算機(jī)硬件不支持此功能,返回FALSE,若函數(shù)執(zhí)行成功,返回TRUE / BOOL bNormal = TRUE;LARGE_INTEGER frequence, privious, cu

44、rrent, interval;if(!QueryPerformanceFrequency( &frequence):MessageBox(NULL, Your computer hardware doesnt support the high-resolution performance counter,Not Support, MB_ICONEXCLAMATION | MB_OK); /或其它的提示信息return FALSE;interval.QuadPart = frequence.QuadPart * dwInterval / 1000000;bNormal = bNormal &

45、QueryPerformanceCounter( &privious );current = privious;while( current.QuadPart - privious.QuadPart interval.QuadPart )bNormal = bNormal & QueryPerformanceCounter( t );return bNormal;需要指出的是,由于在此函數(shù)中的代碼很多,機(jī)器在執(zhí)行這些代碼所花費(fèi)的時(shí)間也很長(zhǎng),所以在需要幾個(gè)微秒的延時(shí)時(shí),會(huì)影響精度。實(shí)際上,讀者在熟悉這種方法后,只要使用QueryPerformanceFrequency和QueryPerforma

46、nceCounter這兩個(gè)函數(shù)就能按實(shí)際需要寫出自己的延時(shí)代碼了。使用CPU時(shí)間戳進(jìn)行高精度計(jì)時(shí)對(duì)關(guān)注性能的程序開(kāi)發(fā)人員而言,一個(gè)好的計(jì)時(shí)部件既是益友,也是良師。計(jì)時(shí)器既可以作為程序組件幫助程序員精確的控制程序進(jìn)程,又是一件有力的調(diào)試武器,在有經(jīng)驗(yàn)的程序員手里可以盡快的確定程序的性能瓶頸,或者對(duì)不同的算法作出有說(shuō)服力的性能比較。在Windows平臺(tái)下,常用的計(jì)時(shí)器有兩種,一種是timeGetTime多媒體計(jì)時(shí)器,它可以提供毫秒級(jí)的計(jì)時(shí)。但這個(gè)精度對(duì)很多應(yīng)用場(chǎng)合而言還是太粗糙了。另一種是QueryPerformanceCount計(jì)數(shù)器,隨系統(tǒng)的不同可以提供微秒級(jí)的計(jì)數(shù)。對(duì)于實(shí)時(shí)圖形處理、多媒體數(shù)

47、據(jù)流處理、或者實(shí)時(shí)系統(tǒng)構(gòu)造的程序員,善用QueryPerformanceCount/QueryPerformanceFrequency是一項(xiàng)基本功。本文要介紹的,是另一種直接利用Pentium CPU內(nèi)部時(shí)間戳進(jìn)行計(jì)時(shí)的高精度計(jì)時(shí)手段。以下討論主要得益于Windows圖形編程一書,第15頁(yè)17頁(yè),有興趣的讀者可以直接參考該書。關(guān)于RDTSC指令的詳細(xì)討論,可以參考Intel產(chǎn)品手冊(cè)。本文僅僅作拋磚之用。在Intel Pentium以上級(jí)別的CPU中,有一個(gè)稱為“時(shí)間戳(Time Stamp)”的部件,它以64位無(wú)符號(hào)整型數(shù)的格式,記錄了自CPU上電以來(lái)所經(jīng)過(guò)的時(shí)鐘周期數(shù)。由于目前的CPU主頻都

48、非常高,因此這個(gè)部件可以達(dá)到納秒級(jí)的計(jì)時(shí)精度。這個(gè)精確性是上述兩種方法所無(wú)法比擬的。在Pentium以上的CPU中,提供了一條機(jī)器指令RDTSC(Read Time Stamp Counter)來(lái)讀取這個(gè)時(shí)間戳的數(shù)字,并將其保存在EDX:EAX寄存器對(duì)中。由于EDX:EAX寄存器對(duì)恰好是Win32平臺(tái)下C+語(yǔ)言保存函數(shù)返回值的寄存器,所以我們可以把這條指令看成是一個(gè)普通的函數(shù)調(diào)用。像這樣:inline unsigned _int64 GetCycleCount() _asm RDTSC 但是不行,因?yàn)镽DTSC不被C+的內(nèi)嵌匯編器直接支持,所以我們要用_emit偽指令直接嵌入該指令的機(jī)器碼形式

49、0X0F、0X31,如下:inline unsigned _int64 GetCycleCount() _asm _emit 0 x0F _asm _emit 0 x31 以后在需要計(jì)數(shù)器的場(chǎng)合,可以像使用普通的Win32 API一樣,調(diào)用兩次GetCycleCount函數(shù),比較兩個(gè)返回值的差,像這樣: unsigned long t; t = (unsigned long)GetCycleCount(); /Do Something time-intensive . t -= (unsigned long)GetCycleCount(); Windows圖形編程第15頁(yè)編寫了一個(gè)類,把這個(gè)計(jì)

50、數(shù)器封裝起來(lái)。有興趣的讀者可以去參考那個(gè)類的代碼。作者為了更精確的定時(shí),做了一點(diǎn)小小的改進(jìn),把執(zhí)行RDTSC指令的時(shí)間,通過(guò)連續(xù)兩次調(diào)用GetCycleCount函數(shù)計(jì)算出來(lái)并保存了起來(lái),以后每次計(jì)時(shí)結(jié)束后,都從實(shí)際得到的計(jì)數(shù)中減掉這一小段時(shí)間,以得到更準(zhǔn)確的計(jì)時(shí)數(shù)字。但我個(gè)人覺(jué)得這一點(diǎn)點(diǎn)改進(jìn)意義不大。在我的機(jī)器上實(shí)測(cè),這條指令大概花掉了幾十到100多個(gè)周期,在Celeron 800MHz的機(jī)器上,這不過(guò)是十分之一微秒的時(shí)間。對(duì)大多數(shù)應(yīng)用來(lái)說(shuō),這點(diǎn)時(shí)間完全可以忽略不計(jì);而對(duì)那些確實(shí)要精確到納秒數(shù)量級(jí)的應(yīng)用來(lái)說(shuō),這個(gè)補(bǔ)償也過(guò)于粗糙了。 這個(gè)方法的優(yōu)點(diǎn)是: 1.高精度??梢灾苯舆_(dá)到納秒級(jí)的計(jì)時(shí)精度

51、(在1GHz的CPU上每個(gè)時(shí)鐘周期就是一納秒),這是其他計(jì)時(shí)方法所難以企及的。 2.成本低。timeGetTime 函數(shù)需要鏈接多媒體庫(kù)winmm.lib,QueryPerformance* 函數(shù)根據(jù)MSDN的說(shuō)明,需要硬件的支持(雖然我還沒(méi)有見(jiàn)過(guò)不支持的機(jī)器)和KERNEL庫(kù)的支持,所以二者都只能在Windows平臺(tái)下使用(關(guān)于DOS平臺(tái)下的高精度計(jì)時(shí)問(wèn)題,可以參考圖形程序開(kāi)發(fā)人員指南,里面有關(guān)于控制定時(shí)器8253的詳細(xì)說(shuō)明)。但RDTSC指令是一條CPU指令,凡是i386平臺(tái)下Pentium以上的機(jī)器均支持,甚至沒(méi)有平臺(tái)的限制(我相信i386版本UNIX和Linux下這個(gè)方法同樣適用,但沒(méi)有條件試驗(yàn)),而且函數(shù)調(diào)用的開(kāi)銷是最小的。 3.具有和CPU主頻直接對(duì)應(yīng)的速率關(guān)系。一個(gè)計(jì)數(shù)相當(dāng)于1/(CPU主頻Hz數(shù))秒,這樣只要知道了CPU的主頻,可以直接計(jì)算出時(shí)間。這和QueryPerformanceCount不同,后者需要通過(guò)QueryPerformanceFrequency獲取當(dāng)前計(jì)數(shù)器每秒的計(jì)數(shù)次數(shù)才能換算成時(shí)間。 這個(gè)方法的缺點(diǎn)是: 1.現(xiàn)

溫馨提示

  • 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)論