杨志宏 李 捷 电力自动化研究院电网控制研究所 210003 南京
0 引言
近年来,网络技术及Internet的发展令人瞩目。Internet技术中尤其以WWW及其相关技术的发展最为迅速,从最初的HTTP,CGI到VBScript,JavaScript和Java,短短的数年时间内,各种新技术不断涌现,令人眼花缭乱。WWW技术所带来的影响是深刻而广泛的,它改变了计算机技术的外貌,也改变了许多人的生活方式。本文将Web及Java技术引入SCADA/EMS系统中,以期在图形的实时数据处理方面效果更好。
1 Web与Java技术的核心
1.1 HTTP协议 WWW技术的基本核心是 HTTP+HTML。HTML(HyperText Markup Language)用以描述文档以何种面貌呈现在用户的屏幕上,HTTP(HyperText Transfer Protocol)则是用于传送WWW文档(HTML文件、图像文件等)的协议。HTTP是一个简单的无状态协议,也就是说服务器端不记录与客户通信相关的状态信息。客户端与Web服务器建立一个连接后,向服务器发出一个请求,如GET请求,以获取一个HTML文件,当得到回答后随即关闭这个连接,下次再有请求时重新建立新的连接。由于网络连接的一次性使用,不需要记录状态,因而简化了客户方与服务器方的软件设计,出错的概率也大大降低。但另一方面,由于频繁地建立连接(访问一个页面一般需要建立十几个甚至几十个连接),使网络的利用率下降,这也是HTTP受到批评的地方。后来的一些Web服务器加入了一种称为keep alive的技术,通过复用所建的网络连接来提高效率。 1.2 CGI技术 Web浏览器的基本功能是从Web服务器取得HTML文件(或其它文件)后,根据其格式将其显示在屏幕上。从这种意义上说,Web浏览器充其量不过是个简单的排版、显示程序。为了在静态的文本和图像基础上增加交互特性,Web服务器中又加入了CGI(Common Gateway Interface)功能。CGI提供了一种调用服务器上可执行文件的机制,所调用的CGI程序存放于Web服务器的专用目录(一般为cgi—bin)中。与HTML文档一样,CGI程序也是由URL(Universal Resource Locator)标识的,不同的只是其主体是一个可执行文件而不是可显示的文档。当服务器收到访问CGI的请求后,并不是发回此文件的内容,而是执行这个文件,并将其输出结果(一般是一个根据请求参数动态生成的HTML文档)传回给浏览器。使用CGI以后,就打破了只能显示静态文本的局限性,因而可以在浏览器中进行简单的数据录入、查询等工作。 然而,由于每当有CGI请求时,Web服务器都需要创建新的进程以执行CGI程序,这就给系统带来了很大的负担,系统的吞吐量受到了限制。于是又有了很多改进方法,如Microsoft的ISAPI技术等,这些改进的基本思想都是消除每次创建进程的系统开销,如转成DLL方式,只需一次载入即可。 1.3 Java语言 CGI所带来的交互性远不能达到人们的要求,如用户所输入内容的即时校验就无法完成。SUN公司于1995年推出的Java语言则给Web的交互性带来了革命性的转变,Java小应用程序(applet)在交互操作、动画处理、背景音乐及网络游戏等方面的突出表现极大地扩展了Internet的内涵。 作为程序设计语言来说,Java语言的主要特性[1]可概括为:一是面向对象,Java是一个完全面向对象的语言,Java程序就是类、方法、实例;二是多线程,Java把线程的概念加入到语法中,使得一个Java程序看起来可以同时进行几件工作;三是简单性,Java可以说是C++的一个衍生简化版本,去掉了C++中的许多不太必要或容易出错的部分,尤其是去掉了C/C++中的指针,使得程序的编写和调试难度大大降低。 然而Java语言更重要的特点在于其跨平台的移动代码(mobile-code)特性,由于生成的小应用程序可动态地从网络上下载,并可在任意平台上解释执行,所以特别适合于在浏览器中运行。同时,Java语言中丰富的网络支持和强大的图像处理能力也使得Java在浏览器中有更多的用武之地,特别是网络方面,Java语言将网络通信抽象为文件的读写操作并支持高层的协议,给开发者带来了很大的方便。
2 EMS中的图形处理
浏览器中Java小应用程序对图形的处理有两种方式:基于图像的方式和基于图形的即时绘制的方式。 2.1 基于图像的方式 为了避免绘制图形的麻烦,可将图上除实时数据和曲线以外的部分作为背景图像来处理[2]。可使用一般的绘图工具画出背景图,并转换成浏览器能处理的某种标准格式如GIF,JPEG等。Java小应用程序通过getImage方法即可以从Web服务器上取到图像,再使用drawImage方法即可将图像显示出来,程序非常简单。当通过某种方式取得实时数据后,再将数据显示到指定位置即可。这种方式较为简单,下面着重介绍后一种方式。 2.2 基于图形的即时绘制的方式 这种方式的思想是从Web服务器读取图形文件,再根据其中的描述信息利用Java的绘图功能直接绘制母线、开关、变压器以及实时数据等,从而显示出实时图形。这里涉及到图形文件的读取、绘制等较为复杂的工作。 2.2.1 图形文件的读取 由于图形文件存放于Web服务器上,因此必须通过网络来读取。事实上,由于安全性限制,小应用程序在一般情况下仅能读取源服务器上的文件,而无法访问浏览器所在地机器的文件。Java的设计者已充分考虑了Internet应用的需要,设计的网络功能很强大,能直接对URL进行处理,因此给利用HTTP协议读取图形文件带来了方便。 Java的net包中专门定义了URL类以实现URL的处理功能,创建一个URL对象后,可利用它的openConnection方法打开到URL资源的连接,得到一个URLConnection类的实例,再利用它的getInputStream方法获取一个输入流(如果需要,还可调用它的getOutputStream方法得到输出流)。此处我们并不需要使用输出流,因而可以用更简单的方法,即直接使用URL类的openStream方法,同时打开URL连接,并得到相应的输入流。得到输入流以后,就可以像处理普通文件一样进行读取分析工作。 2.2.2 图形元件的面向对象设计 在现实模型中,图形上的各种元件都具有一定的属性,需要一定的处理方法,均可作为独立的对象来处理。而Java语言本身则是完全面向对象的语言,两项因素相结合使得面向对象的图形处理方式成为顺理成章之事。 通过对母线、开关、刀闸、线路、变压器等各种设备,对直线、多边形、椭圆、圆弧等各种基本构件、对饼图、棒图、仪表图、曲线等各种复杂构件以及对图形平面甚至图形文件等进行封装成为对象的处理方式,使得系统的可重用性、可扩展性、可维护性得到大大提高,也加快了系统的开发周期[3]。 2.2.3 图形的绘制 Java语言的一大特点就是其方便的图像处理能力,如上一节所述,只需简单的语句即可将已有的图像显示出来,然而,Java的图形处理能力却很弱,这主要是由于设计者的跨平台兼容能力、简单性等目标而造成的。 Java语言的图形处理功能实现在一个名为AWT(Abstract Window Toolkit)的包中[1],其中的Graphics类包含了绘图所需的各种函数,如绘制直线、矩形、圆弧、椭圆、多边形等,并可进行填充处理,同时还包括绘制文字、像素区域拷贝及前述的显示图像等功能。虽然绘图功能不够强大,并缺少一些必须的功能,如设置线型、填充模式等,但已可满足基本的绘图要求。 在实现时,仅能绘出图形还远远不够,还必须作出一些处理以使用户满意,其中之一便是绘图时的双缓冲技术,以消除图形的闪烁。利用Graphics类的功能创建一块内存图形缓冲区,按同样的方式对其进行绘图处理,当绘制完成后再将其拷贝到物理显示屏上。这样就避免了用户看到闪烁以及绘图过程,而只是看到实时数据和设备状态在悄悄改变。另外还需利用多线程技术同时处理文件读取、图形绘制及用户输入等功能,以减少用户的等待时间。 2.3 两种方式的比较 可以看出,基于图像的方式中程序处理非常简单,但存在3个问题:一是维护不方便,当EMS中的图形修改以后,Web服务器上的相关背景图像亦须作修改;二是图像文件较大,因而需要较长的下载时间;三是在图形中难以用可视化的方式显示设备的状态,如开关的分、合等。基于图形的即时绘制方式与此恰恰相反,可完全避免上述3个问题,只是增加了许多开发工作量,两种方式的比较参见表1。可以说,后一种方式是以开发者的辛勤付出换来使用者的方便。现在的技术趋势也表明:从基于服务器的图像向基于客户机的图形的过渡将成为必然。
表1 两种图形处理方式的比较 Table 1 Comparison of two graphics processing methods
图形处理方式
维护 方便性
下载 时间
设备状态 可视化
开发 难度
基于图像的方式
不方便
较长
不可以(较难)
小
基于图形的方式
免维护
较短
可以
大
3 EMS实时数据的处理
EMS中的图形与普通意义上的图形相比,其特殊之处在于它包含有实时数据和状态,也就是遥信、遥测量等,实时数据的处理应算是EMS中应用Internet技术的关键之一。为了取得这些数据,必须访问相关的数据库,这通常可由以下3种方式实现:访问中件方式、CGI方式和JDBC方式。 3.1 访问中件方式 这种方式基于3层结构应用的思想,小应用程序并不直接访问数据库,而是将请求传送给位于Web服务器上的中件应用程序,由后者根据请求信息访问相关的数据库,并将结果返回给小应用程序。这种方式具有较好的灵活性,对于数据库的种类和位置没有特殊的限制,只是编程可能较复杂。如果没有使用Java RMI或CORBA分布对象平台之类的方式,则在小应用程序和中件应用程序中需要处理客户/服务器间的网络通信。 3.1.1 小应用程序客户方 Java语言的net包中除了对上层的HTTP等协议的支持外,也包括了较底层的socket网络通信接口,将其实现为一个Socket类,这给直接利用TCP/IP协议带来了很大的方便。编程时,只需调用Socket类的构建函数,给出相应的网络地址和端口号,即可得到一个代表网络连接的实例;再调用其getInputStream方法和getOutputStream方法,即可得到输入流和输出流。将请求信息写入输出流即是向服务方发送请求,而读输入流即可获得服务方返回的结果。 3.1.2 服务方中件程序 中件程序并不限于某种语言实现,只要能完成网络通信和访问数据库这两项功能即可,因而既可以用Java实现,也可以用通常的C/C++实现。用C/C++实现时,需要使用传统的socket接口函数,访问数据库则需使用数据库厂商提供的客户端程序;用Java实现中件应用程序时,利用后文将述的JDBC,中件应用程序可以访问各种数据库,只要其提供相应的驱动程序即可。网络通信方面,可使用net包中的ServerSocket类,调用其accept方法即可接受连接请求,其返回值是一个Socket类的实例,利用它可以很方便地与客户方进行通信。 3.2 CGI方式 采用CGI方式时,客户方的Java程序并不太复杂,主要是访问相应的CGI程序。向CGI程序传递参数的方式有两种:GET方式和POST方式。如果参数不太复杂,可使用GET方式,这也是较常用的方式;如果参数过于复杂,则POST方式较为合适。GET方式的参数处理比较简单,只需在URL的文件名后加“?”,再按规定格式加上参数的名值对,然后按通常读取HTML文档的方式处理,即可获得CGI程序的返回信息。POST方式则要复杂一些,需要先获取URL的URLConnection实例,设置其doOutput属性,并向其输出流中写参数。实际上还可以模拟浏览器处理POST请求的方式,依照前一节所述的方法利用Socket类的功能连接到Web服务器的HTTP协议端口(一般是80)上,向输出流中写POST命令,其后按规定格式写参数信息头和具体的参数,然后读取输入流即可获得输出结果。 在Web服务器方则需要编制CGI程序,以访问相关的数据库。CGI程序本质上仍然是可执行程序(解释型或编译型均可),与普通程序的区别仅在于输入与输出方面的约定不同而已。CGI程序获取参数的方式相应地也有两种,GET方式是从环境变量中取得参数,POST方法则是从标准输入中取得参数。CGI程序的回答只需写向标准输出即可,在按协议规定的头部信息之后便可跟随返回的数据。由于客户端不是由浏览器接收后显示,而是由Java小应用程序读取数据,所以数据格式完全可以自定而不需要使用HTML格式,如使用双方都易于处理的文本格式。 3.3 JDBC方式 在Java语言公布之初,并没有关于数据库访问方面的内容,但设计者们也知道数据库接入应用的重要性,因而在Java语言公布的第2年(即1996年)公布了JDBC(Java DataBase Connectivity)规范。通过使用JDBC包,开发者可以连接到数据库之上,并可使用工业标准的SQL查询语言去查询和修改数据库中的内容。由于JDBC的设计思想和ODBC差不多,所以这使得用Java和JDBC开发的应用既独立于平台,又独立于数据库供应商。 JDBC规范由2层组成:上层是JDBC驱动程序管理器;下层是销售商提供的JDBC驱动程序。如图1所示。考虑到ODBC的广泛应用,JDBC也可建立于ODBC之上,即通过JDBC—ODBC桥,进而经过ODBC驱动程序来访问数据库。用户按JDBC API编程,即可通过JDBC或ODBC驱动程序访问到相应的数据库。需要注意的是,使用何种数据库产品,就需要使用相应的数据库厂商或其它独立开发商所提供的JDBC驱动程序,而对于小应用程序而言,还要求JDBC驱动程序可以下载到浏览器中执行。
图1 JDBC访问数据库的途径 Fig.1 JDBC architecture
3.4 3种方式的比较 CGI方式应该说是最成熟的方式,在Internet上应用最广,其主要缺点是CGI的效率问题;JDBC方式相对较新,在Java中处理也很方便,但在浏览器环境下却有所限制,因为小应用程序只能与源Web服务器通信,所以它访问的数据库只能是位于Web服务器上;访问中件方式没有JDBC那样的问题,它与CGI程序一样都可以访问任何位置的数据库,而且可以访问一些特殊的(很可能未提供JDBC或ODBC驱动程序)数据库,它的缺点在于增加了网络通信方面的编程,给开发工作增加了难度。这3种方式的比较如表2所示。
表2 3种数据获取方式的比较 Table 2 Comparison of three data retrieving methods
数据获取方式
执行效率
数据库位置
通信复杂性
CGI方式
低
不受限制
中
JDBC方式
高
受限制
低
中件方式
高
不受限制
高
4 对于EMS的意义
4.1 传统的处理方式 通常情况下,EMS都使用C/C++或其它高级语言在图形工作站的环境下实现,异种机难以直接访问EMS的图形和数据。为了解决这个问题,一般采取以下两种方式:一是在某些特殊地点(如局长办公室)的PC机上安装称为PC—X的X服务器软件,模拟出一个工作站的X窗口环境,直接登录到某台EMS工作站中,从而达到与EMS本地工作站相同的效果。这种方式简便易行,但给EMS工作站和实时网络增加了很大的负担,严重时甚至会影响到EMS的运行。 另一种方式是在MIS中另开发一套软件用以显示所需的图形和数据,这种方式避免了上述问题,但是需要增加开发工作量,而且会有系统维护上的困难。所以说,这两种方式均有各自严重的缺点。 4.2 Web浏览器方式的优点 当我们充分利用Internet技术,以Web浏览器方式实现图形及实时数据访问时,将彻底改变上述情况。它在平台适应性、可维护性和远程访问等方面都有了很大的进步。 4.2.1 平台适应性强 由于Java的“一次编写,到处运行”的特性,它可在各种平台的机器上执行,不管是工作站还是PC机,需要的只是一个Java虚拟机,所以只要其安装了适当的浏览器软件,即可在浏览器中执行Java小应用程序,可在浏览器窗口中看到实时变化的图形和曲线,这给用户在资源的合理利用上带来了方便。 4.2.2 免维护 这里的免维护包含两方面的内容:一是在客户机上未另行开发、安装特殊的软件或驱动程序(浏览器已几乎成为操作系统的一部分),所以不会带来维护上的问题;另一方面是当EMS中修改了某些图形时,客户方可以马上看到新图,而不需要去其它系统中修改任何内容,这给用户在运行维护管理上带来了方便。 4.2.3 远程访问能力 在Web浏览器的一次执行过程中(直到程序结束为止)只需一次性下载Java代码,而在察看某一图形时也只需一次性下载相关的图形文件,在用户看到画出图形后的正常运行过程中,网络上传送的仅是数量很少的实时数据,这使远程访问成为可能。如果充分利用Java的各种特性加以优化处理,还可缩短用户的启动等待时间。
5 结语
随着Internet/Intranet技术的不断发展,Web与Java技术会更成熟,其应用前景也必定会更广阔。在电网控制研究所开发的OPEN—2000大型能量管理系统中,我们使用数据访问中件的方式获取实时数据、使用Java图形功能即时绘图,实现了通过浏览器察看EMS中实时图形及曲线的目标,并达到了用户的免维护要求。经过现场的成功投运,取得了良好的应用效果。
参考文献 [1] [2] 下一页
|