




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
PAGE
基于PLC的溫度監(jiān)控系統(tǒng)設(shè)計(jì)
摘要:可編程邏輯控制器(PLC)被研制成大約在1968年。PLC是一種固態(tài)電子裝置,它利用已存入的程序來控制機(jī)器的運(yùn)行或工藝的工序。PLC通過輸入/輸出(I/O)裝置發(fā)出控制信號(hào)和接受輸入信號(hào)。由于PLC綜合了計(jì)算機(jī)和自動(dòng)化技術(shù),所以它發(fā)展日新月異,大大超過其出現(xiàn)時(shí)的技術(shù)水平。它不但可以很容易地完成邏輯、順序、定時(shí)、計(jì)數(shù)、數(shù)字運(yùn)算、數(shù)據(jù)處理等功能,而且可以通過輸入輸出接口建立與各類生產(chǎn)機(jī)械數(shù)字量和模擬量的聯(lián)系,從而實(shí)現(xiàn)生產(chǎn)過程的自動(dòng)控制。特別是超大規(guī)模集成電路的迅速發(fā)展以及信息、網(wǎng)絡(luò)時(shí)代的到來,擴(kuò)展了PLC的功能,使它具有很強(qiáng)的聯(lián)網(wǎng)通訊能力,從而更廣泛地應(yīng)用于眾多行業(yè)。本文所涉及到的溫度監(jiān)控系統(tǒng)能夠監(jiān)控現(xiàn)場(chǎng)的溫度,并且能夠現(xiàn)場(chǎng)控制和通過計(jì)算機(jī)控制。
關(guān)鍵詞:PLC編程語言溫度
DesignofthetemperaturesupervisorysystembasedonPLC
Abstract:Theprogrammablelogiccontroller(PLC)wasdevelopedin1968.PLCisasolid-statedeviceusedtocontrolmachinemotionorprocessoperationbymeansofastaredprogram.ThePLCsendsoutputcontrolsignalsandreceivesinputsignalsthroughinput/out(I/O)devices.PLCdesignisforbadindustrialenvironmentaluse.Becauseofthecomprehensivecomputerandautomatictechnology,makeitsdevelopmentchangewitheachpassingday,exceedtheengineeringlevelwhileitappearsgreatly.Itcanfinishlogic,order,timing,count,digitaloperation,dataprocessing,etc.functionveryeasily,andcanestablishwithallkindsofconnectionwithanalogquantityofamountofmechanicalfigureproducedthroughtheinput-outputinterface,thusrealizetheautomaticcontroloftheproductionprocess.Especiallytherapiddevelopment,information,arrivalofcybertimesoftheverylargescaleintegration,expandedthefunctionofPLC,makesithaveverystrongnetworkingcommunicationability,thuswidelyapplytonumeroustradesevenmore.Thetemperaturesupervisorysystemthatthispaperisconcernedwithcanthetemperatureofmonitoringsend,andcanthecontrolon-the-spotwithcontrolthroughcomputer.Keywords:PLCProgramminglanguageTemperature
1引言
在生產(chǎn)過程,科學(xué)研究和其他產(chǎn)業(yè)領(lǐng)域中,電氣控制技術(shù)應(yīng)用十分廣泛。在機(jī)械設(shè)備的控制中,電氣控制也比其他的控制方法使用的更為普遍。隨著科學(xué)技術(shù)日新月異的發(fā)展,特別是大規(guī)模集成電路問世和微處理技術(shù)的應(yīng)用,在1969年美國DEC公司研制出第一臺(tái)可編程控制器,用在GM公司生產(chǎn)線上的獲得成功。其后日本、德國等相續(xù)引入,可編程控制器迅速發(fā)展起來。可編程控制器(PLC),使電氣控制技術(shù)進(jìn)入了一個(gè)嶄新的階段。因此可編程控制器廣泛應(yīng)用工業(yè)控制中,PLC系統(tǒng)能夠監(jiān)控反應(yīng)的溫度,就是PLC的一個(gè)典型應(yīng)用。
可編程控制器是一種數(shù)字運(yùn)算操作的電子系統(tǒng),它是專為在惡劣工業(yè)環(huán)境下應(yīng)用而設(shè)計(jì)。它采用可編程序的存儲(chǔ)器,用來在內(nèi)部存儲(chǔ)執(zhí)行邏輯運(yùn)算、順序控制,定時(shí)、計(jì)數(shù)和算術(shù)等操作的指令,并采用數(shù)字式、模擬式的輸入和輸出,控制各種的機(jī)械或生產(chǎn)過程。長期以來,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)。如PLC可進(jìn)行模擬量控制、位置控制和PID控制等,易于實(shí)現(xiàn)柔性制造系統(tǒng)。遠(yuǎn)程通信功能的實(shí)現(xiàn)更使PLC如虎添翼。目前,在先進(jìn)國家中,PLC已成為工業(yè)控制的標(biāo)準(zhǔn)設(shè)備,應(yīng)用面幾乎覆蓋了所有工業(yè)企業(yè)。PLC之所以應(yīng)用廣泛,是因?yàn)镻LC有很多優(yōu)點(diǎn),本文涉及的溫度監(jiān)控系統(tǒng)是以PLC為核心的監(jiān)控系統(tǒng)。
本系統(tǒng)的控制是采用PLC的編程語言——梯形語言,梯形語言是在可編程控制器中的應(yīng)用最廣的語言,因?yàn)樗诶^電器的基礎(chǔ)上加進(jìn)了許多功能、使用靈活的指令,使邏輯關(guān)系清晰直觀,編程容易,可讀性強(qiáng),所實(shí)現(xiàn)的功能也大大超過傳統(tǒng)的繼電器控制電路。
溫度監(jiān)控系統(tǒng)作為一個(gè)應(yīng)用系統(tǒng),要不斷地完善,適應(yīng)時(shí)代和市場(chǎng)的需要才能有所發(fā)展。
2.設(shè)計(jì)要求
①PLC系統(tǒng)能夠監(jiān)控反應(yīng)器的溫度。
②開始工作時(shí)全速加熱,到設(shè)定值時(shí)保溫40分鐘停止加熱。
③通過串行方式在LED上顯示3位溫度值。
④保溫過程中溫度過高/低時(shí)能發(fā)出聲光報(bào)警,聲報(bào)警能用按鈕手動(dòng)解除,光報(bào)警在正常時(shí)自動(dòng)解除。
⑤通過通信方式傳送給監(jiān)控電腦,監(jiān)控電腦能檢測(cè)對(duì)象的參數(shù)、狀態(tài)。
基于以上的要求,所設(shè)計(jì)的系統(tǒng)必須有以下結(jié)構(gòu)模塊:溫度傳感器單元、參數(shù)的LED串行顯示單元、PLC模擬量轉(zhuǎn)換單元、電腦監(jiān)測(cè)單元。
3.系的結(jié)構(gòu)
溫度監(jiān)控系統(tǒng)是將溫度通過溫度傳感器傳送到A/D模塊,A/D模塊將溫度轉(zhuǎn)換為數(shù)字量,再傳送到PLC。其傳送主要是通過PLC的指令,指令控制部分是接收外部各種控制信號(hào),并完成對(duì)各種信息的處理以及完成對(duì)外部設(shè)備的控制。PLC與外部設(shè)備的連接主要是通過I/O口,其功能是接收輸入信號(hào),傳出輸出信號(hào)。整個(gè)系統(tǒng)包括:PLC、A/D模塊、顯示電路。系統(tǒng)原理框圖如圖1所示。
溫度傳感器
加熱單元
顯示電路
FP0
A21
電腦
圖1
3.1PLC類型的選擇
目前,各個(gè)廠家生產(chǎn)的PLC其品種、規(guī)格及功能都各不相同。由于本設(shè)計(jì)的需要我選擇了日本松下電工公司的FP系列PLC,既FP0。FP0是超小型PLC,之所以選擇松下公司生產(chǎn)的PLC,是因?yàn)槠洚a(chǎn)品特點(diǎn)有以下三個(gè)特點(diǎn):
(1)豐富的指令系統(tǒng),有將近200條指令
(2)有強(qiáng)大通信功能。
(3)CPU處理速度快
3.2溫度傳感器
3.2.1溫度傳感器的類型
溫度傳感器有熱電偶和熱電阻兩種類型。
3.2.2類型的選擇
在選擇溫度傳感器時(shí)根據(jù)不同的場(chǎng)合選擇類型,本設(shè)計(jì)由于需要選用PT100溫度傳感器,鉑熱電阻PT100是國際溫標(biāo)ITS-90標(biāo)準(zhǔn)中的工業(yè)溫度測(cè)量元件之一,所以利用PT100溫度傳感器具有一定的典型性,有利于工作系統(tǒng)的穩(wěn)定。鉑熱電阻溫度傳感器是一種精度高,穩(wěn)定性好,抗環(huán)境干擾能力強(qiáng)等。
3.2.3工作原理
鉑電阻溫度傳感器是利用金屬鉑在溫度變化時(shí)自身電阻值也隨之改變的特性測(cè)量溫度,顯示儀表將會(huì)指示出鉑電阻的電阻值所對(duì)應(yīng)的溫度值。當(dāng)被測(cè)介質(zhì)存在溫度梯度時(shí),所測(cè)得的溫度是感溫元件所在范圍內(nèi)介質(zhì)層中的平均溫度。
3.2.4主要技術(shù)指標(biāo)
(1)絕緣電阻:常溫絕緣電阻的試驗(yàn)電壓可取直流10~100V,任意值。
(2)熱響應(yīng)時(shí)間:在溫度出現(xiàn)階躍變化時(shí),熱電阻的電阻變化到相當(dāng)于該階躍變化的50%所需的時(shí)間,稱為熱響應(yīng)時(shí)間,用τ0.5表示。
(3)公稱壓力:一般是指在工作溫度下,保護(hù)管所能承受的靜外壓力而不破裂。
3.3A/D模塊及其溫度控制編程
與FP0配接的A/D混合模塊的型號(hào)為A21,在實(shí)際應(yīng)用中往往需要通過模擬量所采集的值,對(duì)執(zhí)行機(jī)構(gòu)進(jìn)行控制。
3.3.1A/D模塊的介紹
A21模塊有2個(gè)模擬量輸入通道:CH0、CH1。
占用I/O通道分別為:CH0WX2(模擬量輸入通道);CH1WX3(模擬量輸入通道)
根據(jù)本系統(tǒng)的要求應(yīng)選擇CH0通道。
3.3.2數(shù)據(jù)轉(zhuǎn)換
由于A21的輸出數(shù)據(jù)是十進(jìn)制的,也就是說DT0中的數(shù)據(jù)是十進(jìn)制的,那么必須將溫度25度轉(zhuǎn)換為相應(yīng)的十進(jìn)制才可以比較,即數(shù)據(jù)轉(zhuǎn)換的問題。可通過以下計(jì)算思路,得出溫度與相對(duì)應(yīng)的十進(jìn)制值的關(guān)系。溫度傳感器的輸出信號(hào)為0~20mA的電流值,對(duì)應(yīng)于0度~100度的溫度,溫度與電流是線性的,則有:Y1=5x1+2
其中y1代表溫度值,x1代表電流值,根據(jù)以上數(shù)據(jù)轉(zhuǎn)換圖表,當(dāng)輸入4—20mA時(shí),溫度值與十進(jìn)制存在以下關(guān)系:k2=200x2—1000,且x2=20MA,k2=4000則有溫度值和十進(jìn)制的關(guān)系如下:
(Y1-2)/5=k2/200
其中y1和k2分別代表溫度值和十進(jìn)制值。
當(dāng)溫度值為40℃時(shí),對(duì)應(yīng)的十進(jìn)制是1520,根據(jù)以上分析,我們可計(jì)算出任意模擬量輸出的物理量與計(jì)算機(jī)所能處理的十進(jìn)制之間甚至二進(jìn)制的關(guān)系,從而為計(jì)算機(jī)與物理量數(shù)據(jù)的交互提供了一個(gè)通道。在本文的應(yīng)用中,通過PLC模擬單元對(duì)數(shù)據(jù)的轉(zhuǎn)換和傳遞,實(shí)現(xiàn)了實(shí)時(shí)模擬值與需求值不斷比較,直到達(dá)到需求值時(shí)所應(yīng)執(zhí)行的動(dòng)作。因此在程序中用K1520與DM0中的數(shù)據(jù)比較;用CMP指令實(shí)現(xiàn),同時(shí)產(chǎn)生一個(gè)標(biāo)志。但在本文應(yīng)用中需要注意兩點(diǎn):一是由于PLC采用的掃描工作方式,存在著掃描時(shí)間,因此所采集的值到執(zhí)行件執(zhí)行時(shí)模擬值已發(fā)生變化,同時(shí),若我們用CMP指令時(shí),取值一般是小于等于或大于等于這個(gè)結(jié)果,因?yàn)镻LC運(yùn)行時(shí),CPU只能分時(shí)的一個(gè)一個(gè)操作地執(zhí)行,那么模擬值等于需求值同時(shí)又在執(zhí)行CMP的指令的概率就很小,極其容易導(dǎo)致死循環(huán)。因此我們用以上介紹的方法時(shí),應(yīng)用在執(zhí)行元件取值的范圍允許大于PLC一個(gè)掃描周期內(nèi)模擬值變化的狀態(tài)。
3.3.3軟件編程的思路
在程序開始時(shí),首先要將設(shè)定值寫入輸出通道,以便進(jìn)行A/D轉(zhuǎn)換,用第一次循環(huán)標(biāo)志R9012執(zhí)行。PLC上電后,需要約100ms開始進(jìn)行A/D轉(zhuǎn)換,為了使數(shù)據(jù)完全轉(zhuǎn)換,在程序開始時(shí),延時(shí)200到300ms后再從通道中用MOVE指令讀出數(shù)據(jù)。
該指令用于從模擬I/O單元讀取數(shù)據(jù),并把數(shù)據(jù)傳送至目的寄存器中。經(jīng)過A-21將溫度的值輸入PLC內(nèi)部后,可以通過DT0值執(zhí)行動(dòng)作。這里介紹一下在溫度為25度時(shí)停止加熱。為實(shí)現(xiàn)這樣的功能我們的思路是:溫度為25度作為一個(gè)標(biāo)準(zhǔn)值,拿這個(gè)值與DT0中的值不斷的比較,直到DT0中的值等于25度,DT0中的值為25度產(chǎn)生一個(gè)標(biāo)志,在R900B為ON后,表示溫度已達(dá)到設(shè)定值,可執(zhí)行相應(yīng)的動(dòng)作處理。
3.4顯示電路
在工業(yè)控制、儀器儀表、圖形顯示和郵電及其它行業(yè)的窗口廣告顯示系統(tǒng)中,需要有一種LED顯示驅(qū)動(dòng)電路。從目前的LED顯示驅(qū)動(dòng)電路來看,普遍采用一種定時(shí)或中斷控制方式要占據(jù)一部分時(shí)間。然而對(duì)實(shí)時(shí)性很強(qiáng)的工控系統(tǒng)來說該方法就顯得不太合適。當(dāng)控制的回路數(shù)很多時(shí),矛盾尤為突出。本系統(tǒng)的顯示部分采用PS7219顯示驅(qū)動(dòng)器,因?yàn)镻S7219有很多優(yōu)點(diǎn)。
3.4.1PS7219簡(jiǎn)介
PS7219是Maxim公司生產(chǎn)的高性能,低價(jià)格的8位LED(或64只獨(dú)立的LED)顯示驅(qū)動(dòng)器,它采用同步串行外設(shè)接口(PS1)。僅需PLC的三個(gè)控制信號(hào)即可與任何一種單片機(jī)方便接口。實(shí)際上只要符合其接口邏輯。PA7219同樣可應(yīng)用PLC,不管顯示多少位數(shù)據(jù)。均只占用PLC三個(gè)接口,大大方便了顯示電路,從而大大節(jié)省了PLC的端口資源并可在產(chǎn)品設(shè)計(jì)中使LED顯示電路簡(jiǎn)單化。
3.4.2PS7219的主要特點(diǎn):
串行接口信號(hào)頻率可達(dá)10MHz。
可獨(dú)立控制LED各段。
可選擇編碼或非編碼方式。
在關(guān)斷方式下,顯示數(shù)據(jù)不改變,維持電流僅150μA。
可用數(shù)字和模擬兩種方式控制顯示亮度。
內(nèi)含8×8雙端口靜態(tài)RAM。
可直接驅(qū)動(dòng)共陰極LED顯示器。
串行數(shù)據(jù)傳送格式
表1中,串行數(shù)據(jù)共有16位。其中D7~D0為數(shù)據(jù)位,D11~D8為要寫入該數(shù)據(jù)的寄存器地址,D15~D12是無關(guān)位(可為任意數(shù))。
表1
D15D14D13D12
D11D10D9D8
D7D6D5D4D3D2D1D0
無關(guān)位
地址
數(shù)據(jù)
3.4.4通訊時(shí)序圖
數(shù)據(jù)發(fā)送按由高到低的原則,首先發(fā)送D15,最后發(fā)送D0。發(fā)送到DIN端的串行數(shù)據(jù)在每個(gè)CLK的下降沿被移入到內(nèi)部16位寄存器中。在LOAD的上升沿,最后接收到的8位數(shù)據(jù)被鎖存到對(duì)應(yīng)地址的數(shù)字或控制寄存器中。LOAD必須在鎖存D0的時(shí)鐘下降沿同時(shí)或之后,但在下一個(gè)時(shí)鐘下降沿之前變高,否則數(shù)據(jù)將會(huì)丟失。
3.4.5PS7219數(shù)字與控制寄存器
PS7219內(nèi)部共有統(tǒng)一編址的8位寄存器15個(gè),分8個(gè)數(shù)字寄存器和7個(gè)控制寄存器,它們均可單獨(dú)直接尋址,這樣就可對(duì)單個(gè)數(shù)據(jù)或控制字進(jìn)行更新。
數(shù)字寄存器
地址01H~08H,對(duì)應(yīng)LED1~LED8。不譯碼時(shí),D6~D0分別對(duì)應(yīng)標(biāo)準(zhǔn)7段顯示器的A~G,正邏輯顯示。譯碼時(shí),D3~D0為顯示數(shù)據(jù)的BCD碼。無論譯碼與否,D7為1,則該位小數(shù)點(diǎn)顯示。
譯碼方式寄存器
地址09H,D0~D7對(duì)應(yīng)LED1~LED8,正邏輯譯碼。例如D0為1,則LED1工作在譯碼方式。
亮度控制寄存器
地址0AH,D3~D0分32檔控制亮度,0000B全熄,1111B最亮。D7~D4未用。
掃描界線寄存器
地址0BH,由D2~D0內(nèi)容設(shè)置所顯示數(shù)據(jù)的多少,可從1到8。例如111B控制8個(gè)LED全部顯示。
掉電模式寄存器
地址0AH,D0=0,PS7219工作于掉電模式,此時(shí)掃描振蕩器停止工作,CON引腳將置高,顯示器不顯示,功耗降到最低。在數(shù)據(jù)和控制寄存器中的數(shù)據(jù)保持不變。掉電模式可被任何控制功能取消。
閃爍控制寄存器
地址0DH,D0~D7對(duì)應(yīng)LED1~LED8,正邏輯閃爍(即為1時(shí),對(duì)應(yīng)位閃爍)。
非工作寄存器
地址00H,用于PS7219級(jí)聯(lián)。此時(shí)把所有器件的LOAD輸入連接在一起,而把DOUT連接到相鄰PS7219的DIN上。例如,如果要對(duì)第3片芯片寫入時(shí),先發(fā)送所需的16位字,然后跟二個(gè)16位非工作代碼×0××H。當(dāng)LOAD變高時(shí)數(shù)據(jù)被鎖存在所有器件中,前二個(gè)芯片接收的是非工作指令,而第3個(gè)芯片則接收到預(yù)期的數(shù)據(jù)。在起始上電時(shí),所有控制寄存器被復(fù)位為00H,此時(shí)顯示器不顯示。因此用戶在初始化階段至少應(yīng)進(jìn)行譯碼、亮度及掃描線控制寄存器的編程,保證PS7219能正確顯示。
4.軟件編程
本系統(tǒng)采用調(diào)用子程序方式對(duì)ps7219進(jìn)行控制,傳送16位數(shù)據(jù)的地址位和數(shù)據(jù)位。在主程序中對(duì)ps7219的初始化。包括:譯碼方式寄存器、顯示亮度寄存器、掃描個(gè)數(shù)寄存器等。顯示程序?qū)嶋H上就是在CLK和LOAD時(shí)序的配合下不斷通過DIN向ps7219的相應(yīng)控制寄存器和數(shù)據(jù)顯示寄存器寫入16位二進(jìn)制數(shù)據(jù)的過程。所以問題的關(guān)鍵在于編寫一個(gè)通用的寫入子程序?qū)PU的內(nèi)容從高位到低位在CLK的作用下依次移入到ps7219的移位寄存器,最后在LOAD的上升沿鎖存到相應(yīng)的內(nèi)部控制寄存器和數(shù)據(jù)顯示寄存器中。
5.報(bào)警電路
報(bào)警電路部分是為了方便對(duì)于本部分的硬件電路比較簡(jiǎn)單,主要是軟件的編程,其程序如下:
6.程序的結(jié)構(gòu)框圖
初始化
顯示溫度
是否到設(shè)定值
停止加熱
加熱
保溫階段
與設(shè)定值比較
報(bào)警
Y
N
N
低
系統(tǒng)的程序框圖如右圖所示。
7.結(jié)束語
隨著計(jì)算機(jī)控制技術(shù)的發(fā)展,可編程序控制器(PLC)憑借其自身所具有的抗干擾能力強(qiáng)、穩(wěn)定性好、可靠性高、編程簡(jiǎn)單、維護(hù)量小等一系列特點(diǎn),在現(xiàn)代控制領(lǐng)域占有越來越重要的地位。近年來,世界上各生產(chǎn)廠家相繼推出多種新型PLC,其主要特點(diǎn)是:功能強(qiáng)大,具有網(wǎng)絡(luò)功能,不僅能實(shí)現(xiàn)復(fù)雜的邏輯控制,還能實(shí)現(xiàn)順序和定時(shí)的閉環(huán)控制功能,并能組成分布控制系統(tǒng)等。然而PLC在對(duì)模擬量處理中雖然廠家推出了各種模擬采集模塊,但造價(jià)高、路數(shù)少、擴(kuò)展麻煩,在模擬量多的控制場(chǎng)合中應(yīng)用受到限制。本文利用PLC完善的功能與溫度傳感器,PS7219,LED,A/D轉(zhuǎn)換等相結(jié)合,有效而可靠地實(shí)現(xiàn)了對(duì)溫度的自動(dòng)控制。實(shí)踐表明PLC抗干擾能力好,壽命長,可靠性高,非常適合工業(yè)控制系統(tǒng)及類似的生產(chǎn)線。
本設(shè)計(jì)既充分利用PLC的特點(diǎn),又對(duì)PLC的控制功能進(jìn)行擴(kuò)充,使其具有顯示直觀,運(yùn)行可靠。
參考文獻(xiàn)
[1]凌云.PS7219顯示驅(qū)動(dòng)器及其在PLC中的應(yīng)用.湖南冶金職業(yè)技術(shù)學(xué)院報(bào),2003(6)
[2]張桂香.電氣控制與PLC應(yīng)用.化學(xué)工業(yè)出版社,2003
[3]王成福.PLC在多路溫度采集顯示系統(tǒng)中的應(yīng)用.電子技術(shù),2003(8)
[3]張桂苓.淺談現(xiàn)代PLC的優(yōu)勢(shì)特點(diǎn).電子技術(shù),2003(2)
[5]李丹,楊素英.可編程序控制器通用數(shù)據(jù)采集方法的研究.大連理工學(xué)報(bào),2001(6)附錄資料:不需要的可以自行刪除
測(cè)量平差程序設(shè)計(jì)
角度(度分秒)到弧度AngleToRadian
#definePI3.14159265
doubleAngleToRadian(doubleangle)
{
intD,M;
doubleS,radian,degree,angle,MS;
D=int(angle+0.3);
MS=angle-D;
M=int((MS)*100+0.3);
S=(MS*100-M)*100;
degree=D+M/60.0+S/3600.0;
radian=degree*PI/180.0;
returnradian;
}
注意:防止數(shù)據(jù)溢出,要加個(gè)微小量,例如0.3.
弧度換角度(度分秒)RadianToAngle
#definePI3.14159265
doubleRadianToAngle(doubleradian)
{
intD,M;
doubleS,radian,degree,MS,angle;
degree=radian*180/PI;
D=int(degree);
MS=degree-D;
M=int(MS*60);
S=(MS*60-M)*60;
angle=D+M/100.0+S/10000.0;
returnangle;
}
已知兩點(diǎn)求坐標(biāo)方位角Azimuth
#include<math.h>
doubleAzimuth(doublexi,doubleyi,doublexj,doubleyj)
{
doubleDx,Dy,S,T;
Dx=xj-xi;
Dy=yj-yi;
S=sqrt(Dx*Dx+Dy*Dy);
if(S<1e-10)return0;
T=asin(Dy/S);
if(Dx<0)T=PI-T;
if(Dx>0&&(Dy<0)||T<0)T=2*PI+T;
returnT;
}
4.開辟二維數(shù)組的動(dòng)態(tài)空間的宏
#include<malloc.h>
#defineNewArray2D(type,A,i,n,m){A=(type**)malloc(n*sizeof(type*));\
for(i=0;i<m;i++)\
A[i]=(type*)malloc(m*sizeof(type));\
}
5.釋放開辟的二維數(shù)組的空間
#defineFreeSpace(A,i,m){for(i=0;i<m;i++)\
free(A[ i]);\
free(A);\
}
注意:釋放空間與開辟空間相反,釋放空間是先釋放列,后釋放行.
6.矩陣求轉(zhuǎn)置transformmatrix
voidtransformmatrix(double**A,double**B,inti,intj)
{
intm,n;
for(m=0;m<=i;m++)
for(n=0;n<=j;n++)
{
B[n][m]=A[m][n]:
}
}
7.矩陣相乘(mulmatrix)
voidmulmatrix(double**A,double**B,double**C,inti,intj,intk)
{
intm,n,p;
for(m=0;m<i;m++)
for(n=0;n<j;n++)
{
C[m][n]=0;
for(p=0;p<k;p++)
{
C[m][n]+=A[m][p]*B[p][n]:
}
}
}
8.矩陣求逆(countermatrix)
#include<math.h>
voidcountermatrix(double**T,double**s,double**r,double**Q,double**N,double**rt,intn)
{
for(i=0;i<n;i++)
{
s=N[i][i];
for(k=0;k<i;k++)
{
s-=T[k][i]*T[k][i];
}
T[i][i]=sqrt(s)
for(j=i+1;j<n;j++)
{
s=N[i][j];
for(k=0;k<i;k++)
{
s-=T[k][i]*T[k][j];
}
T[i][j]=s/T[i][i];
}
}
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
T[i][j]=0;
}
for(i=n-1;i>=0;i++)
{
r[i][i]=1/T[i][i];
for(j=i+1;j<n;j++)
{
s=0;
for(k=i;k<j-1;k++)
{
s-=r[i][k]*T[k][j];
}
r[i][j]=s/T[i][i];
}
}
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
r[i][j]=0;
}
transformmatrix(r,rt,n,n)
mulmatrix(r,rt,Q,n,n)
}
9.平差主程序之讀入數(shù)據(jù)
typedefstructPOINT
{
charname[8];
doublex,y;
inttype;
}POINT;
typedefstructREADVALUE
{
POINT*begin;
POINT*end;
doublevalue;
}READVALUE;
POINT*GETPOINT(char*name,POINT*pPoint,intnPoint)
{
inti;
for(i=0;i<nPoint;i++)
{
if(strcmp(pPoint[i].name,name)==0)
return(pPoint+i)
}
for(i=0;i<nPoint;i++)
{
if(pPoint[i]=NULL)
strcmp(pPoint[i].name,name);
pPoint[i].type=0;
return(pPoint+i);
}
}
doubleAngleToRadian(doubleangle)
{
intD,M;
doubleS,radian,degree,angle,MS;
D=int(angle+0.3);
MS=angle-D;
M=int((MS)*100+0.3);
S=(MS*100-M)*100;
degree=D+M/60.0+S/3600.0;
radian=degree*PI/180.0;
returnradian;
}
main()
{
POINT*pPoint=NULL;
READVALUE*pDirect=NULL;
READVALUE*pDistance=NULL;
intnPoint,nKnownPoint,nDirect,nDistance,i;
doublemo,mf,ms;
charbegin[8],end[8];
FILE*fp=0;
fp=fopen(“c:\\dat\\t1.txt”,”r”)
fscanf(fp,”%d,%d,%d,%d\n”,&nPoint,&nKnowPoint,&nDirect,&nDistance)
if(nPoint>0)
pPoint=(POINT*)malloc(nDirect*sizeof(POINT));
if(nDirect>0)
pDirect=(READVALUE*)malloc(nDirect*sizeof(READVALUE));
if(nDistance>0)
pDistance=(READVALUE*)malloc(nDistance*sizeof(RAADVALUE));
fscanf(fp,”%lf,%lf,%lf\n”,&mo,&mf,&ms);
for(i=0;i<nKnownPoint;i++)
{
fscanf(fp,”%s,%lf,%lf\n”,pPoint[i].name,&pPoint[i].x,&pPoint[i].y);
type=1;
}
for(;i<nPoint;i++)
{
pPoint[i].name=NULL;
pPoint[i].x=0;
pPoint[i].y=0;
pPoint[i].type=0;
}
for(i=0;i<nDirect;i++)
{
fscanf(fp,”%s,%s,%lf\n”,begin,end,&pDirect[i].value);
pDirect[i].begin=GetPoint(begin,pPoint,nPoint);
pDirect[i].end=GetPoint(end,pPoint,nPoint);
}
for(i=0;i<nDistance;i++)
{
fscanf(fp,”%s,%s,%lf\n”,begin,end,&pDistance[i].value);
pDistance[i].begin=GetPoint(begin,pPoint,nPoint);
pDistance[i].end=GetPoint(end,pPoint,nPoint);
}
fclose(fp);
}
10.角度檢驗(yàn)(checkangle)
#include<math.h>
intcheckangle(doubleangle)
{
intM,S;
doubleMS;
if(angle>=0&&angle<360)
{
MS=angle-(int)(angle);
if(M<6)
{
S=(int)(MS*1000);
if(S%10<6)
{
return1;
}
}
}
return0;
}
11.前方交會(huì)
#definePI=3014159265
/***此處調(diào)用程序角度換弧度AngleToRadian***/
Qianfang(doubleXE,doubleYE,doubleXF,doubleYF,doubleDEG,doubleDEF,doubleDFG,doubleDFE,double*DFE,double*DFG)
{
doubleC,A,B;
C=DGE-DGF;
A=DEF-DEG;
B=DFG-DFE;
if((C<-PI&&C>-2*PI)||(C>0&&C<PI)
{
XG=(XE/tan(B)+XF/tan(A)-YE+YF)/(1/tan(A)+1/tan(B);
YG=(YE/tan(B)+YF/tan(A)+XE-XF)/(1/tan(A)+1/tan(B);
}
if((C>-PI&&C<0)||(C>PI&&C<2*PI))
{
XG=(XE/tan(B)+XF/tan(A)+YE-YF)/(1/tan(A)+1/tan(B);
YG=(YE/tan(B)+YF/tan(A)-XE+XF)/(1/tan(A)+1/tan(B);
}
}
12.坐標(biāo)概算全方向法
子函數(shù)取出觀測(cè)方向GetAllDirect
intGetAllDirect(char*name,intnDirect,READVALUE*pDirect,READVALUE*pStation)
{
inti,nCount=0;
for(i=0;i<nDirect;i++)
if(strcmp(pDirect[i].begin->name,name)==0))
{
pStation[nCount].begin=p(pDirect[nCount].begin;
pStation[nCount].end=p(pDirect[nCount].end;
pStation[nCount].value=p(pDirect[nCount].value;
nCount++;
}
returnnCount;
}
坐標(biāo)概算全方向法子程序?qū)崿F(xiàn)流程(coordinate)
coordinate(入口參數(shù)設(shè)置)
{
READVALUEpStation[50],pObject[50];
intnCount,i,j,k,m,n,p,nobject;
for(i=0;i<nPoint;i++)
{
nCount=GetAllDirect(pPoint[i].name,nDirect,pStation)
if((nCount>1)||(nCount=1))
{
for(j=0;j<nCount;j++)
{
if(pStation[j].end->type==1)
{
for(k=0;k<nCount;k++)
{
if(pStation[k].end->type==0)
nobject=GetAllDirect(pStation[j].end->name,nDirect,pDirect,pobject)
m=-1;
n=-1;
for(p=0;p<nobject;p++)
{
if(strcmp(pobject[p].end->name,pPoint[i].name)==0)
{
m=p;
}
if(strcmp(pobject[p].end->name,pStation[k].end->name)==0)
{
n=p;
}
if(m>=0&&n>=0)
{
pPoint[i]=pStation[k].end-pStation[j].end;
pStation[j].end=pObject[m].value-pObject[n].value;
{
Xe=pPoint[i].x;
Ye=pPoint[i].y;
Xf=pStation[j].end->x;
Yf=pStation[j].end->y;
Lef=pStation[j].value;
Leg=pStation[k].value;
Lfe=pObject[m].value;
Lfg=pObject[n].value;
Qianfang(Xe,Xf,Ye,Yf,Lef,Leg,Lfe,Lfg,*Xg,*Yg;)
pStation[k].end->x=*xg;
pStation[k].end->y=*yg;
pStation[k].end.type=2;
}
}
}
}
}
}
}
}
13.坐標(biāo)增量法(calcoordinate)
子函數(shù)由端點(diǎn)名稱得邊長值的函數(shù)GetDistance
doubleGetDistance(char*begin,char*end,intnDistance,READVALUE*pDistance)
{
inti;
for(i=0;i<nDistance;i++)
{ if((strcmp(pDistance[i].begin->name,begin)==0&&strcmp(pDistance[i].end->name,end==0)||(strcmp(pDistance[i].begin->name,end)==0&&strcmp(pDistance[i].end,begin)==0))
returnpDistance[i].value;
}
return-1;
}
/***函數(shù)取出觀測(cè)方向GetAllDirect***/
voidcalcoordinate(intnDirect,READVALUE*pDirect,intnDistace,READVALUE*pDistance,intnPoint,POINT*pPoint)
{
intnPoint,nCount,nDirect,nDistance;
intm=-1,i,j,k;
doublex1,y1,x2,y2,A0,A,S,dx,dy;
READVALUE*pDirect=NULL;
READVALUEpStation[50];
for(i=0;i<nPoint;i++)
{
if(pPoint[i].type>0)
{
nCount=GetAllDirect(pPoint[i].name,nDirect,pDirect,pStation[50]);
for(j=0;j<nCount;j++)
{
if(pStation[j].end->type>0)m=j;
if(m!=-1)
{
for(k=0;k<nCount;k++)
{
if(pStation[k].end->type==0)
{
x1=pPoint[i].x;
y1=pPoint[i].y;
x2=pStation[j].end->x;
y2=pStation[j].end->y;
A0=Bearing(x1,y1,x2,y2);
A=A0-(DMSToRAD(pStation[m].value)-DMSToRAD(pStation[k].value));
if(A<0)A=A+2*PI;
if(A>2*PI)A=A-2*PI;
S=GetDistance(pPoint[i],pStation[k].end,nDistance,pDistance);
if(S<0)continue;
else
{
dx=S*cos(A);
dy=S*sin(A);
pStation[k].end->x=pPoint[i].x+dx;
pStation[k].end->y=pPoint[i].y+dy;
pStation[k].end->type=2;}
}
}
}
}
}
}
}
14.高斯正反算
高斯正算:
#include<math.h>
#include<stdio.h>
#definePI3.14159265
doubleDMSToRAD(doubledDMS)
{
in
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- T-ZGXK 024-2024 青儲(chǔ)玉米品種試驗(yàn)規(guī)范
- 二零二五年度企業(yè)代為管理員工社保繳費(fèi)及報(bào)銷流程合同
- 二零二五年度購房按揭貸款利率調(diào)整合同
- 2025年度酒店入住智能家居體驗(yàn)合同
- 2025年度汽車零部件訂車合同違約賠償標(biāo)準(zhǔn)及責(zé)任界定
- 二零二五年度公寓樓出租合同樣本(含精裝修、家具家電及物業(yè)費(fèi))
- 二零二五年度醫(yī)院藥劑科藥品配送與勞務(wù)合作合同
- 二零二五年度臨時(shí)項(xiàng)目經(jīng)理聘用與項(xiàng)目風(fēng)險(xiǎn)預(yù)警協(xié)議
- 二零二五年度租賃型住房委托管理服務(wù)合同
- 二零二五年度旅游產(chǎn)業(yè)投資合作框架協(xié)議
- 500-3000總噸船舶大副培訓(xùn)大綱(2021版)
- 2024至2030年中國錢幣類收藏品行業(yè)市場(chǎng)前景調(diào)查及投融資戰(zhàn)略研究報(bào)告
- 三級(jí)安全培訓(xùn)考試題附參考答案(滿分必刷)
- 高一英語完形填空專項(xiàng)訓(xùn)練100(附答案)及解析
- 機(jī)房基礎(chǔ)設(shè)施運(yùn)行維護(hù)管理標(biāo)準(zhǔn)規(guī)范
- 老年心房顫動(dòng)診治中國專家共識(shí)(2024)解讀
- 部編版八年級(jí)上冊(cè)歷史期中復(fù)習(xí)重點(diǎn)總結(jié)
- 2024年揚(yáng)州市職業(yè)大學(xué)單招職業(yè)適應(yīng)性測(cè)試題庫1套
- 消防安全技術(shù)綜合能力要點(diǎn)概述
- DL-T 5148-2021水工建筑物水泥灌漿施工技術(shù)條件-PDF解密
- 道路施工安全隱患及防范措施
評(píng)論
0/150
提交評(píng)論