大学毕业设计基于c#的远程液位监控软件设计.docx
- 文档编号:6410904
- 上传时间:2023-01-06
- 格式:DOCX
- 页数:38
- 大小:627.34KB
大学毕业设计基于c#的远程液位监控软件设计.docx
《大学毕业设计基于c#的远程液位监控软件设计.docx》由会员分享,可在线阅读,更多相关《大学毕业设计基于c#的远程液位监控软件设计.docx(38页珍藏版)》请在冰豆网上搜索。
大学毕业设计基于c#的远程液位监控软件设计
学号
毕业设计(论文)
题目:
基于C#的远程液位监控软件设计
作者届别
学院专业
指导教师职称
完成时间年月日
摘要
为了弥补组态软件在远程液位监控系统中的不足,本文设计了一套基于C#的远程液位监控软件。
本软件依靠.NET类库中Windows.Forms类完成了服务器与客户端测试界面的设计,还利用SOCKET类实现了服务器与客户端之间的异步通信,达到了实时传输和远程监控的要求。
同时利用内部的垃圾回收机制,有效的避免了资源浪费和内存泄露等缺陷。
在满足企业个性化设计需求的同时还保证了测控平台的工作性能和测控质量,极大的提高了工业生产效率。
关键词:
C#;SOCKET;异步通信;
Abstract
To make up for deficiencies in the remote configuration software level monitoring system, the paper designs a C # based on the level of remote monitoring software. The software relies on .NET class library Windows.Forms class completed the test server and the client interface design, but also use SOCKET class implements the asynchronous communication between the server and the client, to the real-time transmission and remote monitoring requirements. While taking advantage of the internal garbage collection mechanism, effectively avoiding the waste of resources and memory leaks and other defects. Personalized design to meet business needs, while also ensuring the quality and control performance and control platform, which greatly improves the efficiency of industrial production.
Keywords:
C #; SOCKET; asynchronous communication;
第1章引言
1.1课题研究的背景
随着科技的不断发展,远程监控技术以其逐步完善和推广,逐渐使人们意识到远程测控技术对现代企业管理和生产效率的重要意义。
为了提高生产效率,人们希望获得对工厂生产中大量的物理量和生产工艺等参数的实时测控。
但是以往的监测技术已经无法满足当代工业生产的需求。
伴随着通讯技术、电子技术和计算机网络技术的快速发展,丰富的网络资源以及不断降低的成本为网络化远程监控系统提供了可能。
液位监控是当代工业测控中较为普遍的一类问题,在石油、化工、电力等工业部门中应用极为普及,是工业生产过程当中的一个重要构成部分。
针对传统工业生产中液位过程所具有的非线性、时滞和时变等复杂特性,液位监控系统能够有效的模拟和监测生产中液位过程所产生的一系列物理量,并及时针对其产生的问题做出相应的调整。
此外,液位过程测控平台的构建和控制方案的钻研,对工业生产中施行液位过程控制具备重要的指导作用。
1.2课题研究的意义
当前国内外大多数企业都使用组态软件对液位过程进行监控。
组态软件是近些年在工业控制领域广泛应用的软件开发工具,可快速构建不同需求的数据采集和监控系统。
应用组态软件可免去了传统测控软件编写中庞大而复杂的编程工作,大大提高了测控系统的开发效率,且保证了测控平台的工作性能和测控质量。
然而传统的组态软件在使用过程中由于系统体积的庞大,造成了巨大的资源浪费,且价格昂贵,无法满足企业各种个性化设计的要求。
因此不满足大多数中小型企业的要求。
针对这一问题,大部分开发人员选择使用VB或VC++等语言开发符合企业需求的监控软件。
虽然利用这些语言编写的监控软件可以弥补组态软件的不足,且可以自由的对系统资源进行控制。
但是由于语言本身的不完善,很容易造成系统资源浪费,内存泄露等问题,从而使得监控软件不稳定,极大地影响了监测质量。
C#是微软公司于2000年7月,专门为.NET的应用而发布的一种全新的面向对象程序设计语言,具有简单、安全等特点。
C#继承了C语言的语法风格,同时又继承了C++的面向对象特性,同时拥有和VB相类似的快速开发能力。
因此用C#语言开发的远程液位测控软件可以有效的弥补传统组态软件的不足,满足企业个性化的要求。
利用.NET程序集、MSIL和JIT编译器实现了对组件的充分使用,而且经过内部的垃圾回收机制,可及时回收软件运行时不再使用的内存资源,避免了资源浪费和内存泄露等缺陷。
综上原因,本文提出并设计了一套基于C#远程液位监控软件。
该软件不但依靠.NET类库中强大的类库资源实现了对液位过程的实时监测和远程控制,还利用内部的垃圾回收机制,有效的避免了资源浪费和内存泄露等缺陷。
在满足企业个性化设计需求的同时还保证了测控平台的工作性能和测控质量,极大的提高了工业生产效率。
1.3课题研究内容及结构安排
组态软件在工业控制中应用广泛,本文基于此研究设计了一套基于C#的远程液位监控软件,以弥补组态软件在远程监控领域的不足。
论文结构安排如下:
第1章,描述了课题研究的背景和意义,阐述了基于C#远程液位监控软件的优点。
第2章,软件的总体设计,包括软件说明和功能介绍以及程序设计流程框图。
第3章,相关软件和技术的基本介绍。
第4章,软件各功能模块的具体设计与实现。
第5章,软件生成与测试结果展示。
第6章,结语与展望。
第2章系统整体结构
2.1控制系统构成
为了实现对水箱液位参数的精确测控以及实时监视和记录。
本文设计了一套水箱液位监控系统,此监控系统采用计算机(PC)作为控制器,变频器作为执行器进行构建。
监控系统结构图如图2.1所示。
图2.1水箱液位监控系统结构图
在此系统中,液位变送器LT101使用测量范围为0~60cm的阻压式液位(压力)变送器,将检测出来的水箱液位信号转变为4~20mA标准电信号。
控制器LIC101采用PC机,用组态王KingVIEW6.55开发监控软件,并用C#编写可供组态王KingVIEW6.55使用的远程监控控件。
A/D与D/A分别选用ADAM5018模块和ADAM5060模块,可经过RS232总线与计算机进行通讯。
变频器采用西门子G110变频器,用来获取计算机发送经ADAM5060转换后的4~20mA控制信号,并完成变频调速(频率范围为0~50Hz)进而驱动水泵改变管路中的水流量,达到调节水箱液位的目的
ADAM5018/5060控制模块体积较小,易于集成,且拥有一个独立的嵌入式的RS232传输卡,可通过RS232与PC机进行通信。
底板上有4个插槽,能够插接ADAM5018/5060的I/O模块,从而完成快速数据的收集与控制,因而ADAM5018/5060模块很适宜该系统。
2.2测控软件构成
2.2.1相关技术介绍
(1).NET框架
软件基于.NET框架的VS2010编程环境设计,.NET是一个由Microsoft.NETFrameworkSDK中包括的类、值类型和接口构成的库。
该库直接访问系统功能,是组成.NETFramework程序、组件及控件的基础。
(2)C/S结构
软件遵循C/S结构,设计了服务器和客户端两大块。
该结构可以充分利用硬件的优点,将任务合理安排到客户端和服务器,大大减少了系统整体的通信成本。
C/S结构的根本原理是将大的任务分解为多个子任务,由多台计算机协作完成。
其工作模式如图2.2所示:
图2.2C/S结构工作模式
C/S构架的长处是能够充分利用客户端的应对能力,很多任务能够在客户端处理后再转交给服务器。
这样可以大大提高客户端的响应速度。
具体如下两点优势:
(1)服务器处理数据负担较轻。
(2)数据的储存管理能力较为透明。
(3)SOCEKT类
服务器和客户端依靠强大的SOCKET类建立连接。
完成液位过程数据采集后的传输工作,将远端设备的数据实时可靠的传输到服务器端进行检测和纪录,同时服务器也可发送数据到客户端,对远程液位设备进行调控。
Socket也称"套接字",用来描绘IP地址和端口,是个通信链的句柄。
在Internet上的主机通常都会运行多个应用软件,并且提供多种服务。
而每个服务程序都会构建相应的SOCKET与端口一一对应,从而让不同端口拥有不同服务。
Socket本质上供应了过程通信的端点。
Socket连接过程能够分为三步:
服务器侦听、确认连接和客户端申请。
(1)服务器侦听:
服务器端socket不是定位详细的客户端socket,而是处于等候连接的状况,实时监测网络状况。
(2)客户端申请:
是指由客户端提出连接申请,要连接的目标是服务器端的套接字。
因此,客户端的socket首先得描绘它所要连接的服务器,确认服务器端socket的IP地址和端口号,进而向服务器端提出连接申请。
(3)确认连接:
指当服务器端socket监听到客户端socket的连接申请时,它会回应客户端socket的申请,创建一个新的线程,将服务器端socket的叙述发给客户端,当客户端确定了此叙述,就会成功握手建立连接。
而服务器端socket还将处于监听状态,等待接收其他客户端socket的连接申请。
2.2.2程序流程框图
系统根据C/S架构,分别创建服务器和客户端。
服务器首先创建socket()套接字,利用bind()方法绑定本地IP和端口,用listen()方法监听端口请求,。
侦听到端口有连接申请时,调用accept()方法接受请求,而后用receive()/send()方法对数据进行读/写操作,传输完成时使用close()函数关闭服务器。
同样客户端也先创建socket()套接字,获取要连接服务器的IP和端口,使用connect()方法发送连接请求,而后使用receive()/send()函数进行数据的读/写,传输完成时使用close()函数关闭客户端。
系统程序框图如图2.3所示:
图2.3系统程序框图
2.3本章小结
本章描述了远程液位监控系统的整体架构设计。
包括液位监控系统的各部分组成,监控软件设计所涉及的相关技术介绍,如:
.NET框架、C/S结构和SOCKET编程等,以及系统设计的程序框图说明。
第3章监控软件程序实现
3.1软件设计方案
监控软件设计的核心在于服务器和客户端之间的实时通信。
本文提供了两种通信协议,分别是面向连接的TCP/IP协议和无连接的UDP协议,然而在工业控制中必须保证数据传输的可靠性,因此我们选择了安全性高的TCP/IP协议作为通讯协议。
此外本文还提供了同步通信和异步异步通信两种模式可供选择。
同步通信属于串行通信,用次模式,要求客户端在发送一条请求后,必须等到服务器做出相应回应,才能够发送下一条请求。
异步通信属于并行通信,此模式下客户端发送一条请求之后,不必等到服务器做出相应回应就可发送下一条请求。
在工业控制中,往往需要保证数据传输的实时性,同步通信模式显然不符合要求,因此我们选择能实时传输的异步通信模式。
3.2服务器设计
3.2.1界面设计
为了方便演示与测试,创建Windows窗体应用程序,进行软件设计。
而要生成ActiveX控件则需要创建Windows控件库项目,但两者界面设计的方法一致(注:
该服务器界面以及下章的客户端界面仅为测试通信使用,作为Active控件发布的界面数据无需手动输入,数据采集完成后直接存储到内部Buffer进行发送。
而正式的工业液位监控界面由组态王设计,本文不介绍)。
创建好项目后,打开工具箱,拖出我们所需的工具控件如:
Lable、Button、TextBox等进行界面设计,之后修改其对应的属性,双击后则可进行其他部分的代码编写。
最终界面如图3.1所示。
图3.1server界面设计
3.2.2Socket编程
Microsoft.NetFramework为程序访问Internet实现了可分层、可扩展的网络服务,其命名空间System.Net和System.Net.Sockets包含大量的类能够便于网络通讯程序的开发。
所以在编写前应该添加usingSystem.Net、usingSystem.Net.Sockets和usingSystem.Threading三个命名空间。
具体编程可分为以下步骤:
(1)建立服务器连接
首先要创建Socket对象,使用Socket类的构造方法实现:
Socketlistener=newSocket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
参数如下:
AddressFamily:
Socket使用的寻址方案;SocketType:
Socket类型;ProtocolType:
Socket使用的协议,这里所用的是TCP/IP协议。
当创建Socket后,服务器端则要通过Bind()方法绑定所指定的端口,使Socket和一个本地终端相联。
这里在服务器端可设置两种方式进行连接,一种是DNS创建域名接连的方式:
IPHostEntryipHostInfo=Dns.Resolve(Dns.GetHostName());
另一种是IP地址的连接方式:
IPAddressipAddress=ipHostInfo.AddressList[0];
这里是系统自动获取本机IP,也可以手动输入IP地址方法如下:
IPAddressipAddress=IPAddress.Parse("127.0.0.1");
这里采取IP地址连接的方式,设置好IP地址和端口号后使用Bind()方法进行绑定:
IPEndPointlocalEndPoint=newIPEndPoint(ipAddress,11000);
listener.Bind(localEndPoint);
然后通过Listen方法监听该端口上的连接申请,当监听到端口的连接申请后。
同步模式时,服务器调用Accept方法允许连接申请。
异步模式时,服务器能够调用BeginAccept方法和EndAccept方法实现与客户端的通信。
BeginAccept在异步模式下尝试连接,它准许其余进程直接运行,而不必等候连接建立。
在使用BeginAccept方法之前,必需调用Listen方法来监听连接申请,BeginAccept的函数原型为:
BeginAccept(AsyncCallbackAsyncCallback,Ojbectstate);
这里AsyncCallBack:
代表回调函数;state:
代表状态信息,必须确保state中包含socket的句;调用BeginAccept方法的根本流程是:
1、建立本机终节点,并建立新的socket与本机终节点进行绑定;2、在端口上监听是否有新的连接申请;3、申请开始接入新的连接,将其传入Socket的实例或者StateOjbect的实例。
调用BeginAccept()方法完成后,当有新的连接产生,就会使用回调函数,此回调函数一定得包含用于终结接入连接操作的EndAccept()方法,其原型为:
SocketEndAccept(IAsyncResultiar);
那么服务器构建代码如下:
publicstaticvoidStartListening()
{
IPAddresslocal=IPAddress.Parse("127.0,0,1");
IPEndPointiep=newIPEndPoint(local,13000);
Socketlistener=newSocket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
server.Bind(iep);
server.Listen(20);
server.BeginAccecpt(newAsyncCallback(Accept),listener);
}
voidAccept(IAsyncResultiar)
{
SocketMyServer=(Socket)iar.AsyncState;
Socketservice=MyServer.EndAccept(iar);
}
(2)发送与接收数据
在创建了套接字的连接后,就能够使服务器端和客户端之间进行数据通信了。
异步通信用BeginSend和EndSend方法来完成数据发送。
在使用BeginSend方法前要确认双方都已成功连接,不然会出错误。
BeginSend方法原型为:
Socket.BeginSend(Byte[],Int32,Int32,SocketFlags,AsyncCallback,Object);
参数如下:
buffer:
Byte类型的数组,包含将发送的数据;offset:
buffer参数中发送数据的起始位置,该位置从零开始计数;size:
将发送的字节数;socketFlags:
SocketFlags值的按位组合;callback:
AsyncCallback委托;state:
一个对象,包含此申请的状态消息;返回值:
调用异步通讯发送IAsyncResult。
创建一个完成AsyncCallback的回调方法并将名字传入BeginSend方法。
state参数一定得包含用来通讯的连接。
如果回调要求更多信息,那么可构建一个小型的类用于存储Socket和其他必须的信息。
经过state参数将此类的一个实例传递给BeginSend方法。
回调方法应使用EndSend方法。
当应用程序使用BeginSend方法时,系统将运用一个单独的线程完成特定的回调方法,并阻止EndSend,直到Socket发送了申请的字节数或引发了异常。
相关代码如下:
privatestaticvoidSend(Sockethandler,Stringdata)
{
byte[]byteData=Encoding.ASCII.GetBytes(data);
handler.BeginSend(byteData,0,byteData.Length,0,newAsyncCallback(SendCallback),handler);
}
privatestaticvoidSendCallback(IAsyncResultar)
{
try
{
Sockethandler=(Socket)ar.AsyncState;
intbytesSent=handler.EndSend(ar);
handler.Shutdown(SocketShutdown.Both);
handler.Close();
}
catch(Exceptione)
{
}
}
异步通信用BeginReceive和EndReceive方法来接收数据,其BeginReceive方法原型为:
Socket.BeginReceive(Byte[],Int32,Int32,SocketFlags,AsyncCallback,Object)
参数如下:
buffer:
Byte类型的数组,它是保存接收到的数据的位置;offset:
buffer参数中保存所接收数据的位置,该位置从零开始计数;size:
要接收的字节数;socketFlags:
SocketFlags值的按位组合;callback:
一个AsyncCallback委托,它援用操作完成时要应用的方法;state:
一个用户定义对象,其中宝库接收操作的相干信息。
操作完成时,此对象会传软EndReceive方法;返回值:
使用异步方法读取IAsyncResult。
异步BeginReceive操作应使用EndReceive方法完成。
一般该方法由callback实现。
在操作完成前方法不会进入阻塞状态。
如需一直阻塞到操作完成时则应使用Receive方法进行重载。
相关代码如下:
privatestaticvoidReceive(Socketclient)
{
try
{
StateObjectstate=newStateObject();
state.workSocket=client;
client.BeginReceive(state.buffer,0,StateObject.BufferSize,0,newAsyncCallback(ReceiveCallback),state);
}
catch(Exceptione)
{
}
}
privatestaticvoidReceiveCallback(IAsyncResultar)
{
try
{
StateObjectstate=(StateObject)ar.AsyncState;
Socketclient=state.workSocket;
intbytesRead=client.EndReceive(ar);
if(bytesRead>0)
{
state.sb.Append(Encoding.ASCII.GetString(state.buffer,0,bytesRead);
client.BeginReceive(state.buffer,0,StateObject.BufferSize,0,newAsyncCallback(ReceiveCallback),state);
}
else
{
if(state.sb.Length>1)
{
response=state.sb.ToString();
}
receiveDone.Set();
}
}
catch(Exceptione)
{
}
}
这里对接收的数据做了一些处理,首先处理连接的回调函数里获得的通讯套接字client,然后开始接收数据。
当数据发送到缓冲区中,BeginReceive方法尝试从buffer数组中获取长度为buffer.length的数据块,并且返回接收到的数据量bytesRead。
经过判断返回值bytesRead的大小来判断数据是否传输完全。
这里出现了Set()方法,引出了程序阻塞和异步中的同步问题。
.Net里提供了EventWaitHandle类来表示一个线程的同步事件。
EventWaitHandle即事件等待句柄,他允许线程通过操作系统互发信号和等待彼此的信号来达到线程同步的目的。
这个类有2个子类,分别为AutoRestEevnt(自动重置)和ManualRestEvent(手动重置)。
下面是线程同步的几个方法:
(1)Rset方法:
将事件状态设置为非终止状态,使得线程阻塞。
这里的线程阻塞是指同意其
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 大学 毕业设计 基于 c# 远程 监控 软件设计
![提示](https://static.bdocx.com/images/bang_tan.gif)