基于PLC的溫度監(jiān)控系統(tǒng)設(shè)計(jì)_第1頁
基于PLC的溫度監(jiān)控系統(tǒng)設(shè)計(jì)_第2頁
基于PLC的溫度監(jiān)控系統(tǒng)設(shè)計(jì)_第3頁
基于PLC的溫度監(jiān)控系統(tǒng)設(shè)計(jì)_第4頁
基于PLC的溫度監(jiān)控系統(tǒng)設(shè)計(jì)_第5頁
已閱讀5頁,還剩11頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論