关键词: 电力GIS,实时监控,Socket
1 引言
计算机技术日新月异,对计算机的应用要求也越来越高,其应用领域也日渐宽广,本文所进行的电力GIS实时监控技术的应用研究就是这其中的一部分。电力企业是国民经济的主要部门之一,它与经济各部门以及人民的日常生活有着密切的关系。国内的电力行业正处于不断的调整与规范之中,在城(农)配电网的基础设施建设中,供电企业的供电水平直接影响到其经济效益。供电部门急需适合电力行业的各种应用,电力GIS与实时监控技术相结合正是适合电力企业要求的应用系统。这种技术与应用的交汇将为电力企业带来的益处是显而易见的:实时监控电力配电网的运行,提高供电质量;快速响应故障,从而提高检修的速度,使设备能够得以发挥其能力;提高管理水平,节省办公费用等等。
2 现状分析
地理信息系统GIS(Geographic Information
System)是为获取、存储、检索、分析和显示空间定位数据而建立的数字化的计算机数据库管理系统。GIS利用现代化计算机图形和数据库技术来输入、存储、编辑、查询、分析、显示和输出地理图形及其属性数据,是集地理学、几何学、计算机科学及各类应用对象为一体的综合性高科技。由于GIS具有上述的特点,GIS不但可以广泛应用于国土资源调查、环境评估等方面,更可以深入到区域规划、公共设施管理、能源、电力、电信等与国民经济相关的重要部门。
电力系统从发电厂、输供电线路(架空线、电缆)、变电站、配电所直到千家万户电度表,大量各种各样、不同规范的电气设施分布在广阔的地域和空间。如何充分合理利用目前有限的电力资源,成为摆在电力决策者面前的首要问题。然而面对纵横交织的电网分布、日益复杂的电力设施、时刻变化的电网信息、不断变迁的城市道路与建筑,尤其是电网中许多与空间位置有关的数据,如何在需要的时候迅速准确地提供完整的信息,也就是如何将各种图形、地图、数据属性信息统一管理并达到共享。所有这些问题的解决都依赖于GIS。电力系统中有很多需要监测的参数,将采集到的实时信息引入GIS系统,可以提高我们向用户提供的信息量,丰富GIS的内容,这对于GIS应用系统来说同样具有重要的意义。
因为现有的供电系统通讯已经基本实现本地企业网化,采用TCP/IP进行数据传输从而实现信息交换的方案是可行。TCP/IP协议具有跨越异构通信网络的能力,它已经被广泛地应用于当今的通讯网络。
当今国内外的主要GIS开发平台:国外的有ARC/INFO、MapInfo、GeoMedia;国内的有吉奥之星(GeoStar)系列、MapGIS、城市之星(CityStar)。
基于以下2点,本文采用MapInfo公司的平台MapInfo
Professional和MapXtreme进行开发:(1)系统应用的要求。对于不是很大的GIS系统来说,MapInfo公司的系列产品即可满足各项要求;(2)MapInfo的性能价格比是很高的。可以用较少的代价获得较高的性能,这对于配电管理信息系统是很合算的。
作为业界领先的地图化解决方案的MapInfo
Professional,其复杂而详细的数据分析能力可帮助用户从地理的角度更好地理解商业信息。使用MapInfo
Professional可以增强报表和数据表现能力,找出以前无法看到的模式和趋势,创建高质量的地图以便做出高效的决策。而且MapInfo
Professional支持集成二次开发,我们可以使用支持OLE自动化的开发工具,如Delphi、Visual
C++、Visual Basic、PowerBuilder等等进行集成二次开发以达到将良好的功能与优秀的界面相结合的目的。
由于Delphi所使用的语言是面向对象的Pascal语言(Object
Pascal),用它开发出的应用程序具有可重用性的特点,以及很强的异常处理能力。在目前应用开发工具呈百家争鸣的时期,Delphi在语言的灵活性、开发速度、应用质量都能兼顾。因此本文采用DELPHI实现的电力GIS的实时监控技术。
3 基于TCP/IP通信的实时信息集成实现
3.1 TCP/IP简介
TCP/IP(Transmission Control Protocol/Internal
Protocol)是20世纪70年代中期美国国防部为其ARPANET开发的网络体系结构和协议标准。TCP/IP是一个协议族,协议组成,如图1所示。
3.2 Socket网络编程接口原理
作为TCP/IP核心的TCP、UDP、IP等中下层协议向外提供的只是原始的编程界面,而不是直接的用户服务。用户服务要靠核心以外的应用程序实现。
TCP/IP应用编程接口与核心应用程序的关系如图2所示。
TCP/IP并没有对应用程序接口进行标准化,应用编程接口通常和操作系统紧密相连,不同的操作系统提供不同的接口。Socket接口和Windows下的WinSock接口是使用最为广泛的两类接口,它们通常也称为套接字。套接字用来区分数据究竟是发给在主机上运行的哪一个应用程序的。因为在同一主机上,运行着多个应用程序,可能都在运行TCP或UDP协议进行通信,套接字提供了一套区分不同应用程序所传输的数据的机制。可以理解为套接字=端口+IP地址,端口是一个16位的标志符,标志传输层协议和应用程序之间的数据接口,它由不同的主机上的TCP协议独立分配,不可能全局唯一。端口号和IP地址合起来,就可以在全网范围内唯一地标志一个端口了。
Socket其实是一种进程间通信机制,正如UNIX系统中的管道(pipe)、共享内存(shared
memory)和Windows环境下的DDE机制一样,Socket提供了进程之间进行通信、相互作用的一种方法,并将这种进程间通信从单机环境扩展到网络环境。
Socket套接字有三种类型:流式套接字、数据报套接字及原始套接字。流式套接字定义了一种可靠的面向连接的服务,实现了无差错无重复的顺序数据传输。数据报套接字定义了一种无连接的服务,数据通过相互独立的报文进行传输,是无序的,不保证可靠、无差错。原始套接字允许对低层协议如IP或ICMP直接访问,主要用于新的网络协议实现的测试等。基于对实时监控系统的要求,应采用了流式套接字实现远程通信。
在网络环境中进程通信需要解决以下3个方面的问题:
(1)网络环境的进程之间的通信首先要解决进程标识问题:在同一台主机中,不同进程可以用进程号(Process
ID)唯一标识,但在网络环境中,各主机独立分配的进程号是不能作为进程标识的。要想标识正确标识网络进程必须指明主机地址。
(2)另一方面,在网络通信中,进程本身也不用进程号来标识,因为进程号有很大的灵活性,它由操作系统动态分配。同样一个文件传输进程在不同的主机中其被分配的进程号很可能不同。所以在TCP/IP网络中使用端口来标识进程。应用程序通过系统调用与某个端口建立联编(Binding)后,传输层就可以通过该端口进行收发数据。
(3) 网络进程通信还需要解决通信协议的识别,因为不同协议的地址格式不同,端口分配相互独立,工作方式也不相同。
所以在网络环境中标识一个进程需要一个三元组,即:协议、本地地址、本地端口号。其中本地地址指定了网络中的主机,本地端口号指定了主机中的特定进程,协议说明了此进程采用的通信规约,在TCP/IP
Socket编程接口下,Socket提供了进程通信的端点。进程通信之前,双方必须各自申请一个端点Socket,每个Socket用上述的半相关描述,一个完整的Socket连接用一个相关描述。每个Socket有一个本地唯一的Socket号,由操作系统分配。
4 Delphi中的实现
通过编写服务器端程序可以实现报警数据的实时传输,以便客户端实现动态显示配电网当前数据,实现配电网的实时监控。我们利用Delphi封装的控件实现基于TCP/IP通信网络的数据传输。有两种实现方式:面向连接的可靠传输和无连接的数据报传输。
面向连接的可靠传输由TCP(传输控制协议)提供保障,在传输数据之前,链路已经建立起来,需要传输的数据可以通过这条已经建立起来的链路直接发送。这种链路一直维持着活动状态,直至某一方提出释放链路。
GIS与实时系统集成原理如图3所示,基本的处理机制如图4所示。
下面的代码示出了服务器方是如何向所有已经与之保持连接的客户方发送广播消息的:
j:=serversocket.Socket.ActiveConnections;
file://计算活动连接数目
if j<>0 then//如果有活动连接存在
begin
for i:=0 to j-1 do
with serversocket.Socket.Connections[i] do
ServerSocket.Socket.Connections[i].SendText(AlarmData);//广播报警,其中AlarmData为自定义格
file://式的消息,用于传递报警信息。
end;
下面的代码在客户请求连接或请求断开时调用,用以刷新界面:
for i:=0 to serversocket.Socket.ActiveConnections-1 do
with serversocket.Socket.Connections[i] do
begin
ActiveOnes.Items.Clear;
ActiveOnes.Items.Add (''连接至:''+RemoteHost+'';
IP为:''+RemoteAddress);
statusbar1.Panels[2].text:=''共有活动连接''+inttostr(ActiveOnes.items.count)+''个'';
end;
下面的代码调用发生在客户请求连接成功时,此时刷新历史记录:
var j:integer;
ClientName,ClientIP,ConnectedTime:string;
begin
ClientName:=Socket.RemoteHost;
ClientIP:=Socket.RemoteAddress;
ConnectedTime:=DateTimeToStr(Now);
TableHistory.edit;
TableHistory.Append;
TableHistory.FieldByName(''客户机名称'').AsString:=ClientName;
TableHistory.FieldByName(''客户机IP'').AsString:=ClientIP;
TableHistory.FieldByName(''连接时间'').AsString:=ConnectedTime;
……….
TableHistory.Post;
TableHistory.Refresh;
End;
TCP连接必须首先建立起来,然后才能传输数据。
下面的代码给出了客户端收到变压器报警信息后根据信息中的变压器编号进行自动地理定位操作,即实现地图自动推出:
procedure TFormByqAlarm.LocateByq(Num:string);
var pos_x1,pos_y1:real;
win_id,Count:integer;
begin
Num:=''"''+Num+''"'';
OLEMAP.DO(''Create Index On变压器(变压器编号) '');
win_id:=OLEMAP.Eval(''FrontWindow()'');
OLEMAP.DO(''find using 变压器(变压器编号)'');
OLEMAP.DO(''find ''+Num);
count:=OLEMAP.Eval(''CommandInfo(3)'');
if count1>=1 Then
begin
pos_x1:=OLEMAP.Eval(''CommandInfo(1)'');
pos_y1:=OLEMAP.Eval('' CommandInfo(2) '');
OLEMAP.DO(''select * from “变压器” where 变压器.变压器编号=''+Num);
OLEMAP.DO(''set map scale 1 units "cm" for 70 units "m"'');
OLEMAP.DO(''Set Map Window''+inttostr(win_id1)+'' Center
(''+floattostr(pos_x1)+'',''+ floattostr(pos_y1)+'') '');
end
else showmessage(''目标不止一个或目标没有找到!'');end;
5 结束语
目前,国外已经将GIS广泛应用到电力系统的各个领域,如:配电管理、输电管理、电力设施管理、停电管理、用电营业管理等等。而我国GIS在电力系统领域的应用还仅仅处于起步阶段。本文对如何将实时信息引入电力GIS进行了探讨,并详细介绍了用DELPHI实现的电力GIS的实时监控的实现技术并应用于湖北某地的配电网系统,在实际应用中过程中取得了很好的效果。进一步工作将实时控制引入电力GIS由于网络传输存在着的诸多不确定性因素,尤其是传输延迟问题还有待深入研究。