基于Flex 和LCDS 的Web 监控系统设计与应用 吕海东(大连理工大学城市学院,辽宁大连116600) 陆永林(大连英科时代科技发展有限公司,辽宁大连116601) Web Based Monitoring System Designing and Implementing Based on Flex and LCDS 摘要 如何克服Web 监控系统响应速度慢,页面表达简单,交互性差的缺点,一直是监控系统开发人员不懈努力的目标。基于传统的HTTP 请求/ 响应模式,即使应用AJAX 技术实现异步请求和局部页面刷新,依然无法彻底解决以上问题。RIA 新技术Flex 的出现,为Web 监控系统带来了新的革命,采用Flex 和数据访问框架LCDS 开发的全新Web 监控系统经过实际中运用,表现出梦幻般显示效果和高性能数据访问速度,满足了实时监控系统的需要。 关键词:Web Scada,Flex,J2EE,Hibernate,Spring,锅炉监控 Abstract How to solve the problems of low speed,simple GUI presentation and limited reaction in classic Web Scada is alwaysthe destination of automatic controlling system developer.Although AJAX which based on HTTP request / response has solved the web page refreshing with the Asynchronous request and DOM,but above problems still could not be solved completely.The new RIA framework Flex can create engaging,cross-platform rich Internet applications,base on Flex and LCDS the new Web Scada system was designed and implemented in XinYuan Heat-Supplying control system. Keywords:Web Scada,Flex,J2EE,Hibernate,Spring 工业过程监控系统(SCADA)从C/ S 模式向B/ S 模式的迁移是大势所趋,目前基本上所有的监控系统都提供的Web 方式的监控数据显示,极大方便了用户的访问和管理。但一般Web监控系统都使用传统的HTML 和HTTP 请求/ 响应模式请求服务器数据来实现监控数据的显示,一直无法解决Web 页面的刷新难题,由于重新载入整合页面,严重影响监控的实时性。虽然AJAX 技术以异步通讯方式进行HTTP 请求,解决了整个页面刷新问题,显著提高了响应速度和监控实时性,但其依然是以文本方式的HTTP 请求方式工作了,无法使Web 监控系统的性能得到彻底的改善,况且AJAX 存在浏览器兼容问题,基于AJAX 的Web SCADA 不能在所有浏览器上正确运行。更重要的是传统 的HTML Web SCADA 无法实现C/ S 模式下的复杂监控画面的显示,响应速度和交互能力均无法满足监控的实时性要求。 RIA(Rich Internet Application)已经在信息管理Web 应用中得到了普及应用,Flex 以其C/ S 的美观画面, 响应速度和丰富交互能力成为RIA 的主流技术,在以AJAX、EXT JS、DOJO等竞争中处于领先地位。 将Flex 引入监控系统, 将使Web 监控系统发生翻天覆地的变化,流畅优美的画面再结合Adobe 公司最新数据访问框架技术LiveCycle Data Services ES,极大提高数据传输速度,满足了实时监控系统的要求,使Web SCADA 进入了新的阶段。 本文采用Flex 和LCDS 框架, 结合开源Java 技术Hibernate,设计了全新的Web SCADA,并应用于新园供热监控系统中,取得了满意的效果。 1 Flex 框架技术 Flex 是一个开发RIA 的程序框架,它将桌面应用程序的最佳用户界面功能与Web 程序的普遍采用, 低成本部署以及互动多媒体的实时快捷融合在一起,成为开发新一代Web 应用的利器。 Flex 框架由MXML 页面标记语言,ActionScript 编程语言和Flex 类库组成。MXML 是基于XML 的标记语言,用于界面的布局和显示控件。MXML 提供了用户界面和服务器端数据的绑定,极大简化了数据访问编程,提高了编程效率。ActionScript 是类似JavaScript 的强类型面向对象语言, 用于操控GUI 组件,事件监听,数据访问回调等。Flex 类库是核心,提供了种类繁多的各种控件,GUI 组件,数据访问组件,行为组件等,可以方便实现负责的用户界面和响应事件类型。 2 LiveCycle Data Service(LCDS) 2.1 特点 Adobe 的LCDS 提供了高级的与Web 服务器通信的方式,不但提高通讯的效率,还提供了传统B/ S 结构所没有的功能。LCDS 提供了三种方式与服务器通讯: 1)远程对象(Remoting):基于AMF 协议的远程调用方式,速度和效率优于HTTP 的文本模式。 2)数据管理(Data Management):通过AMF 和RTMP 协议的混合使用,实现服务器向Flex 客户端推送数据,实现真正意义的实时监控。 3)消息服务(Mesagesing):基于JMS 的服务器和客户数据交换技术,也实现了数据推技术。 2.2 LCDS 的框架结构 LCDS 是基于JavaEE 的数据访问框架, 提供了RemoteObject、HttpService、WebService、MessageService 和Data-Management 技术来访问服务端数据, 这里采用ReomoteObject技术实现Flex 与服务器端的数据交互。未来我们将使用MessageService 或ataManagement 组件实现推技术的实时监控Web 设计。Adobe LCDS 的体系结构见图1。 LCDS 可以部署在任何JavaEE 规范的Web 服务器上,通过调用Java 对象的方法,取得数据源的数据,可以使用拉方式(Pull)和推(Push)方式将数据传送到Flex 客户端进行显示。 3 Web Scada 设计与实现 3.1 架构选择 本Web 监控系统采用基于JavaEE 的开源框架技术,Web服务器选择Tomcat6.0.18,数据库访问层使用Hibernate3.3.1,读取XDC800 系统的实时采集数据库的数据,Adobe LCDS2.6作为JavaBean 业务层和Flex 表示层的数据交换层,Flex3 实现GUI 页面,定时接收并显示采集数据。Web 监控系统的总体结构如图2 所示。 图2 新园供热Web 监控系统整体结构图 3.2 实时数据访问层设计 监控数据由DCS800 系统实时采集到分布式实时数据库中,本系统采用Hibernate 框架技术读取数据库中保存的数据。 1)设计每个监测点的数据类,封装水温,压力和流量。 public class SiteValue implements Serilizable{ Private Integer dataNo=null;// 监测数据序号 private double t=0; // 温度 private double p=0; // 压力 private double v=0; // 流量 private String siteNo=null; // 监测点编号 private String Date dataTime=null; // 监测时间 } 2)配置Hibernate 映射文件SiteValue.hbm.xml,与监测数据表关联。 <hibernate-mapping package=″com.jy.crm.value″> <class name=″SiteValue″ table=″XY_SITE″ dynamic-update=″true″ dynamic-insert=″true″> <id name =″dataNo″ column =″DATANO″ ><generator class =″native″></generator></ id> <property name=″siteNo″ column=″SITENO″ /> <property name=″t″ column=″t″ /> <property name=″p″ column=″p″ /> <property name=″v″ column=″v″ /> <property name=″dataTime″ column=″DATATIME″ /> </ class> </ hibernate-mapping> 3)使用Spring 管理Hibernate 和业务层对象。 <-- 定义数据库联接池数据源--> <bean id =″ dataSource″ class =″ org.springframework.jndi.JndiObjectFactoryBean″> <property name=″jndiName″> <value>java:xinyuan< / value> < / property> < / bean> <-- 定义Hibernate Session Factory--> <bean id=″sessionFactory″ class=″org.springframework.orm.hibernate3.LocalSessionFactoryBean″> <property name=″dataSource″> <ref bean=″dataSource″ /> </property> <property name=″mappingResources″> <list> <value>com/jy/crm/value/PackageTypeValue.hbm.xml</value> </list> < /property> </bean> <--监测业务类--> <bean id=″site″ class=″com.xinyuan.scada.Site″> <property name=″sessionFactory″> <ref bean=″sessionFactory″ /> </property> </bean> 4)访问实时数据库的业务层设计。 采用JavaBean 结合Hibernate 和Spring 取得监测点的监测数据,示意代码如下: public class Site extends HibernateDaoSupport{ public SiteValue getLatestData(String siteNo);{ //HQL 语句,取得指定监测点的最近数据,按时间倒序排序 String hql=″from SiteValue site where site.siteNo=芽order bysite.dataTime desc″; Queery q=session.createQuery(hql); q.setString(0,siteNo); q.setMaxResults(1); //只取最新的数据 return (SiteValue)q.uniqueResult(); }} 3.3 LCDS 数据交换层设计 1)参见Adobe 文档将LCDS 配置在Tomcat 上。 2)配置LCDS 远程对象服务: /WEB-INF/ flex/remote-config.xml <service id =″ remoting -service″ class =″ flex.messaging.services.RemotingService″> <adapters> <adapter-definition id=″java-object″ class =″ flex.messaging.services.remoting.adapters.JavaAdapter″ default=″true″/ > </ adapters> <default-channels> <channel ref=″xinyuan-amf″/ > </ default-channels> <--定义LCDS 远程对象,并使用默认的通道xinyuan-amf --> <destination id=″site″> <properties> <source> com.xinyuan.scada.Site</ source> </ properties> </ destination> </ service> 3.4 Flex GUI 显示层设计与实现 1)定义远程对象服务:直接通过LCDS RemoteObject 访问Java 业务对象方法,定义回调事件处理取得监控数据。 <mx:RemoteObject id =″ site01″ destination =″ site″ result =″ handleResult01(event)″ fault=″handleFault01(event) /> 2)定义监控画面,如图3 所示。
<mx:Application xmlns:mx=″http: //www.adobe.com/2006/mxml″ > <mx:Panel title=″新园供热″ width=″100%″ height=″100%″ backgroundImage =″tu01.jpg″> <mx:Label id='site001_t' text=″″ x=″628″ y=″445″/> <mx:Label id='site001_p' text=″″ x=″648″ y=″445″/> <mx:Label id='site001_p' text=″″ x=″668″ y=″445/> 。。。。。。 </mx.Panel> </mx:Application> 3)定时调用业务监测业务对象方法巡回取得监测数据并显示: //定时器起动入口,间隔5 秒钟读取检测数据。 public function startTimter():void{ intervalId001 = setInterval(doGetDataSite001,5000); intervalId001 = setInterval(doGetDataSite002,5000); } //检测点01 定时器回调方法,通过RemoteObject 调用服务器端Java业务对象方法, public function doGetData001():void{ site01.getLatestData(″1″); } //定义RemoteObject 事件处理方法,取得监控数据并写入到Label 控件中。 private function handleResult01(event:ResultEvent):void{ Site01_t.text=event.result.site.t; } |
联系客服