1. 引言
随着计算机网络技术、信息技术和自动化技术的发展以及其在各行各业的渗透,众多行业逐步迈向自动化。水库调度自动化是水库调度未来发展的趋势。在水库调度系统建设方面,我国起步较晚。80年代我国选择长江陆水水库流域、东北第二松花江流域作为试点从国外引进建立水情自动测报系统。98年3月,国调中心制定了《电力系统水调自动化功能规范》,规范和促进了水调自动化系统的发展 [1] 。在水调自动化系统建模以及实际应用方面,李文武等人从信息系统整体角度分析研究水库调度自动化系统设计 [2] ,吴志坚等人为优化自动化系统的信息共享研究开发了以Cluster组件为核心的电调自动化系统和水调自动化系统的联合应用 [3] 。
目前,水库调度自动化系统主要采用传统的C/S结构 [4] 。但C/S结构有其固有缺点:缺乏通用性,系统维
护、升级需要重新设计和开发,增加了维护和管理的难度,进一步的数据拓展困难较多 [5] 。黄小锋等人分析了水调自动化系统所处的新的形势,指出其发展方向主要表现在通用性、生态调度、风险决策、数字流域、智能专家系统、电力市场等方面 [6] 。这都不是传统C/S结构擅长的地方,需要新的B/S结构的自动化系统。王金星等人在白山发电厂建立了基于WEB的水库调度综合自动化系统 [7] 。本文讲述基于VS2012平台使用MVC技术开发水库调度自动化B/S系统的方法和流程。
2. 开发模型与系统结构
2.1. 开发模型
本软件系统在开发过程中,采用三层结构开发模式。所谓三层结构开发模式,与传统的B/S软件开发模式不同的是,在用户界面和数据库之间加入了一个“中间层”,也叫组件层。这里所说的三层体系,不是指物理上的三层,也不仅仅有B/S应用才是三层体系结构,三层是指逻辑上的三层。通用三层结构模型见图1。
中间层包括业务逻辑层(Business Logic Layer,简称BLL)、数据访问层(Database Access Layer,简称DAL)和数据对象模型层(Database Object Model Layer,简称DOM)。此时的三层结构开发模型见图2。
(1) 用户界面(User Interface,简称UI),也称表示层,位于最上层,用于显示和接受用户提交的数据,为用户提供交互式的界面。表示层一般为Windows窗体应用程序或Web应用程序。
(2) 业务逻辑层是表示层和数据访问层之间沟通的桥梁,主要负责数据的传递和处理。

Figure 2. Three-layer structure developing model
图2. 三层结构开发模式
(3) 数据访问层主要实现对数据的读取、保存和更新等操作。
(4) 数据对象模型层即业务实体层。主要用于表示数据存储的持久对象。在实际应用程序中的实体类是跟数据库中的表相对应的,也就是说一个表会有一个对应的实体类。当然有些三层结构并不包含单独的数据对象模型层,而将其功能分解到业务逻辑层和数据访问层之中。
在三层结构中表示层直接依赖于业务逻辑层;业务逻辑层直接依赖于数据访问层;数据访问层直接依赖于数据对象模型层。三层结构主要体现出对程序分而治之的思想:数据访问层只负责提供原始数据,并不需要了解业务逻辑;业务逻辑层调用数据访问层提供的方法自定义一些业务逻辑,对数据进行加工,本身不需要了解数据访问层的实现;表示层直接调用业务逻辑提供的方法把数据呈现给用户。
2.2. 软件平台B/S架构
2.2.1. C/S结构和B/S结构的概念
C/S结构,即Client/Server (客户机/服务器)结构,是大家熟知的软件系统体系结构,通过将任务合理分配到Client端和Server端,降低了系统的通讯开销,可以充分利用两端硬件环境的优势。早期的软件系统多以此作为首选设计标准。
B/S结构,即Browser/Server (浏览器/服务器)结构,是随着Internet技术的兴起,对C/S结构的一种变化和改进的结构。在这种结构下,用户界面完全通过WWW浏览器实现,一部分事务逻辑在前端实现,但是主要事务逻辑在服务器端实现,形成所谓3-tier结构。B/S结构,主要是利用了不断成熟的WWW浏览器技术,结合浏览器的多种Script语言(VB Script、JavaScript…)和ActiveX技术,用通用浏览器就实现了原来需要复杂专用软件才能实现的强大功能,并节约了开发成本,是一种全新的软件系统构造技术。随着Windows 98/Windows 2000将浏览器技术植入操作系统内部,这种结构更成为当今应用软件的首选体系结构。
2.2.2. C/S结构与B/S结构的区别
Client/Server是建立在局域网的基础上的;Browser/Server是建立在广域网的基础上的,但并不是说B/S结构不能再局域网上使用。
(1) 硬件环境不同:C/S一般建立在专用的网络上,小范围里的网络环境,局域网之间再通过专门服务器提供连接和数据交换服务;B/S建立在广域网之上的,不必是专门的网络硬件环境,例与电话上网,租用设备。信息自己管理。有比C/S更强的适应范围,一般只要有操作系统和浏览器就行。
(2) 对安全要求不同:C/S 对服务端、客户端都安全都要考虑;B/S只需要注重服务端的安全即可。
(3) 对程序架构不同:C/S程序可以更加注重流程,可以对权限多层次校验,对系统运行速度可以较少考虑;B/S对安全以及访问速度有着多重的考虑,它建立在需要更加优化的基础之上,比C/S有更高的要求。B/S结构的程序架构是未来发展的趋势。
(4) 软件重用不同:C/S程序不可避免地要进行整体性考虑,构件的重用性不如在B/S要求下的构件的重用性好;B/S所需要的多重结构,要求构件具有相对独立的功能,能够相对较好的重用。就如买来的餐桌可以再利用,而墙上的石头却很难再利用。
(5) 系统维护不同:系统维护是软件生存周期中开销很大同时也很重要的一部分。C/S程序由于整体性,必须整体考虑,若出现问题或者系统升级处理起来都很困难,最后的结果可能是再做一个全新的系统;B/S由构件组成,可以通过构件个别的更换,实现系统的无缝升级。系统开销减到最小。
(6) 处理问题不同:C/S程序一般针对的是比较固定的用户面,并且空间分布相对集中,安全方面的要求比较高,程序与操作系统的关联性也比较高;B/S程序建立在广域网甚至是因特网上,用户所处的地域分散,且B/S程序与操作系统平台的关系最小。
(7) 用户接口不同:C/S程序多是建立在Window平台上,表现方法有限,对程序员要求普遍较高;B/S建立在浏览器上,通过WEB服务或其他公共可识别描述语言可跨平台,使用更灵活。不仅可以应用在window平台上,还可以应用在Unix/Linux等平台。
2.2.3. B/S结构的优缺点
B/S结构的优点:具有分布式特点,可以随时随地进行查询、浏览等业务处理;业务扩展简单方便,通过增加页面即可增加服务器功能;维护简单方便,只需要改变网页,即可实现所有用户的同步更新;共享性强。
B/S结构的缺点:响应速度不及C/S,但随着AJAX技术的发展,相对传统B/S结构软件可以提升一倍速度;用户体验效果不是很理想,B/S需要单独界面设计,厂商之间的浏览器界面也是千差万别,由于浏览器刷新机制,使用时有刷屏现象。
2.3. 系统结构
因特网用户通过网络访问用户界面;在用户界面上使用鼠标和键盘提出自己的业务需求,通过业务逻辑层调用调度算法;业务逻辑依赖数据访问层实现对数据的读取、保存、更新和删除等操作;数据访问层通过对象关系映射访问数据库。此体系从逻辑上来讲,又可以分为三大平台:综合管理平台,算法调度平台,协同数据平台。梯级水库调度自动化B/S系统的整体结构见图3。
2.4. 开发流程
此软件系统是在VS2012 + SQL SERVER2012平台中使用C#、C和Fortran两种语言开发的,系统主要用C#编写,C和Fortran主要负责调度算法的编写,并以动态链接库的形式提供算法接口。在开发过程中,我们采用由下至上的开发流程,即先进行数据库的设计和实现,然后是数据访问层的设计和实现,业务逻辑层设计和实现,最后是界面层的设计和实现。见图4。
3. 系统设计和实现
3.1. 数据库设计和实现
在大型B/S软件系统的开发中,一般数据库的设计是最初的一步,也是至关重要的一步。数据库设计的好与坏,直接关系到业务逻辑设计的复杂程度和整个系统的开发效率与执行效率。所以在这部分工作中,我们一定要注意数据库的简洁性和逻辑性。
功能决定结构,水库调度系统需要实现的功能有:水库基础信息维护,实时水情信息管理,梯级中长期调度及年度计划的编制,短期调度及96点计划的编制。所以在数据库设计中,我们需要水库基础信息相关表、实
时水情信息相关表、中长期调度方案相关表、短期调度方案相关表和系统管理相关表这几类。
3.2. 数据访问层设计和实现
数据访问层没有什么设计和实现上的难处主要体现于:它下面的数据库是以关系模型存储数据,使用T-SQL语言进行查询;它上面的业务应用以及代码在内存中的组织形式是以对象模型表现的,使用C#这种面向对象的编程语言处理,关系模型和对象模型在逻辑和结构上都有很大的区别。数据访问层要解决的问题是耦合这两种模型,这里采用的方法是ORM。
ORM全称Object Relational Mapping (对象关系映射),即在业务层和数据层中添加一个软件层,将面向对象编程所建立的对象建立一一对应的关系。把对表直接进行的操作,变成对类的属性和方法的操作。这样大大降低了业务层和数据层的耦合度,提高了系统的扩展性和可维护性,提高了开发效率。在应用中使用ORM组件,就等于在关系模型和对象模型之间架起了一座沟通的桥梁,从而把开发人员从低级重复的劳动中解脱出来,使之有更多的时间关注于实际的商业需求。从对象存储和分层的观点来看,人们也把ORM组件称之为持久层(Persistent Layer)。
ORM只是一种开发观念,项目实际开发中需要的是实现这一观念的技术,项目开发过程中通过Entity Framework技术来实现对象关系映射。在VS2012中,大部分的工作已经由微软完成,我们只需使用它所提供的服务,编写少量的代码,即可实现。
3.3. 业务逻辑层设计和实现
一般在大型商务软件中,业务逻辑层的设计和实现是整个软件开发中最重要且最复杂的部分。但在水库调度软件系统中,业务逻辑并不复杂,它主要包括用户登录管理,数据查询、更新和删除,方案的新增、加载约束、计算以及结果的存储和显示等。在水调系统中,这一层主要的工作是为用户调用的算法准备数据,并将计算结果存储到数据库中供显示层读取。
3.4. 显示层设计和实现
显示层的实际和实现是这几部分工作中最繁琐最耗时间的部分,同时它涉及的问题和与之相关的技术也最多。这部分涉及的问题有:WEB访问的安全性问题,因特网上数据传输的速度问题,用户浏览网页的体验问题等。相应的解决方案和技术有:MD5加密技术,基于Json数据的ajax动态表格技术,基于Highcharts的多元化图形技术等。MD5加密可以解决安全性问题,ajax技术可以大大提高访问速度,多元化图形技术以及图表结合使用能够给用户良好的浏览体验。这些技术很好集成在jQuery中,我们使用jQuery可以很方便地使用这些技术。图5~图7为图形显示效果示例。

Figure 7. Example of combined curve and column chart
图7. 曲线柱状联动图示例
4. 结语
随着计算机网络以及移动互联网的发展,基于B/S模式的水库调度自动化系统将会得到迅速的发展和应用。开发这类大型的B/S软件,我们需要有规范的开发模型和流程:在模型方面,按照关注点分离的原则,我们一般采用三层结构开发模式以及MVC模式;在流程方面,按照自下而上、由内而外的原则,我们一般先设计好数据模型,然后是业务逻辑,最后是显示在用户面前的界面。大型水库调度网络应用程序的开发往往需要多人合作完成,同时需要不同专业的人合作完成。为了提高程序开发的并行性,我们采用动态链接库技术,让不同专业和擅长不同编程语言的成员发挥各自的所长,提高开发效率。
基金项目
国家自然科学基金(51279138)。