![](https://static.zsdocx.com/FlexPaper/FileRoot/2019-6/7/15/e26c31fb-24cc-413f-a00c-b85be50a407e/e26c31fb-24cc-413f-a00c-b85be50a407epic.jpg)
![畢業(yè)設計-基于c#的遠程液位監(jiān)控軟件設計_第1頁](https://static.zsdocx.com/FlexPaper/FileRoot/2019-6/7/15/e26c31fb-24cc-413f-a00c-b85be50a407e/e26c31fb-24cc-413f-a00c-b85be50a407e1.gif)
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、<p><b> 學號</b></p><p><b> 畢業(yè)設計(論文)</b></p><p> 題目: 基于C#的遠程液位監(jiān)控軟件設計</p><p> 作 者 屆 別 </p><p>
2、; 學 院 專 業(yè) </p><p> 指導教師 職 稱 </p><p> 完成時間 年 月 日 </p><p><b> 摘 要</b>
3、</p><p> 為了彌補組態(tài)軟件在遠程液位監(jiān)控系統(tǒng)中的不足,本文設計了一套基于C#的遠程液位監(jiān)控軟件。本軟件依靠.NET類庫中Windows.Forms類完成了服務器與客戶端測試界面的設計,還利用SOCKET類實現了服務器與客戶端之間的異步通信,達到了實時傳輸和遠程監(jiān)控的要求。同時利用內部的垃圾回收機制,有效的避免了資源浪費和內存泄露等缺陷。在滿足企業(yè)個性化設計需求的同時還保證了測控平臺的工作性能和測控質量
4、,極大的提高了工業(yè)生產效率。</p><p> 關鍵詞:C#;SOCKET;異步通信;</p><p><b> Abstract</b></p><p> To make up for deficiencies in the remote configura
5、tion software level monitoring system, the paper designs a C # based on the level of remote monitoring software. The sof
6、tware relies on .NET class library Windows.Forms class completed the test server and the client interface design, but also us
7、e SOCKET class implements the asynchronous communication between the server and the client, to the real-time transmission and remo
8、te monitoring requirements. While taking advantage of the internal garbage</p><p> Keywords: C #; SOCKET; asynchronous communication; &l
9、t;/p><p><b> 目 錄</b></p><p><b> 摘 要I</b></p><p> AbstractII</p><p> 第1章 引 言1</p><p> 1.1 課題研究的背景1</p><p> 1.2
10、 課題研究的意義1</p><p> 1.3 課題研究內容及結構安排2</p><p> 第2章 系統(tǒng)整體結構3</p><p> 2.1 控制系統(tǒng)構成3</p><p> 2.2 測控軟件構成4</p><p> 2.2.1 相關技術介紹4</p><p> 2.2.
11、2 程序流程框圖5</p><p> 2.3 本章小結6</p><p> 第3章 監(jiān)控軟件程序實現7</p><p> 3.1 軟件設計方案7</p><p> 3.2 服務器設計7</p><p> 3.2.1 界面設計7</p><p> 3.2.2 Socket
12、編程8</p><p> 3.3 客戶端設計12</p><p> 3.3.1 界面設計12</p><p> 3.3.2 Socket編程13</p><p> 3.4 本章小結15</p><p> 第4章 ActiveX控件生成與發(fā)布16</p><p> 4.1
13、 控件生成與發(fā)布16</p><p> 4.2 本章小結21</p><p> 第5章 軟件生成與測試22</p><p> 5.1 軟件生成及測試22</p><p> 5.2 本章小結25</p><p> 第6章 結語與展望26</p><p><b>
14、 參考文獻27</b></p><p><b> 致 謝28</b></p><p> 附錄 軟件代碼29</p><p><b> 第1章 引 言</b></p><p> 1.1 課題研究的背景</p><p> 隨著科技的不斷發(fā)展,遠
15、程監(jiān)控技術以其逐步完善和推廣,逐漸使人們意識到遠程測控技術對現代企業(yè)管理和生產效率的重要意義。為了提高生產效率,人們希望獲得對工廠生產中大量的物理量和生產工藝等參數的實時測控。但是以往的監(jiān)測技術已經無法滿足當代工業(yè)生產的需求。伴隨著通訊技術、電子技術和計算機網絡技術的快速發(fā)展,豐富的網絡資源以及不斷降低的成本為網絡化遠程監(jiān)控系統(tǒng)提供了可能。</p><p> 液位監(jiān)控是當代工業(yè)測控中較為普遍的一類問題,在石油、
16、化工、電力等工業(yè)部門中應用極為普及,是工業(yè)生產過程當中的一個重要構成部分。針對傳統(tǒng)工業(yè)生產中液位過程所具有的非線性、時滯和時變等復雜特性,液位監(jiān)控系統(tǒng)能夠有效的模擬和監(jiān)測生產中液位過程所產生的一系列物理量,并及時針對其產生的問題做出相應的調整。此外,液位過程測控平臺的構建和控制方案的鉆研,對工業(yè)生產中施行液位過程控制具備重要的指導作用。</p><p> 1.2 課題研究的意義 </p>
17、<p> 當前國內外大多數企業(yè)都使用組態(tài)軟件對液位過程進行監(jiān)控。組態(tài)軟件是近些年在工業(yè)控制領域廣泛應用的軟件開發(fā)工具,可快速構建不同需求的數據采集和監(jiān)控系統(tǒng)。應用組態(tài)軟件可免去了傳統(tǒng)測控軟件編寫中龐大而復雜的編程工作,大大提高了測控系統(tǒng)的開發(fā)效率,且保證了測控平臺的工作性能和測控質量。</p><p> 然而傳統(tǒng)的組態(tài)軟件在使用過程中由于系統(tǒng)體積的龐大,造成了巨大的資源浪費,且價格昂貴,無法滿足
18、企業(yè)各種個性化設計的要求。因此不滿足大多數中小型企業(yè)的要求。針對這一問題,大部分開發(fā)人員選擇使用VB或VC++等語言開發(fā)符合企業(yè)需求的監(jiān)控軟件。雖然利用這些語言編寫的監(jiān)控軟件可以彌補組態(tài)軟件的不足,且可以自由的對系統(tǒng)資源進行控制。但是由于語言本身的不完善,很容易造成系統(tǒng)資源浪費,內存泄露等問題,從而使得監(jiān)控軟件不穩(wěn)定,極大地影響了監(jiān)測質量。</p><p> C#是微軟公司于2000年7月,專門為.NET的應用
19、而發(fā)布的一種全新的面向對象程序設計語言,具有簡單、安全等特點。C#繼承了C語言的語法風格,同時又繼承了C++的面向對象特性,同時擁有和VB相類似的快速開發(fā)能力。因此用C#語言開發(fā)的遠程液位測控軟件可以有效的彌補傳統(tǒng)組態(tài)軟件的不足,滿足企業(yè)個性化的要求。利用.NET程序集、MSIL和JIT編譯器實現了對組件的充分使用,而且經過內部的垃圾回收機制,可及時回收軟件運行時不再使用的內存資源,避免了資源浪費和內存泄露等缺陷。</p>
20、<p> 綜上原因,本文提出并設計了一套基于C#遠程液位監(jiān)控軟件。該軟件不但依靠.NET類庫中強大的類庫資源實現了對液位過程的實時監(jiān)測和遠程控制,還利用內部的垃圾回收機制,有效的避免了資源浪費和內存泄露等缺陷。在滿足企業(yè)個性化設計需求的同時還保證了測控平臺的工作性能和測控質量,極大的提高了工業(yè)生產效率。</p><p> 1.3 課題研究內容及結構安排 </p><
21、p> 組態(tài)軟件在工業(yè)控制中應用廣泛,本文基于此研究設計了一套基于C#的遠程液位監(jiān)控軟件,以彌補組態(tài)軟件在遠程監(jiān)控領域的不足。論文結構安排如下:</p><p> 第1章,描述了課題研究的背景和意義,闡述了基于C#遠程液位監(jiān)控軟件的優(yōu)點。 </p><p> 第2章,軟件的總體設計,包括軟件說明和功能介紹以及程序設計流程框圖。</p><p> 第3章,
22、相關軟件和技術的基本介紹。</p><p> 第4章,軟件各功能模塊的具體設計與實現。</p><p> 第5章,軟件生成與測試結果展示。</p><p> 第6章,結語與展望。</p><p> 第2章 系統(tǒng)整體結構</p><p> 2.1 控制系統(tǒng)構成</p><p> 為了
23、實現對水箱液位參數的精確測控以及實時監(jiān)視和記錄。本文設計了一套水箱液位監(jiān)控系統(tǒng),此監(jiān)控系統(tǒng)采用計算機(PC)作為控制器,變頻器作為執(zhí)行器進行構建。監(jiān)控系統(tǒng)結構圖如圖2.1所示。</p><p> 圖2.1 水箱液位監(jiān)控系統(tǒng)結構圖</p><p> 在此系統(tǒng)中,液位變送器LT101使用測量范圍為0~60cm的阻壓式液位(壓力)變送器,將檢測出來的水箱液位信號轉變?yōu)?~20mA標準電信號。
24、控制器LIC101采用PC機,用組態(tài)王KingVIEW6.55開發(fā)監(jiān)控軟件,并用C#編寫可供組態(tài)王KingVIEW6.55使用的遠程監(jiān)控控件。A/D與D/A分別選用ADAM5018模塊和ADAM5060模塊,可經過RS232總線與計算機進行通訊。變頻器采用西門子G110變頻器,用來獲取計算機發(fā)送經ADAM5060轉換后的4~20mA控制信號,并完成變頻調速(頻率范圍為0~50Hz)進而驅動水泵改變管路中的水流量,達到調節(jié)水箱液位的目的&
25、lt;/p><p> ADAM5018/5060控制模塊體積較小,易于集成,且擁有一個獨立的嵌入式的RS232傳輸卡, 可通過RS232與PC機進行通信。底板上有4個插槽,能夠插接ADAM5018/5060的I/O 模塊, 從而完成快速數據的收集與控制, 因而ADAM5018/5060模塊很適宜該系統(tǒng)。</p><p> 2.2 測控軟件構成</p><p> 2
26、.2.1 相關技術介紹</p><p><b> ?。?).NET框架</b></p><p> 軟件基于.NET框架的VS2010編程環(huán)境設計,.NET是一個由 Microsoft .NET Framework SDK中包括的類、值類型和接口構成的庫。該庫直接訪問系統(tǒng)功能,是組成.NET Framework程序、組件及控件的基礎。</p><p
27、><b> (2)C/S結構</b></p><p> 軟件遵循C/S結構,設計了服務器和客戶端兩大塊。該結構可以充分利用硬件的優(yōu)點,將任務合理安排到客戶端和服務器,大大減少了系統(tǒng)整體的通信成本。C/S 結構的根本原理是將大的任務分解為多個子任務,由多臺計算機協(xié)作完成。其工作模式如圖2.2所示:</p><p> 圖2.2 C/S結構工作模式</p&
28、gt;<p> C/S構架的長處是能夠充分利用客戶端的應對能力,很多任務能夠在客戶端處理后再轉交給服務器。這樣可以大大提高客戶端的響應速度。具體如下兩點優(yōu)勢:</p><p> (1)服務器處理數據負擔較輕。</p><p> ?。?)數據的儲存管理能力較為透明。</p><p> (3)SOCEKT類</p><p>
29、 服務器和客戶端依靠強大的SOCKET類建立連接。完成液位過程數據采集后的傳輸工作,將遠端設備的數據實時可靠的傳輸到服務器端進行檢測和紀錄,同時服務器也可發(fā)送數據到客戶端,對遠程液位設備進行調控。Socket也稱"套接字",用來描繪IP地址和端口,是個通信鏈的句柄。在Internet上的主機通常都會運行多個應用軟件,并且提供多種服務。而每個服務程序都會構建相應的SOCKET與端口一一對應,從而讓不同端口擁有不同服務。
30、Socket本質上供應了過程通信的端點。Socket連接過程能夠分為三步:服務器偵聽、確認連接和客戶端申請。</p><p> (1)服務器偵聽:服務器端socket不是定位詳細的客戶端socket,而是處于等候連接的狀況,實時監(jiān)測網絡狀況。</p><p> ?。?)客戶端申請:是指由客戶端提出連接申請,要連接的目標是服務器端的套接字。因此,客戶端的socket首先得描繪它所要連接的服
31、務器,確認服務器端socket的IP地址和端口號,進而向服務器端提出連接申請。</p><p> (3)確認連接:指當服務器端socket監(jiān)聽到客戶端socket的連接申請時,它會回應客戶端socket的申請,創(chuàng)建一個新的線程,將服務器端socket的敘述發(fā)給客戶端,當客戶端確定了此敘述,就會成功握手建立連接。而服務器端socket還將處于監(jiān)聽狀態(tài),等待接收其他客戶端socket的連接申請。</p>
32、<p> 2.2.2 程序流程框圖</p><p> 系統(tǒng)根據C/S架構,分別創(chuàng)建服務器和客戶端。服務器首先創(chuàng)建socket()套接字,利用bind()方法綁定本地IP和端口,用listen()方法監(jiān)聽端口請求,。偵聽到端口有連接申請時,調用accept()方法接受請求,而后用receive()/send()方法對數據進行讀/寫操作,傳輸完成時使用close()函數關閉服務器。同樣客戶端也先創(chuàng)建
33、socket()套接字,獲取要連接服務器的IP和端口,使用connect()方法發(fā)送連接請求,而后使用receive()/send()函數進行數據的讀/寫,傳輸完成時使用close()函數關閉客戶端。系統(tǒng)程序框圖如圖2.3所示:</p><p> 圖2.3系統(tǒng)程序框圖</p><p><b> 2.3 本章小結</b></p><p>
34、本章描述了遠程液位監(jiān)控系統(tǒng)的整體架構設計。包括液位監(jiān)控系統(tǒng)的各部分組成,監(jiān)控軟件設計所涉及的相關技術介紹,如:.NET框架、C/S結構和SOCKET編程等,以及系統(tǒng)設計的程序框圖說明。</p><p> 第3章 監(jiān)控軟件程序實現</p><p> 3.1 軟件設計方案</p><p> 監(jiān)控軟件設計的核心在于服務器和客戶端之間的實時通信。本文提供了兩種通信協(xié)
35、議,分別是面向連接的TCP/IP協(xié)議和無連接的UDP協(xié)議,然而在工業(yè)控制中必須保證數據傳輸的可靠性,因此我們選擇了安全性高的TCP/IP協(xié)議作為通訊協(xié)議。此外本文還提供了同步通信和異步異步通信兩種模式可供選擇。同步通信屬于串行通信,用次模式,要求客戶端在發(fā)送一條請求后,必須等到服務器做出相應回應,才能夠發(fā)送下一條請求。異步通信屬于并行通信,此模式下客戶端發(fā)送一條請求之后,不必等到服務器做出相應回應就可發(fā)送下一條請求。在工業(yè)控制中,往往需
36、要保證數據傳輸的實時性,同步通信模式顯然不符合要求,因此我們選擇能實時傳輸的異步通信模式。</p><p><b> 3.2 服務器設計</b></p><p> 3.2.1 界面設計</p><p> 為了方便演示與測試,創(chuàng)建Windows窗體應用程序,進行軟件設計。而要生成ActiveX控件則需要創(chuàng)建Windows控件庫項目,但兩者界
37、面設計的方法一致(注:該服務器界面以及下章的客戶端界面僅為測試通信使用,作為Active控件發(fā)布的界面數據無需手動輸入,數據采集完成后直接存儲到內部Buffer進行發(fā)送。而正式的工業(yè)液位監(jiān)控界面由組態(tài)王設計,本文不介紹)。創(chuàng)建好項目后,打開工具箱,拖出我們所需的工具控件如:Lable、Button、TextBox等進行界面設計,之后修改其對應的屬性,雙擊后則可進行其他部分的代碼編寫。最終界面如圖3.1所示。</p><
38、;p> 圖3.1 server界面設計</p><p> 3.2.2 Socket編程</p><p> Microsoft.Net Framework 為程序訪問Internet實現了可分層、可擴展的網絡服務,其命名空間System.Net和System.Net.Sockets包含大量的類能夠便于網絡通訊程序的開發(fā)。所以在編寫前應該添加using System.Net、usi
39、ng System.Net.Sockets和using System.Threading三個命名空間。具體編程可分為以下步驟:</p><p> ?。?)建立服務器連接</p><p> 首先要創(chuàng)建Socket對象,使用Socket類的構造方法實現:</p><p> Socket listener = new Socket(AddressFamily.Inte
40、rNetwork,SocketType.Stream, ProtocolType.Tcp);</p><p> 參數如下:AddressFamily:Socket使用的尋址方案;SocketType:Socket類型;ProtocolType:Socket使用的協(xié)議,這里所用的是TCP/IP協(xié)議。</p><p> 當創(chuàng)建Socket后,服務器端則要通過Bind()方法綁定所指定的端口
41、,使Socket和一個本地終端相聯(lián)。這里在服務器端可設置兩種方式進行連接,一種是DNS創(chuàng)建域名接連的方式:</p><p> IPHostEntry ipHostInfo = Dns.Resolve(Dns.GetHostName());</p><p> 另一種是IP地址的連接方式:</p><p> IPAddress ipAddress = ipHost
42、Info.AddressList[0];</p><p> 這里是系統(tǒng)自動獲取本機IP,也可以手動輸入IP地址方法如下:</p><p> IPAddress ipAddress = IPAddress.Parse("127.0.0.1");</p><p> 這里采取IP地址連接的方式,設置好IP地址和端口號后使用Bind()方法進行綁定
43、:</p><p> IPEndPoint localEndPoint = new IPEndPoint(ipAddress, 11000);</p><p> listener.Bind(localEndPoint);</p><p> 然后通過Listen方法監(jiān)聽該端口上的連接申請,當監(jiān)聽到端口的連接申請后。同步模式時,服務器調用Accept方法允許連接申
44、請。異步模式時,服務器能夠調用BeginAccept方法和EndAccept方法實現與客戶端的通信。BeginAccept在異步模式下嘗試連接,它準許其余進程直接運行,而不必等候連接建立。在使用BeginAccept方法之前,必需調用Listen方法來監(jiān)聽連接申請,BeginAccept的函數原型為:</p><p> BeginAccept(AsyncCallback AsyncCallback, Ojbec
45、t state);</p><p> 這里AsyncCallBack:代表回調函數;state:代表狀態(tài)信息,必須確保state中包含socket的句;調用BeginAccept方法的根本流程是:1、建立本機終節(jié)點,并建立新的socket與本機終節(jié)點進行綁定;2、在端口上監(jiān)聽是否有新的連接申請;3、申請開始接入新的連接,將其傳入Socket的實例或者StateOjbect的實例。調用BeginAccept()方
46、法完成后,當有新的連接產生,就會使用回調函數,此回調函數一定得包含用于終結接入連接操作的EndAccept()方法,其原型為:</p><p> Socket EndAccept(IAsyncResult iar);</p><p> 那么服務器構建代碼如下:</p><p> public static void StartListening()</p
47、><p><b> {</b></p><p> IPAddress local = IPAddress.Parse("127.0,0,1");</p><p> IPEndPoint iep = new IPEndPoint(local,13000);</p><p> Socket liste
48、ner = new Socket(AddressFamily.InterNetwork,SocketType.Stream, ProtocolType.Tcp);</p><p> server.Bind(iep);</p><p> server.Listen(20);</p><p> server.BeginAccecpt(new AsyncCallba
49、ck(Accept), listener);</p><p><b> }</b></p><p> void Accept(IAsyncResult iar)</p><p><b> {</b></p><p> Socket MyServer = (Socket)iar.AsyncSt
50、ate;</p><p> Socket service = MyServer.EndAccept(iar);</p><p><b> }</b></p><p> (2)發(fā)送與接收數據</p><p> 在創(chuàng)建了套接字的連接后,就能夠使服務器端和客戶端之間進行數據通信了。異步通信用BeginSend和EndS
51、end方法來完成數據發(fā)送。在使用BeginSend方法前要確認雙方都已成功連接,不然會出錯誤。BeginSend方法原型為:</p><p> Socket.BeginSend(Byte[],Int32, Int32, SocketFlags, AsyncCallback, Object);</p><p> 參數如下:buffer:Byte類型的數組,包含將發(fā)送的數據;offset:
52、buffer參數中發(fā)送數據的起始位置,該位置從零開始計數;size:將發(fā)送的字節(jié)數;socketFlags:SocketFlags值的按位組合;callback:AsyncCallback委托;state:一個對象,包含此申請的狀態(tài)消息;返回值:調用異步通訊發(fā)送IAsyncResult。創(chuàng)建一個完成 AsyncCallback 的回調方法并將名字傳入 BeginSend 方法。state 參數一定得包含用來通訊的連接。如果回調要求更多信
53、息,那么可構建一個小型的類用于存儲Socket和其他必須的信息。經過state 參數將此類的一個實例傳遞給 BeginSend 方法。回調方法應使用EndSend方法。當應用程序使用 BeginSend方法時,系統(tǒng)將運用一個單獨的線程完成特定的回調方法,并阻止 EndSend,直到Socket發(fā)送了申請的字節(jié)數或引發(fā)了異常。相關代碼如下:</p><p> private static void Send(So
54、cket handler, String data)</p><p><b> { </b></p><p> byte[] byteData = Encoding.ASCII.GetBytes(data); </p><p> handler.BeginSend(byteData,0,byteData.Length,0,ne
55、w AsyncCallback(SendCallback), handler);</p><p><b> }</b></p><p> private static void SendCallback(IAsyncResult ar)</p><p><b> {</b></p><p>&
56、lt;b> try</b></p><p><b> { </b></p><p> Socket handler = (Socket)ar.AsyncState; </p><p> int bytesSent = handler.EndSend(ar);</p><p> ha
57、ndler.Shutdown(SocketShutdown.Both);</p><p> handler.Close();</p><p><b> }</b></p><p> catch (Exception e)</p><p><b> {</b></p><p
58、><b> }</b></p><p><b> }</b></p><p> 異步通信用BeginReceive和EndReceive方法來接收數據,其BeginReceive方法原型為:</p><p> Socket.BeginReceive(Byte[],Int32,Int32,SocketFlags
59、,AsyncCallback,Object)</p><p> 參數如下:buffer:Byte類型的數組,它是保存接收到的數據的位置;offset:buffer參數中保存所接收數據的位置,該位置從零開始計數;size:要接收的字節(jié)數;socketFlags:SocketFlags值的按位組合;callback:一個AsyncCallback委托,它援用操作完成時要應用的方法;state:一個用戶定義對象,其中
60、寶庫接收操作的相干信息。操作完成時,此對象會傳軟EndReceive方法;返回值:使用異步方法讀取IAsyncResult。異步BeginReceive操作應使用EndReceive方法完成。一般該方法由callback 實現。在操作完成前方法不會進入阻塞狀態(tài)。如需一直阻塞到操作完成時則應使用Receive方法進行重載。相關代碼如下:</p><p> private static void Receive(S
61、ocket client)</p><p><b> {</b></p><p><b> try</b></p><p><b> { </b></p><p> StateObject state = new StateObject();</p>&l
62、t;p> state.workSocket = client; </p><p> client.BeginReceive(state.buffer,0,StateObject.BufferSize,0,new AsyncCallback(ReceiveCallback), state);</p><p><b> }</b></p>
63、<p> catch (Exception e)</p><p><b> {</b></p><p><b> }</b></p><p><b> }</b></p><p> private static void ReceiveCallback(IA
64、syncResult ar)</p><p><b> {</b></p><p><b> try</b></p><p><b> { </b></p><p> StateObject state = (StateObject)ar.AsyncState;<
65、;/p><p> Socket client = state.workSocket; </p><p> int bytesRead = client.EndReceive(ar);</p><p> if (bytesRead > 0)</p><p><b> { </b></p>
66、<p> state.sb.Append(Encoding.ASCII.GetString(state.buffer,0,bytesRead); </p><p> client.BeginReceive(state.buffer,0,StateObject.BufferSize,0,new AsyncCallback(ReceiveCallback), state);</p>
67、<p><b> }</b></p><p><b> else</b></p><p><b> { </b></p><p> if (state.sb.Length > 1)</p><p><b> {</b><
68、/p><p> response = state.sb.ToString();</p><p><b> } </b></p><p> receiveDone.Set();</p><p><b> }</b></p><p><b> }</b
69、></p><p> catch (Exception e)</p><p><b> {</b></p><p><b> }</b></p><p><b> }</b></p><p> 這里對接收的數據做了一些處理,首先處理連接的
70、回調函數里獲得的通訊套接字client,然后開始接收數據。當數據發(fā)送到緩沖區(qū)中,BeginReceive方法嘗試從buffer數組中獲取長度為buffer.length的數據塊,并且返回接收到的數據量bytesRead。經過判斷返回值bytesRead的大小來判斷數據是否傳輸完全。這里出現了Set()方法,引出了程序阻塞和異步中的同步問題。</p><p> .Net里提供了EventWaitHandle類來表
71、示一個線程的同步事件。EventWaitHandle即事件等待句柄,他允許線程通過操作系統(tǒng)互發(fā)信號和等待彼此的信號來達到線程同步的目的。這個類有2個子類,分別為AutoRestEevnt(自動重置)和ManualRestEvent(手動重置)。下面是線程同步的幾個方法:</p><p> (1)Rset方法:將事件狀態(tài)設置為非終止狀態(tài),使得線程阻塞。這里的線程阻塞是指同意其他需要等候的線程進行阻塞即讓含Wait
72、One()方法的線程阻塞;</p><p> (2)Set方法:將事件狀態(tài)設置終止狀態(tài),允許一個或多個等候線程繼續(xù)。該方法發(fā)送一個信號給操作系統(tǒng),讓處于等候的某個線程從阻塞狀態(tài)轉變成繼續(xù)運行,即WaitOne方法的線程不在阻塞;</p><p> (3)WaitOne方法:阻塞當前線程,直到當前的等候句柄收到信號。此方法將一直使本線程處于阻塞狀態(tài)直到收到信號為止,即當其他非阻塞進程使用
73、set方法時可以繼續(xù)執(zhí)行。</p><p><b> 3.3 客戶端設計</b></p><p> 3.3.1 界面設計</p><p> 客戶端界面設計方法和服務器方法相同,首先創(chuàng)建Windows窗體應用程序,打開工具箱,拖出我們所需的工具控件如:Lable、Button、TextBox等進行界面設計,之后修改其對應的屬性,雙擊后則可進
74、行其他部分的代碼編寫。最終界面如圖3.2所示。</p><p> 圖3.2 client界面設計</p><p> 3.3.2 Socket編程</p><p> 客戶端的Socket編程同樣分為以下兩個步驟:</p><p> ?。?)建立客戶端連接</p><p> 首先要創(chuàng)建Socket對象的實例,可以經
75、過Socket類的構造方法來實現:</p><p> Socket socket= new Socket(AddressFamily.InterNetwork,SocketType.Stream, ProtocolType.Tcp);</p><p> 然后獲取所要連接的服務器IP地址和端口:</p><p> IPAddress ip=IPAddress.P
76、arse("127.0.0.1");</p><p> IPEndPoint iep=new IPEndPoint(ip,11000);</p><p> 而后在同步模式中,客戶端調用Connect方法連接服務器。在異步模式下,客戶端則使用BeginConnect方法和EndConnect方法來完成與服務器的連接,BeginConnect方法原型為:</p&g
77、t;<p> Socket.BeginConnect(EndPoint, AsyncCallback, Object);</p><p> 其參數:remoteEP:表示遠程主機IP地址和端口號;callback:AsyncCallback委托;state:一個對象,它包含此請求的狀態(tài)信息;返回值:IAsyncResult,它引用異步連接。在調用BeginConnect方法時必須注冊相應的回調函
78、數并且至少傳遞一個Socket的實例給state參數,以保證EndConnect方法中能使用原始的套接字。調用代碼如下:</p><p> private static void StartClient()</p><p><b> {</b></p><p> Socket socket=new Socket(AddressFamily
79、.InterNetwork,SocketType.Stream,ProtocolType.Tcp);</p><p> IPAddress ip=IPAddress.Parse("127.0.0.1");</p><p> IPEndPoint iep=new IPEndPoint(ip,13000);</p><p> socket.Be
80、ginConnect(iep, new AsyncCallback(Connect),socket);</p><p><b> }</b></p><p> void Connect(IAsyncResult iar)</p><p><b> {</b></p><p> Socket
81、client=(Socket)iar.AsyncState;</p><p><b> try</b></p><p><b> {</b></p><p> client.EndConnect(iar);</p><p><b> }</b></p>&
82、lt;p> catch (Exception e)</p><p><b> {</b></p><p><b> }</b></p><p><b> }</b></p><p> ?。?)發(fā)送與接收數據</p><p> 在建立了套接
83、字的連接后,就可以服務器端和客戶端之間進行數據通信了。異步通信用BeginSend和EndSend方法來負責數據的發(fā)送。前面已經介紹,這里不再贅述。</p><p><b> 3.4 本章小結</b></p><p> 本章先是討論了監(jiān)控軟件的設計方案,選擇了可靠性高的TCP/IP協(xié)議和實效性高的異步通信模式。然后分別講解了服務器和客戶端的實現代碼,包括界面設計和
84、SOCKET編程設計。</p><p> 第4章 ActiveX控件生成與發(fā)布</p><p> 4.1 控件生成與發(fā)布</p><p> ActiveX控件又稱Ocx控件,用于遠程液位監(jiān)控系統(tǒng)中組態(tài)軟件的調用。本文中使用C#語言生成的AxtiveX控件并非真正意義上的ActiveX控件,而是.dll控件,不過足夠滿足VS2010,Web等多種軟件調用。要生
85、成可供組態(tài)軟件調用的Ocx控件,還需做不同的處理。因此本文不做描述,僅介紹C#環(huán)境下生成.dll控件的方法,具體步驟如下:</p><p> 創(chuàng)建一個應用程序解決方案,并添加一個Windows控件庫項目,如圖4.1</p><p> 圖4.1 創(chuàng)建解決方案</p><p> ?。?)更改“項目屬性-應用程序-程序集信息”設置,勾選“使程序集 COM 可見”,如圖
86、4.2</p><p> 圖4.2 更改項目屬性</p><p> ?。?)更改“項目屬性-生成”屬性,勾選“為 COM Interop 注冊”(此處若是在debug狀態(tài)下修改的,那在調到release狀態(tài)下還應該再設置一次)如圖4.3</p><p> 圖4.3 更改項目屬性</p><p> (4)修改AssemblyInfo.cs
87、文件,增加[assembly: AllowPartially</p><p> TrustedCallers()]項(需要使用System.Security名稱空間),如圖4.4所示</p><p> 圖4.4 修改AssemblyInfo.cs文件</p><p> ?。?)添加一個Windows用戶控件</p><p> (6)為控
88、件類增加GUID,這個編號將用于B/S系統(tǒng)的客戶端應用時調用(能夠使用 工具-創(chuàng)建GUID 菜單創(chuàng)建一個GUID,再復制),如圖4.5所示</p><p> 圖4.5 添加GUID</p><p> ?。?)為了使ActiveX控件獲取客戶端的信任,控件類還需要完成一個名為“IObjectSafety”的接口,要建立該接口(注意,不能修改該接口的GUID值),IObjectSafety.
89、cs代碼如下:</p><p> ?。?)然后在控件類中繼承并完成該接口,代碼如下</p><p> ?。?)引用封裝的FK.dll,代碼如下</p><p> ?。?0)進行封裝,代碼如下</p><p> ?。?1)打包發(fā)布ActiveX,與普通的Windows Form應用程序的安裝設置幾乎一樣,單有一個地方需要注意,將前面創(chuàng)建的用戶控
90、件項目作為主輸出項目,并設定其Register屬性為vsdrpCOM,如圖4.6</p><p><b> 圖4.6 安裝部署</b></p><p> ?。?2)將項目文件添加。</p><p> (13)在系統(tǒng)文件夾system32文件夾中將msiexec.exe(卸載控件時用到)地址找到也增加至上面文件夾</p><
91、;p> ?。?4)在“用戶的程序菜單”中,新建文件夾后加入主程序與msiexec.exe快捷方式。</p><p> ?。?5)點擊項目安裝工程,在屬性中將ProductCode復制,點擊msiexec.exe快捷方式,在屬性Arguments中加入“/x+一個空隔+ProductCode”。</p><p> (16)生成項目,打包文件就完成了,打開..\Debug看到生成了2個
92、文件,一個是xx.exe,一個是xx.msi,運行exe安裝到系統(tǒng)。</p><p><b> 4.2 本章小結</b></p><p> 本章開頭提出了用C#語言生成的AxtiveX控件并非真正意義上的ActiveX控件,而是.dll控件,且能夠滿足VS2010,Web等多種軟件調用。要生成可供組態(tài)軟件調用的Ocx控件,還需做不同的處理,本文不作介紹。然后詳細介
93、紹了.dll控件的生成配置和發(fā)布設置方法。</p><p> 第5章 軟件生成與測試</p><p> 5.1 軟件生成及測試</p><p> 運行客戶端,生成server界面,點擊“啟動服務器”按鈕,彈出“服務器已啟動,正在等待連接……”對話框,點擊確定,偵聽綁定端口的客戶端請求。</p><p> 圖5.1 啟動服務器<
94、/p><p> 運行客戶端,生成client界面。在“IP”和“端口”欄輸入要連接服務器的IP地址和端口號,這里我們采用本地IP:127.0.0.1和預先設定的端口號:9050進行測試。點擊連接,連接成功會彈出“連接成功,正在獲取測試信息……”窗口,服務器端也會彈出請求連接的客戶端IP和端口號等信息,連接失敗。</p><p> 圖5.2 客戶端成功連接</p><p&
95、gt; 圖5.3 服務器成功連接</p><p> 連接成功后,服務器會向客戶端發(fā)送一條“welcome here!”的測試信息以確保數據通信的通常無誤。</p><p> 圖5.4 客戶端接收測試信息</p><p> 測試成功后,服務器和客戶端可相互發(fā)送接收數據,內部設定先發(fā)送后接收的機制。例如:服務器向客戶端發(fā)送“hello!”,客戶端也可向服務器發(fā)送
96、“How are you!”等信息。</p><p> 圖5.5 服務器向客戶端發(fā)送消息</p><p> 圖5.6客戶端向服務器發(fā)送消息</p><p> 通信完成后,點擊“關閉服務器”會彈出確認關閉的選擇窗口,選擇“是”則關閉“否”則取消??蛻舳讼嗤?lt;/p><p><b> 圖5.7關閉服務器</b><
97、;/p><p><b> 圖5.8關閉客戶端</b></p><p><b> 5.2 本章小結</b></p><p> 本章展示軟件測試過程。測試表明該軟件能夠實現對液位過程的實時監(jiān)測和遠程控制,還能有效的避免了資源浪費和內存泄露等缺陷。在滿足企業(yè)個性化設計需求的同時還保證了測控平臺的工作性能和測控質量,極大的提高了
98、工業(yè)生產效率。</p><p> 第6章 結語與展望</p><p> 本文利用VS2012.NET編程平臺設計了一套基于C#遠程液位監(jiān)控軟件,可確保遠程數據傳輸的實時性和有效性,操作簡便且界面友好,彌補了傳統(tǒng)組態(tài)軟件在工業(yè)應用中的不足。該系統(tǒng)極大的滿足了現代工業(yè)控制中的遠程監(jiān)控的要求,為提要企業(yè)生產效率和市場競爭力提供了有力的保障。然而目前軟件僅支持遠程客戶端和服務器之間進行點對點
99、通信,若實現多端口多服務器之間進行通信,可滿足工業(yè)液位過程監(jiān)控的系統(tǒng)化管理,對提高企業(yè)生產效率有著重大意義。</p><p><b> 參考文獻</b></p><p> [1] 顧洪軍,張佐,吳秋峰.網絡控制系統(tǒng)的實時特性分析及數據傳輸技術[J].計算機工程技術與應用,20010:38-40 </p><p> [2] 王峰,張宏偉,秦
100、霆鎬等.嵌入式Internet技術及其實現方案[J].微計算機信息,2003</p><p> 19(12):61一62</p><p> [3] LeeKB, SchneemanRD. Interne- t based Distributed Measurement and Control Applications [J].IEEE Instrumentation&Measu
101、rement Magazine, 1999, (6).</p><p> [4] 邊寧寧,費敏銳.一種基于工業(yè)以太網的控制系統(tǒng)的設計與實現[J].儀器儀表學報,2003,8(4):366-369</p><p> [5] 陳元謀,吳長奇.基于S ocket的遠程監(jiān)控的通信系統(tǒng)實現[J].計算機安全,2011(3):60-62</p><p> [6] 孫海民.
102、精通Windows Sockets網絡開發(fā)一基于Visual C++實現[M].人民郵電出版社,</p><p> 2008:101一160</p><p> [7] 謝家興,王建,劉洪山等.基于TCP/IP數據通信系統(tǒng)設計[J].軟件導刊,2010, 9(3):10-12</p><p> [8] 李大連.基于TCP/IP網絡的機房環(huán)境監(jiān)控系統(tǒng)設計[J].計
103、算機與現代化,2011(2) :97-99</p><p> [9] 茹金平.基于Internet的遠程監(jiān)控系統(tǒng)設計[J].電腦知識與技術,2010(6):7516-7517</p><p> [10] 侯其鋒,李曉華,李莎.Visual C++數據庫通用模塊開發(fā)與系統(tǒng)移植[M].清華大學出版</p><p> 社,2007(5):20117</p>
104、;<p> [11] 姚鰻.網絡化遠程測控系統(tǒng)的網絡信息安全關鍵技術研究[D].碩士,西北工業(yè)大學,</p><p><b> 2007</b></p><p> [12] 李想.基于ethernet+TCP/IP的現場網絡控制系統(tǒng)的研究[D].碩士,華北電力大學,</p><p><b> 2006:23<
105、;/b></p><p> [13] 沈鑫刻.計算機網絡[M].清華大學出版社,2008</p><p><b> 致 謝</b></p><p> 通過此次完成畢業(yè)設計的過程,讓我明白了畢業(yè)設計是對我們大學四年學習成果的一次鞏固和檢驗。同時極大的鍛煉了我們個人獨立完成項目的能力以及論文設計的能力,為以后面對工作或者繼續(xù)深造打下
106、了良好的基礎。</p><p> 本次設計能夠順利完成,首先我要感謝丁躍澆老師。他在我設計的過程中給予了我極大的幫助和支持。每有問題,老師總是耐心的解答,使我能夠從各種困惑中走出來,繼續(xù)完成后續(xù)工作。再則我還要感謝湖南理工學院創(chuàng)新基地實驗室,這里是我成長和進步的地方,見證者我能力成長的地方,它為我提供了良好的設備和學習的環(huán)境。同時我還要感謝我的寢室同學,他們在我迷惑的時候為我無私的提供了幫助。最后還要感謝相關資
107、料的編著者和給予我們支持的社會各界人士,感謝您們?yōu)槲覀兲峁┮粋€良好的環(huán)境,使本次設計圓滿完成。</p><p> 最后祝愿母校能夠越來越好,同學們能夠心想事成,考上自己理想的學校,得到自己理想的工作。</p><p><b> 附錄 軟件代碼</b></p><p><b> 服務器:</b></p>
108、<p> using System;</p><p> using System.Collections.Generic;</p><p> using System.ComponentModel;</p><p> using System.Data;</p><p> using System.Drawing;<
109、/p><p> using System.Linq;</p><p> using System.Text;</p><p> using System.Windows.Forms;</p><p> using System.Net;</p><p> using System.Net.Sockets;<
110、/p><p> using System.Threading;</p><p> namespace text_server</p><p><b> {</b></p><p> public partial class Form1 : Form</p><p><b> {&l
111、t;/b></p><p> public Form1()</p><p><b> {</b></p><p> InitializeComponent();</p><p><b> }</b></p><p> public class StateObj
112、ect</p><p><b> {</b></p><p> public Socket workSocket = null;</p><p> public const int BufferSize = 1024;</p><p> public byte[] buffer = new byte[Buffer
113、Size];</p><p> public StringBuilder sb = new StringBuilder();</p><p><b> }</b></p><p> public static ManualResetEvent allDone </p><p> = new ManualReset
114、Event(false);</p><p> Socket listener = new Socket(AddressFamily.</p><p> InterNetwork, SocketType.Stream, ProtocolType.Tcp);</p><p> Socket handler;</p><p> StateO
115、bject state = new StateObject();</p><p> private String content_receive = String.Empty;</p><p> private String content_send = String.Empty;</p><p> private Thread demoThread = nu
116、ll;</p><p> delegate void SetTextCallback(string text);</p><p> /// <summary></p><p> /// 啟動服務器準備發(fā)送接收</p><p> /// </summary></p><p> /// &
117、lt;param name="sender"></param></p><p> /// <param name="e"></param></p><p> private void but_start_Click(object sender, EventArgs e)</p><p&
118、gt;<b> {</b></p><p> byte[] bytes = new Byte[1024];</p><p> IPAddress ipAddress = IPAddress.Parse("127.0.0.1");</p><p> IPEndPoint localEndPoint = new IPEn
119、dPoint(ipAddress, 11000);</p><p> listener.Bind(localEndPoint);</p><p> listener.Listen(100);</p><p> MessageBox.Show("服務器已啟動,正在等待連接……");</p><p> allDone.
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 基于c#平臺的短信發(fā)送軟件設計[畢業(yè)論文]
- c#課程設計—模擬抽獎軟件設計
- 基于C#的數據采集上位機軟件設計.pdf
- 基于c#平臺的短信發(fā)送軟件設計[開題報告]
- 基于C#的可變情報板系統(tǒng)的軟件設計.pdf
- 基于c#的即時通訊軟件設計與實現畢業(yè)論文
- 液位測量與監(jiān)控系統(tǒng)設計畢業(yè)設計
- 基于c#平臺的短信發(fā)送軟件設計[任務書]
- 液位監(jiān)控系統(tǒng)畢業(yè)設計(外文翻譯)
- 液位監(jiān)控系統(tǒng)畢業(yè)設計(外文翻譯)
- 畢業(yè)設計論文—基于android的物聯(lián)網監(jiān)控手機軟件設計
- 基于c#的監(jiān)控組態(tài)軟件開發(fā)
- 基于GSM的遠程液位監(jiān)控報警系統(tǒng)的設計.pdf
- 基于DSP遠程監(jiān)控系統(tǒng)的后端軟件設計與實現.pdf
- 基于C#的上位機監(jiān)控組態(tài)軟件的設計與開發(fā).pdf
- 畢業(yè)設計(論文)-基于gprs模塊的軟件設計
- 基于c#的熒光分子影像控制和分析軟件設計和實現
- 基于C#的監(jiān)控組態(tài)軟件開發(fā).pdf
- 基于Visual C++的視頻監(jiān)控系統(tǒng)的軟件設計.pdf
- 基于OPC的監(jiān)控軟件設計.pdf
評論
0/150
提交評論