版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、PAGE PAGE 28基于PLC實(shí)現(xiàn)的三相異步電動(dòng)機(jī)七段速調(diào)速實(shí)驗(yàn) 學(xué)院: 專業(yè): 學(xué)號(hào): 姓名: 引言三相異步電動(dòng)機(jī)的應(yīng)用非常廣泛,具有機(jī)構(gòu)簡(jiǎn)單,效率高,控制方便,運(yùn)行可靠,易于維修成本低的有點(diǎn),幾乎涵蓋了工農(nóng)業(yè)生產(chǎn)和人類生活的各個(gè)領(lǐng)域,在這些應(yīng)用領(lǐng)域中,三相異步電動(dòng)機(jī)運(yùn)行的環(huán)境不同,所以造成其故障的發(fā)生也很頻繁,所以要正確合理的利用它。要合理的控制它。這個(gè)系統(tǒng)的控制是采用PLC的編程語(yǔ)言梯形圖,梯形語(yǔ)言是在可編程控制器中的應(yīng)用最廣的語(yǔ)言,因?yàn)樗诶^電器的基礎(chǔ)上加進(jìn)了許多功能,使用靈活的指令,使邏輯關(guān)系清晰直觀,編程容易,可讀性強(qiáng),所實(shí)現(xiàn)的功能也大大超過(guò)傳統(tǒng)的繼電器控制電路,可編程控制器是
2、一種數(shù)字運(yùn)算操作的電子系統(tǒng),它是專為在惡劣工業(yè)環(huán)境下應(yīng)用而設(shè)計(jì),它采用可編程序的存儲(chǔ)器,用來(lái)在內(nèi)部存儲(chǔ)執(zhí)行邏輯運(yùn)算,順序控制,定時(shí),計(jì)數(shù)和算術(shù)等操作的指令,并采用數(shù)字式,模擬式的輸入和輸出,控制各種的機(jī)械或生產(chǎn)過(guò)程。長(zhǎng)期以來(lái),PLC始終處于工業(yè)自動(dòng)化控制領(lǐng)域的主戰(zhàn)場(chǎng),為各種各樣的自動(dòng)化設(shè)備提供了非常可靠的控制應(yīng)用,它能夠?yàn)樽詣?dòng)化控制應(yīng)用提供安全可靠和比較完善的解決方案,適合于當(dāng)前工業(yè),企業(yè)對(duì)自動(dòng)化的需要。進(jìn)入20世紀(jì)80年代,由于計(jì)算機(jī)技術(shù)和微電子技術(shù)的迅猛發(fā)展,極大地推動(dòng)了PLC的發(fā)展,使得PLC的功能日益增強(qiáng),目前,在先進(jìn)國(guó)家中,PLC已成為工業(yè)控制的標(biāo)準(zhǔn)設(shè)備,應(yīng)用面幾乎覆蓋了所有工業(yè),企
3、業(yè)。由于PLC綜合了計(jì)算機(jī)和自動(dòng)化技術(shù),所以它發(fā)展日新月異,大大超過(guò)其出現(xiàn)時(shí)的技術(shù)水平,它不但可以很容易的完成邏輯,順序,定時(shí),計(jì)數(shù),數(shù)字運(yùn)算,數(shù)據(jù)處理等功能,而且可以通過(guò)輸入輸出接口建立與各類生產(chǎn)機(jī)械數(shù)字量和模擬量的聯(lián)系,從而實(shí)現(xiàn)生產(chǎn)過(guò)程的自動(dòng)化控制。特別是超大規(guī)模集成電路的迅速發(fā)展以及信息,網(wǎng)絡(luò)時(shí)代的到來(lái),擴(kuò)展了PLC的功能,使它具有很強(qiáng)的聯(lián)網(wǎng)通訊能力,從而更廣泛的運(yùn)用于眾多行業(yè)。一、實(shí)驗(yàn)名稱:基于PLC實(shí)現(xiàn)的三相異步電動(dòng)機(jī)七段調(diào)速實(shí)驗(yàn)二、實(shí)驗(yàn)?zāi)康模?. 通過(guò)電動(dòng)機(jī)變頻調(diào)速控制系統(tǒng)實(shí)驗(yàn),進(jìn)一步了解可編程控制器在電動(dòng)機(jī)變頻調(diào)速控制中的應(yīng)用。2. 通過(guò)系統(tǒng)設(shè)計(jì),進(jìn)一步了解PLC、變頻器及編碼器
4、之間的配合關(guān)系。3. 通過(guò)實(shí)驗(yàn)線路的設(shè)計(jì),實(shí)際操作,使理論與實(shí)際相結(jié)合,增加感性認(rèn)識(shí),使書本知識(shí)更加鞏固。4. 培養(yǎng)動(dòng)手能力,增強(qiáng)對(duì)可編程控制器運(yùn)用的能力。5. 培養(yǎng)分析,查找故障的能力。6. 增加對(duì)可編程控制器外圍電路的認(rèn)識(shí)。三、實(shí)驗(yàn)器件:220V PLC實(shí)驗(yàn)臺(tái)一套、380V變頻器實(shí)驗(yàn)臺(tái)一套、三相電動(dòng)機(jī)一臺(tái)(Nr=1400r/min,p=2)、光電編碼器一個(gè)(864p/r)、萬(wàn)用表一個(gè)、導(dǎo)線若干。四、實(shí)驗(yàn)原理:1.實(shí)驗(yàn)原理圖:2.實(shí)驗(yàn)原理:通過(guò)光電編碼器將電動(dòng)機(jī)的轉(zhuǎn)速采集出來(lái)并送入PLC中,通過(guò)實(shí)驗(yàn)程序?qū)⒉杉降男畔⑴cDM3X(加速)/DM4X(減速)區(qū)的設(shè)定值進(jìn)行比較,當(dāng)頻率滿足設(shè)定值時(shí)用
5、PLC控制變頻器(變頻器工作在端子調(diào)速模式下),電動(dòng)機(jī)停止加速,保持勻速5S,5S后PLC控制變頻器加速端子繼續(xù)加速。從而實(shí)現(xiàn)完成七段速逐段加速。以15HZ為基準(zhǔn)加速頻率上限為45Hz(可以根據(jù)具體情況設(shè)定),并在最高段速保持10s,此后電機(jī)開(kāi)始減速,當(dāng)?shù)竭_(dá)設(shè)定的頻率時(shí),PLC控制變頻器停止加速,保持勻速5S,5S后PLC控制變頻器減速端子繼續(xù)減速;反轉(zhuǎn)的運(yùn)動(dòng)過(guò)程與正轉(zhuǎn)正轉(zhuǎn)過(guò)程相似。實(shí)驗(yàn)速度曲線如下圖:五、實(shí)驗(yàn)相關(guān)器件特點(diǎn):1.歐姆龍CPM2AH:CPM2A在一個(gè)小巧的單元內(nèi)綜合有各種性能,包括同步脈沖控制,中斷輸入,脈沖輸出,模擬量設(shè)定,和時(shí)鐘功能等。CPM2A CPU單元又是一個(gè)獨(dú)立單元,
6、能處理廣泛的機(jī)械控制應(yīng)用,所以它是在設(shè)備內(nèi)用作內(nèi)裝控制單元的理想產(chǎn)品,完整的通信功能保證了與個(gè)人計(jì)算機(jī)、其它OMRON PC和OMRON可編程終端的通信。這些通信能力使用戶能設(shè)計(jì)一個(gè)經(jīng)濟(jì)的分布生產(chǎn)系統(tǒng)。CPM2A計(jì)有五個(gè)高速計(jì)數(shù)器輸入。一個(gè)響應(yīng)頻率為20 kHz/5 kHz的高速計(jì)數(shù)器輸入,與四個(gè)響應(yīng)頻率為2 kHz的高速計(jì)數(shù)器輸入(在計(jì)數(shù)器方式下)。高速計(jì)數(shù)器可以用在四種輸入方式中的任一種下;微分相位方式(5 kHz),脈沖+方向輸入方式(20 kHz),增/減脈沖方式(20 kHz),或遞增方式(20 kHz)。當(dāng)計(jì)數(shù)與一設(shè)置值匹配或下降在一規(guī)定范圍內(nèi)時(shí),能觸發(fā)中斷。中斷輸入(計(jì)數(shù)器方式)
7、可用遞增計(jì)數(shù)器或遞減計(jì)數(shù)器(2 kHz)并在計(jì)數(shù)與目標(biāo)值匹配時(shí)觸發(fā)中斷(執(zhí)行中斷程序)。2.光電編碼器:光電編碼器,是一種通過(guò)光電轉(zhuǎn)換將輸出軸上的機(jī)械幾何位移量轉(zhuǎn)換成脈沖或數(shù)字量的傳感器。這是目前應(yīng)用最多的傳感器, 光電編碼器是由光柵盤和光電檢測(cè)裝置組成。光柵盤是在一定直徑的圓板上等分地開(kāi)通若干個(gè)長(zhǎng)方形孔。由于光電碼盤與電動(dòng)機(jī)同軸,電動(dòng)機(jī)旋轉(zhuǎn)時(shí),光柵盤與電動(dòng)機(jī)同速旋轉(zhuǎn),經(jīng)發(fā)光二極管等電子元件組成的檢測(cè)裝置檢測(cè)輸出若干脈沖信號(hào),通過(guò)計(jì)算每秒光電編碼器輸出脈沖的個(gè)數(shù)就能反映當(dāng)前電動(dòng)機(jī)的轉(zhuǎn)速。此外,為判斷旋轉(zhuǎn)方向,碼盤還可提供相位相差90的兩路脈沖信號(hào)。3.變頻器:()變頻器可以分為四個(gè)部分。通用變
8、頻器由主電路和控制回路組成。給異步電動(dòng)機(jī)提供調(diào)壓調(diào)頻電源的電力變換部分,稱為主電路。主電路包括整流器、中間直流環(huán)節(jié)(又稱平波回路)、逆變器。 = 1 * GB2 整流器。它的作用是把工頻電源變換成直流電源。 = 2 * GB2 平波回路(中間直流環(huán)節(jié))。由于逆變器的負(fù)載為異步電動(dòng)機(jī),屬于感性負(fù)載。無(wú)論電動(dòng)機(jī)處于電動(dòng)狀態(tài)還是發(fā)電狀態(tài),起始功率因數(shù)總不會(huì)等于1。因此,在中間直流環(huán)節(jié)和電動(dòng)機(jī)之間總會(huì)有無(wú)功功率的交換,這種無(wú)功能量要靠中間直流環(huán)節(jié)的儲(chǔ)能元件電容器或電感器來(lái)緩沖,所以中間直流環(huán)節(jié)實(shí)際上是中間儲(chǔ)能環(huán)節(jié)。 = 3 * GB2 逆變器。與整流器的作用相反,逆變器是將直流功率變換為所要求頻率的交
9、流功率。逆變器的結(jié)構(gòu)形式是利用6個(gè)半導(dǎo)體開(kāi)關(guān)器件組成的三相橋式逆變器電路。通過(guò)有規(guī)律的控制逆變器中主開(kāi)關(guān)的導(dǎo)通和斷開(kāi),可以得到任意頻率的三相交流輸出波形。 = 4 * GB2 控制回路??刂苹芈烦S蛇\(yùn)算電路,檢測(cè)電路,控制信號(hào)的輸入、輸出電路,驅(qū)動(dòng)電路和制動(dòng)電路等構(gòu)成。其主要任務(wù)是完成對(duì)逆變器的開(kāi)關(guān)控制,對(duì)整流器的電壓控制,以及完成各種保護(hù)功能。控制方式有模擬控制或數(shù)字控。六、各器件參數(shù)設(shè)置:1.變頻器參數(shù)設(shè)置:端口設(shè)定值功能端口設(shè)定值功能F2001啟動(dòng)方式:端子控制F41114(OP4)反轉(zhuǎn)F2021停止方式:端子控制F41211(OP5)增速F2042端子調(diào)速控制F41312(OP6)減速
10、F2062正反轉(zhuǎn)端子脈沖給定方向F4147(OP7)停止F4096(OP2)運(yùn)行F41013(OP3)正轉(zhuǎn)2.內(nèi)部寄存器參數(shù)設(shè)置:內(nèi)部端口設(shè)定值(十六進(jìn)制)內(nèi)部端口設(shè)定值(十六進(jìn)制)DM300242DM410790DM310336DM410730DM320420DM420650DM330504DM430560DM340588DM440470DM350672DM450370DM360770DM46 0270DM66421142DM66420003高速計(jì)數(shù)器模式0:微分相位模式(5kHz)1:脈沖方向輸入模式(20kHz)2:增/減輸入模式(20kHz);4:增量模式(20kHz)0407高速計(jì)數(shù)
11、器復(fù)位模式0:Z相和軟件復(fù)位;1:僅軟件復(fù)位08150:Z相和軟件復(fù)位;1:僅軟件復(fù)位00:不使用任意功能;01:作為高速計(jì)數(shù)器使用;02:作為同步脈沖控制使用(10500Hz)03:作為同步脈沖控制使用(201kHz)04:作為同步脈沖控制使用(30020kHz)3.編碼器接口:顏色接口棕色24V電源“+”藍(lán)色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運(yùn)行七、實(shí)驗(yàn)結(jié)論:按照原理圖接好線經(jīng)檢查無(wú)誤后,上電下載編好的
12、程序,并在編程模式下,打開(kāi)PLC的內(nèi)存,在DM數(shù)據(jù)區(qū)從DM30DM36依次寫入0242、0336、0420、0504、0588、0672、0770七個(gè)加速比較的十六進(jìn)制數(shù)據(jù),DM40DM46依次寫入0780、0730、0650、0560、0470、0370、0270七個(gè)減速比較的十六進(jìn)制數(shù)據(jù),并在DM6642 數(shù)據(jù)區(qū)寫入0112,設(shè)置高速計(jì)數(shù)器工作模式。之后保存并在線傳送到PLC,再將PLC切換到運(yùn)行模式。按下正轉(zhuǎn)按鈕后,變頻器啟動(dòng)運(yùn)行電動(dòng)機(jī)正轉(zhuǎn)加速,頻率達(dá)到每一個(gè)階梯后延時(shí)5秒再加速,在45Hz左右后,開(kāi)始減速,減速到停止;反轉(zhuǎn)類似于正轉(zhuǎn)。當(dāng)按下停止按鈕后,變頻器停止工作電機(jī)停止轉(zhuǎn)動(dòng)。電機(jī)勻
13、速的頻率為:5.42Hz、14.89Hz、25.04Hz、35.26Hz、46.03Hz。比較接近預(yù)期值,符合實(shí)驗(yàn)要求。力控PLC變頻器監(jiān)控平臺(tái)I/O設(shè)備組態(tài)(采用host link協(xié)議)2、力控?cái)?shù)據(jù)庫(kù)組態(tài)器件定義關(guān)聯(lián)點(diǎn)器件定義關(guān)聯(lián)點(diǎn)正傳按鈕20600二段指示20701反轉(zhuǎn)按鈕20601三段指示20702停止按鈕20602四段指示20703加速按鈕20603五段指示20704減速按鈕20604六段指示20705減速指示20006七段指示20706運(yùn)行指示20108增速指示20603一段指示207003、監(jiān)控平臺(tái)4、運(yùn)行結(jié)果圖 圖1 加速過(guò)程 圖2 減速過(guò)程九、程序流程圖及程序清單,流程圖梯形圖
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語(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:Get
26、CurrentTime() 精確到秒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/t
27、imeEndPeriod/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 (time
28、info) );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 ( &
29、rawtime ); - 轉(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#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 是一個(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í)間,
31、 以毫秒為單位這個(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(st
32、ruct 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 =
33、time(&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看
34、看你的系統(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;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);/*獲得當(dāng)前日期和時(shí)間CTime tm=CTime:GetCurrentTime();CString str=tm.Format(%Y-%m-%d);在VC中,我們可以借助CTime時(shí)間類,獲取系統(tǒng)當(dāng)前日期,具體使用方法如下:CTime t = CTim
36、e: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( 19
37、99, 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è)fieldsd
38、stflagmillitmtimetimezonevoid _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
39、);對(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
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 !);本文來(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
42、函數(shù))。二是利用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)用QueryPerfo
43、rmanceFrequency函數(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 ClassWizar
44、d添加的成員變量也分別對(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(!QueryPerformanceFrequenc
45、y( &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 = M
46、ySleep( 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_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é)果如上圖所示。在本人所用的機(jī)
48、上(奔騰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,
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ù)中的代碼很多,機(jī)器在執(zhí)行這些代碼所花費(fèi)的時(shí)間也很長(zhǎng),所以在需要幾個(gè)微秒的延時(shí)時(shí),會(huì)影響精度。實(shí)際上,讀者在熟悉這種方法后,只要使用QueryPerformanceFrequency和QueryPerfor
51、manceCounter這兩個(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í)圖形處理、多媒
52、體數(shù)據(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主
53、頻都非常高,因此這個(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ī)器碼
54、形式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è)類,把這
55、個(gè)計(jì)數(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í)
56、精度(在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
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 簡(jiǎn)單創(chuàng)新創(chuàng)業(yè)計(jì)劃書
- 2025八年級(jí)英語(yǔ)教學(xué)教研工作計(jì)劃
- 銷售工作計(jì)劃怎么寫范文
- 高一下冊(cè)英語(yǔ)課程教學(xué)計(jì)劃
- 幼兒園小班教師工作計(jì)劃范本
- 月工區(qū)安全生產(chǎn)工作計(jì)劃范文
- 國(guó)際市場(chǎng)營(yíng)銷計(jì)劃
- 銀行2025年工作計(jì)劃及2025工作總結(jié)范文
- 中考物理教學(xué)計(jì)劃
- 2025年年幼兒園大班班級(jí)工作計(jì)劃
- 國(guó)債資金管理辦法
- 二年級(jí)數(shù)學(xué)應(yīng)用題50道附參考答案(綜合題)
- 光纜項(xiàng)目創(chuàng)業(yè)計(jì)劃書
- 昂立教育擬資產(chǎn)租賃所涉及的位于徐匯區(qū)龍耀路175號(hào)部分辦公房地產(chǎn)年租金市場(chǎng)價(jià)值資產(chǎn)評(píng)估報(bào)告
- QBT 2667.1-2004 埋地通信用多孔一體塑料管材 第1部分硬聚氯乙烯(PVC-U)多 孔 一 體 管 材
- 宮頸機(jī)能不全和宮頸縫扎術(shù)課件
- 醫(yī)療設(shè)備的清潔和消毒制度
- 湖南省基本概況
- 承包商安全資質(zhì)審核管理規(guī)定模板
- 24春國(guó)家開(kāi)放大學(xué)《建筑測(cè)量》形考任務(wù)實(shí)驗(yàn)1-6參考答案
- 維保措施及方案設(shè)計(jì)流程
評(píng)論
0/150
提交評(píng)論