基于plc實現(xiàn)三相異步電動機七段速調(diào)速實驗_第1頁
基于plc實現(xiàn)三相異步電動機七段速調(diào)速實驗_第2頁
基于plc實現(xiàn)三相異步電動機七段速調(diào)速實驗_第3頁
基于plc實現(xiàn)三相異步電動機七段速調(diào)速實驗_第4頁
基于plc實現(xiàn)三相異步電動機七段速調(diào)速實驗_第5頁
已閱讀5頁,還剩23頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、PAGE PAGE 28基于PLC實現(xiàn)的三相異步電動機七段速調(diào)速實驗 學(xué)院: 專業(yè): 學(xué)號: 姓名: 引言三相異步電動機的應(yīng)用非常廣泛,具有機構(gòu)簡單,效率高,控制方便,運行可靠,易于維修成本低的有點,幾乎涵蓋了工農(nóng)業(yè)生產(chǎn)和人類生活的各個領(lǐng)域,在這些應(yīng)用領(lǐng)域中,三相異步電動機運行的環(huán)境不同,所以造成其故障的發(fā)生也很頻繁,所以要正確合理的利用它。要合理的控制它。這個系統(tǒng)的控制是采用PLC的編程語言梯形圖,梯形語言是在可編程控制器中的應(yīng)用最廣的語言,因為它在繼電器的基礎(chǔ)上加進了許多功能,使用靈活的指令,使邏輯關(guān)系清晰直觀,編程容易,可讀性強,所實現(xiàn)的功能也大大超過傳統(tǒng)的繼電器控制電路,可編程控制器是

2、一種數(shù)字運算操作的電子系統(tǒng),它是專為在惡劣工業(yè)環(huán)境下應(yīng)用而設(shè)計,它采用可編程序的存儲器,用來在內(nèi)部存儲執(zhí)行邏輯運算,順序控制,定時,計數(shù)和算術(shù)等操作的指令,并采用數(shù)字式,模擬式的輸入和輸出,控制各種的機械或生產(chǎn)過程。長期以來,PLC始終處于工業(yè)自動化控制領(lǐng)域的主戰(zhàn)場,為各種各樣的自動化設(shè)備提供了非常可靠的控制應(yīng)用,它能夠為自動化控制應(yīng)用提供安全可靠和比較完善的解決方案,適合于當前工業(yè),企業(yè)對自動化的需要。進入20世紀80年代,由于計算機技術(shù)和微電子技術(shù)的迅猛發(fā)展,極大地推動了PLC的發(fā)展,使得PLC的功能日益增強,目前,在先進國家中,PLC已成為工業(yè)控制的標準設(shè)備,應(yīng)用面幾乎覆蓋了所有工業(yè),企

3、業(yè)。由于PLC綜合了計算機和自動化技術(shù),所以它發(fā)展日新月異,大大超過其出現(xiàn)時的技術(shù)水平,它不但可以很容易的完成邏輯,順序,定時,計數(shù),數(shù)字運算,數(shù)據(jù)處理等功能,而且可以通過輸入輸出接口建立與各類生產(chǎn)機械數(shù)字量和模擬量的聯(lián)系,從而實現(xiàn)生產(chǎn)過程的自動化控制。特別是超大規(guī)模集成電路的迅速發(fā)展以及信息,網(wǎng)絡(luò)時代的到來,擴展了PLC的功能,使它具有很強的聯(lián)網(wǎng)通訊能力,從而更廣泛的運用于眾多行業(yè)。一、實驗名稱:基于PLC實現(xiàn)的三相異步電動機七段調(diào)速實驗二、實驗?zāi)康模?. 通過電動機變頻調(diào)速控制系統(tǒng)實驗,進一步了解可編程控制器在電動機變頻調(diào)速控制中的應(yīng)用。2. 通過系統(tǒng)設(shè)計,進一步了解PLC、變頻器及編碼器

4、之間的配合關(guān)系。3. 通過實驗線路的設(shè)計,實際操作,使理論與實際相結(jié)合,增加感性認識,使書本知識更加鞏固。4. 培養(yǎng)動手能力,增強對可編程控制器運用的能力。5. 培養(yǎng)分析,查找故障的能力。6. 增加對可編程控制器外圍電路的認識。三、實驗器件:220V PLC實驗臺一套、380V變頻器實驗臺一套、三相電動機一臺(Nr=1400r/min,p=2)、光電編碼器一個(864p/r)、萬用表一個、導(dǎo)線若干。四、實驗原理:1.實驗原理圖:2.實驗原理:通過光電編碼器將電動機的轉(zhuǎn)速采集出來并送入PLC中,通過實驗程序?qū)⒉杉降男畔⑴cDM3X(加速)/DM4X(減速)區(qū)的設(shè)定值進行比較,當頻率滿足設(shè)定值時用

5、PLC控制變頻器(變頻器工作在端子調(diào)速模式下),電動機停止加速,保持勻速5S,5S后PLC控制變頻器加速端子繼續(xù)加速。從而實現(xiàn)完成七段速逐段加速。以15HZ為基準加速頻率上限為45Hz(可以根據(jù)具體情況設(shè)定),并在最高段速保持10s,此后電機開始減速,當?shù)竭_設(shè)定的頻率時,PLC控制變頻器停止加速,保持勻速5S,5S后PLC控制變頻器減速端子繼續(xù)減速;反轉(zhuǎn)的運動過程與正轉(zhuǎn)正轉(zhuǎn)過程相似。實驗速度曲線如下圖:五、實驗相關(guān)器件特點:1.歐姆龍CPM2AH:CPM2A在一個小巧的單元內(nèi)綜合有各種性能,包括同步脈沖控制,中斷輸入,脈沖輸出,模擬量設(shè)定,和時鐘功能等。CPM2A CPU單元又是一個獨立單元,

6、能處理廣泛的機械控制應(yīng)用,所以它是在設(shè)備內(nèi)用作內(nèi)裝控制單元的理想產(chǎn)品,完整的通信功能保證了與個人計算機、其它OMRON PC和OMRON可編程終端的通信。這些通信能力使用戶能設(shè)計一個經(jīng)濟的分布生產(chǎn)系統(tǒng)。CPM2A計有五個高速計數(shù)器輸入。一個響應(yīng)頻率為20 kHz/5 kHz的高速計數(shù)器輸入,與四個響應(yīng)頻率為2 kHz的高速計數(shù)器輸入(在計數(shù)器方式下)。高速計數(shù)器可以用在四種輸入方式中的任一種下;微分相位方式(5 kHz),脈沖+方向輸入方式(20 kHz),增/減脈沖方式(20 kHz),或遞增方式(20 kHz)。當計數(shù)與一設(shè)置值匹配或下降在一規(guī)定范圍內(nèi)時,能觸發(fā)中斷。中斷輸入(計數(shù)器方式)

7、可用遞增計數(shù)器或遞減計數(shù)器(2 kHz)并在計數(shù)與目標值匹配時觸發(fā)中斷(執(zhí)行中斷程序)。2.光電編碼器:光電編碼器,是一種通過光電轉(zhuǎn)換將輸出軸上的機械幾何位移量轉(zhuǎn)換成脈沖或數(shù)字量的傳感器。這是目前應(yīng)用最多的傳感器, 光電編碼器是由光柵盤和光電檢測裝置組成。光柵盤是在一定直徑的圓板上等分地開通若干個長方形孔。由于光電碼盤與電動機同軸,電動機旋轉(zhuǎn)時,光柵盤與電動機同速旋轉(zhuǎn),經(jīng)發(fā)光二極管等電子元件組成的檢測裝置檢測輸出若干脈沖信號,通過計算每秒光電編碼器輸出脈沖的個數(shù)就能反映當前電動機的轉(zhuǎn)速。此外,為判斷旋轉(zhuǎn)方向,碼盤還可提供相位相差90的兩路脈沖信號。3.變頻器:()變頻器可以分為四個部分。通用變

8、頻器由主電路和控制回路組成。給異步電動機提供調(diào)壓調(diào)頻電源的電力變換部分,稱為主電路。主電路包括整流器、中間直流環(huán)節(jié)(又稱平波回路)、逆變器。 = 1 * GB2 整流器。它的作用是把工頻電源變換成直流電源。 = 2 * GB2 平波回路(中間直流環(huán)節(jié))。由于逆變器的負載為異步電動機,屬于感性負載。無論電動機處于電動狀態(tài)還是發(fā)電狀態(tài),起始功率因數(shù)總不會等于1。因此,在中間直流環(huán)節(jié)和電動機之間總會有無功功率的交換,這種無功能量要靠中間直流環(huán)節(jié)的儲能元件電容器或電感器來緩沖,所以中間直流環(huán)節(jié)實際上是中間儲能環(huán)節(jié)。 = 3 * GB2 逆變器。與整流器的作用相反,逆變器是將直流功率變換為所要求頻率的交

9、流功率。逆變器的結(jié)構(gòu)形式是利用6個半導(dǎo)體開關(guān)器件組成的三相橋式逆變器電路。通過有規(guī)律的控制逆變器中主開關(guān)的導(dǎo)通和斷開,可以得到任意頻率的三相交流輸出波形。 = 4 * GB2 控制回路??刂苹芈烦S蛇\算電路,檢測電路,控制信號的輸入、輸出電路,驅(qū)動電路和制動電路等構(gòu)成。其主要任務(wù)是完成對逆變器的開關(guān)控制,對整流器的電壓控制,以及完成各種保護功能??刂品绞接心M控制或數(shù)字控。六、各器件參數(shù)設(shè)置:1.變頻器參數(shù)設(shè)置:端口設(shè)定值功能端口設(shè)定值功能F2001啟動方式:端子控制F41114(OP4)反轉(zhuǎn)F2021停止方式:端子控制F41211(OP5)增速F2042端子調(diào)速控制F41312(OP6)減速

10、F2062正反轉(zhuǎn)端子脈沖給定方向F4147(OP7)停止F4096(OP2)運行F41013(OP3)正轉(zhuǎn)2.內(nèi)部寄存器參數(shù)設(shè)置:內(nèi)部端口設(shè)定值(十六進制)內(nèi)部端口設(shè)定值(十六進制)DM300242DM410790DM310336DM410730DM320420DM420650DM330504DM430560DM340588DM440470DM350672DM450370DM360770DM46 0270DM66421142DM66420003高速計數(shù)器模式0:微分相位模式(5kHz)1:脈沖方向輸入模式(20kHz)2:增/減輸入模式(20kHz);4:增量模式(20kHz)0407高速計數(shù)

11、器復(fù)位模式0:Z相和軟件復(fù)位;1:僅軟件復(fù)位08150:Z相和軟件復(fù)位;1:僅軟件復(fù)位00:不使用任意功能;01:作為高速計數(shù)器使用;02:作為同步脈沖控制使用(10500Hz)03:作為同步脈沖控制使用(201kHz)04:作為同步脈沖控制使用(30020kHz)3.編碼器接口:顏色接口棕色24V電源“+”藍色24V電源“-”黑色(A)0.00白色(B)0.01橙色(C)0.024.PLC端口配置:端口功能端口功能003正轉(zhuǎn)1103反轉(zhuǎn)004停止1004加速005反轉(zhuǎn)1005減速006加速1006停止007減速1102正轉(zhuǎn)1101運行七、實驗結(jié)論:按照原理圖接好線經(jīng)檢查無誤后,上電下載編好的

12、程序,并在編程模式下,打開PLC的內(nèi)存,在DM數(shù)據(jù)區(qū)從DM30DM36依次寫入0242、0336、0420、0504、0588、0672、0770七個加速比較的十六進制數(shù)據(jù),DM40DM46依次寫入0780、0730、0650、0560、0470、0370、0270七個減速比較的十六進制數(shù)據(jù),并在DM6642 數(shù)據(jù)區(qū)寫入0112,設(shè)置高速計數(shù)器工作模式。之后保存并在線傳送到PLC,再將PLC切換到運行模式。按下正轉(zhuǎn)按鈕后,變頻器啟動運行電動機正轉(zhuǎn)加速,頻率達到每一個階梯后延時5秒再加速,在45Hz左右后,開始減速,減速到停止;反轉(zhuǎn)類似于正轉(zhuǎn)。當按下停止按鈕后,變頻器停止工作電機停止轉(zhuǎn)動。電機勻

13、速的頻率為:5.42Hz、14.89Hz、25.04Hz、35.26Hz、46.03Hz。比較接近預(yù)期值,符合實驗要求。力控PLC變頻器監(jiān)控平臺I/O設(shè)備組態(tài)(采用host link協(xié)議)2、力控數(shù)據(jù)庫組態(tài)器件定義關(guān)聯(lián)點器件定義關(guān)聯(lián)點正傳按鈕20600二段指示20701反轉(zhuǎn)按鈕20601三段指示20702停止按鈕20602四段指示20703加速按鈕20603五段指示20704減速按鈕20604六段指示20705減速指示20006七段指示20706運行指示20108增速指示20603一段指示207003、監(jiān)控平臺4、運行結(jié)果圖 圖1 加速過程 圖2 減速過程九、程序流程圖及程序清單,流程圖梯形圖

14、程序變頻器調(diào)速程序清單LD P_On變頻器調(diào)速程序清單OUT 200.00LD 200.00ANDNOT TIM000TIM 000 #1LD TIM000PRV(62) 0 0 DM0LDNOT TIM000DIFU(13) 200.01LD 200.01OUT 252.00LD 200.10OR 203.07OR 200.08ANDNOT 200.03ANDNOT 203.00OUT 203.07LD 200.00OUT TR0AND 203.07CMP(20) DM30 DM0LD TR0LD P_LTOR P_EQANDLDOUT 201.00LD 201.00OR 203.00AND

15、NOT 200.03ANDNOT 203.01OUT 203.00LD 203.00OR 204.05OUT 208.00LD 203.01OR 204.04OUT 208.01LD 203.02OR 204.03OUT 208.02LD 203.03OR 204.02OUT 208.03LD 203.04OR 204.01OUT 208.04LD 203.05OR 204.00OUT 208.05LD 200.00OUT TR0AND 203.00CMP(20) DM31 DM0LD TR0LD P_LTOR P_EQANDLDOUT 201.01LD 201.01OR 203.01ANDN

16、OT 200.03ANDNOT 203.02OUT 203.01LD 200.00OUT TR0AND 203.01CMP(20) DM32 DM0LD TR0LD P_LTOR P_EQANDLDOUT 201.02LD 201.02OR 203.02ANDNOT 200.03ANDNOT 203.03OUT 203.02LD 200.00OUT TR0AND 203.02CMP(20) DM33 DM0LD TR0LD P_LTOR P_EQANDLDOUT 201.03LD 201.03OR 203.03ANDNOT 200.03ANDNOT 203.04OUT 203.03LD 200

17、.00OUT TR0AND 203.03CMP(20) DM34 DM0LD TR0LD P_LTOR P_EQANDLDOUT 201.04LD 201.04OR 203.04ANDNOT 200.03ANDNOT 203.05OUT 203.04LD 200.00OUT TR0AND 203.04CMP(20) DM35 DM0LD TR0LD P_LTOR P_EQANDLDOUT 201.05LD 201.05OR 203.05ANDNOT 200.03ANDNOT 203.06OUT 203.05LD 200.00OUT TR0AND 203.05CMP(20) DM36 DM0LD

18、 TR0LD P_LTOR P_EQANDLDOUT 201.06LD 201.06OR 203.06ANDNOT TIM004ANDNOT 200.03OUT 203.06LD 203.06TIM 004 #100LD 201.00OR 201.01OR 201.02OR 201.03OR 201.04OR 201.05OR 201.10ANDNOT TIM001OUT 201.10LD 0.03OR 206.00OUT 200.10LD 200.10OR 201.08OR 200.08ANDNOT 200.03OUT 201.08LD 201.08OUT 11.01LD 0.07OR 20

19、6.02OUT 200.03LD 200.03OUT 10.06LD 200.10OR 200.04ANDNOT 200.03ANDNOT 200.09OUT 200.04LD 200.04OUT 11.02LD 200.04OR 200.09ANDNOT 200.05ANDNOT 203.06ANDNOT 210.00OUT 10.04OUT 206.03LD 201.10OR 201.12OR 200.05ANDNOT TIM001OUT 200.05LD 200.05TIM 001 #50LD TIM004OR 210.00ANDNOT 200.03OUT 210.00LD TIM004

20、OR 210.01ANDNOT 204.00ANDNOT 200.03OUT 210.01LD 210.00OUT TR0AND 210.01CMP(20) DM40 DM0LD TR0LD P_GTOR P_EQANDLDOUT 202.00LD TR0AND P_LTOUT 205.00LD 202.00OR 204.00ANDNOT 200.03ANDNOT 204.01OUT 204.00LD 210.00OUT TR0AND 204.00CMP(20) DM41 DM0LD TR0LD P_GTOR P_EQANDLDOUT 202.01LD TR0AND P_LTOUT 205.0

21、1LD 202.01OR 204.01ANDNOT 200.03ANDNOT 204.02OUT 204.01LD 210.00OUT TR0AND 204.01CMP(20) DM42 DM0LD TR0LD P_GTOR P_EQANDLDOUT 202.02LD TR0AND P_LTOUT 205.02LD 202.02OR 204.02ANDNOT 200.03ANDNOT 204.03OUT 204.02LD 210.00OUT TR0AND 204.02CMP(20) DM43 DM0LD TR0LD P_GTOR P_EQANDLDOUT 202.03LD TR0AND P_L

22、TOUT 205.03LD 202.03OR 204.03ANDNOT 200.03ANDNOT 204.04OUT 204.03LD 210.00OUT TR0AND 204.03CMP(20) DM44 DM0LD TR0LD P_GTOR P_EQANDLDOUT 202.04LD TR0AND P_LTOUT 205.04LD 202.04OR 204.04ANDNOT 200.03ANDNOT 204.05OUT 204.04LD 210.00OUT TR0AND 204.04CMP(20) DM45 DM0LD TR0LD P_GTOR P_EQANDLDOUT 202.05LD

23、TR0AND P_LTOUT 205.05LD 202.05OR 204.05ANDNOT 200.03ANDNOT 204.06OUT 204.05LD 210.00OUT TR0AND 204.05CMP(20) DM46 DM0LD TR0LD P_GTOR P_EQANDLDOUT 202.06LD TR0AND P_LTOUT 205.06LD 202.06OR 204.06ANDNOT 200.03ANDNOT TIM005OUT 204.06LD 204.06TIM 005 #50LD 202.01OR 202.02OR 202.03OR 202.04OR 202.05OR 20

24、1.12ANDNOT TIM002ANDNOT 200.03OUT 201.12LD 201.12TIM 002 #50LD TIM002OR 200.06OR TIM004OR 205.00OR 205.02OR 205.01OR 205.03OR 205.04OR 205.05OR TIM005OR 205.06ANDNOT 200.03ANDNOT 200.05ANDNOT 202.06OUT 200.06LD 200.06ANDNOT 200.05OUT 10.05OUT 206.04LD 0.06OR 206.01ANDNOT 200.03OUT 200.08LD 200.08OR

25、200.09ANDNOT 200.04ANDNOT 200.03OUT 200.09LD 200.09OUT 11.03END(01)附錄資料:不需要的可以自行刪除C語言中如何獲取時間?精度如何?1 使用time_t time( time_t * timer ) 精確到秒2 使用clock_t clock() 得到的是CPU時間精確到1/CLOCKS_PER_SEC秒3 計算時間差使用double difftime( time_t timer1, time_t timer0 )4 使用DWORD GetTickCount() 精確到毫秒5 如果使用MFC的CTime類,可以用CTime:Get

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

27、imeEndPeriod/timeGetDevCaps/timeGetSystemTime/*/用標準C實現(xiàn)獲取當前系統(tǒng)時間的函數(shù)一.time()函數(shù)time(&rawtime)函數(shù)獲取當前時間距1970年1月1日的秒數(shù),以秒計數(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 (time

28、info) );exit(0);=#include - 必須的時間函數(shù)頭文件time_t - 時間類型(time.h 定義是typedef long time_t; 追根溯源,time_t是long)struct tm - 時間結(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 ); - 獲取時間,以秒計,從1970年1月一日起算,存于rawtimelocaltime ( &

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

30、t 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 是一個結(jié)構(gòu)體, 其中成員函數(shù) ti_hund 是毫秒。四.GetTickCount(),這個是windows里面常用來計算程序運行時間的函數(shù);DWORD dwStart = GetTickCount();/這里運行你的程序代碼DWORD dwEnd = GetTickCount();則(dwEnd-dwStart)就是你的程序運行時間,

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

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

33、time(&t);2.stime其參數(shù)應(yīng)該是GMT時間,根據(jù)本地時區(qū)設(shè)置為本地時間;int stime(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看

34、看你的系統(tǒng)是否有time_t64,它能表示更大的時間范圍/*windows#Window里面的一些不一樣的/*一.CTime () 類VC編程一般使用CTime類 獲得當前日期和時間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;SYSTE

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

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

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

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

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

40、;if( 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 !);

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

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

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

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

45、y( &frequence) /取高精度運行計數(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; /通過頻率換算微秒數(shù)到對應(yīng)的數(shù)量(與CPU時鐘有關(guān)),1秒=1000000微秒ret = M

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

47、TEGER 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é)果如上圖所示。在本人所用的機

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

49、current, 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

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

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

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

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

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

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

56、精度(在1GHz的CPU上每個時鐘周期就是一納秒),這是其他計時方法所難以企及的。 2.成本低。timeGetTime 函數(shù)需要鏈接多媒體庫winmm.lib,QueryPerformance* 函數(shù)根據(jù)MSDN的說明,需要硬件的支持(雖然我還沒有見過不支持的機器)和KERNEL庫的支持,所以二者都只能在Windows平臺下使用(關(guān)于DOS平臺下的高精度計時問題,可以參考圖形程序開發(fā)人員指南,里面有關(guān)于控制定時器8253的詳細說明)。但RDTSC指令是一條CPU指令,凡是i386平臺下Pentium以上的機器均支持,甚至沒有平臺的限制(我相信i386版本UNIX和Linux下這個方法同樣適用,但沒有條件試驗),而且函數(shù)調(diào)用的開銷是最小的。 3.具有和CPU

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論