化工仿真技術(shù)實(shí)習(xí)報(bào)告_第1頁(yè)
化工仿真技術(shù)實(shí)習(xí)報(bào)告_第2頁(yè)
化工仿真技術(shù)實(shí)習(xí)報(bào)告_第3頁(yè)
化工仿真技術(shù)實(shí)習(xí)報(bào)告_第4頁(yè)
化工仿真技術(shù)實(shí)習(xí)報(bào)告_第5頁(yè)
已閱讀5頁(yè),還剩31頁(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、 進(jìn)富氣達(dá)到一定負(fù)荷后,開V26和V27,調(diào)整兩閥使TI-308在5一下,以便在FA-304中分離C6油。手動(dòng)開TIC-312的輸出 使溫度降低至5左右,投自動(dòng)。投自動(dòng)和比值調(diào)節(jié) 設(shè)“AKB”為53.5%左右,將FRC-311投自動(dòng)和比值調(diào)節(jié)(以串級(jí)表示)。提升進(jìn)富氣負(fù)荷 逐漸開大V1和V2,待吸收塔頂溫TI-309下降至7.0左右,使進(jìn)氣流量緩慢提高到5000kg/h左右。注意當(dāng)LI-309高于60%時(shí),可適當(dāng)開V22閥。由于C6油在吸收解吸過(guò)程中有一定的損耗,當(dāng)LI-311下降時(shí)應(yīng)適當(dāng)開大V6補(bǔ)充C6油。將系統(tǒng)調(diào)整到正常工況 設(shè)計(jì)值范圍如下:項(xiàng)目數(shù)值項(xiàng)目數(shù)值 FI-308 5000kg/h

2、FRC-31113300kg/h PIC-308 1.20MPaTI-3085.0 TIC-3125.0LIC-31050% LIC-31250%LI-30950%LI-31150%AI-3010.6% AI-3020.6%PAGE PAGE 34第五章 間歇反應(yīng)一、工藝流程簡(jiǎn)介間歇反應(yīng)過(guò)程在精細(xì)化工、制藥、催化劑制備、染料中間體等行業(yè)應(yīng)用廣泛。本間歇反應(yīng)的物料特性差異大;多硫化鈉需要通過(guò)反應(yīng)制備;反應(yīng)屬放熱過(guò)程,由于二硫化碳的飽和蒸汽壓隨溫度上升而迅猛上升,冷卻操作不當(dāng)會(huì)發(fā)生劇烈爆炸;反應(yīng)過(guò)程中有主副反應(yīng)的競(jìng)爭(zhēng),必須設(shè)法抑制副反應(yīng),然而主反應(yīng)的活化能較高,又期望較高的反應(yīng)溫度。如此多種因素交

3、織在一起,使本間歇反應(yīng)具有典型代表意義。在敘述工藝過(guò)程之前必須說(shuō)明,選擇某公司有機(jī)廠的硫化促進(jìn)劑間歇反應(yīng)崗位為參照啊,目的在于使本仿真培訓(xùn)軟件更具有工業(yè)背景,但并不拘泥于該流程的全部真實(shí)情況。為了使軟件通用性更強(qiáng),對(duì)某些細(xì)節(jié)作了適當(dāng)?shù)淖兺ㄌ幚砗秃?jiǎn)化。有機(jī)廠縮合反應(yīng)的產(chǎn)物是橡膠硫化促進(jìn)劑,它能大大加快橡膠硫化的速度。硫化作用能使橡膠的高分子結(jié)構(gòu)變成網(wǎng)狀,從而使橡膠的抗拉斷力、抗氧化性、耐磨性等加強(qiáng)。它和促進(jìn)劑D合用適用于棕色橡膠的硫化,與促進(jìn)劑M合用適用于淺色橡膠硫化。本間歇反應(yīng)崗位包括了備料工序和縮合工序?;驹蠟樗姆N:硫化鈉(Na2S)、硫磺(S)、鄰硝基氯苯(C6H4ClNO2)及二硫化

4、碳(CS2)。備料工序包括多硫化鈉制備與沉淀,二硫化碳計(jì)量,鄰氯苯計(jì)量。多硫化鈉制備反應(yīng)此反應(yīng)是將硫磺(S)、硫化鈉(Na2S)和水混合,以蒸汽加熱、攪拌,在常壓開口容器中反應(yīng),得到多硫化鈉溶液。反應(yīng)時(shí)有副反應(yīng)發(fā)生,此副反應(yīng)在加熱接近沸騰時(shí)才會(huì)有顯著的反應(yīng)速度。因此,多硫化鈉制備溫度不得超過(guò)85。多硫化鈉的含硫量以指數(shù)n表示。實(shí)驗(yàn)表明,硫指數(shù)較高時(shí),促進(jìn)劑的縮合反應(yīng)產(chǎn)率提高。但當(dāng)n增至4時(shí),產(chǎn)率趨于定值。此外,當(dāng)硫指數(shù)過(guò)高時(shí),縮合反應(yīng)中析出游離硫的量增加,容易在蛇管和夾套傳熱面上結(jié)晶而影響傳熱,使反應(yīng)過(guò)程中壓力難于控制。所以硫指數(shù)應(yīng)取適中值。二硫化碳計(jì)量二硫化碳易燃易爆,不溶于水,相對(duì)密度大于

5、水。因此,可以采用水封隔絕空氣保障安全。同時(shí)還能利用水壓將儲(chǔ)罐中的二硫化碳?jí)褐粮呶徊?。高位槽具有夾套水冷系統(tǒng)。鄰硝基氯苯計(jì)量鄰硝基氯苯熔點(diǎn)為31.5,不溶于水,常溫下呈固體狀態(tài)。為了便于管道輸送和計(jì)量,必須將其熔化,并保存于具有夾套蒸汽加熱的儲(chǔ)罐中。計(jì)量時(shí),利用壓縮空氣將液態(tài)鄰硝基氯苯壓至高位槽,高位槽也具有夾套保溫系統(tǒng)??s合反應(yīng)工序縮合工序歷經(jīng)下料、加熱升溫、冷卻控制、保溫、出料及反應(yīng)釜清洗階段。鄰硝基氯苯、多硫化鈉和二硫化碳在反應(yīng)釜中經(jīng)夾套蒸汽加入適度的熱量后,將發(fā)生復(fù)雜的化學(xué)反應(yīng),產(chǎn)生促進(jìn)劑M的鈉鹽及其副產(chǎn)物??s合反應(yīng)不是一步合成,實(shí)踐證明還伴有副反應(yīng)發(fā)生??s合速率的大小與這個(gè)副反應(yīng)有密

6、切關(guān)系。當(dāng)硫指數(shù)較低時(shí),反應(yīng)是向副反應(yīng)方向進(jìn)行。主反應(yīng)的活化能高于副反應(yīng),因此提高反應(yīng)溫度有利于主反應(yīng)的進(jìn)行。但在本反應(yīng)中若升溫過(guò)快、過(guò)高,將可能造成不可遏制的爆炸而產(chǎn)生危險(xiǎn)事故。保溫階段之目的是盡可能多地獲得所期望的產(chǎn)物。為了最大限度地減少副產(chǎn)物的生產(chǎn),必須保持較高的反應(yīng)釜溫度。操作員應(yīng)經(jīng)常注意釜內(nèi)壓力和穩(wěn)定,當(dāng)溫度壓力有所下降時(shí),應(yīng)向夾套內(nèi)通入適當(dāng)蒸汽以保持原有的釜溫、釜壓??s合反應(yīng)歷經(jīng)保溫階段后,接著利用蒸汽壓力將縮合釜內(nèi)的料液壓入下道工序。出料完畢,用蒸汽吹洗反應(yīng)釜,為下一批作業(yè)做好準(zhǔn)備。本間歇反應(yīng)崗位操作即告完成。二、工藝流程圖(CAD繪制)三、開車步驟準(zhǔn)備工作檢查各開關(guān)、手動(dòng)閥門是

7、否關(guān)閉。多硫化鈉制備 打開硫化堿閥HV-1,向多硫化鈉制備反應(yīng)器R1注入硫化堿,使液位H-1升至0.4m,關(guān)閉閥HV-1。 打開熔融硫閥HV-2,向多硫化鈉制備反應(yīng)器R1注入硫磺,液位H-1升至0.8m,關(guān)閉HV-2。打開水閥HV-3,使多硫化鈉制備反應(yīng)器R1液位H-1升至1.2m,關(guān)閉HV-3。開啟多硫化鈉制備反應(yīng)器攪拌電機(jī)M1開關(guān)M01。打開多硫化鈉制備反應(yīng)器R1蒸汽加熱閥HV-4,使溫度T1上升至8184(升溫需要一定時(shí)間,可利用此時(shí)間差完成其他操作)。保持?jǐn)嚢?分鐘(實(shí)際為3小時(shí))。注意當(dāng)反應(yīng)溫度T1超過(guò)85時(shí)將使副反應(yīng)加強(qiáng),此種情況會(huì)報(bào)警扣分。開啟多硫化鈉輸送泵M3的電機(jī)開關(guān)M03,

8、將多硫化鈉料液全部打入沉淀槽F1,靜置5分鐘(實(shí)際為4小時(shí))備用。鄰硝基氯苯計(jì)量備料檢查并確認(rèn)通大氣泄壓閥V6是否關(guān)閉。檢查并確認(rèn)鄰硝基氯苯計(jì)量槽F4下料閥V12是否關(guān)閉。打開上料閥HV-7。開啟并調(diào)整壓縮空氣進(jìn)氣閥HV-5。觀察鄰硝基氯苯計(jì)量槽F4液位H-5逐漸上升,且鄰硝基氯苯儲(chǔ)罐液位H-4略有下降,直至計(jì)量槽液位H-5達(dá)到1.2m。由于計(jì)量槽裝有溢流管,液位一旦達(dá)到此高度將不再上升。但如果不及時(shí)關(guān)閉HV-7,則儲(chǔ)罐液位H-4會(huì)繼續(xù)下降。注意儲(chǔ)罐液位下降過(guò)多,將被認(rèn)為操作失誤而扣分。壓料完畢,關(guān)閉HV-7及HV-5。打開泄壓閥V6。如果忘記打開V6,會(huì)被認(rèn)為操作失誤而扣分。二硫化碳計(jì)量備料

9、檢查并確認(rèn)通水池的泄壓閥V8是否關(guān)閉。檢查并確認(rèn)二硫化碳計(jì)量槽F5下料閥V14是否關(guān)閉。打開上料閥HV-10。開啟并調(diào)整自來(lái)水閥HV-9,使二硫化碳計(jì)量槽F5液位H-7上升。此時(shí)二硫化碳儲(chǔ)罐液位H-6略有下降。直至計(jì)量槽液位H-7達(dá)到1.4m。由于計(jì)量槽裝有溢流管,液位將不再上升。但若不及時(shí)關(guān)閉HV-10,則儲(chǔ)罐液位H-6會(huì)繼續(xù)下降,此種情況會(huì)被認(rèn)為操作失誤而扣分。壓料完畢,關(guān)閉閥門HV-10及HV-9。打開泄壓閥V8。如果忘記打開泄壓閥V8會(huì)被認(rèn)為操作失誤而扣分。像縮合反應(yīng)釜加入三種物料檢查并確認(rèn)反應(yīng)釜R2放空閥HV-21是否開啟,否則會(huì)引起計(jì)量槽下料不暢。檢查并確認(rèn)反應(yīng)釜R2進(jìn)料閥V15是

10、否打開。打開管道冷卻水閥V13約5秒,使下料管冷卻后關(guān)閉V13。打開二硫化碳計(jì)量槽F5下料閥V14,觀察計(jì)量槽液位因高位勢(shì)差下降,直至液位下降至0.0m,即關(guān)閉V14。再次開啟冷卻水閥V13約5秒,將管道中殘余的二硫化碳沖洗入反應(yīng)釜,關(guān)V13。開啟管路蒸汽加熱閥V11約5秒,使下料管預(yù)熱,關(guān)閉V11。打開鄰硝基氯苯計(jì)量槽F4下料閥V12,觀察液位指示儀,當(dāng)液位H-5下降至0.0m,即關(guān)V12。再次開啟管路蒸汽加熱閥V11約5秒。將管道中殘余的鄰硝基氯苯?jīng)_洗干凈,即關(guān)閉V11。關(guān)閉閥V15,全關(guān)反應(yīng)釜R2放空閥HV-21。檢查并確認(rèn)反應(yīng)釜R2進(jìn)料閥V16是否開啟。啟動(dòng)多硫化鈉輸送泵M4電機(jī)開關(guān)M

11、04,將沉淀槽F1靜置后的料液打入反應(yīng)釜R2。注意反應(yīng)釜的最終液位H-3大于2.41 m 時(shí),必須及時(shí)關(guān)泵,否則反應(yīng)釜液位H-3會(huì)繼續(xù)上升,當(dāng)大于2.7 m 時(shí),將引起液位超限報(bào)警扣分。當(dāng)反應(yīng)釜的最終液位H-3小于2.4 m 時(shí),必須補(bǔ)加多硫化鈉,直至合格。否則軟件設(shè)定不反應(yīng)??s合反應(yīng)操作本部分難度較大,能夠訓(xùn)練學(xué)員分析能力、決策能力和應(yīng)變能力。需通過(guò)多次反應(yīng)操作,并根據(jù)親身體驗(yàn)到的間歇反應(yīng)過(guò)程動(dòng)力學(xué)特性,總結(jié)出最佳操作方法。認(rèn)真且迅速檢查并確認(rèn):放空閥HV-21,進(jìn)料閥V15、V16,出料閥V20是否關(guān)閉。開啟反應(yīng)釜R2攪拌電機(jī)M02,觀察釜內(nèi)溫度T已經(jīng)略有上升。適當(dāng)打開夾套蒸汽加熱閥HV-

12、17,觀察反應(yīng)釜內(nèi)溫度T逐漸上升。注意加熱量的調(diào)節(jié)應(yīng)使溫度上升速度適中。加熱速率過(guò)猛會(huì)使反應(yīng)后續(xù)的劇烈階段失控而產(chǎn)生超壓事故。加熱速率過(guò)慢會(huì)使反應(yīng)停留在低溫壓,副反應(yīng)會(huì)加強(qiáng),影響主產(chǎn)物產(chǎn)率。反應(yīng)釜溫度和壓力是確保反應(yīng)安全的關(guān)鍵參數(shù),所以必須根據(jù)溫度和壓力的變化來(lái)控制反應(yīng)的速率。當(dāng)溫度T上升至45左右應(yīng)停止加熱,關(guān)閉夾套蒸汽加熱閥HV-17。反應(yīng)此時(shí)已被深度誘發(fā),并逐漸靠自身反應(yīng)的放熱效應(yīng)不斷加快反應(yīng)速度。操作學(xué)員應(yīng)根據(jù)具體情況,主要是根據(jù)反應(yīng)釜溫度T上升的速率,在0.10 0.20 /s 以內(nèi),當(dāng)反應(yīng)釜溫度T上升至65左右(釜壓0.18MPa左右),間斷小量開啟夾套冷卻水閥門HV-18及蛇管冷

13、卻水閥門HV-19,控制反應(yīng)釜的溫度和壓力上升速度,提前預(yù)防系統(tǒng)超壓。在此特別需要指出的是:開啟HV-18和HV-19的同時(shí),應(yīng)當(dāng)觀察夾套冷卻水出口溫度T2和蛇管冷卻水出口溫度T3不得低于60。如果低于60,反應(yīng)物產(chǎn)物中的硫磺(副產(chǎn)物之一)將會(huì)在夾套內(nèi)壁和蛇管傳熱面上結(jié)晶,增大熱阻,影響傳熱,因而大大減低冷卻控制作用。特別是當(dāng)反應(yīng)釜溫度還不足夠高時(shí)更易發(fā)生此種現(xiàn)象。反應(yīng)釜溫度大約在90(釜壓0.34MPa左右)以下副反應(yīng)速率大于主反應(yīng)速率, 反應(yīng)釜溫度大約在90以上主反應(yīng)速率大于副反應(yīng)速率。反應(yīng)預(yù)計(jì)在95110(或釜壓0.410.55 MPa)進(jìn)入劇烈難控的階段。學(xué)員應(yīng)充分集中精力并加強(qiáng)對(duì)HV

14、-18和HV-19的調(diào)節(jié)。這一階段學(xué)員既要大膽升壓,又要謹(jǐn)慎小心防止超壓。為使主反應(yīng)充分進(jìn)行,并盡量減弱副反應(yīng),應(yīng)使反應(yīng)溫度維持在121(或壓力維持在0.69 MPa左右)。但壓力維持過(guò)高,一旦超過(guò)0.8 MPa(反應(yīng)溫度超過(guò)128),將會(huì)報(bào)警扣分。如果反應(yīng)釜壓力P上升過(guò)快,已將HV-18和HV-19開到最大,仍壓制不住壓力的上升,可迅速打開高壓水閥門V25及高壓水泵電機(jī)開關(guān)M05,進(jìn)行強(qiáng)制冷卻。如果開啟高壓水泵后仍無(wú)法壓制反應(yīng),當(dāng)壓力繼續(xù)上升至0.83 MPa(反應(yīng)溫度超過(guò)130)以上時(shí),應(yīng)立刻關(guān)閉反應(yīng)釜R2攪拌電機(jī)M2。此時(shí)物料會(huì)因密度不同而分層,反應(yīng)速度會(huì)減緩,如果強(qiáng)制冷卻及停止攪拌奏效

15、,一旦壓力出現(xiàn)下降趨勢(shì),應(yīng)關(guān)閉V25及高壓水泵開關(guān)M05,同時(shí)開啟反應(yīng)釜攪拌電機(jī)開關(guān)M02。如果操作不按規(guī)程進(jìn)行,特別是前期加熱速率過(guò)猛,加熱時(shí)間過(guò)長(zhǎng),冷卻又不及時(shí),反應(yīng)可能進(jìn)入無(wú)法控制的狀態(tài)。即使采取了第、第項(xiàng)措施還控制不住反應(yīng)壓力,當(dāng)壓力超過(guò)1.20 MPa 已屬危險(xiǎn)超壓狀態(tài),將會(huì)再次報(bào)警扣分。此時(shí)應(yīng)迅速打開放空閥HV-21,強(qiáng)行泄放反應(yīng)釜壓力。由于打開放空閥會(huì)使部分二硫化碳蒸汽散失(當(dāng)然也污染大氣),所以壓力一旦有所下降,應(yīng)立刻關(guān)閉HV-21,若關(guān)閉閥HV-21壓力仍上升,可反復(fù)數(shù)次。需要指出,二硫化碳的散失會(huì)直接影響主產(chǎn)物產(chǎn)率。如果第、三種應(yīng)急措施都不能見效,反應(yīng)器壓力超過(guò)1.60 M

16、Pa,將被認(rèn)定為反應(yīng)器爆炸事故。此時(shí)緊急事故報(bào)警閃光,仿真軟件處于凍結(jié)狀態(tài)。成績(jī)?yōu)榱惴帧7磻?yīng)保溫階段如果控制合適,反應(yīng)歷經(jīng)劇烈階段之后,壓力P、溫度T會(huì)迅速下降。此時(shí)應(yīng)逐步關(guān)小冷 卻水閥HV-18和HV-19,使反應(yīng)釜溫度保持在120(壓力保持在0.680.70 MPa左右),不斷調(diào)整直至全部關(guān)閉掉HV-18和HV-19。當(dāng)關(guān)閉HV-18和HV-19后出現(xiàn)壓力下降時(shí),可適當(dāng)打開夾套蒸汽加熱閥HV-17,仔細(xì)調(diào)整,使反應(yīng)釜溫度始終保持在120(壓力保持在0.680.70 MPa )510分鐘(實(shí)際為23小時(shí))。保溫之目的在于使反應(yīng)盡可能充分地進(jìn)行,以便達(dá)到盡可能高的主產(chǎn)物產(chǎn)率。此刻是觀看開車成績(jī)

17、的最佳時(shí)刻。教師可參考記錄曲線綜合評(píng)價(jià)學(xué)員開車水平。出料及清洗反應(yīng)器完成保溫后,即可進(jìn)入出料及反應(yīng)釜清洗階段。首先打開放空閥HV-21約10秒(實(shí)際為25分鐘),放掉釜內(nèi)殘存的可燃?xì)怏w及硫化氫。關(guān)閉放空閥HV-21。打開出料增壓蒸汽閥V23,使釜內(nèi)壓力升至0.79 MPa以上。打開出料管預(yù)熱閥V22及V24約10秒(實(shí)際為25分鐘)。關(guān)閉V22及V24。立即打開出料閥V20,觀察反應(yīng)釜液位H-3逐漸下降,但釜內(nèi)壓力不變。當(dāng)液位H-3下降至0.09m時(shí),壓力開始迅速下降到0.44 MPa左右,保持10秒充分吹洗反應(yīng)釜及出料管。關(guān)閉出料管V20及蒸汽增壓閥V23。打開蒸汽閥V24及放空閥HV-21

18、吹洗反應(yīng)釜10秒(實(shí)際為25分鐘)。關(guān)閉閥門V24。至此全部反應(yīng)崗位操作完畢,可進(jìn)入操作下一批反應(yīng)的準(zhǔn)備工作。實(shí)習(xí)體會(huì)通過(guò)此次實(shí)習(xí),我進(jìn)一步深刻了解了化工生產(chǎn)的操作過(guò)程,熟悉了幾個(gè)基本的化工生產(chǎn)的開停車過(guò)程,具備了一定的基本操作能力。雖然沒有真的在工廠進(jìn)行真正的操作,但是通過(guò)在電腦上進(jìn)行仿真實(shí)習(xí),了解了化工過(guò)程的工藝和控制系統(tǒng)的動(dòng)態(tài)特性、提高了對(duì)工藝過(guò)程的運(yùn)行和控制能力。通過(guò)此次仿真實(shí)習(xí),我悟出了幾個(gè)要點(diǎn):在進(jìn)行手動(dòng)開車前一定要進(jìn)行預(yù)習(xí),要熟悉工藝流程、熟悉操作設(shè)備、熟悉控制系統(tǒng)、熟悉開車規(guī)程。以免進(jìn)行錯(cuò)誤操作,浪費(fèi)時(shí)間,使自己不能很好的掌握所學(xué)習(xí)的內(nèi)容。在操作時(shí)切忌大起大落,為了加快操作速度

19、,減少操作時(shí)間,如果貪快貿(mào)然加大控制量,很可能會(huì)由于系統(tǒng)的慣性,使得生產(chǎn)情況超出基本限度,發(fā)生報(bào)警,最后生產(chǎn)出不合格產(chǎn)品,甚至導(dǎo)致設(shè)備故障,以致發(fā)生危險(xiǎn)。因此在操作生產(chǎn)中一定要按照要求來(lái),不能貪功冒進(jìn),要有耐心,不能急于求成。在進(jìn)行開車前,我們要仔細(xì)的把開車前的準(zhǔn)備工作做好,不能怕麻煩而忽略準(zhǔn)備工作。這很可能是產(chǎn)品是否合格,甚至生產(chǎn)過(guò)程是否安全的要點(diǎn),決不能忽略。在開車過(guò)程中,要先進(jìn)行低負(fù)荷工作,在開車達(dá)到正常情況后再提高負(fù)荷。這樣能避免在開車過(guò)程中因誤操作引起問題時(shí)發(fā)生引起很大的安全事故。附錄資料:不需要的可以自行刪除C語(yǔ)言中如何獲取時(shí)間?精度如何?1 使用time_t time( time

20、_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:GetCurrentTime() 精確到秒6 要獲取高精度時(shí)間,可以使用BOOL QueryPerformanceFrequency(LARGE_INTEGER *lpFrequency)獲取系統(tǒng)的計(jì)數(shù)器的頻率BOOL QueryPerform

21、anceCounter(LARGE_INTEGER *lpPerformanceCount)獲取計(jì)數(shù)器的值然后用兩次計(jì)數(shù)器的差除以Frequency就得到時(shí)間。7 Multimedia Timer FunctionsThe following functions are used with multimedia timers.timeBeginPeriod/timeEndPeriod/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ù)單位,存

22、于rawtime 中。#include time.hvoid main ()time_t rawtime;struct tm * timeinfo;time ( &rawtime );timeinfo = localtime ( &rawtime );printf ( 007The current date/time is: %s, asctime (timeinfo) );exit(0);=#include - 必須的時(shí)間函數(shù)頭文件time_t - 時(shí)間類型(time.h 定義是typedef long time_t; 追根溯源,time_t是long)struct tm - 時(shí)間結(jié)構(gòu),ti

23、me.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 ( &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

24、_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 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);re

25、turn 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í)間, 以毫秒為單位這個(gè)函數(shù)只精確到55ms,1個(gè)tick就是55ms。五.timeGetTime()t,imeGetTime()基本等于GetTickCount(),但是精度更高DWORD dwStart = timeGetTime();/這

26、里運(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(struct 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

27、*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 = 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í)間后

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

29、YSTEMTIME 結(jié)構(gòu)包含毫秒信息typedef struct _SYSTEMTIME WORD wYear;WORD wMonth;WORD wDayOfWeek;WORD wDay;WORD wHour;WORD wMinute;WORD wSecond;WORD wMilliseconds; SYSTEMTIME, *PSYSTEMTIME;SYSTEMTIME t1;GetSystemTime(&t1)CTime curTime(t1);WORD ms = t1.wMilliseconds;SYSTEMTIME sysTm;:GetLocalTime(&sysTm);在time.h中

30、的_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: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

31、.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, 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();

32、/獲取這段時(shí)間間隔共有多少天int iHour=span.GetTotalHours(); /獲取總共有多少小時(shí)int iMin=span.GetTotalMinutes();/獲取總共有多少分鐘int iSec=span.GetTotalSeconds();/獲取總共有多少秒三._timeb()函數(shù)_timeb定義在SYSTIMEB.H,有四個(gè)fieldsdstflagmillitmtimetimezonevoid _ftime( struct _timeb *timeptr );struct _timeb timebuffer;_ftime( &timebuffer );取當(dāng)前時(shí)間:文檔講

33、可以到ms,有人測(cè)試,好象只能到16ms!四.設(shè)置計(jì)時(shí)器定義TIMER ID#define TIMERID_JISUANFANGSHI 2在適當(dāng)?shù)牡胤皆O(shè)置時(shí)鐘,需要開始其作用的地方;SetTimer(TIMERID_JISUANFANGSHI,200,NULL);在不需要定時(shí)器的時(shí)候的時(shí)候銷毀掉時(shí)鐘KillTimer(TIMERID_JISUANFANGSHI);對(duì)應(yīng)VC程序的消息映射void CJisuan:OnTimer(UINT nIDEvent)switch(nIDEvent)#如何設(shè)定當(dāng)前系統(tǒng)時(shí)間windowsSYSTEMTIME m_myLocalTime,*lpSystemTim

34、e;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 !);SYSTEMTIME m_myLoca

35、lTime,*lpSystemTime;m_myLocalTime.wYear=2003;m_myLocalTime.wM;m_myLocalTime.wDay=1;lpSystemTime=&m_myLocalTime;if( SetDate(lpSystemTime) ) /此處換成 SetSystemTime( )也不行MessageBox(OK !);elseMessageBox(Error !);本文來(lái)自CSDN博客,轉(zhuǎn)載請(qǐng)標(biāo)明出處:HYPERLINK /khuang2008/archive/2008/12/09/3483274.aspx/khuang2008/archive/200

36、8/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ù))。二是利用GetTickCount函數(shù)可以返回自計(jì)算機(jī)啟動(dòng)后的時(shí)間,通過(guò)兩次調(diào)用GetTickCount函數(shù),然后控制它們的差值來(lái)取得定時(shí)效果,此方式跟第一種方式一樣,精度也是毫秒級(jí)的。用這兩種方式取得的定時(shí)效果雖然在許多場(chǎng)合已經(jīng)滿

37、足實(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)用QueryPerformanceFrequency函數(shù)取得高精度運(yùn)行計(jì)數(shù)器的頻率f。單位是每秒多少次(n/s),此數(shù)一般很大。2、在需要定時(shí)的代碼的兩端分別調(diào)用QueryPerformanceCounter以取得高精度運(yùn)行計(jì)數(shù)器的數(shù)值n1,n2。兩次數(shù)值的差

38、值通過(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添加的成員變量也分別對(duì)應(yīng)為DWORD m_dwTest和DWORD m_dwAct. “退出”按紐的ID為IDOK,“開始測(cè)試”按紐ID為IDC_B_TEST,用MFC ClassWizard添加此按紐的單擊消息處理函數(shù)如下:void

39、CHightTimerDlg:OnBTest()/ TODO: Add your control notification handler code hereUpdateData(TRUE); /取輸入的測(cè)試時(shí)間值到與編輯框相關(guān)聯(lián)的成員變量m_dwTest中LARGE_INTEGER frequence;if(!QueryPerformanceFrequency( &frequence) /取高精度運(yùn)行計(jì)數(shù)器的頻率,若硬件不支持則返回FALSEMessageBox(Your computer hardware doesnt support the high-resolution perform

40、ance 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 = MySleep( test ); /調(diào)用此函數(shù)開始延時(shí),返回實(shí)際花銷的數(shù)量m_dwAct = (DWORD)(1000000 * ret.QuadPart / frequence.QuadPart ); /換算到微秒數(shù)UpdateData(

41、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_INTEGER privious, current, Elapse;QueryPerformanceCounter( &privious );current = privious;while( current.QuadPart - privi

42、ous.QuadPart Interval.QuadPart )QueryPerformanceCounter( t );Elapse.QuadPart = current.QuadPart - privious.QuadPart;return Elapse;注:別忘了在頭文件中為此函數(shù)添加函數(shù)聲明。至此,可以編譯和執(zhí)行此工程了,結(jié)果如上圖所示。在本人所用的機(jī)上(奔騰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è)試的需要,沒有在函數(shù)級(jí)封裝,下面給出的函數(shù)基本上可以以全局函數(shù)的形式照搬到別

43、的程序中。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, current, interval;if(!QueryPerformanceFrequency( &frequence):MessageBox(NULL, Your computer hardware doesnt support the

44、 high-resolution performance counter,Not Support, MB_ICONEXCLAMATION | MB_OK); /或其它的提示信息return FALSE;interval.QuadPart = frequence.QuadPart * dwInterval / 1000000;bNormal = bNormal & QueryPerformanceCounter( &privious );current = privious;while( current.QuadPart - privious.QuadPart interval.QuadPart

45、 )bNormal = bNormal & QueryPerformanceCounter( t );return bNormal;需要指出的是,由于在此函數(shù)中的代碼很多,機(jī)器在執(zhí)行這些代碼所花費(fèi)的時(shí)間也很長(zhǎng),所以在需要幾個(gè)微秒的延時(shí)時(shí),會(huì)影響精度。實(shí)際上,讀者在熟悉這種方法后,只要使用QueryPerformanceFrequency和QueryPerformanceCounter這兩個(gè)函數(shù)就能按實(shí)際需要寫出自己的延時(shí)代碼了。使用CPU時(shí)間戳進(jìn)行高精度計(jì)時(shí)對(duì)關(guān)注性能的程序開發(fā)人員而言,一個(gè)好的計(jì)時(shí)部件既是益友,也是良師。計(jì)時(shí)器既可以作為程序組件幫助程序員精確的控制程序進(jìn)程,又是一件有力的調(diào)試

46、武器,在有經(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ù)據(jù)流處理、或者實(shí)時(shí)系統(tǒng)構(gòu)造的程序員,善用QueryPerformanceCount/QueryPerformanceFrequency是一項(xiàng)基本功。本文要介紹的,是另一種直接利用Pentium CPU內(nèi)部時(shí)間戳進(jìn)行計(jì)時(shí)的高精度計(jì)時(shí)手段

47、。以下討論主要得益于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主頻都非常高,因此這個(gè)部件可以達(dá)到納秒級(jí)的計(jì)時(shí)精度。這個(gè)精確性是上述兩種方法所無(wú)法比擬的。在Pentium以上的CPU中,提供了一條機(jī)器指令RDTSC(Read Time Stamp Counter)來(lái)讀取這個(gè)時(shí)間戳的數(shù)字,并將其保存在ED

48、X: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ī)器碼形式0X0F、0X31,如下:inline unsigned _int64 GetCycleCount() _asm _emit 0 x0F _asm _emit 0 x31 以后在需要計(jì)數(shù)器的場(chǎng)合,可以像使用普通的Win32 API一樣

49、,調(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ì)數(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ù)中減掉這

50、一小段時(shí)間,以得到更準(zhǔn)確的計(jì)時(shí)數(shù)字。但我個(gè)人覺得這一點(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í)精度(在1GHz的CPU上每個(gè)時(shí)鐘周期就是一納秒),這是其他計(jì)時(shí)方法所難以企及的。 2.成本低。timeGetTime 函數(shù)需要鏈接多媒體庫(kù)winmm.lib,QueryPerformance* 函數(shù)根據(jù)MSDN的說(shuō)明,需要硬件的支持(雖

51、然我還沒有見過(guò)不支持的機(jī)器)和KERNEL庫(kù)的支持,所以二者都只能在Windows平臺(tái)下使用(關(guān)于DOS平臺(tái)下的高精度計(jì)時(shí)問題,可以參考圖形程序開發(fā)人員指南,里面有關(guān)于控制定時(shí)器8253的詳細(xì)說(shuō)明)。但RDTSC指令是一條CPU指令,凡是i386平臺(tái)下Pentium以上的機(jī)器均支持,甚至沒有平臺(tái)的限制(我相信i386版本UNIX和Linux下這個(gè)方法同樣適用,但沒有條件試驗(yàn)),而且函數(shù)調(diào)用的開銷是最小的。 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)有的C/C+編譯器多數(shù)不

溫馨提示

  • 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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 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)論