电力系统毕业论文
毕 业 论 文
题 目: 电力系统设计-通讯系统设计
作 者: 学 号:
系 :
专 业:
班 级:
指导者:
评阅者:
年 月
毕业设计,论文,中文摘要
电力系统设计-通讯系统设计
摘要 这篇论文主要基于Delphi技术,后台数据库使用简单易用的SQL 2000。讲述了关于电力系统的信息,特别是讨论了关于设计该系统时的思想、
方法
快递客服问题件处理详细方法山木方法pdf计算方法pdf华与华方法下载八字理论方法下载
和过程,以及在细节上分析函数和方法的实现思想。利用Delphi 软件建立完整性强、安全性好的数据库。在本论文中讲述的电力系统拥有一个交互式的界面、逻辑的数据库结构。并且在设计数据库时还考虑到了实体完整性约束、参照完整性约束、及尽量减少数据的冗余。
关键词 电力系统 通讯系统 Delphi 数据库
第 1 页 共 1 页
目 次
1 引言............................................................. 1 2 电力系统分析..................................................... 1 2(1 定义........................................................... 1 2(2 电力系统图..................................................... 1 2(3 发展简况....................................................... 2 2(4系统构成 ....................................................... 2 3 电力系统的运行和控制............................................. 3 3(1 电力系统的运行................................................. 3 3(2 电力系统的控制................................................. 4 (3安全控制按其功能分类 ........................................... 5 3
3(4 提高系统稳定的基本措施......................................... 5 4 计算机监控系统................................................... 5 4(1 星型网络....................................................... 5 4(2 扩展环型网络................................................... 6 5 Delphi在电力系统中的应用 ........................................ 6 5(1 主控程序(PTX)............................................... 7 5(2 GPRSServer................................................... 10 5(3 ClientIn..................................................... 18 5(4 ServerIn..................................................... 18 6 ActiveX控件 ................................................... 22 6(1 COM技术
规范
编程规范下载gsp规范下载钢格栅规范下载警徽规范下载建设厅规范下载
的发展史 ......................................... 22 6(2 Active 举例.................................................. 23 结论............................................................... 31 致谢............................................................... 32 参考文献........................................................... 33
第 1 页 共 33 页
1 引言
随着经济的发展,社会的进步,计算机越来越深入到我们日常的工作学习及生活中,成为我们日常生活中不可缺少的辅助工具。随着科学技术的不断提高,计算机科学日渐成熟,其强大的功能已为人们深刻认识,它已进入人类社会的各个领域并发挥着越来越重要的作用。它已经深入到日常工作和生活的方方面面,比如文字处理、信息管理、辅助设计、图形图像处理、教育培训以及游戏娱乐等。各行各业的人们无须经过特别的训练就能够使用电脑完成许许多多复杂的工作。然而,虽然现在世界上已经充满了多如牛毛的各种软件,但它们依然不能满足用户的各种特殊需要,人们还不得不开发适合自己特殊需求的软件。以前开发Windows应用软件是专业人员的工作,需要掌握许多专业知识和经过特殊的培训才能胜任。现在不同了,即使你没有接受过严格的程序设计训练,使用Delphi编程语言也一样能够开发出功能强大、适合自己特殊需求的应用程序了。Delphi编程语言继承了其他语言易学易用的特点,特别适合于初学者学习Windows系统编程。
2 电力系统分析
2(1 定义
由发电、变电、输电、配电和用电等环节组成的电能生产、传输、分配和消费的系统。由发电、输电、变电、配电和用电等环节组成的电能生产与消费系统。它的功能是将自然界的一次能源通过发电动力装置转化成电能,再经输电、变电和配电将电能供给到各用户。为实现这一功能,电力系统在各个环节和不同层次还具有相应的信息与控制系统,对电能的生产过程进行丈量、调节、控制、保护、通讯和调度,以保证用户获得安全、经济、优质的电能。
2(2 电力系统图
由发电、变电、输电、配电和用电等环节组成的电能生产与消费系统。它的功能是将自然界的一次能源通过发电动力装置(主要包括锅炉、汽轮机、发电机及电厂辅助生产系统等)转化成电能,再经输、变电系统及配电系统将电能供给到各负荷中心,通过各种设备再转换成动力、热、光等不同形式的能量,为地区经济和人民生活服务。由于电源点与负荷中心多数处于不同地区,也无法大量储存,故其生产、输送、分配和消费都在同一时间内完成,并在同一地域内有机地
第 2 页 共 33 页
组成一个整体,电能生产必须时刻保持与消费平衡。因此,电能的集中开发与分散使用,以及电能的连续供给与负荷的随机变化,就制约了电力系统的结构和运行。据此,电力系统要实现其功能,就需在各个环节和不同层次设置相应的信息与控制系统,以便对电能的生产和输运过程进行丈量、调节、控制、保护、通讯和调度,确保用户获得安全、经济、优质的电能。建立结构公道的大型电力系统不仅便于电能生产与消费的集中治理、同一调度和分配,减少总装机容量,节省动力设施投资,且有利于地区能源资源的公道开发利用,更大限度地满足地区国民经济日益增长的用电需要。电力系统建设往往是国家及地区国民经济发展规划的重要组成部分。电力系统的出现,使高效、无污染、使用方便、易于调控的电能得到广泛应用,推动了社会生产各个领域的变化,开创了电力时代,发生了第二次技术革命。电力系统的规模和技术水准已成为一个国家经济发展水平的标志之一。
2(3 发展简况
在电能应用的初期,由小容量发电机单独向灯塔、轮船、电力系统。
车间等的照明供电系统,可看作是简单的住户式供电系统。白炽灯发明后,出现了中心电站式供电系统,如1882年T.A.托马斯?阿尔瓦?爱迪生在纽约主持建造的珍珠街电站。它装有6台直流发电机(总容量约670千瓦),用110伏电压供1300盏电灯照明。19世纪90年代,三相交流输电系统研制成功,并很快取代了直流输电,成为电力系统大发展的里程碑。20世纪以后,人们普遍熟悉到扩大电力系统的规模可以在能源开发、产业布局、负荷调整、系统安全与经济运行等方面带来明显的社会经济效益。于是,电力系统的规模迅速增长。世界上覆盖面积最大的电力系统是前苏联的同一电力系统。它东西横越7000千米,南北直通3000千米,覆盖了约1000万平方千米的土地。中华人民共和国的电力系统从50年代开始迅速发展。到1991年底,电力系统装机容量为14600万千瓦,年发电量为6750亿千瓦时,均居世界第四位。输电线路以220千伏、330千伏和500千伏为网络骨干,形成4个装机容量超过1500万千瓦的大区电力系统和9个超过百万千瓦的省电力系统,大区之间的联网工作也已开始。此外,1989年,台湾省建立了装机容量为1659万千瓦的电力系统。
2(4系统构成
电力系统的主体结构有电源、电力网络和负荷中心。电源指各类发电厂、站,它将一次能源转换成电能;电力网络由电源的升压变电所、输电线路、负荷中心变电所、配电线路等构成。它的功能是将电源发出的电能升压到一定等级后输送到负荷中心变电所,再降压至一定等级后,经配电线路与用户相联。电力系统中
第 3 页 共 33 页
网络结点千百个交织密布,有功潮流、无功潮流、高次谐波、负序电流等以光速在全系统范围传播。它既能输送大量电能,创造巨大财富,也能在瞬间造成重大的灾难性事故。为保证系统安全、稳定、经济地运行,必须在不同层次上依不同要求配置各类自动控制装置与通讯系统,组成信息与控制子系统。它成为实现电力系统信息传递的神经网络,使电力系统具有可观测性与可控性,从而保证电能生产与消费过程的正常进行以及事故状态下的紧急处理。
3 电力系统的运行和控制
3(1 电力系统的运行
电力系统的运行状态可以分成正常状态和异常状态两种。正常状态又可分为安全状态和警戒状态;异常状态又分成紧急状态和恢复状态。电力系统的运行包括了所有这些状态及其相互间的转移,如图所示。
电力系统运行
安全状态 系统的频率、各节点的电压、各元件的负荷均处于规定的允许值范围内,并且一般的小扰动不致使运行状态脱离正常运行状态。由于目前电能尚不能大量存贮,任何瞬间必须保证发电、输电、用电之间的平衡,而用电负荷又随时会发生变化,所以正常安全状态实际上始终处于一个动态的平衡之中,必须进行正常的调整,包括频率和电压,即有功功率和无功功率的调整。
警戒状态 系统整体仍处于安全的范围内,但个别元件或地区的运行参数已临近安全范围的边缘,扰动将使运行进入紧急状态。对处于警戒状态的电力系统应该采取预防控制,使之进入安全状态。
紧急状态 正常运行状态的电力系统遭到扰动(包括负荷的变动和各种故障),电源和负荷之间的功率平衡遭到破坏而引起系统频率和节点电压超过了允许的偏移值,或元件的负担超过了安全运行的限制值,系统处于危机中。对处于紧急状态下的电力系统,应该采取各种校正控制和稳定控制措施,使系统尽可能回复到正常状态。近来有人把紧急状态进一步分为耐受性危机(它允许持续几秒
第 4 页 共 33 页
到几十分钟)和稳定性危机(它允许持续时间一般不超过10秒钟)。这种细分有利于针对不同的危机采取不同的控制措施。
恢复状态 这时电力系统已被解列成若干个局部系统,其中有些系统已经不能保证正常地向用户供电,但其他部分可以维持正常状态;或者系统未被解列,但已不能满足向所有的用户正常供电,已有部分负荷被切除。当处于紧急状态下的电力系统不能通过校正和稳定控制回复到正常状态时,应按对用户影响最小的原则采取紧急控制措施,使之进入恢复状态。然后根据情况采取恢复控制措施,使系统回复到正常运行状态。
安全控制 预防性控制、校正控制、稳定控制、紧急控制和恢复控制都以提高电力系统安全性为目标,所以统一称为安全控制。
由于供电中断和电能质量的低劣会给国民经济和人民生活带来严重影响,所以电力系统的运行必须安全可靠、保证电能质量和求取最大的经济性。
为了提高电力系统的安全可靠性,要求系统有一定的备用容量以满足负荷变动和事故的需要;要求合理配置无功功率电源;要求设备处于健康的状态,系统具有一定的稳定性储备,并配备各种必要的安全措施和装置。
交流电力系统的频率、电流和电压的正弦波形,以及各节点的电压幅值是电能质量的 3个基本指标。为了保证电能质量,必须采取电压调整、频率调整和抑制谐波的措施。
电力系统调度 电力系统在保证安全可靠和电能质量的前提下,还应力求调整负荷,提高设备利用率,合理利用各种能源资源,实施经济运行,降低煤耗、厂用电和网络损耗,以取得最大的经济效益。
由于电力系统本身的特点:集中的发电和分散的用电,电力系统分布于广阔
的地域而发、送、用之间的功率又要求严格的瞬时平衡,因而电力系统的运行需要统一而分级、分层的调度管理,需要一个和电能传输、分配系统相平行的信息采集、传输和处理的通信系统,以实现正常的调整和各种安全、经济的控制。 3(2 电力系统的控制
电力系统安全控制的目的是采取各种措施使系统尽可能运行在正常运行状态。在正常运行 状态下,调度人员通过制定运行
计划
项目进度计划表范例计划下载计划下载计划下载课程教学计划下载
和运用计算机监控系统(,,,,,或,,,)实时进行电力系统运行信息的收集和处理,在线安全监视和安全分析等,使系统处于最优的正常运行状态。
同时。在正常运行时,确定各项预防性控制,以对可能出现的紧急状态提高处理能力。这些控制内容包括:系统以额定工况运行调整发电机出力、切换网络和负荷、调整潮流、改变保护整定值、切换变压器分接头等,使系统运行在最佳
第 5 页 共 33 页
状态。在系统发生事故时有较高的安全水平当电力系统一旦出现故障进入紧急状态后,则靠紧急控制来处理。这些控制措施包括继电保护装置正确快速动作和各种稳定控制装置等切除故障,防止事故扩大,平衡有功和无功,将系统恢复到正常运行状态或重新进入正常运行状态。
3(3安全控制按其功能分类
1、提高系统稳定的措施有快速励磁、电力系统稳定器(,,,)、电气制动、快关汽机和切机、串联补偿、静止无功:,,,,,,?、超导电磁蓄能和直流 调制等。
2、维持系统频率的措施有低频减负荷、低频降电压、低频自起动、抽水蓄能机组抵频抽水改发电、低频发电机解列、高频切机、高频减出力等。
3、预防线路过负荷的措施有过负荷切电源、过负荷切负荷等。 3(4 提高系统稳定的基本措施
1、加强电网网架,提高系统稳定。线路输送功率能力与线路两端电压之积成正比,而与线路阻抗成反比。减少线路电抗和维持电压,可提高系统稳定性。在线路上装设串联电容是一种有效的减少线路阻抗的方法。在长线路中间装设静止无功补偿装置,,,?。能有效地保持线路中间电压水平(相当于长线路变成两段短线路),并快速调整系统无功。是提高系统稳定性的重要手段。
2、电力系统稳定控制和保护装置。提高电力系统稳定性的控制可包括两个方面:一是失去稳定前,采取措施提高系统的稳定性;二是失去稳定后,采取措施重新恢复新的稳定运行。
所谓稳定,是指电力系统可以连续不断的向负荷供电的状态。电力系统继电保护的充足性、安全性、经济性和质量是电力工业生产稳定必须满足的几项基本要求。
4 计算机监控系统
对于应用较为广泛的星型和环型网络进行详细分析并进行扩展,同时结合有、无主结构分析其应用性质(
4(1 星型网络
由星形网络组成的监控系统,各网络节点通过中心交换机连接,同时考虑到冗余需要,利用另外一台交换机组成双网络,网络工作原理如下:
有主结构:现地控制单元有两块CPU模件,实现该单元节点处的故障冗余,为主的CPU板实时采集各种信号,并针对故障信号采取相应处理,同时将采集的
第 6 页 共 33 页
信号量数字化,再传送给主站;主站负责数据的接收,同时向操作员站送实时数据,并将操作员站的命令下达(
无主结构:现地控制单元实时采集各种信号并针对故障信号采取相应处理,主站作为数据服务器,定时向各现地控制单元节点要数据并记录,操作员站通过交换机直接与现地控制单元通讯,传送数据与命令(
星形网络的优点是结构相对简单,由于普遍通讯
协议
离婚协议模板下载合伙人协议 下载渠道分销协议免费下载敬业协议下载授课协议下载
为TCP/IP,开发额外的系统应用程序比较简单,缺点是系统安全性能不高,若交换机坏,则网络就面临崩溃,对主站依赖性强(此种网络结构在一些系统升级改造的电站应用较多( 4(2 扩展环型网络
扩展环型网络是在环型网络的基础上,加上各其他功能节点,或通过转换与其他应用网络连接,而现地计算机控制依旧处于环型网络上(
由扩展环型网络组成的监控系统,各网络节点通过环型链路交换数据,利用两条环链构成冗余,除现地单元、操作员站外的其他应用计算机属于另一个TCP/IP网,主站与应用程序这些功能计算机通过协议转换连接到两个网络中(网络工作原理如下:
此种网络拓扑结构较适合于无主结构,若应用为有主结构,TCP/IP网段的信息交换将由于主站性能限制而受到迟滞,对应用快速性不利(
在无主结构模式下,现地控制单元实时采集各种信号并针对故障信号采取相应处理,主站作为数据服务器,记录各现地控制单元节点数据,操作员站在环网上直接与现地控制单元通讯,传送数据与命令(在环网之外的TCP/IP网络通过与主站、应用程序工作站通讯,取得各种信息并可发送命令(
扩展环型网络的优点是在结构上,分层应用明显,各节点功能清楚,系统安全性能高,两个不同协议网段间的故障互相没有影响,网络稳定性好(缺点结构相对复杂,网络投入较大,开发应用程序时,需考虑到两个网段的不同协议(目前国内某在建大型水电站的计算机监控系统采用的就是这种结构( 5 Delphi在电力系统中的应用
这里主要讲Delphi在这个工程里作为中间层起到的作用
1.调用下层api函数。
2.负责通讯(上位机和下位机)。
3.负责对下位机传上来的数据进行解码,容错和控制。
4.负责对上位机下发的数据进行解码,容错和控制。
由于考虑到程序整体的稳定性大致按功能分为:
第 7 页 共 33 页
主控程序(PTX):主要作用是控制这4个模块的稳定性。比如这4个模块中任何一个崩溃了,需要自动重启之。
无线电接口程序(Server):主要作用和无线电发射机进行交互,因为整 个工程是无线电和GPRS并用的。
GPRS接口程序(GPRSServer):主要作用和GPRS硬件模块进行交互。
ActiveX接口程序(ServerIn):主要作用是和网页中的ActiveX插件进 行交互。
Java后台接口程序(ClientIn):主要作用是和Java后台进行交互,当然 java用的是jsp平台。
5(1 主控程序(PTX)
这里用到了一个定时器Timer1,它的作用是每隔1s作一次循环检测,检测上面4个模块是否死机了,如果死机就把相应的模块启动起来
procedure TFormTX.Timer1Timer(Sender: TObject);
var
dwExitCode:Dword;
fprocessExit:boolean;
begin
dwExitCode:=0;
fprocessExit:=GetExitCodeProcess(PProcInfo_SERVER.hProcess,dwExitCode);
if (fprocessExit and (dwExitCode<>STILL_ACTIVE)) then //判断相应模块是否退出了或者是状态不为激活状态了
begin
memo1.Lines.Add('Sever 进程终止~');
CloseHandle(PProcInfo_SERVER.hThread);//杀线程
CloseHandle(PProcInfo_SERVER.hProcess);//杀进程
ProccessSuccessful_SERVER;//重启相应的模块
memo1.Lines.Add('Sever 进程启动~');
end;
dwExitCode:=0;
第 8 页 共 33 页
fprocessExit:=GetExitCodeProcess(PProcInfo_ServerIn.hProcess,dwExitCode);
if (fprocessExit and (dwExitCode<>STILL_ACTIVE)) then
begin
memo1.Lines.Add('ServerIn 进程终止~');
CloseHandle(PProcInfo_ServerIn.hThread);
CloseHandle(PProcInfo_ServerIn.hProcess);
ProccessSuccessful_ServerIn;
memo1.Lines.Add('ServerIn 进程启动~');
end;
dwExitCode:=0;
fprocessExit:=GetExitCodeProcess(PProcInfo_ClientIn.hProcess,dwExitCode);
if (fprocessExit and (dwExitCode<>STILL_ACTIVE)) then
begin
memo1.Lines.Add('ClientIn 进程终止~');
CloseHandle(PProcInfo_ClientIn.hThread);
CloseHandle(PProcInfo_ClientIn.hProcess);
ProccessSuccessful_ClientIn;
memo1.Lines.Add('ClientIn 进程启动~');
end;
dwExitCode:=0;
fprocessExit:=GetExitCodeProcess(PProcInfo_GPRSSERVER.hProcess,dwExitCode);
if (fprocessExit and (dwExitCode<>STILL_ACTIVE)) then
begin
memo1.Lines.Add('GPRSSERVER 进程终止~');
CloseHandle(PProcInfo_GPRSSERVER.hThread);
CloseHandle(PProcInfo_GPRSSERVER.hProcess);
ProccessSuccessful_GPRSSERVER;
memo1.Lines.Add('GPRSSERVER 进程启动~');
end;
end;
第 9 页 共 33 页
上面的代码中分为4个if 语句,每个if中有像ProccessSuccessful_SERVER,
ProccessSuccessful_ServerIn,ProccessSuccessful_ClientIn,
ProccessSuccessful_GPRSSERVER的函数
我们看看其中一个的定义(其他三个函数意思基本一样):
procedure TFormTX.ProccessSuccessful_SERVER;
var
bSuccess:boolean;
begin
if findwindow('TFormServer',nil)=0 then
begin
ZeroMemory(@sStartInfo_SERVER,sizeof(sStartInfo_SERVER)); //zero memory
//设置必要的进程参数
sStartInfo_SERVER.cb:=sizeof(sStartInfo_SERVER);
seProcess_SERVER.nLength:=sizeof(seProcess_SERVER);
seProcess_SERVER.lpSecurityDescriptor:=Pchar(nil);
seProcess_SERVER.bInheritHandle:=true;
seThread_SERVER.nLength:=sizeof(seThread_SERVER);
seThread_SERVER.lpSecurityDescriptor:=Pchar(nil);
seThread_SERVER.bInheritHandle:=true;
//创建进程
bSuccess:=CreateProcess(Pchar(nil),Pchar(ExtractFilePath(Paramstr(0))+'Server')
,@seProcess_SERVER,@seThread_SERVER,
false,CREATE_DEFAULT_ERROR_MODE,pchar(nil),pchar(nil),sStartInfo_SERVER,PProcIn
fo_SERVER);
if (not bSuccess)then
Memo1.Lines.Add('Server 服务器创建失败!')
else
Memo1.Lines.Add('Server 服务器创建成功~');
end;
end;
这个函数是用来重启相应的4个模块中的一个的,当然最后一个步骤是当
PTX结束时要把4个模块全部杀死。
第 10 页 共 33 页
procedure TFormTX.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Timer1.Enabled:=false;
TerminateProcess(PProcInfo_SERVER.hProcess,10);
PProcInfo_SERVER.hProcess:=0;
TerminateProcess(PProcInfo_GPRSSERVER.hProcess,10);
PProcInfo_SERVER.hProcess:=0;
TerminateProcess(PProcInfo_ServerIn.hProcess,10);
PProcInfo_ServerIn.hProcess:=0;
TerminateProcess(PProcInfo_ClientIn.hProcess,10);
PProcInfo_ClientIn.hProcess:=0;
TerminateProcess(PProcInfo_DelayTime.hProcess,10);
PProcInfo_DelayTime.hProcess:=0;
end;
5(2 GPRSServer
为什么叫GPRSServer是因为这个模块是和下层GPRS硬件模块通讯所用。
在这个模块中我们将和GPRS通讯的所有细节全部封装到wcomm_dll.dll动
态连接库中。
这个动态链接库负责和下层具体通讯,包括UDP包的封装,下层通讯队列的
维护和一些扩展功能等等。
具体代码如下:
unit Unit_dll;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
Dialogs, Menus, ComCtrls, ToolWin, StdCtrls, ImgList, ExtCtrls,
NMUDP,winsock;
const MAX_RECEIVE_BUF=1024; //最大接收缓冲区
const MAX_SEND_BUF=1024; //最大发送缓冲区
const gprs_dll='wcomm_dll.dll';
第 11 页 共 33 页
const gprs_smm='gprs_smm.dll';
const misc='misc.dll';
type
// 用户注册信息结构
gprs_user_info=record
m_userid:array[1..12] of char; //终端模块号码
m_sin_addr:Cardinal; //终端模块进入Internet的代理主机IP地址
m_sin_port:word; //终端模块进入Internet的代理主机IP
端口
m_local_addr:Cardinal; //终端模块在移动网内IP地址
m_local_port:word; //终端模块在移动网内IP端口
m_logon_date:array[1..20] of char; //终端模块登录时间
m_update_time:array[1..20] of char; //终端模块更新信息时间
m_status:byte; //终端模块状态, 1 在线 0 不在线
//m_pid:array[1..12] of char;
end;
type
//用户数据结构
data_record=record
m_userid:array[1..12] of char;
m_recv_date:array[1..20] of char;
m_data_buf:array[1..MAX_RECEIVE_BUF] of char;
m_data_len:word;
m_data_type:byte;
end;
type
Arr12 = array[1..12] of Char;
Arr16 = array[1..16] of Char;
Arr256 = array[1..256] of Char;
Arr512 = array[1..512] of Char;
Arr1024 = array[1..1024] of Char;
//下面定义的时函数类型,用于指向动态库中的函数
第 12 页 共 33 页
function
start_gprs_server(a:HWND;b:Cardinal;c:Integer;d:PChar):Integer;stdcall;
function
start_net_service(a:HWND;b:Cardinal;c:Integer;d:PChar):Integer;stdcall;
function do_read_proc(var
a:data_record;b:PChar;c:boolean):Integer;stdcall;
procedure cancel_read_block();stdcall;
function stop_gprs_server(a:PChar):Integer;stdcall;
function stop_net_service(a:PChar):Integer;stdcall;
function do_close_all_user(a:PChar):Integer;stdcall;
function
do_send_user_data(a:PChar;b:PChar;c:Cardinal;d:PChar):Integer;stdcall;
function get_user_at(a:Cardinal;var b:gprs_user_info):Integer;stdcall;
function get_max_user_amount:Cardinal;stdcall;
function do_close_one_user(a:PChar;b:PChar):Integer;stdcall;
function SetWorkMode(nWorkMode: integer): integer; stdcall;
function KillProcess(a:PChar):Integer;stdcall;
function DisConnectRas(a:PChar):Integer;stdcall;
function GetConnEntryName(a:PChar):Integer;stdcall;
//The Following function is SMM
//int SMMInit(char *,int,char *,DCB *,char *,char *,int);
function SMMInit(var a:Arr16;b:Integer;var c:Arr16;var d:DCB;var e:Arr12;var f:Arr12;g:Integer):Integer;stdcall;
function SMMFree:Integer;stdcall;
function SMMSetting(var a:Arr12;b:Integer):Integer;stdcall;
function MakeDTUOnLine(a:Integer;var b:Arr12):Integer;stdcall;
function SendDataToDTUBySM(var a:Arr12;var
b:Arr256;c:Integer;d:Integer):Integer;stdcall;
implementation
//gprs_dll
function start_gprs_server; external gprs_dll name 'start_gprs_server';
第 13 页 共 33 页
function start_net_service; external gprs_dll name 'start_net_service';
function do_read_proc; external gprs_dll name 'do_read_proc';
procedure cancel_read_block; external gprs_dll name 'cancel_read_block';
function stop_gprs_server; external gprs_dll name 'stop_gprs_server';
function stop_net_service; external gprs_dll name 'stop_net_service';
function do_close_all_user;external gprs_dll name 'do_close_all_user';
function do_send_user_data;external gprs_dll name 'do_send_user_data';
function get_user_at;external gprs_dll name 'get_user_at';
function get_max_user_amount;external gprs_dll name
'get_max_user_amount';
function do_close_one_user;external gprs_dll name 'do_close_one_user';
function SetWorkMode;external gprs_dll name 'SetWorkMode';
//gprs_smm
function SMMInit;external gprs_smm name 'SMMInit';
function SMMFree;external gprs_smm name 'SMMFree';
function SMMSetting;external gprs_smm name 'SMMSetting';
function MakeDTUOnLine;external gprs_smm name 'MakeDTUOnLine';
function SendDataToDTUBySM;external gprs_smm name 'SendDataToDTUBySM';
function KillProcess;external misc name 'KillProcess';
function DisConnectRas;external misc name 'DisConnectRas';
function GetConnEntryName;external misc name 'GetConnEntryName';
end.
其他所用的一些动态链接库我们在这个项目中用不到。。调用动态链接库有
两种方法,静态调用和动态调用,以上就是静态调用的方法。通过封装调用我们
在以后的开发中就可以直接用这些函数了。
当下层硬件发送数据给我们的模块时,我们会用消息机制来处理。
处理过程为:下层数据通过UDP数据包发送到wcomm_dll.dll,
wcomm_dll.dll就会去解析UDP数据包,并且要维护一下数据列表。最后向外广
播约定好的windows消息,告诉外层程序数据已经接收到了。
第 14 页 共 33 页
当然这个外层程序(GPRSServer模块)收到了这个特定的windows消息之
后,就会通过do_read_proc函数来读取数据,do_read_proc已经在
wcomm_dll.dll中定义了。
而GPRSServer处理Windows消息:
procedure ProcessMessage(var Msg:TMessage);message GPRSRECVMESS;
这个是消息的定义,再来看看这个消息处理函数具体做了什么工作:
procedure TFormGPRSServer.ProcessMessage(var Msg:TMessage);
var dr:data_record;
p:PChar;
bAnswer:Boolean;
begin
try
GetMem(p,1024);
if ckAnswer.Checked then
bAnswer:=true
else
bAnswer:=false;
if (do_read_proc(dr,p,bAnswer)>=0) then
begin
if dr.m_data_len=0 then
PollUserTable
else
ProcessData(dr);
end;
finally
FreeMem(p);
end;
end;
在以上的这个函数中我们比较关心的是ProcessData()这个函数,其他函数
都是一些修饰和保护等等。
来看看ProcessData()这个函数的实现:
procedure TFormGPRSServer.ProcessData(dr:data_record);
var i,j:Integer;
第 15 页 共 33 页
str,S:String;
re:Pchar;
reLong,ReLongTemp:integer;
label H1;
begin
str:=dr.m_userid+'---'+dr.m_recv_date+'---'+IntToStr(dr.m_data_len);
for i:=1 to Length(str) do
if str[i]=#0 then
str[i]:=' ';
mmDataWnd.Lines.Add(str);
mmDataWnd.Lines.Add('下位机-->通讯服务器:'+dr.m_data_buf);
/////////////////////////////////
try
re:=nil;
ReLongTemp:=0;
if dr.m_data_len>G_cachLeng then //对缓冲区进行保护
begin
fillmemory(@G_cach,G_cachLeng,$FF);
mmDataWnd.Lines.Add('缓冲区溢出~');
goto H1;
end;
re:=@dr.m_data_buf;
reLong:=dr.m_data_len;
s:='';
for j:=0 to reLong-1 do
begin
S:=S+inttohex(ord((re+j)^),2)+' ';
end;
mmDataWnd.Lines.Add('下位机-->通讯服务器:'+S+#13+#10);
if G_cachPose>=G_cachleng-1 then
G_cachPose:=0;
if reLong>(G_cachleng-G_cachPose)then
G_cachPose:=0;
第 16 页 共 33 页
move(re^,G_cach[G_cachPose],reLong);
G_cachPose:=G_cachPose+reLong;
G_reLong:=reLong;
Doit;
H1:
except
on EAccessViolation do
exit;
end;
end;
ProcessData()这个函数其实主要功能就像一个漏斗,将不断接收到的数据
流存入一个叫G_cach的缓存中以供后续操作。这步很必要,因为作为UDP数据
包来说不能保证一连串的数据的完整性,而且在无限传输过程中这种不稳定性尤
其突出,我们可以用无线电传输字节流来试试,看整个数据的真确率能不能达到
70,,而当缓存好了之后我们要做的事就是Doit这个函数。
看看Doit是如何实现的:
procedure TFormGPRSServer.Doit;
var
i,DDL:integer;
label H1;
begin
try
i:=0;
while i
0 then
26 begin
第 20 页 共 33 页
27 SocketT:=Tcustomwinsocket.Create(SocketID);
28 SocketT.SendText(S);
29 end;
30 end;
31 if G_ShowInfo then
32 begin
33 SS:='';
34 for i:=0 to l-1 do
35 SS:=SS+inttohex(ord(S[i+1]),2)+' ';
36 memo1.Lines.Add(SS);
37 end;
38 end;
39 end;
40
这个消息函数比较简单,基本上和上一节列出的消息函数差不多,不过我们要注意的是24行,这行作用是找到相应的SocketID,SocketID是什么,当很多个Active控件连接到ServerIn模块的时候,每个Active控件在ServerIn模块中都会留下唯一的标识。这个标识就是SocketID,其实就像是数据库中一张表中的关键字一样,找到相应的SocketID其实就是找到了唯一的Acitve,也就是找到了发命令的那台电脑(客户机)。当然也会出现一种情况,就是多台电脑(客户机)在对同一台下位机进行操作,这个时候该怎么做呢,看看我们的22~30行,是个大循环,原来只要符合要求的SocketID我们都会去转发数据。
当然说到现在我们还没有提到到哪个地方找到这些SocketID吧,其实我们一直在和SoketID链接池打交道,24行就是从SocketID链接池找到SocketID。在链接池里保存了很多个结构,每个结构里都储存着SocketID和其他一些重要的信息。这个链接池同时具有查找、增加、删除、修改、初始化等功能,我们24行就是它的查找功能函数。总体来说,我们可以将链接池看成存放n个Active的信息的仓库。
第二个功能,将Active控件的数据转发给ServerIN:
1 for i:=0 to G_ActiveNo-1 do
2 begin
3 if ActiveSocketArr.InnerActiveSocketArr[i].Flg=true then//表明有数据
第 21 页 共 33 页
4 if ActiveSocketArr.InnerActiveSocketArr[i].Valid =false then //表明在此次循环中还没有被使用
5 begin
6 ActiveSocketArr.InnerActiveSocketArr[i].Valid:=true;
7
ActiveSocketArr.TimerUsedRecordNomber:=ActiveSocketArr.TimerUsedRecordNomber+1;
8
stemp:=copy(ActiveSocketArr.InnerActiveSocketArr[i].Info,1,46);
9 if
ActiveSocketArr.TimerUsedRecordNomber>=ActiveSocketArr.ValidTrueRecordNomber
then //表明到了循环结束
10 begin
11 for j:=0 to G_ActiveNo-1 do
12
ActiveSocketArr.InnerActiveSocketArr[j].Valid:=false;
13 end;
14 goto H1;
15 end;
16 end;
17 H1:
18 hwndReceiver:=findwindow('TFormClientIn',nil);
19 if hwndReceiver<>0 then
20
SendMessageTo(hwndReceiver,stemp,ServerInSendToClientInInfo,0,true);
21
上面的大部分内容是针对链接池中的结构进行的判别操作。而上面的最后一
行,这行其实我们在其他模块中也出现过很多次。这行的含义是将数据发送给哪
个模块,ServerInSendToClientInInfo这个参数含义很明显,将数据传递给Cl
ientIn模块,好像我们刚刚讲的ServerIn模块它的功能是将数据转发给GPRSS
erver模块阿,这里怎么传递给了ClientIn呢,这里我偷懒了,因为上一节我
给你们讲过Java后台发送出来的数据是不能直接传递给下位机的,需要进行转
换,那么这个转换功能在哪个模块作了呢,是在ClientIn模块作了。其实整个
第 22 页 共 33 页
系统有两种转换,第一种是下位机(也就是我们上面讲的DSP硬件系统)将数据传递给GPRSServer的向上传递过程,在这个过程中数据的转换工作是在GPRSServer模块中进行的,转换完成之后,将数据转发给ClientIn,ClientIn这个时候什么都不做,它只是简单的把数据扔给Java后台就行了;第二种是Java后台将数据传递给ClientIn模块的向下传递过程。在这个过程中数据的转换工作是在ClientIn中进行的,上一章讲的那个接口就是负责具体转换工作的。但ClientIn将数据转换好之后,就发送给GPRSServer或SERVER(无线电模块)这两个模块收到数据后也是什么都不做,直接将数据扔给下位机。
那么既然我已经在ClientIn中做好了那个接口,我为什么还要在ServerIn中再做一回同样的事呢,所以我直接将数据发送给了ClientIn,欺骗ClientIn,让ClientIn认为是Java后台发送的数据,ClientIn一旦收到这样的数据,它当然要进行转换和转发工作了。当然这样做性能上会收到一些影响,但影响不太大,是很微妙的。至此ServerIn模块的大体结构就完成了。
6 ActiveX控件
ActiveX是个精灵~而且是个网络精灵~ActiveX是COM规范的演化产物。 关于COM规范,其实你们只要用计算机,用Windows操作系统你们就在用COM规范开发出来的软件~你们的office办公软件系统就用到了大量COM规范,你们用到的很多Windows系统服务都在使用COM+服务。
6(1 COM技术规范的发展史
1991年,随着Windows3.x的发布,微软公司发布了一种叫做OLE1.0 (Object
Linking and Emebedding)的规范。它使用面向对象技术,是一种处理复合文方法,可以在一个文档中同时保存多种格式的数据,在当时来说这些功能的出现实在是太神奇了,但其设计是以文档为中心的,本身有一些缺陷,所以并不出名。1993年,微软发布了OLE2.0规范,它有很多的特点如就地编辑,复合文档中对象的编辑器可以和该文档的编辑器天衣无缝地结合在一个窗体内等等。所以来说2.0是成功的,并且得到了当年的PC Magazine的技术优秀奖和PC/Computering的软件革新MVP奖。这里2.0所有成就的基础就是我们的组件对象模型(Component Object Model ,COM)规范。1995年,随着windows95的发布和Internet的发展,微软意识到Internet上的商业利润,决定通过编程来获得这一切。1996年发布了ActiveX技术,从而导致了ActiveX控件的产生。其实ActiveX没有什么真正的改变,它不过s是OLE技术的扩展罢了,其目的就是为
第 23 页 共 33 页
了使用方便,有利于网上传输。 直到现在Internet网络上都充斥着大量的ActiveX控件, 如很多流媒体技术的展现都是用的ActiveX控件(Media Player)网络电视,我们在工商银行的网上银行上查工资,其登陆界面就使用了ActiveX控件。
6(2 Active 举例
首先我们看看Delphi的Type Library界面(下图9-1):
(图9-1)
图9-1中我们建了一个名叫AFJITChart的ActiveX控件,他的GUID是{20E29E23-2B05-4564-BA85-44DC4BB27B52}。经过我们注册之后,我们在注册表中就能查找到这个控件了。
然后看看AFJITChart的Delphi创建界面(图9-2):
第 24 页 共 33 页
(图9-2)
我们甚至可以用其他的编程软件来调用我们在Delphi里创建的这个控件。 下面这个界面(图9-3和图9-4)就是在用VB来调用AFJITChart控件
第 25 页 共 33 页
(图9-3)
(图9-4)
下面这个界面(图9-5和图9-6)就是在.net中调用AFJITChart控件。
第 26 页 共 33 页
(图9-5)
(图9-6)
也就是说一旦我们创建好ActiveX控件实现统一接口之后我们就可以任何
一种编程语言去调用它~(除了Java >
2 <%@ include file="/common/taglibs.jsp" %>
3 <%@ page import="com.zijin.util.Constants"%>
4
5
6
7 9520配电变压器综合测控数据管理系统
8
9
10
11
第 27 页 共 33 页
12
17
18
19
30 31 32 33
34
35
36
37
60
61
这个上面的19~29行就是调用我们的AFJITChart控件,看看21行的classid,是不是就是我们生成的GUID。39~57行是对我们的AFJITChart控件附值,39~57行所调用的接口函数在我们的第一张图显示的Type Library里已经定义了。其实当这个jsp页面运行的时候,系统首先要通过这个GUID值在注册表里找到我们的AFJITChart控件,然后才能加载AFJITChart控件。
看看实际的运行图9-7:
第 29 页 共 33 页
(图9-7)
如此一来,我们的网页出现了实时动态图像~
其实这个系统中很多网页都是这么完成的,再看看其他的界面(图9-8和图
9-9)
第 30 页 共 33 页
( 图9-8)
(图9-9) 整个运行效果就像在视频聊天。
第 31 页 共 33 页
结论
经过一段时间的开发设计和调试,我基本实现了在系统设计时所设计的所有功能,设计出了一个功能比较完善的电力系统。该系统基于Delphi 6.0及SQL Server 2000数据库平台而开发。
主控程序(PTX)主要作用是控制了其它4个模块的稳定性,无线电接口程序(Server)主要作用和无线电发射机进行交互,GPRS接口程序(GPRSServer)主要作用和GPRS硬件模块进行交互。
由于是初次设计,难免有许多考虑不周的地方,所以该
方案
气瓶 现场处置方案 .pdf气瓶 现场处置方案 .doc见习基地管理方案.doc关于群访事件的化解方案建筑工地扬尘治理专项方案下载
还存在很多有待改进的地方。
第 32 页 共 33 页
致谢
经过大半年的忙碌,毕业设计即将完成,在此我要由衷地感谢在我毕业设计阶段,乃至大学三年学习生活中帮助过我的师长与同学。在毕业设计完成的过程 浅。本论文的选题、研究内容、研究方法及论文的形成是在刘伟老师支持、鼓励和悉心指导下完成的,他是我获得深思熟虑的意见和概念清晰的见解的来源,他不惜花费自己时间对本论文提出许多意见和建议,既激发了我的灵感,又给了我持久不断的鼓励。在论文完成的过程中倾注了指导老师大量的心血,在论文完成之际,特向我尊敬的指导老师表示衷心的感谢。
本次论文与设计的完成对我是一个巨大的激励,使我在学术研究方面充满信心,更为我在今后的学习与工作中提供了宝贵的经验。
在学习、工作和论文写作中,得到了同学们的热忱帮助,在此向他们由衷的感谢。
第 33 页 共 33 页
参考文献
[1] 王学庆. Delphi 6数据库设计实例导航(北京科学出版社,2003 [2] 付 军. Delphi7实例编程100例(中国铁道出版社,2005 [3] 赛奎春, 陈紫红. Delphi 数据库开发实例解析(第二版).机械工业
出版社,2006.1
[4] James Huddleston. C#数据库入门经典(第二版).清华大学出版社,
2006.4
[5] 郎波.Java语言程序设计.清华大学出版社,2005.5
第 34 页 共 33 页
精品文档
正确应用空气的H–I图确定空气的状态点及其性质参数;熟练应用物料衡算及热量衡算解决干燥过程中的计算问题;了解干燥过程的平衡关系和速率特征及干燥时间的计算;了解干燥器的类型及强化干燥操作的基本方法。
二、本章思考题
1、工业上常用的去湿方法有哪几种,
态参数,
11、当湿空气的总压变化时,湿空气H–I图上的各线将如何变化? 在t、H相同的条件下,提高压力对干燥操作是否有利? 为什么?
12、作为干燥介质的湿空气为什么要先经预热后再送入干燥器,
13、采用一定湿度的热空气干燥湿物料,被除去的水分是结合水还是非结合水,为什么,
14、干燥过程分哪几种阶段,它们有什么特征,
15、什么叫临界含水量和平衡含水,
16、干燥时间包括几个部分,怎样计算,
17、干燥哪一类物料用部分废气循环,废气的作用是什么,
18、影响干燥操作的主要因素是什么,调节、控制时应注意哪些问题,
三、例题
2o例题13-1:已知湿空气的总压为101.3kN/m ,相对湿度为50%,干球温度为20 C。试用I-H图求解:
(a)水蒸汽分压p;
(b)湿度,;
第 35 页 共 33 页 (c)热焓,;
(d)露点t ; d
(e)湿球温度tw ;
o(f)如将含500kg/h干空气的湿空气预热至117C,求所需热量,。
解 :
2o由已知条件:,,101.3kN/m,Ψ,50%,t=20 C在I-H图上定出湿空气00
的状态点,点。
(a)水蒸汽分压p
过预热器气所获得的热量为
每小时含500kg干空气的湿空气通过预热所获得的热量为
第 36 页 共 33 页
例题13-2:在一连续干燥器中干燥盐类结晶,每小时处理湿物料为1000kg,经
干燥后物料的含水量由40%减至5%(均为湿基),以热空气为干燥介质,初始
-1-1湿度H为0.00kg水•kg绝干气,离开干燥器时湿度H为0.039kg水•kg绝干12气,假定干燥过程中无物料损失,试求:
-1(1) 水分蒸发是q (kg水•h); m,W
-1(2) 空气消耗q(kg绝干气•h); m,L
-1原湿空气消耗量q(kg原空气•h); m,L’
-1(3)干燥产品量q(kg•h)。 m,G2
解:
q=1000kg/h, w=40?, w=5% mG112
H=0.009, H=0.039 12
q=q(1-w)=1000(1-0.4)=600kg/h mGCmG11
x=0.4/0.6=0.67, x=5/95=0.053 12
?q=q(x-x)=600(0.67-0.053)=368.6kg/h mwmGC12
?q(H-H)=q mL21mw
q368.6mwq,,,12286.7 mLH,H0.039,0.00921
q=q(1+H)=12286.7(1+0.009)=12397.3kg/h mL’mL1
?q=q(1-w) mGCmG22
q600mGCq,,,631.6kg/h? mG21,w1,0.052
第 37 页 共 33 页
精品文档