版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、<p> 畢 業(yè) 論 文</p><p> 題 目: 電力系統(tǒng)設計-通訊系統(tǒng)設計 </p><p> 作 者: 學 號: </p><p> 系 : </p><p> 專 業(yè):
2、 </p><p> 班 級: </p><p> 指導者: </p><p> 評閱者: </p><p><b> 年 月</b>
3、;</p><p> 畢業(yè)設計(論文)中文摘要</p><p><b> 目 次</b></p><p><b> 1 引言1</b></p><p> 2 電力系統(tǒng)分析1</p><p><b> 2.1 定義1</b></
4、p><p> 2.2 電力系統(tǒng)圖1</p><p> 2.3 發(fā)展簡況2</p><p><b> 2.4系統(tǒng)構成2</b></p><p> 3 電力系統(tǒng)的運行和控制3</p><p> 3.1 電力系統(tǒng)的運行3</p><p> 3.2 電力系統(tǒng)的控
5、制4</p><p> 3.3安全控制按其功能分類5</p><p> 3.4 提高系統(tǒng)穩(wěn)定的基本措施5</p><p> 4 計算機監(jiān)控系統(tǒng)5</p><p> 4.1 星型網絡5</p><p> 4.2 擴展環(huán)型網絡6</p><p> 5 Delphi在電力系
6、統(tǒng)中的應用6</p><p> 5.1 主控程序(PTX)7</p><p> 5.2 GPRSServer10</p><p> 5.3 ClientIn18</p><p> 5.4 ServerIn18</p><p> 6 ActiveX控件22</p><
7、p> 6.1 COM技術規(guī)范的發(fā)展史22</p><p> 6.2 Active 舉例23</p><p><b> 結論31</b></p><p><b> 致謝32</b></p><p><b> 參考文獻33</b></p>
8、<p><b> 1 引言</b></p><p> 隨著經濟的發(fā)展,社會的進步,計算機越來越深入到我們日常的工作學習及生活中,成為我們日常生活中不可缺少的輔助工具。隨著科學技術的不斷提高,計算機科學日漸成熟,其強大的功能已為人們深刻認識,它已進入人類社會的各個領域并發(fā)揮著越來越重要的作用。它已經深入到日常工作和生活的方方面面,比如文字處理、信息管理、輔助設計、圖形圖像處理
9、、教育培訓以及游戲娛樂等。各行各業(yè)的人們無須經過特別的訓練就能夠使用電腦完成許許多多復雜的工作。然而,雖然現在世界上已經充滿了多如牛毛的各種軟件,但它們依然不能滿足用戶的各種特殊需要,人們還不得不開發(fā)適合自己特殊需求的軟件。以前開發(fā)Windows應用軟件是專業(yè)人員的工作,需要掌握許多專業(yè)知識和經過特殊的培訓才能勝任?,F在不同了,即使你沒有接受過嚴格的程序設計訓練,使用Delphi編程語言也一樣能夠開發(fā)出功能強大、適合自己特殊需求的應用程
10、序了。Delphi編程語言繼承了其他語言易學易用的特點,特別適合于初學者學習Windows系統(tǒng)編程。 </p><p><b> 2 電力系統(tǒng)分析</b></p><p><b> 2.1 定義</b></p><p> 由發(fā)電、變電、輸電、配電和用電等環(huán)節(jié)組成的電能生產、傳輸、分配和消費的系統(tǒng)。由發(fā)電、輸電、變電
11、、配電和用電等環(huán)節(jié)組成的電能生產與消費系統(tǒng)。它的功能是將自然界的一次能源通過發(fā)電動力裝置轉化成電能,再經輸電、變電和配電將電能供給到各用戶。為實現這一功能,電力系統(tǒng)在各個環(huán)節(jié)和不同層次還具有相應的信息與控制系統(tǒng),對電能的生產過程進行丈量、調節(jié)、控制、保護、通訊和調度,以保證用戶獲得安全、經濟、優(yōu)質的電能。</p><p><b> 2.2 電力系統(tǒng)圖</b></p><
12、p> 由發(fā)電、變電、輸電、配電和用電等環(huán)節(jié)組成的電能生產與消費系統(tǒng)。它的功能是將自然界的一次能源通過發(fā)電動力裝置(主要包括鍋爐、汽輪機、發(fā)電機及電廠輔助生產系統(tǒng)等)轉化成電能,再經輸、變電系統(tǒng)及配電系統(tǒng)將電能供給到各負荷中心,通過各種設備再轉換成動力、熱、光等不同形式的能量,為地區(qū)經濟和人民生活服務。由于電源點與負荷中心多數處于不同地區(qū),也無法大量儲存,故其生產、輸送、分配和消費都在同一時間內完成,并在同一地域內有機地組成一個整
13、體,電能生產必須時刻保持與消費平衡。因此,電能的集中開發(fā)與分散使用,以及電能的連續(xù)供給與負荷的隨機變化,就制約了電力系統(tǒng)的結構和運行。據此,電力系統(tǒng)要實現其功能,就需在各個環(huán)節(jié)和不同層次設置相應的信息與控制系統(tǒng),以便對電能的生產和輸運過程進行丈量、調節(jié)、控制、保護、通訊和調度,確保用戶獲得安全、經濟、優(yōu)質的電能。建立結構公道的大型電力系統(tǒng)不僅便于電能生產與消費的集中治理、同一調度和分配,減少總裝機容量,節(jié)省動力設施投資,且有利于地區(qū)能源
14、資源的公道開發(fā)利用,更大限度地滿足地區(qū)國民經濟日益增長的用電需要。電力系統(tǒng)建設往往是國家及地區(qū)國民經濟發(fā)展規(guī)劃的重要組成部分。電力系統(tǒng)</p><p><b> 2.3 發(fā)展簡況</b></p><p> 在電能應用的初期,由小容量發(fā)電機單獨向燈塔、輪船、電力系統(tǒng)。</p><p> 車間等的照明供電系統(tǒng),可看作是簡單的住戶式供電系統(tǒng)。白
15、熾燈發(fā)明后,出現了中心電站式供電系統(tǒng),如1882年T.A.托馬斯·阿爾瓦·愛迪生在紐約主持建造的珍珠街電站。它裝有6臺直流發(fā)電機(總容量約670千瓦),用110伏電壓供1300盞電燈照明。19世紀90年代,三相交流輸電系統(tǒng)研制成功,并很快取代了直流輸電,成為電力系統(tǒng)大發(fā)展的里程碑。20世紀以后,人們普遍熟悉到擴大電力系統(tǒng)的規(guī)??梢栽谀茉撮_發(fā)、產業(yè)布局、負荷調整、系統(tǒng)安全與經濟運行等方面帶來明顯的社會經濟效益。于是,電
16、力系統(tǒng)的規(guī)模迅速增長。世界上覆蓋面積最大的電力系統(tǒng)是前蘇聯的同一電力系統(tǒng)。它東西橫越7000千米,南北直通3000千米,覆蓋了約1000萬平方千米的土地。中華人民共和國的電力系統(tǒng)從50年代開始迅速發(fā)展。到1991年底,電力系統(tǒng)裝機容量為14600萬千瓦,年發(fā)電量為6750億千瓦時,均居世界第四位。輸電線路以220千伏、330千伏和500千伏為網絡骨干,形成4個裝機容量超過1500萬千瓦的大區(qū)電力系統(tǒng)和9個超過百萬千瓦的省電力系統(tǒng),大區(qū)之
17、間的聯網工作也已開始。此外,1989年,臺灣省建立了裝機容量為1659萬千瓦的電力系統(tǒng)</p><p><b> 2.4系統(tǒng)構成</b></p><p> 電力系統(tǒng)的主體結構有電源、電力網絡和負荷中心。電源指各類發(fā)電廠、站,它將一次能源轉換成電能;電力網絡由電源的升壓變電所、輸電線路、負荷中心變電所、配電線路等構成。它的功能是將電源發(fā)出的電能升壓到一定等級后輸送到
18、負荷中心變電所,再降壓至一定等級后,經配電線路與用戶相聯。電力系統(tǒng)中網絡結點千百個交織密布,有功潮流、無功潮流、高次諧波、負序電流等以光速在全系統(tǒng)范圍傳播。它既能輸送大量電能,創(chuàng)造巨大財富,也能在瞬間造成重大的災難性事故。為保證系統(tǒng)安全、穩(wěn)定、經濟地運行,必須在不同層次上依不同要求配置各類自動控制裝置與通訊系統(tǒng),組成信息與控制子系統(tǒng)。它成為實現電力系統(tǒng)信息傳遞的神經網絡,使電力系統(tǒng)具有可觀測性與可控性,從而保證電能生產與消費過程的正常進
19、行以及事故狀態(tài)下的緊急處理。</p><p> 3 電力系統(tǒng)的運行和控制</p><p> 3.1 電力系統(tǒng)的運行</p><p> 電力系統(tǒng)的運行狀態(tài)可以分成正常狀態(tài)和異常狀態(tài)兩種。正常狀態(tài)又可分為安全狀態(tài)和警戒狀態(tài);異常狀態(tài)又分成緊急狀態(tài)和恢復狀態(tài)。電力系統(tǒng)的運行包括了所有這些狀態(tài)及其相互間的轉移,如圖所示。 </p><p>&
20、lt;b> 電力系統(tǒng)運行</b></p><p> 安全狀態(tài) 系統(tǒng)的頻率、各節(jié)點的電壓、各元件的負荷均處于規(guī)定的允許值范圍內,并且一般的小擾動不致使運行狀態(tài)脫離正常運行狀態(tài)。由于目前電能尚不能大量存貯,任何瞬間必須保證發(fā)電、輸電、用電之間的平衡,而用電負荷又隨時會發(fā)生變化,所以正常安全狀態(tài)實際上始終處于一個動態(tài)的平衡之中,必須進行正常的調整,包括頻率和電壓,即有功功率和無功功率的調整。&l
21、t;/p><p> 警戒狀態(tài) 系統(tǒng)整體仍處于安全的范圍內,但個別元件或地區(qū)的運行參數已臨近安全范圍的邊緣,擾動將使運行進入緊急狀態(tài)。對處于警戒狀態(tài)的電力系統(tǒng)應該采取預防控制,使之進入安全狀態(tài)。</p><p> 緊急狀態(tài) 正常運行狀態(tài)的電力系統(tǒng)遭到擾動(包括負荷的變動和各種故障),電源和負荷之間的功率平衡遭到破壞而引起系統(tǒng)頻率和節(jié)點電壓超過了允許的偏移值,或元件的負擔超過了安全運行的限
22、制值,系統(tǒng)處于危機中。對處于緊急狀態(tài)下的電力系統(tǒng),應該采取各種校正控制和穩(wěn)定控制措施,使系統(tǒng)盡可能回復到正常狀態(tài)。近來有人把緊急狀態(tài)進一步分為耐受性危機(它允許持續(xù)幾秒到幾十分鐘)和穩(wěn)定性危機(它允許持續(xù)時間一般不超過10秒鐘)。這種細分有利于針對不同的危機采取不同的控制措施。</p><p> 恢復狀態(tài) 這時電力系統(tǒng)已被解列成若干個局部系統(tǒng),其中有些系統(tǒng)已經不能保證正常地向用戶供電,但其他部分可以維持正常狀
23、態(tài);或者系統(tǒng)未被解列,但已不能滿足向所有的用戶正常供電,已有部分負荷被切除。當處于緊急狀態(tài)下的電力系統(tǒng)不能通過校正和穩(wěn)定控制回復到正常狀態(tài)時,應按對用戶影響最小的原則采取緊急控制措施,使之進入恢復狀態(tài)。然后根據情況采取恢復控制措施,使系統(tǒng)回復到正常運行狀態(tài)。</p><p> 安全控制 預防性控制、校正控制、穩(wěn)定控制、緊急控制和恢復控制都以提高電力系統(tǒng)安全性為目標,所以統(tǒng)一稱為安全控制。</p>
24、<p> 由于供電中斷和電能質量的低劣會給國民經濟和人民生活帶來嚴重影響,所以電力系統(tǒng)的運行必須安全可靠、保證電能質量和求取最大的經濟性。</p><p> 為了提高電力系統(tǒng)的安全可靠性,要求系統(tǒng)有一定的備用容量以滿足負荷變動和事故的需要;要求合理配置無功功率電源;要求設備處于健康的狀態(tài),系統(tǒng)具有一定的穩(wěn)定性儲備,并配備各種必要的安全措施和裝置。 </p><p> 交流
25、電力系統(tǒng)的頻率、電流和電壓的正弦波形,以及各節(jié)點的電壓幅值是電能質量的 3個基本指標。為了保證電能質量,必須采取電壓調整、頻率調整和抑制諧波的措施。</p><p> 電力系統(tǒng)調度 電力系統(tǒng)在保證安全可靠和電能質量的前提下,還應力求調整負荷,提高設備利用率,合理利用各種能源資源,實施經濟運行,降低煤耗、廠用電和網絡損耗,以取得最大的經濟效益。</p><p> 由于電力系統(tǒng)本身的特點
26、:集中的發(fā)電和分散的用電,電力系統(tǒng)分布于廣闊的地域而發(fā)、送、用之間的功率又要求嚴格的瞬時平衡,因而電力系統(tǒng)的運行需要統(tǒng)一而分級、分層的調度管理,需要一個和電能傳輸、分配系統(tǒng)相平行的信息采集、傳輸和處理的通信系統(tǒng),以實現正常的調整和各種安全、經濟的控制。</p><p> 3.2 電力系統(tǒng)的控制</p><p> 電力系統(tǒng)安全控制的目的是采取各種措施使系統(tǒng)盡可能運行在正常運行狀態(tài)。在正常
27、運行 狀態(tài)下,調度人員通過制定運行計劃和運用計算機監(jiān)控系統(tǒng)(SCADA或EMs)實時進行電力系統(tǒng)運行信息的收集和處理,在線安全監(jiān)視和安全分析等,使系統(tǒng)處于最優(yōu)的正常運行狀態(tài)。</p><p> 同時。在正常運行時,確定各項預防性控制,以對可能出現的緊急狀態(tài)提高處理能力。這些控制內容包括:系統(tǒng)以額定工況運行調整發(fā)電機出力、切換網絡和負荷、調整潮流、改變保護整定值、切換變壓器分接頭等,使系統(tǒng)運行在最佳狀態(tài)。在系統(tǒng)發(fā)
28、生事故時有較高的安全水平當電力系統(tǒng)一旦出現故障進入緊急狀態(tài)后,則靠緊急控制來處理。這些控制措施包括繼電保護裝置正確快速動作和各種穩(wěn)定控制裝置等切除故障,防止事故擴大,平衡有功和無功,將系統(tǒng)恢復到正常運行狀態(tài)或重新進入正常運行狀態(tài)。 </p><p> 3.3安全控制按其功能分類 </p><p> 1、提高系統(tǒng)穩(wěn)定的措施有快速勵磁、電力系統(tǒng)穩(wěn)定器(ess)、電氣制動、快關汽機和切機、串
29、聯補償、靜止無功:ff ̄Osvq、超導電磁蓄能和直流 調制等?!?lt;/p><p> 2、維持系統(tǒng)頻率的措施有低頻減負荷、低頻降電壓、低頻自起動、抽水蓄能機組抵頻抽水改發(fā)電、低頻發(fā)電機解列、高頻切機、高頻減出力等?!?lt;/p><p> 3、預防線路過負荷的措施有過負荷切電源、過負荷切負荷等?!?lt;/p><p> 3.4 提高系統(tǒng)穩(wěn)定的基本措施 </p>
30、;<p> 1、加強電網網架,提高系統(tǒng)穩(wěn)定。線路輸送功率能力與線路兩端電壓之積成正比,而與線路阻抗成反比。減少線路電抗和維持電壓,可提高系統(tǒng)穩(wěn)定性。在線路上裝設串聯電容是一種有效的減少線路阻抗的方法。在長線路中間裝設靜止無功補償裝置 ̄svq。能有效地保持線路中間電壓水平(相當于長線路變成兩段短線路),并快速調整系統(tǒng)無功。是提高系統(tǒng)穩(wěn)定性的重要手段?!?lt;/p><p> 2、電力系統(tǒng)穩(wěn)定控制和保護
31、裝置。提高電力系統(tǒng)穩(wěn)定性的控制可包括兩個方面:一是失去穩(wěn)定前,采取措施提高系統(tǒng)的穩(wěn)定性;二是失去穩(wěn)定后,采取措施重新恢復新的穩(wěn)定運行。</p><p> 所謂穩(wěn)定,是指電力系統(tǒng)可以連續(xù)不斷的向負荷供電的狀態(tài)。電力系統(tǒng)繼電保護的充足性、安全性、經濟性和質量是電力工業(yè)生產穩(wěn)定必須滿足的幾項基本要求。</p><p> 4 計算機監(jiān)控系統(tǒng)</p><p> 對于應
32、用較為廣泛的星型和環(huán)型網絡進行詳細分析并進行擴展,同時結合有、無主結構分析其應用性質.</p><p><b> 4.1 星型網絡</b></p><p> 由星形網絡組成的監(jiān)控系統(tǒng),各網絡節(jié)點通過中心交換機連接,同時考慮到冗余需要,利用另外一臺交換機組成雙網絡,網絡工作原理如下:</p><p> 有主結構:現地控制單元有兩塊CPU模件
33、,實現該單元節(jié)點處的故障冗余,為主的CPU板實時采集各種信號,并針對故障信號采取相應處理,同時將采集的信號量數字化,再傳送給主站;主站負責數據的接收,同時向操作員站送實時數據,并將操作員站的命令下達.</p><p> 無主結構:現地控制單元實時采集各種信號并針對故障信號采取相應處理,主站作為數據服務器,定時向各現地控制單元節(jié)點要數據并記錄,操作員站通過交換機直接與現地控制單元通訊,傳送數據與命令.</p
34、><p> 星形網絡的優(yōu)點是結構相對簡單,由于普遍通訊協(xié)議為TCP/IP,開發(fā)額外的系統(tǒng)應用程序比較簡單,缺點是系統(tǒng)安全性能不高,若交換機壞,則網絡就面臨崩潰,對主站依賴性強.此種網絡結構在一些系統(tǒng)升級改造的電站應用較多.</p><p> 4.2 擴展環(huán)型網絡</p><p> 擴展環(huán)型網絡是在環(huán)型網絡的基礎上,加上各其他功能節(jié)點,或通過轉換與其他應用網絡連接,
35、而現地計算機控制依舊處于環(huán)型網絡上.</p><p> 由擴展環(huán)型網絡組成的監(jiān)控系統(tǒng),各網絡節(jié)點通過環(huán)型鏈路交換數據,利用兩條環(huán)鏈構成冗余,除現地單元、操作員站外的其他應用計算機屬于另一個TCP/IP網,主站與應用程序這些功能計算機通過協(xié)議轉換連接到兩個網絡中.網絡工作原理如下:</p><p> 此種網絡拓撲結構較適合于無主結構,若應用為有主結構,TCP/IP網段的信息交換將由于主站
36、性能限制而受到遲滯,對應用快速性不利.</p><p> 在無主結構模式下,現地控制單元實時采集各種信號并針對故障信號采取相應處理,主站作為數據服務器,記錄各現地控制單元節(jié)點數據,操作員站在環(huán)網上直接與現地控制單元通訊,傳送數據與命令.在環(huán)網之外的TCP/IP網絡通過與主站、應用程序工作站通訊,取得各種信息并可發(fā)送命令.</p><p> 擴展環(huán)型網絡的優(yōu)點是在結構上,分層應用明顯,各
37、節(jié)點功能清楚,系統(tǒng)安全性能高,兩個不同協(xié)議網段間的故障互相沒有影響,網絡穩(wěn)定性好.缺點結構相對復雜,網絡投入較大,開發(fā)應用程序時,需考慮到兩個網段的不同協(xié)議.目前國內某在建大型水電站的計算機監(jiān)控系統(tǒng)采用的就是這種結構.</p><p> 5 Delphi在電力系統(tǒng)中的應用</p><p> 這里主要講Delphi在這個工程里作為中間層起到的作用</p><p>
38、; 1.調用下層api函數。</p><p> 2.負責通訊(上位機和下位機)。</p><p> 3.負責對下位機傳上來的數據進行解碼,容錯和控制。</p><p> 4.負責對上位機下發(fā)的數據進行解碼,容錯和控制。</p><p> 由于考慮到程序整體的穩(wěn)定性大致按功能分為:</p><p> 主控程序
39、(PTX):主要作用是控制這4個模塊的穩(wěn)定性。比如這4個模塊中任何一個崩潰了,需要自動重啟之。</p><p> 無線電接口程序(Server):主要作用和無線電發(fā)射機進行交互,因為整 個工程是無線電和GPRS并用的。</p><p> GPRS接口程序(GPRSServer):主要作用和GPRS硬件模塊進行交互。</p><p> ActiveX接口程
40、序(ServerIn):主要作用是和網頁中的ActiveX插件進 行交互。</p><p> Java后臺接口程序(ClientIn):主要作用是和Java后臺進行交互,當然 java用的是jsp平臺。</p><p> 5.1 主控程序(PTX) </p><p> 這里用到了一個定時器Timer1,它的作用是每隔1s作一次
41、循環(huán)檢測,檢測上面4個模塊是否死機了,如果死機就把相應的模塊啟動起來</p><p> procedure TFormTX.Timer1Timer(Sender: TObject);</p><p><b> var</b></p><p> dwExitCode:Dword;</p><p> fprocess
42、Exit:boolean;</p><p><b> begin</b></p><p> dwExitCode:=0;</p><p> fprocessExit:=GetExitCodeProcess(PProcInfo_SERVER.hProcess,dwExitCode);</p><p> if (f
43、processExit and (dwExitCode<>STILL_ACTIVE)) then //判斷相應模塊是否退出了或者是狀態(tài)不為激活狀態(tài)了</p><p><b> begin</b></p><p> memo1.Lines.Add('Sever 進程終止!');</p><p> CloseHan
44、dle(PProcInfo_SERVER.hThread);//殺線程</p><p> CloseHandle(PProcInfo_SERVER.hProcess);//殺進程</p><p> ProccessSuccessful_SERVER;//重啟相應的模塊</p><p> memo1.Lines.Add('Sever 進程啟動!'
45、);</p><p><b> end;</b></p><p> dwExitCode:=0;</p><p> fprocessExit:=GetExitCodeProcess(PProcInfo_ServerIn.hProcess,dwExitCode);</p><p> if (fprocessExi
46、t and (dwExitCode<>STILL_ACTIVE)) then</p><p><b> begin</b></p><p> memo1.Lines.Add('ServerIn 進程終止!');</p><p> CloseHandle(PProcInfo_ServerIn.hThread);&
47、lt;/p><p> CloseHandle(PProcInfo_ServerIn.hProcess);</p><p> ProccessSuccessful_ServerIn;</p><p> memo1.Lines.Add('ServerIn 進程啟動!');</p><p><b> end;</
48、b></p><p> dwExitCode:=0;</p><p> fprocessExit:=GetExitCodeProcess(PProcInfo_ClientIn.hProcess,dwExitCode);</p><p> if (fprocessExit and (dwExitCode<>STILL_ACTIVE)) the
49、n</p><p><b> begin</b></p><p> memo1.Lines.Add('ClientIn 進程終止!');</p><p> CloseHandle(PProcInfo_ClientIn.hThread);</p><p> CloseHandle(PProcInfo
50、_ClientIn.hProcess);</p><p> ProccessSuccessful_ClientIn;</p><p> memo1.Lines.Add('ClientIn 進程啟動!');</p><p><b> end;</b></p><p> dwExitCode:=0;&
51、lt;/p><p> fprocessExit:=GetExitCodeProcess(PProcInfo_GPRSSERVER.hProcess,dwExitCode);</p><p> if (fprocessExit and (dwExitCode<>STILL_ACTIVE)) then</p><p><b> begin<
52、;/b></p><p> memo1.Lines.Add('GPRSSERVER 進程終止!');</p><p> CloseHandle(PProcInfo_GPRSSERVER.hThread);</p><p> CloseHandle(PProcInfo_GPRSSERVER.hProcess);</p><
53、;p> ProccessSuccessful_GPRSSERVER;</p><p> memo1.Lines.Add('GPRSSERVER 進程啟動!');</p><p><b> end;</b></p><p><b> end;</b></p><p>
54、上面的代碼中分為4個if 語句,每個if中有像ProccessSuccessful_SERVER,ProccessSuccessful_ServerIn,ProccessSuccessful_ClientIn,ProccessSuccessful_GPRSSERVER的函數</p><p> 我們看看其中一個的定義(其他三個函數意思基本一樣):</p><p> procedure T
55、FormTX.ProccessSuccessful_SERVER;</p><p><b> var</b></p><p> bSuccess:boolean;</p><p><b> begin</b></p><p> if findwindow('TFormServer
56、39;,nil)=0 then</p><p><b> begin</b></p><p> ZeroMemory(@sStartInfo_SERVER,sizeof(sStartInfo_SERVER)); //zero memory</p><p> //設置必要的進程參數</p><p> sStartI
57、nfo_SERVER.cb:=sizeof(sStartInfo_SERVER);</p><p> seProcess_SERVER.nLength:=sizeof(seProcess_SERVER);</p><p> seProcess_SERVER.lpSecurityDescriptor:=Pchar(nil);</p><p> seProcess
58、_SERVER.bInheritHandle:=true;</p><p> seThread_SERVER.nLength:=sizeof(seThread_SERVER);</p><p> seThread_SERVER.lpSecurityDescriptor:=Pchar(nil);</p><p> seThread_SERVER.bInherit
59、Handle:=true;</p><p><b> //創(chuàng)建進程</b></p><p> bSuccess:=CreateProcess(Pchar(nil),Pchar(ExtractFilePath(Paramstr(0))+'Server'),@seProcess_SERVER,@seThread_SERVER,</p>&
60、lt;p> false,CREATE_DEFAULT_ERROR_MODE,pchar(nil),pchar(nil),sStartInfo_SERVER,PProcInfo_SERVER);</p><p> if (not bSuccess)then</p><p> Memo1.Lines.Add('Server 服務器創(chuàng)建失敗!')</p>
61、<p><b> else</b></p><p> Memo1.Lines.Add('Server 服務器創(chuàng)建成功!');</p><p><b> end;</b></p><p><b> end;</b></p><p> 這個函數
62、是用來重啟相應的4個模塊中的一個的,當然最后一個步驟是當PTX結束時要把4個模塊全部殺死。</p><p> procedure TFormTX.FormClose(Sender: TObject; var Action: TCloseAction);</p><p><b> begin</b></p><p> Timer1.Enab
63、led:=false;</p><p> TerminateProcess(PProcInfo_SERVER.hProcess,10);</p><p> PProcInfo_SERVER.hProcess:=0;</p><p> TerminateProcess(PProcInfo_GPRSSERVER.hProcess,10);</p>&
64、lt;p> PProcInfo_SERVER.hProcess:=0;</p><p> TerminateProcess(PProcInfo_ServerIn.hProcess,10);</p><p> PProcInfo_ServerIn.hProcess:=0;</p><p> TerminateProcess(PProcInfo_Clien
65、tIn.hProcess,10);</p><p> PProcInfo_ClientIn.hProcess:=0;</p><p> TerminateProcess(PProcInfo_DelayTime.hProcess,10);</p><p> PProcInfo_DelayTime.hProcess:=0;</p><p>
66、<b> end;</b></p><p> 5.2 GPRSServer</p><p> 為什么叫GPRSServer是因為這個模塊是和下層GPRS硬件模塊通訊所用。</p><p> 在這個模塊中我們將和GPRS通訊的所有細節(jié)全部封裝到wcomm_dll.dll動態(tài)連接庫中。</p><p> 這個動態(tài)
67、鏈接庫負責和下層具體通訊,包括UDP包的封裝,下層通訊隊列的維護和一些擴展功能等等。</p><p><b> 具體代碼如下:</b></p><p> unit Unit_dll;</p><p><b> interface</b></p><p><b> uses</
68、b></p><p> Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,</p><p> Dialogs, Menus, ComCtrls, ToolWin, StdCtrls, ImgList, ExtCtrls, NMUDP,winsock;</p><p> cons
69、t MAX_RECEIVE_BUF=1024; //最大接收緩沖區(qū)</p><p> const MAX_SEND_BUF=1024; //最大發(fā)送緩沖區(qū)</p><p> const gprs_dll='wcomm_dll.dll';</p><p> const gprs_smm='gprs_smm.dll';&
70、lt;/p><p> const misc='misc.dll';</p><p><b> type</b></p><p> // 用戶注冊信息結構</p><p> gprs_user_info=record</p><p> m_userid:array[1..12
71、] of char; //終端模塊號碼</p><p> m_sin_addr:Cardinal; //終端模塊進入Internet的代理主機IP地址</p><p> m_sin_port:word; //終端模塊進入Internet的代理主機IP端口</p><p> m_local_addr:Card
72、inal; //終端模塊在移動網內IP地址</p><p> m_local_port:word; //終端模塊在移動網內IP端口</p><p> m_logon_date:array[1..20] of char; //終端模塊登錄時間</p><p> m_update_time:array[1..20]
73、of char; //終端模塊更新信息時間</p><p> m_status:byte; //終端模塊狀態(tài), 1 在線 0 不在線</p><p> //m_pid:array[1..12] of char;</p><p><b> end;</b></p><p><b&g
74、t; type</b></p><p><b> //用戶數據結構</b></p><p> data_record=record</p><p> m_userid:array[1..12] of char;</p><p> m_recv_date:array[1..20] of char;&l
75、t;/p><p> m_data_buf:array[1..MAX_RECEIVE_BUF] of char;</p><p> m_data_len:word;</p><p> m_data_type:byte;</p><p><b> end;</b></p><p><b>
76、; type</b></p><p> Arr12 = array[1..12] of Char;</p><p> Arr16 = array[1..16] of Char;</p><p> Arr256 = array[1..256] of Char;</p><p> Arr512 = ar
77、ray[1..512] of Char;</p><p> Arr1024 = array[1..1024] of Char;</p><p> //下面定義的時函數類型,用于指向動態(tài)庫中的函數</p><p> function start_gprs_server(a:HWND;b:Cardinal;c:Integer;d:PChar):Integer;s
78、tdcall;</p><p> function start_net_service(a:HWND;b:Cardinal;c:Integer;d:PChar):Integer;stdcall;</p><p> function do_read_proc(var a:data_record;b:PChar;c:boolean):Integer;stdcall;</p>
79、<p> procedure cancel_read_block();stdcall;</p><p> function stop_gprs_server(a:PChar):Integer;stdcall;</p><p> function stop_net_service(a:PChar):Integer;stdcall;</p><p>
80、function do_close_all_user(a:PChar):Integer;stdcall;</p><p> function do_send_user_data(a:PChar;b:PChar;c:Cardinal;d:PChar):Integer;stdcall;</p><p> function get_user_at(a:Cardinal;var b:gprs_
81、user_info):Integer;stdcall;</p><p> function get_max_user_amount:Cardinal;stdcall;</p><p> function do_close_one_user(a:PChar;b:PChar):Integer;stdcall;</p><p> function SetWorkMo
82、de(nWorkMode: integer): integer; stdcall;</p><p> function KillProcess(a:PChar):Integer;stdcall;</p><p> function DisConnectRas(a:PChar):Integer;stdcall;</p><p> function GetConn
83、EntryName(a:PChar):Integer;stdcall;</p><p> //The Following function is SMM</p><p> //int SMMInit(char *,int,char *,DCB *,char *,char *,int);</p><p> function SMMInit(var a:Arr1
84、6;b:Integer;var c:Arr16;var d:DCB;var e:Arr12;var f:Arr12;g:Integer):Integer;stdcall;</p><p> function SMMFree:Integer;stdcall;</p><p> function SMMSetting(var a:Arr12;b:Integer):Integer;stdca
85、ll;</p><p> function MakeDTUOnLine(a:Integer;var b:Arr12):Integer;stdcall;</p><p> function SendDataToDTUBySM(var a:Arr12;var b:Arr256;c:Integer;d:Integer):Integer;stdcall;</p><p>
86、; implementation</p><p> //gprs_dll</p><p> function start_gprs_server; external gprs_dll name 'start_gprs_server';</p><p> function start_net_service; external gprs_dll
87、 name 'start_net_service';</p><p> function do_read_proc; external gprs_dll name 'do_read_proc';</p><p> procedure cancel_read_block; external gprs_dll name 'cancel_read_bl
88、ock';</p><p> function stop_gprs_server; external gprs_dll name 'stop_gprs_server';</p><p> function stop_net_service; external gprs_dll name 'stop_net_service';</p>
89、<p> function do_close_all_user;external gprs_dll name 'do_close_all_user';</p><p> function do_send_user_data;external gprs_dll name 'do_send_user_data';</p><p> functi
90、on get_user_at;external gprs_dll name 'get_user_at';</p><p> function get_max_user_amount;external gprs_dll name 'get_max_user_amount';</p><p> function do_close_one_user;exter
91、nal gprs_dll name 'do_close_one_user';</p><p> function SetWorkMode;external gprs_dll name 'SetWorkMode';</p><p> //gprs_smm</p><p> function SMMInit;external gpr
92、s_smm name 'SMMInit';</p><p> function SMMFree;external gprs_smm name 'SMMFree';</p><p> function SMMSetting;external gprs_smm name 'SMMSetting';</p><p>
93、function MakeDTUOnLine;external gprs_smm name 'MakeDTUOnLine';</p><p> function SendDataToDTUBySM;external gprs_smm name 'SendDataToDTUBySM';</p><p> function KillProcess;exter
94、nal misc name 'KillProcess';</p><p> function DisConnectRas;external misc name 'DisConnectRas';</p><p> function GetConnEntryName;external misc name 'GetConnEntryName';
95、</p><p><b> end.</b></p><p> 其他所用的一些動態(tài)鏈接庫我們在這個項目中用不到。。調用動態(tài)鏈接庫有兩種方法,靜態(tài)調用和動態(tài)調用,以上就是靜態(tài)調用的方法。通過封裝調用我們在以后的開發(fā)中就可以直接用這些函數了。</p><p> 當下層硬件發(fā)送數據給我們的模塊時,我們會用消息機制來處理。</p>
96、<p> 處理過程為:下層數據通過UDP數據包發(fā)送到wcomm_dll.dll,wcomm_dll.dll就會去解析UDP數據包,并且要維護一下數據列表。最后向外廣播約定好的windows消息,告訴外層程序數據已經接收到了。</p><p> 當然這個外層程序(GPRSServer模塊)收到了這個特定的windows消息之后,就會通過do_read_proc函數來讀取數據,do_read_proc已
97、經在wcomm_dll.dll中定義了。</p><p> 而GPRSServer處理Windows消息:</p><p> procedure ProcessMessage(var Msg:TMessage);message GPRSRECVMESS;</p><p> 這個是消息的定義,再來看看這個消息處理函數具體做了什么工作:</p>&l
98、t;p> procedure TFormGPRSServer.ProcessMessage(var Msg:TMessage);</p><p> var dr:data_record;</p><p><b> p:PChar;</b></p><p> bAnswer:Boolean;</p><p>
99、<b> begin</b></p><p><b> try</b></p><p> GetMem(p,1024);</p><p> if ckAnswer.Checked then</p><p> bAnswer:=true</p><p><b&g
100、t; else</b></p><p> bAnswer:=false;</p><p> if (do_read_proc(dr,p,bAnswer)>=0) then</p><p><b> begin</b></p><p> if dr.m_data_len=0 then</p
101、><p> PollUserTable</p><p><b> else</b></p><p> ProcessData(dr);</p><p><b> end;</b></p><p><b> finally</b></p>
102、<p> FreeMem(p);</p><p><b> end;</b></p><p><b> end;</b></p><p> 在以上的這個函數中我們比較關心的是ProcessData()這個函數,其他函數都是一些修飾和保護等等。</p><p> 來看看Proc
103、essData()這個函數的實現:</p><p> procedure TFormGPRSServer.ProcessData(dr:data_record);</p><p> var i,j:Integer;</p><p> str,S:String;</p><p><b> re:Pchar;</b>
104、</p><p> reLong,ReLongTemp:integer;</p><p><b> label H1;</b></p><p><b> begin</b></p><p> str:=dr.m_userid+'---'+dr.m_recv_date+'
105、;---'+IntToStr(dr.m_data_len);</p><p> for i:=1 to Length(str) do</p><p> if str[i]=#0 then</p><p> str[i]:=' ';</p><p> mmDataWnd.Lines.Add(str);</p
106、><p> mmDataWnd.Lines.Add('下位機-->通訊服務器:'+dr.m_data_buf);</p><p> /////////////////////////////////</p><p><b> try</b></p><p><b> re:=nil;&
107、lt;/b></p><p> ReLongTemp:=0;</p><p> if dr.m_data_len>G_cachLeng then //對緩沖區(qū)進行保護</p><p><b> begin</b></p><p> fillmemory(@G_cach,G_cachLeng,$FF);
108、</p><p> mmDataWnd.Lines.Add('緩沖區(qū)溢出!');</p><p><b> goto H1;</b></p><p><b> end;</b></p><p> re:=@dr.m_data_buf;</p><p>
109、 reLong:=dr.m_data_len;</p><p><b> s:='';</b></p><p> for j:=0 to reLong-1 do</p><p><b> begin</b></p><p> S:=S+inttohex(ord((re+j)
110、^),2)+' ';</p><p><b> end;</b></p><p> mmDataWnd.Lines.Add('下位機-->通訊服務器:'+S+#13+#10);</p><p> if G_cachPose>=G_cachleng-1 then</p><p&
111、gt; G_cachPose:=0;</p><p> if reLong>(G_cachleng-G_cachPose)then</p><p> G_cachPose:=0;</p><p> move(re^,G_cach[G_cachPose],reLong);</p><p> G_cachPose:=G_cach
112、Pose+reLong;</p><p> G_reLong:=reLong;</p><p><b> Doit;</b></p><p><b> H1:</b></p><p><b> except</b></p><p> on EA
113、ccessViolation do</p><p><b> exit;</b></p><p><b> end;</b></p><p><b> end;</b></p><p> ProcessData()這個函數其實主要功能就像一個漏斗,將不斷接收到的數據流存
114、入一個叫G_cach的緩存中以供后續(xù)操作。這步很必要,因為作為UDP數據包來說不能保證一連串的數據的完整性,而且在無限傳輸過程中這種不穩(wěn)定性尤其突出,我們可以用無線電傳輸字節(jié)流來試試,看整個數據的真確率能不能達到70%,而當緩存好了之后我們要做的事就是Doit這個函數。</p><p> 看看Doit是如何實現的:</p><p> procedure TFormGPRSServer.
115、Doit;</p><p><b> var</b></p><p> i,DDL:integer;</p><p><b> label H1;</b></p><p><b> begin</b></p><p><b> try
116、</b></p><p><b> i:=0;</b></p><p> while i<G_cachLeng-1 do</p><p><b> begin</b></p><p> if (ord(G_cach[i])=$10)and(ord(G_cach[i+4])=
117、$16) then</p><p><b> begin</b></p><p> CutReceiveData(@G_cach,G_cachPose);</p><p> fillmemory(@G_cach[i],G_cachPose,$FF);</p><p> G_cachPose:=0;</p&g
118、t;<p><b> i:=i+4;</b></p><p><b> goto H1;</b></p><p><b> end else</b></p><p> if (ord(G_cach[i])=$68)and (ord(G_cach[i+3])=$68)and((or
119、d(G_cach[i+ord(G_cach[i+1])+5])=$16)or(ord(G_cach[i+ord(G_cach[i+1])+5])=0) )then</p><p><b> begin</b></p><p> CutReceiveData(@G_cach,G_cachPose);</p><p> fillmemory(
120、@G_cach[i],G_cachPose,$FF);</p><p> DDL:= ord(G_cach[i+1]);</p><p> i:=i+DDL+5;</p><p> G_cachPose:=0;</p><p><b> goto H1;</b></p><p><b
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 畢業(yè)論文--電力系統(tǒng)的漏電保護綜合設計
- 電力系統(tǒng)無功補償-畢業(yè)論文
- 電力系統(tǒng)繼電保護畢業(yè)論文
- 電力系統(tǒng)的諧波畢業(yè)論文
- 電力系統(tǒng)繼電保護畢業(yè)論文
- 電力系統(tǒng)無功補償-畢業(yè)論文
- 電力系統(tǒng)營銷管理畢業(yè)論文
- 電力系統(tǒng)潮流計算畢業(yè)論文
- 電力系統(tǒng)畢業(yè)設計
- 電力系統(tǒng)課程設計--電力系統(tǒng)規(guī)劃設計
- 電力系統(tǒng)短路分析計算及仿真-畢業(yè)論文(設計)
- 畢業(yè)論文-電力系統(tǒng)穩(wěn)定器pss的設計
- 畢業(yè)論文-電力系統(tǒng)穩(wěn)定器pss的設計
- 電力系統(tǒng)短期負荷預畢業(yè)論文
- 畢業(yè)論文----電力系統(tǒng)負荷預測研究
- 電力系統(tǒng)分析畢業(yè)論文
- 電力系統(tǒng)短期負荷預測畢業(yè)論文
- 電力系統(tǒng)繼電保護畢業(yè)設計論文
- 畢業(yè)設計----電力系統(tǒng)規(guī)劃設計
- 電力系統(tǒng)規(guī)劃設計-畢業(yè)設計
評論
0/150
提交評論