基于C#的遠程液位監(jiān)控軟件設計畢業(yè)設計(論文)_第1頁
基于C#的遠程液位監(jiān)控軟件設計畢業(yè)設計(論文)_第2頁
基于C#的遠程液位監(jiān)控軟件設計畢業(yè)設計(論文)_第3頁
基于C#的遠程液位監(jiān)控軟件設計畢業(yè)設計(論文)_第4頁
基于C#的遠程液位監(jiān)控軟件設計畢業(yè)設計(論文)_第5頁
已閱讀5頁,還剩40頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領

文檔簡介

1、 學號 畢業(yè)設計(論文)題目: 基于c#的遠程液位監(jiān)控軟件設計作 者 屆 別 學 院 專 業(yè) 指導教師 職 稱 完成時間 年 月 日 摘 要為了彌補組態(tài)軟件在遠程液位監(jiān)控系統(tǒng)中的不足,本文設計了一套基于c#的遠程液位監(jiān)控軟件。本軟件依靠.net類庫中windows.forms類完成了服務器與客戶端測試界面的設計,還利用socket類實現(xiàn)了服務器與客戶端之間的異步通信,達到了實時傳輸和遠程監(jiān)控的要求。同時利用內(nèi)部的垃圾回收機制,有效的避免了資源浪費和內(nèi)存泄露等缺陷。在滿足企業(yè)個性化設計需求的同時還保證了測控平臺的工作性能和測控質(zhì)量,極大的提高了工業(yè)生產(chǎn)效率。關鍵詞:c#;socket;異步通信;

2、 abstract tomakeupfordeficienciesintheremoteconfigurationsoftwarelevelmonitoringsystem,thepaperdesignsac#basedonthelevelofremotemonitoringsoftware.thesoftwarerelieson.netclasslibrarywindows.formsclasscompletedthetestserverandtheclientinterfacedesign,butalsousesocketclassimplementstheasynchronouscomm

3、unicationbetweentheserverandtheclient,tothereal-timetransmissionandremotemonitoringrequirements.whiletakingadvantageoftheinternalgarbagecollectionmechanism,effectivelyavoidingthewasteofresourcesandmemoryleaksandotherdefects.personalizeddesigntomeetbusinessneeds,whilealsoensuringthequalityandcontrolp

4、erformanceandcontrolplatform,whichgreatlyimprovestheefficiencyofindustrialproduction.keywords:c#;socket;asynchronouscommunication; 目 錄摘 要iabstractii第1章 引 言11.1 課題研究的背景11.2 課題研究的意義11.3 課題研究內(nèi)容及結(jié)構(gòu)安排2第2章 系統(tǒng)整體結(jié)構(gòu)32.1 控制系統(tǒng)構(gòu)成32.2 測控軟件構(gòu)成42.2.1 相關技術(shù)介紹42.2.2 程序流程框圖52.3 本章小結(jié)6第3章 監(jiān)控軟件程序?qū)崿F(xiàn)73.1 軟件設計方案73.2 服務器設計73.

5、2.1 界面設計73.2.2 socket編程83.3 客戶端設計123.3.1 界面設計123.3.2 socket編程133.4 本章小結(jié)15第4章 activex控件生成與發(fā)布164.1 控件生成與發(fā)布164.2 本章小結(jié)21第5章 軟件生成與測試225.1 軟件生成及測試225.2 本章小結(jié)25第6章 結(jié)語與展望26參考文獻27致 謝28附錄 軟件代碼29第1章 引 言 1.1 課題研究的背景隨著科技的不斷發(fā)展,遠程監(jiān)控技術(shù)以其逐步完善和推廣,逐漸使人們意識到遠程測控技術(shù)對現(xiàn)代企業(yè)管理和生產(chǎn)效率的重要意義。為了提高生產(chǎn)效率,人們希望獲得對工廠生產(chǎn)中大量的物理量和生產(chǎn)工藝等參數(shù)的實時測控

6、。但是以往的監(jiān)測技術(shù)已經(jīng)無法滿足當代工業(yè)生產(chǎn)的需求。伴隨著通訊技術(shù)、電子技術(shù)和計算機網(wǎng)絡技術(shù)的快速發(fā)展,豐富的網(wǎng)絡資源以及不斷降低的成本為網(wǎng)絡化遠程監(jiān)控系統(tǒng)提供了可能。液位監(jiān)控是當代工業(yè)測控中較為普遍的一類問題,在石油、化工、電力等工業(yè)部門中應用極為普及,是工業(yè)生產(chǎn)過程當中的一個重要構(gòu)成部分。針對傳統(tǒng)工業(yè)生產(chǎn)中液位過程所具有的非線性、時滯和時變等復雜特性,液位監(jiān)控系統(tǒng)能夠有效的模擬和監(jiān)測生產(chǎn)中液位過程所產(chǎn)生的一系列物理量,并及時針對其產(chǎn)生的問題做出相應的調(diào)整。此外,液位過程測控平臺的構(gòu)建和控制方案的鉆研,對工業(yè)生產(chǎn)中施行液位過程控制具備重要的指導作用。1.2 課題研究的意義 當前國內(nèi)外大多數(shù)企

7、業(yè)都使用組態(tài)軟件對液位過程進行監(jiān)控。組態(tài)軟件是近些年在工業(yè)控制領域廣泛應用的軟件開發(fā)工具,可快速構(gòu)建不同需求的數(shù)據(jù)采集和監(jiān)控系統(tǒng)。應用組態(tài)軟件可免去了傳統(tǒng)測控軟件編寫中龐大而復雜的編程工作,大大提高了測控系統(tǒng)的開發(fā)效率,且保證了測控平臺的工作性能和測控質(zhì)量。然而傳統(tǒng)的組態(tài)軟件在使用過程中由于系統(tǒng)體積的龐大,造成了巨大的資源浪費,且價格昂貴,無法滿足企業(yè)各種個性化設計的要求。因此不滿足大多數(shù)中小型企業(yè)的要求。針對這一問題,大部分開發(fā)人員選擇使用vb或vc+等語言開發(fā)符合企業(yè)需求的監(jiān)控軟件。雖然利用這些語言編寫的監(jiān)控軟件可以彌補組態(tài)軟件的不足,且可以自由的對系統(tǒng)資源進行控制。但是由于語言本身的不完

8、善,很容易造成系統(tǒng)資源浪費,內(nèi)存泄露等問題,從而使得監(jiān)控軟件不穩(wěn)定,極大地影響了監(jiān)測質(zhì)量。c#是微軟公司于2000年7月,專門為.net的應用而發(fā)布的一種全新的面向?qū)ο蟪绦蛟O計語言,具有簡單、安全等特點。c#繼承了c語言的語法風格,同時又繼承了c+的面向?qū)ο筇匦?,同時擁有和vb相類似的快速開發(fā)能力。因此用c#語言開發(fā)的遠程液位測控軟件可以有效的彌補傳統(tǒng)組態(tài)軟件的不足,滿足企業(yè)個性化的要求。利用.net程序集、msil和jit編譯器實現(xiàn)了對組件的充分使用,而且經(jīng)過內(nèi)部的垃圾回收機制,可及時回收軟件運行時不再使用的內(nèi)存資源,避免了資源浪費和內(nèi)存泄露等缺陷。綜上原因,本文提出并設計了一套基于c#遠程

9、液位監(jiān)控軟件。該軟件不但依靠.net類庫中強大的類庫資源實現(xiàn)了對液位過程的實時監(jiān)測和遠程控制,還利用內(nèi)部的垃圾回收機制,有效的避免了資源浪費和內(nèi)存泄露等缺陷。在滿足企業(yè)個性化設計需求的同時還保證了測控平臺的工作性能和測控質(zhì)量,極大的提高了工業(yè)生產(chǎn)效率。1.3 課題研究內(nèi)容及結(jié)構(gòu)安排 組態(tài)軟件在工業(yè)控制中應用廣泛,本文基于此研究設計了一套基于c#的遠程液位監(jiān)控軟件,以彌補組態(tài)軟件在遠程監(jiān)控領域的不足。論文結(jié)構(gòu)安排如下:第1章,描述了課題研究的背景和意義,闡述了基于c#遠程液位監(jiān)控軟件的優(yōu)點。 第2章,軟件的總體設計,包括軟件說明和功能介紹以及程序設計流程框圖。第3章,相關軟件和技術(shù)的基本介紹。第

10、4章,軟件各功能模塊的具體設計與實現(xiàn)。第5章,軟件生成與測試結(jié)果展示。第6章,結(jié)語與展望。 第2章 系統(tǒng)整體結(jié)構(gòu) 2.1 控制系統(tǒng)構(gòu)成為了實現(xiàn)對水箱液位參數(shù)的精確測控以及實時監(jiān)視和記錄。本文設計了一套水箱液位監(jiān)控系統(tǒng),此監(jiān)控系統(tǒng)采用計算機(pc)作為控制器,變頻器作為執(zhí)行器進行構(gòu)建。監(jiān)控系統(tǒng)結(jié)構(gòu)圖如圖2.1所示。水 泵變頻器水槽d/alic101l t101水箱a/d計算機圖2.1 水箱液位監(jiān)控系統(tǒng)結(jié)構(gòu)圖在此系統(tǒng)中,液位變送器lt101使用測量范圍為060cm的阻壓式液位(壓力)變送器,將檢測出來的水箱液位信號轉(zhuǎn)變?yōu)?20ma標準電信號。控制器lic101采用pc機,用組態(tài)王kingview6

11、.55開發(fā)監(jiān)控軟件,并用c#編寫可供組態(tài)王kingview6.55使用的遠程監(jiān)控控件。a/d與d/a分別選用adam5018模塊和adam5060模塊,可經(jīng)過rs232總線與計算機進行通訊。變頻器采用西門子g110變頻器,用來獲取計算機發(fā)送經(jīng)adam5060轉(zhuǎn)換后的420ma控制信號,并完成變頻調(diào)速(頻率范圍為050hz)進而驅(qū)動水泵改變管路中的水流量,達到調(diào)節(jié)水箱液位的目的adam5018/5060控制模塊體積較小,易于集成,且擁有一個獨立的嵌入式的rs232傳輸卡, 可通過rs232與pc機進行通信。底板上有4個插槽,能夠插接adam5018/5060的i/o 模塊, 從而完成快速數(shù)據(jù)的收

12、集與控制, 因而adam5018/5060模塊很適宜該系統(tǒng)。2.2 測控軟件構(gòu)成2.2.1 相關技術(shù)介紹(1).net框架軟件基于.net框架的vs2010編程環(huán)境設計,.net是一個由 microsoft .net framework sdk中包括的類、值類型和接口構(gòu)成的庫。該庫直接訪問系統(tǒng)功能,是組成.net framework程序、組件及控件的基礎。(2)c/s結(jié)構(gòu)軟件遵循c/s結(jié)構(gòu),設計了服務器和客戶端兩大塊。該結(jié)構(gòu)可以充分利用硬件的優(yōu)點,將任務合理安排到客戶端和服務器,大大減少了系統(tǒng)整體的通信成本。c/s 結(jié)構(gòu)的根本原理是將大的任務分解為多個子任務,由多臺計算機協(xié)作完成。其工作模式如

13、圖2.2所示:圖2.2 c/s結(jié)構(gòu)工作模式c/s構(gòu)架的長處是能夠充分利用客戶端的應對能力,很多任務能夠在客戶端處理后再轉(zhuǎn)交給服務器。這樣可以大大提高客戶端的響應速度。具體如下兩點優(yōu)勢:(1)服務器處理數(shù)據(jù)負擔較輕。(2)數(shù)據(jù)的儲存管理能力較為透明。(3)socekt類服務器和客戶端依靠強大的socket類建立連接。完成液位過程數(shù)據(jù)采集后的傳輸工作,將遠端設備的數(shù)據(jù)實時可靠的傳輸?shù)椒掌鞫诉M行檢測和紀錄,同時服務器也可發(fā)送數(shù)據(jù)到客戶端,對遠程液位設備進行調(diào)控。socket也稱套接字,用來描繪ip地址和端口,是個通信鏈的句柄。在internet上的主機通常都會運行多個應用軟件,并且提供多種服務。而

14、每個服務程序都會構(gòu)建相應的socket與端口一一對應,從而讓不同端口擁有不同服務。socket本質(zhì)上供應了過程通信的端點。socket連接過程能夠分為三步:服務器偵聽、確認連接和客戶端申請。(1)服務器偵聽:服務器端socket不是定位詳細的客戶端socket,而是處于等候連接的狀況,實時監(jiān)測網(wǎng)絡狀況。(2)客戶端申請:是指由客戶端提出連接申請,要連接的目標是服務器端的套接字。因此,客戶端的socket首先得描繪它所要連接的服務器,確認服務器端socket的ip地址和端口號,進而向服務器端提出連接申請。(3)確認連接:指當服務器端socket監(jiān)聽到客戶端socket的連接申請時,它會回應客戶端

15、socket的申請,創(chuàng)建一個新的線程,將服務器端socket的敘述發(fā)給客戶端,當客戶端確定了此敘述,就會成功握手建立連接。而服務器端socket還將處于監(jiān)聽狀態(tài),等待接收其他客戶端socket的連接申請。2.2.2 程序流程框圖系統(tǒng)根據(jù)c/s架構(gòu),分別創(chuàng)建服務器和客戶端。服務器首先創(chuàng)建socket()套接字,利用bind()方法綁定本地ip和端口,用listen()方法監(jiān)聽端口請求,。偵聽到端口有連接申請時,調(diào)用accept()方法接受請求,而后用receive()/send()方法對數(shù)據(jù)進行讀/寫操作,傳輸完成時使用close()函數(shù)關閉服務器。同樣客戶端也先創(chuàng)建socket()套接字,獲取

16、要連接服務器的ip和端口,使用connect()方法發(fā)送連接請求,而后使用receive()/send()函數(shù)進行數(shù)據(jù)的讀/寫,傳輸完成時使用close()函數(shù)關閉客戶端。系統(tǒng)程序框圖如圖2.3所示:圖2.3系統(tǒng)程序框圖2.3 本章小結(jié) 本章描述了遠程液位監(jiān)控系統(tǒng)的整體架構(gòu)設計。包括液位監(jiān)控系統(tǒng)的各部分組成,監(jiān)控軟件設計所涉及的相關技術(shù)介紹,如:.net框架、c/s結(jié)構(gòu)和socket編程等,以及系統(tǒng)設計的程序框圖說明。 第3章 監(jiān)控軟件程序?qū)崿F(xiàn)3.1 軟件設計方案監(jiān)控軟件設計的核心在于服務器和客戶端之間的實時通信。本文提供了兩種通信協(xié)議,分別是面向連接的tcp/ip協(xié)議和無連接的udp協(xié)議,然

17、而在工業(yè)控制中必須保證數(shù)據(jù)傳輸?shù)目煽啃?,因此我們選擇了安全性高的tcp/ip協(xié)議作為通訊協(xié)議。此外本文還提供了同步通信和異步異步通信兩種模式可供選擇。同步通信屬于串行通信,用次模式,要求客戶端在發(fā)送一條請求后,必須等到服務器做出相應回應,才能夠發(fā)送下一條請求。異步通信屬于并行通信,此模式下客戶端發(fā)送一條請求之后,不必等到服務器做出相應回應就可發(fā)送下一條請求。在工業(yè)控制中,往往需要保證數(shù)據(jù)傳輸?shù)膶崟r性,同步通信模式顯然不符合要求,因此我們選擇能實時傳輸?shù)漠惒酵ㄐ拍J健?.2 服務器設計3.2.1 界面設計為了方便演示與測試,創(chuàng)建windows窗體應用程序,進行軟件設計。而要生成activex控件

18、則需要創(chuàng)建windows控件庫項目,但兩者界面設計的方法一致(注:該服務器界面以及下章的客戶端界面僅為測試通信使用,作為active控件發(fā)布的界面數(shù)據(jù)無需手動輸入,數(shù)據(jù)采集完成后直接存儲到內(nèi)部buffer進行發(fā)送。而正式的工業(yè)液位監(jiān)控界面由組態(tài)王設計,本文不介紹)。創(chuàng)建好項目后,打開工具箱,拖出我們所需的工具控件如:lable、button、textbox等進行界面設計,之后修改其對應的屬性,雙擊后則可進行其他部分的代碼編寫。最終界面如圖3.1所示。圖3.1 server界面設計3.2.2 socket編程microsoft.net framework 為程序訪問internet實現(xiàn)了可分層、

19、可擴展的網(wǎng)絡服務,其命名空間system.net和system.net.sockets包含大量的類能夠便于網(wǎng)絡通訊程序的開發(fā)。所以在編寫前應該添加using system.net、using system.net.sockets和using system.threading三個命名空間。具體編程可分為以下步驟:(1)建立服務器連接首先要創(chuàng)建socket對象,使用socket類的構(gòu)造方法實現(xiàn):socket listener = new socket(addressfamily.internetwork,sockettype.stream, protocoltype.tcp);參數(shù)如下:addre

20、ssfamily:socket使用的尋址方案;sockettype:socket類型;protocoltype:socket使用的協(xié)議,這里所用的是tcp/ip協(xié)議。當創(chuàng)建socket后,服務器端則要通過bind()方法綁定所指定的端口,使socket和一個本地終端相聯(lián)。這里在服務器端可設置兩種方式進行連接,一種是dns創(chuàng)建域名接連的方式:iphostentry iphostinfo = dns.resolve(dns.gethostname();另一種是ip地址的連接方式:ipaddress ipaddress = iphostinfo.addresslist0;這里是系統(tǒng)自動獲取本機ip,

21、也可以手動輸入ip地址方法如下:ipaddress ipaddress = ipaddress.parse();這里采取ip地址連接的方式,設置好ip地址和端口號后使用bind()方法進行綁定:ipendpoint localendpoint = new ipendpoint(ipaddress, 11000);listener.bind(localendpoint);然后通過listen方法監(jiān)聽該端口上的連接申請,當監(jiān)聽到端口的連接申請后。同步模式時,服務器調(diào)用accept方法允許連接申請。異步模式時,服務器能夠調(diào)用beginaccept方法和endaccept方法實現(xiàn)與客

22、戶端的通信。beginaccept在異步模式下嘗試連接,它準許其余進程直接運行,而不必等候連接建立。在使用beginaccept方法之前,必需調(diào)用listen方法來監(jiān)聽連接申請,beginaccept的函數(shù)原型為:beginaccept(asynccallback asynccallback, ojbect state);這里asynccallback:代表回調(diào)函數(shù);state:代表狀態(tài)信息,必須確保state中包含socket的句;調(diào)用beginaccept方法的根本流程是:1、建立本機終節(jié)點,并建立新的socket與本機終節(jié)點進行綁定;2、在端口上監(jiān)聽是否有新的連接申請;3、申請開始接入新

23、的連接,將其傳入socket的實例或者stateojbect的實例。調(diào)用beginaccept()方法完成后,當有新的連接產(chǎn)生,就會使用回調(diào)函數(shù),此回調(diào)函數(shù)一定得包含用于終結(jié)接入連接操作的endaccept()方法,其原型為:socket endaccept(iasyncresult iar);那么服務器構(gòu)建代碼如下:public static void startlistening()ipaddress local = ipaddress.parse(127.0,0,1);ipendpoint iep = new ipendpoint(local,13000);socket listener

24、 = new socket(addressfamily.internetwork,sockettype.stream, protocoltype.tcp);server.bind(iep);server.listen(20);server.beginaccecpt(new asynccallback(accept), listener);void accept(iasyncresult iar) socket myserver = (socket)iar.asyncstate; socket service = myserver.endaccept(iar);(2)發(fā)送與接收數(shù)據(jù)在創(chuàng)建了套接字

25、的連接后,就能夠使服務器端和客戶端之間進行數(shù)據(jù)通信了。異步通信用beginsend和endsend方法來完成數(shù)據(jù)發(fā)送。在使用beginsend方法前要確認雙方都已成功連接,不然會出錯誤。beginsend方法原型為:socket.beginsend(byte,int32, int32, socketflags, asynccallback, object);參數(shù)如下:buffer:byte類型的數(shù)組,包含將發(fā)送的數(shù)據(jù);offset:buffer參數(shù)中發(fā)送數(shù)據(jù)的起始位置,該位置從零開始計數(shù);size:將發(fā)送的字節(jié)數(shù);socketflags:socketflags值的按位組合;callback:a

26、synccallback委托;state:一個對象,包含此申請的狀態(tài)消息;返回值:調(diào)用異步通訊發(fā)送iasyncresult。創(chuàng)建一個完成 asynccallback 的回調(diào)方法并將名字傳入 beginsend 方法。state 參數(shù)一定得包含用來通訊的連接。如果回調(diào)要求更多信息,那么可構(gòu)建一個小型的類用于存儲socket和其他必須的信息。經(jīng)過state 參數(shù)將此類的一個實例傳遞給 beginsend 方法?;卣{(diào)方法應使用endsend方法。當應用程序使用 beginsend方法時,系統(tǒng)將運用一個單獨的線程完成特定的回調(diào)方法,并阻止 endsend,直到socket發(fā)送了申請的字節(jié)數(shù)或引發(fā)了異常

27、。相關代碼如下:private static void send(socket handler, string data) byte bytedata = encoding.ascii.getbytes(data); handler.beginsend(bytedata,0,bytedata.length,0,new asynccallback(sendcallback), handler);private static void sendcallback(iasyncresult ar) try socket handler = (socket)ar.asyncstate; int byte

28、ssent = handler.endsend(ar); handler.shutdown(socketshutdown.both); handler.close(); catch (exception e)異步通信用beginreceive和endreceive方法來接收數(shù)據(jù),其beginreceive方法原型為:socket.beginreceive(byte,int32,int32,socketflags,asynccallback,object)參數(shù)如下:buffer:byte類型的數(shù)組,它是保存接收到的數(shù)據(jù)的位置;offset:buffer參數(shù)中保存所接收數(shù)據(jù)的位置,該位置從零開始計

29、數(shù);size:要接收的字節(jié)數(shù);socketflags:socketflags值的按位組合;callback:一個asynccallback委托,它援用操作完成時要應用的方法;state:一個用戶定義對象,其中寶庫接收操作的相干信息。操作完成時,此對象會傳軟endreceive方法;返回值:使用異步方法讀取iasyncresult。異步beginreceive操作應使用endreceive方法完成。一般該方法由callback 實現(xiàn)。在操作完成前方法不會進入阻塞狀態(tài)。如需一直阻塞到操作完成時則應使用receive方法進行重載。相關代碼如下:private static void receive(

30、socket client) try stateobject state = new stateobject(); state.worksocket = client; client.beginreceive(state.buffer,0,stateobject.buffersize,0,new asynccallback(receivecallback), state); catch (exception e) private static void receivecallback(iasyncresult ar) try stateobject state = (stateobject)a

31、r.asyncstate; socket client = state.worksocket; int bytesread = client.endreceive(ar); if (bytesread 0) state.sb.append(encoding.ascii.getstring(state.buffer,0,bytesread); client.beginreceive(state.buffer,0,stateobject.buffersize,0,new asynccallback(receivecallback), state); else if (state.sb.length

32、 1) response = state.sb.tostring(); receivedone.set(); catch (exception e) 這里對接收的數(shù)據(jù)做了一些處理,首先處理連接的回調(diào)函數(shù)里獲得的通訊套接字client,然后開始接收數(shù)據(jù)。當數(shù)據(jù)發(fā)送到緩沖區(qū)中,beginreceive方法嘗試從buffer數(shù)組中獲取長度為buffer.length的數(shù)據(jù)塊,并且返回接收到的數(shù)據(jù)量bytesread。經(jīng)過判斷返回值bytesread的大小來判斷數(shù)據(jù)是否傳輸完全。這里出現(xiàn)了set()方法,引出了程序阻塞和異步中的同步問題。.net里提供了eventwaithandle類來表示一個線程的

33、同步事件。eventwaithandle即事件等待句柄,他允許線程通過操作系統(tǒng)互發(fā)信號和等待彼此的信號來達到線程同步的目的。這個類有2個子類,分別為autoresteevnt(自動重置)和manualrestevent(手動重置)。下面是線程同步的幾個方法:(1)rset方法:將事件狀態(tài)設置為非終止狀態(tài),使得線程阻塞。這里的線程阻塞是指同意其他需要等候的線程進行阻塞即讓含waitone()方法的線程阻塞;(2)set方法:將事件狀態(tài)設置終止狀態(tài),允許一個或多個等候線程繼續(xù)。該方法發(fā)送一個信號給操作系統(tǒng),讓處于等候的某個線程從阻塞狀態(tài)轉(zhuǎn)變成繼續(xù)運行,即waitone方法的線程不在阻塞;(3)wa

34、itone方法:阻塞當前線程,直到當前的等候句柄收到信號。此方法將一直使本線程處于阻塞狀態(tài)直到收到信號為止,即當其他非阻塞進程使用set方法時可以繼續(xù)執(zhí)行。3.3 客戶端設計3.3.1 界面設計客戶端界面設計方法和服務器方法相同,首先創(chuàng)建windows窗體應用程序,打開工具箱,拖出我們所需的工具控件如:lable、button、textbox等進行界面設計,之后修改其對應的屬性,雙擊后則可進行其他部分的代碼編寫。最終界面如圖3.2所示。圖3.2 client界面設計3.3.2 socket編程客戶端的socket編程同樣分為以下兩個步驟:(1)建立客戶端連接首先要創(chuàng)建socket對象的實例,可

35、以經(jīng)過socket類的構(gòu)造方法來實現(xiàn):socket socket= new socket(addressfamily.internetwork,sockettype.stream, protocoltype.tcp);然后獲取所要連接的服務器ip地址和端口:ipaddress ip=ipaddress.parse();ipendpoint iep=new ipendpoint(ip,11000);而后在同步模式中,客戶端調(diào)用connect方法連接服務器。在異步模式下,客戶端則使用beginconnect方法和endconnect方法來完成與服務器的連接,beginconnec

36、t方法原型為:socket.beginconnect(endpoint, asynccallback, object);其參數(shù):remoteep:表示遠程主機ip地址和端口號;callback:asynccallback委托;state:一個對象,它包含此請求的狀態(tài)信息;返回值:iasyncresult,它引用異步連接。在調(diào)用beginconnect方法時必須注冊相應的回調(diào)函數(shù)并且至少傳遞一個socket的實例給state參數(shù),以保證endconnect方法中能使用原始的套接字。調(diào)用代碼如下:private static void startclient() socket socket=new

37、 socket(addressfamily.internetwork,sockettype.stream,protocoltype.tcp); ipaddress ip=ipaddress.parse(); ipendpoint iep=new ipendpoint(ip,13000); socket.beginconnect(iep, new asynccallback(connect),socket);void connect(iasyncresult iar) socket client=(socket)iar.asyncstate; try client.endcon

38、nect(iar); catch (exception e) (2)發(fā)送與接收數(shù)據(jù)在建立了套接字的連接后,就可以服務器端和客戶端之間進行數(shù)據(jù)通信了。異步通信用beginsend和endsend方法來負責數(shù)據(jù)的發(fā)送。前面已經(jīng)介紹,這里不再贅述。3.4 本章小結(jié)本章先是討論了監(jiān)控軟件的設計方案,選擇了可靠性高的tcp/ip協(xié)議和實效性高的異步通信模式。然后分別講解了服務器和客戶端的實現(xiàn)代碼,包括界面設計和socket編程設計。 第4章 activex控件生成與發(fā)布4.1 控件生成與發(fā)布activex控件又稱ocx控件,用于遠程液位監(jiān)控系統(tǒng)中組態(tài)軟件的調(diào)用。本文中使用c#語言生成的axtivex控件

39、并非真正意義上的activex控件,而是.dll控件,不過足夠滿足vs2010,web等多種軟件調(diào)用。要生成可供組態(tài)軟件調(diào)用的ocx控件,還需做不同的處理。因此本文不做描述,僅介紹c#環(huán)境下生成.dll控件的方法,具體步驟如下:(1) 創(chuàng)建一個應用程序解決方案,并添加一個windows控件庫項目,如圖4.1圖4.1 創(chuàng)建解決方案(2)更改“項目屬性-應用程序-程序集信息”設置,勾選“使程序集 com 可見”,如圖4.2圖4.2 更改項目屬性(3)更改“項目屬性-生成”屬性,勾選“為 com interop 注冊”(此處若是在debug狀態(tài)下修改的,那在調(diào)到release狀態(tài)下還應該再設置一次)

40、如圖4.3圖4.3 更改項目屬性(4)修改assemblyinfo.cs文件,增加assembly: allowpartiallytrustedcallers()項(需要使用system.security名稱空間),如圖4.4所示圖4.4 修改assemblyinfo.cs文件(5)添加一個windows用戶控件(6)為控件類增加guid,這個編號將用于b/s系統(tǒng)的客戶端應用時調(diào)用(能夠使用 工具-創(chuàng)建guid 菜單創(chuàng)建一個guid,再復制),如圖4.5所示圖4.5 添加guid(7)為了使activex控件獲取客戶端的信任,控件類還需要完成一個名為“iobjectsafety”的接口,要建立

41、該接口(注意,不能修改該接口的guid值),iobjectsafety.cs代碼如下:(8)然后在控件類中繼承并完成該接口,代碼如下(9)引用封裝的fk.dll,代碼如下(10)進行封裝,代碼如下(11)打包發(fā)布activex,與普通的windows form應用程序的安裝設置幾乎一樣,單有一個地方需要注意,將前面創(chuàng)建的用戶控件項目作為主輸出項目,并設定其register屬性為vsdrpcom,如圖4.6圖4.6 安裝部署(12)將項目文件添加。(13)在系統(tǒng)文件夾system32文件夾中將msiexec.exe(卸載控件時用到)地址找到也增加至上面文件夾(14)在“用戶的程序菜單”中,新建文

42、件夾后加入主程序與msiexec.exe快捷方式。(15)點擊項目安裝工程,在屬性中將productcode復制,點擊msiexec.exe快捷方式,在屬性arguments中加入“/x+一個空隔+productcode”。(16)生成項目,打包文件就完成了,打開.debug看到生成了2個文件,一個是xx.exe,一個是xx.msi,運行exe安裝到系統(tǒng)。4.2 本章小結(jié)本章開頭提出了用c#語言生成的axtivex控件并非真正意義上的activex控件,而是.dll控件,且能夠滿足vs2010,web等多種軟件調(diào)用。要生成可供組態(tài)軟件調(diào)用的ocx控件,還需做不同的處理,本文不作介紹。然后詳細介

43、紹了.dll控件的生成配置和發(fā)布設置方法。第5章 軟件生成與測試5.1 軟件生成及測試運行客戶端,生成server界面,點擊“啟動服務器”按鈕,彈出“服務器已啟動,正在等待連接”對話框,點擊確定,偵聽綁定端口的客戶端請求。圖5.1 啟動服務器運行客戶端,生成client界面。在“ip”和“端口”欄輸入要連接服務器的ip地址和端口號,這里我們采用本地ip:和預先設定的端口號:9050進行測試。點擊連接,連接成功會彈出“連接成功,正在獲取測試信息”窗口,服務器端也會彈出請求連接的客戶端ip和端口號等信息,連接失敗。圖5.2 客戶端成功連接圖5.3 服務器成功連接連接成功后,服務器

44、會向客戶端發(fā)送一條“welcome here!”的測試信息以確保數(shù)據(jù)通信的通常無誤。圖5.4 客戶端接收測試信息測試成功后,服務器和客戶端可相互發(fā)送接收數(shù)據(jù),內(nèi)部設定先發(fā)送后接收的機制。例如:服務器向客戶端發(fā)送“hello!”,客戶端也可向服務器發(fā)送“how are you!”等信息。圖5.5 服務器向客戶端發(fā)送消息圖5.6客戶端向服務器發(fā)送消息通信完成后,點擊“關閉服務器”會彈出確認關閉的選擇窗口,選擇“是”則關閉“否”則取消??蛻舳讼嗤瑘D5.7關閉服務器圖5.8關閉客戶端5.2 本章小結(jié)本章展示軟件測試過程。測試表明該軟件能夠?qū)崿F(xiàn)對液位過程的實時監(jiān)測和遠程控制,還能有效的避免了資源浪費和內(nèi)

45、存泄露等缺陷。在滿足企業(yè)個性化設計需求的同時還保證了測控平臺的工作性能和測控質(zhì)量,極大的提高了工業(yè)生產(chǎn)效率。第6章 結(jié)語與展望本文利用vs2012.net編程平臺設計了一套基于c#遠程液位監(jiān)控軟件,可確保遠程數(shù)據(jù)傳輸?shù)膶崟r性和有效性,操作簡便且界面友好,彌補了傳統(tǒng)組態(tài)軟件在工業(yè)應用中的不足。該系統(tǒng)極大的滿足了現(xiàn)代工業(yè)控制中的遠程監(jiān)控的要求,為提要企業(yè)生產(chǎn)效率和市場競爭力提供了有力的保障。然而目前軟件僅支持遠程客戶端和服務器之間進行點對點通信,若實現(xiàn)多端口多服務器之間進行通信,可滿足工業(yè)液位過程監(jiān)控的系統(tǒng)化管理,對提高企業(yè)生產(chǎn)效率有著重大意義。參考文獻1 顧洪軍,張佐,吳秋峰.網(wǎng)絡控制系統(tǒng)的實時

46、特性分析及數(shù)據(jù)傳輸技術(shù)j.計算機工程技術(shù)與應用,20010:38-40 2 王峰,張宏偉,秦霆鎬等.嵌入式internet技術(shù)及其實現(xiàn)方案j.微計算機信息,200319(12):61一623 leekb, schneemanrd. interne- t based distributed measurement and control applications j.ieee instrumentation&measurement magazine, 1999, (6).4 邊寧寧,費敏銳.一種基于工業(yè)以太網(wǎng)的控制系統(tǒng)的設計與實現(xiàn)j.儀器儀表學報,2003,8(4):366-3695 陳元謀,吳

47、長奇.基于s ocket的遠程監(jiān)控的通信系統(tǒng)實現(xiàn)j.計算機安全,2011(3):60-626 孫海民.精通windows sockets網(wǎng)絡開發(fā)一基于visual c+實現(xiàn)m.人民郵電出版社,2008:101一1607 謝家興,王建,劉洪山等.基于tcp/ip數(shù)據(jù)通信系統(tǒng)設計j.軟件導刊,2010, 9(3):10-128 李大連.基于tcp/ip網(wǎng)絡的機房環(huán)境監(jiān)控系統(tǒng)設計j.計算機與現(xiàn)代化,2011(2) :97-999 茹金平.基于internet的遠程監(jiān)控系統(tǒng)設計j.電腦知識與技術(shù),2010(6):7516-751710 侯其鋒,李曉華,李莎.visual c+數(shù)據(jù)庫通用模塊開發(fā)與系統(tǒng)移

48、植m.清華大學出版社,2007(5):2011711 姚鰻.網(wǎng)絡化遠程測控系統(tǒng)的網(wǎng)絡信息安全關鍵技術(shù)研究d.碩士,西北工業(yè)大學,200712 李想.基于ethernet+tcp/ip的現(xiàn)場網(wǎng)絡控制系統(tǒng)的研究d.碩士,華北電力大學,2006:2313 沈鑫刻.計算機網(wǎng)絡m.清華大學出版社,2008致 謝 通過此次完成畢業(yè)設計的過程,讓我明白了畢業(yè)設計是對我們大學四年學習成果的一次鞏固和檢驗。同時極大的鍛煉了我們個人獨立完成項目的能力以及論文設計的能力,為以后面對工作或者繼續(xù)深造打下了良好的基礎。本次設計能夠順利完成,首先我要感謝丁躍澆老師。他在我設計的過程中給予了我極大的幫助和支持。每有問題,老

49、師總是耐心的解答,使我能夠從各種困惑中走出來,繼續(xù)完成后續(xù)工作。再則我還要感謝湖南理工學院創(chuàng)新基地實驗室,這里是我成長和進步的地方,見證者我能力成長的地方,它為我提供了良好的設備和學習的環(huán)境。同時我還要感謝我的寢室同學,他們在我迷惑的時候為我無私的提供了幫助。最后還要感謝相關資料的編著者和給予我們支持的社會各界人士,感謝您們?yōu)槲覀兲峁┮粋€良好的環(huán)境,使本次設計圓滿完成。最后祝愿母校能夠越來越好,同學們能夠心想事成,考上自己理想的學校,得到自己理想的工作。附錄 軟件代碼服務器:using system;using system.collections.generic;using system.c

50、omponentmodel;using system.data;using system.drawing;using system.linq;using system.text;using system.windows.forms;using system.net;using system.net.sockets;using system.threading;namespace text_server public partial class form1 : form public form1() initializecomponent(); public class stateobject public socket worksocket = null; public const int buffersize = 1024; public byte buffer = new bytebuff

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論