软件说明书最终版_第1页
软件说明书最终版_第2页
软件说明书最终版_第3页
软件说明书最终版_第4页
软件说明书最终版_第5页
已阅读5页,还剩68页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、1 开发背景我国作为能源消费大国, 对天然气、石油等资源的需求巨大, 而输送这些油气资源的管线大部分都埋设在地下, 由于长期受到土壤以及周边环境的影响而发生腐蚀, 从而大大降低了管道的使用寿命, 甚至发生泄漏、爆炸等事故, 严重威胁人民生命财产安全, 并造成环境污染。因此各燃气、石油等公司对防止埋地管道腐蚀问题非常重视。长期的运行实践证明, 防腐涂层和阴极保护技术相结合是最为经济有效的防腐措施。阴极保护技术是电化学保护技术的一种,其原理是向被腐蚀金属结构物表面施加一个外加电流,被保护结构物成阴极,从而使得金属腐蚀发生的电子迁移得到抑制,避免或减弱腐蚀的发生。阴极保护通常采用强制电流法(俗称外加

2、电流法)和牺牲阳极法,对埋地钢质管道实施电化学防腐蚀处理。通常在城市燃气企业,一般来说,都采用牺牲阳极法实施阴极保护,牺牲阳极法阴极保护系统有效阴极保护年限受牺牲阳极寿命的限制,需要定期检测和更换,由于其保护电位、保护电流、自然电位、阳极电位等的数据采集仍处于人工采集阶段,信息化的技术处理还远不到位。因此,设计了埋地管道阴极保护远程监测预警系统,此系统彻底改变了人工测量方式,节省了人力、财力和物力。2 系统需求分析2.1管道阴极保护监控系统架构管道阴极保护监控系统是一套面向阴极保护领域的无线远程智能监控系统。该系统以地理信息系统(GIS)为管理平台,以SQLSERVER数据库作为系统统一的数据

3、库,以公共无线数据通讯方式(GSM)为数据传输手段,该系统实现了对管道等被保护体保护数据的监测、超限报警、图形化的管理以及数据的查询与分析。1)系统工作流程智能电位采集终端将采集的电位数据通过GSM无线通讯方式传送到INTERNET网上,通讯协议采用TCP/IP,数据通过INTERNET网传送到服务器中,最后通过服务器中对应的后台服务程序完成数据处理。后台服务程序在数据处理时,同时完成数据的存储、通讯和与GIS系统的信息交换工作。用户通过GIS应用程序提供的电子地图、图表和报表,可以直观的观察到管道沿线保护情况。图1 阴极保护系统拓扑图2)阴极保护监测预警系统主要功能界面阴极保护在线监控专家系

4、统结合地理信息系统(GIS)技术、无线通讯(GSM)技术和数据库技术,该系统实现了对管道等被保护体保护数据的监测、超限报警、图形化的管理以及数据的查询与分析。图2 测试桩保护电位原型图2.2 系统登录界面设计用于用户登陆本系统。用户在此页面输入正确的用户账号和密码后将出现登陆用户有权操作的功能模块菜单,不同的登陆用户功能菜单可能不同,并在窗口底部显示登陆用户主要信息,对用户输入的账号和密码分两级提示,如果账号错误则提示账号不存在,如果密码错误则提示密码不正确。如图所示图3 登录界面原型图图4 系统首页设计流程图2.3 用户帐号管理用于录入操作本系统的用户的基本信息,并对操作员的使用权限进行授权

5、。本系统采用 账号、密码登陆方式,每个操作员都有一个独立的帐号和密码,每个账号都能使用哪些模块由管理员进行授权。操作员的状态有正常和禁用两个选择,用于控制操作员账号当前是否可用,通常情况下都为“正常”。每个操作员都可以修改自己的密码,在用户正确输入了当前登陆账号和旧密码,并两次输入新密码相同的情况下,将当前登陆账号的密码更新为新输入的密码信息,否则提示旧密码错误或两次输入的新密码不相同。字段名称数据类型备注单位字符类型姓名字符类型帐号字符类型权限字符类型创建时间日期类型联系电话字符类型是否禁用布尔类型表 1数据库表字段图5 用户管理原型图6用户添加界面原型2.4 测试桩信息录入模块(1)管线基

6、本数据录入用于录入管线基本数据,字段包括管线编码、管线名称。当用户输入相同管线名称或向数据库保存数据出错时,进行正确提示,管线名称唯一不能重复。图7 管线基本数据录入字段名称数据类型备注管线编码字符类型管线名称字符类型备注字符类型表2 管线数据库表字段(2)测试桩基本数据录入用于录入每条管线上的测试桩基本信息。字段名称数据类型备注管线编码字符类型测试桩编码字符类型测试桩名称字符类型备注表3 管线上测试桩数据库表字段图8测试桩信息录入界面设2.5 测试桩保护电位数据监测本模块显示各测试桩的阴极保护电位数据,并可按日期、管线条件进行检索查询。字段名称数据类型备注测试桩编码字符类型日期日期类型(年-

7、月-日)电位值数值类型表4 测试桩点位数据库表字段图9 测试桩保护电位界面原型图2.6 远控采集数据当用户操作该模块,可向指定测试桩发送采集电位的请求,测试桩被唤醒后完成电位数据检测,并将检测数据回传到远端服务器存储。图10远控采集数据界面原型图2.7 保护电位数据统计查询用于查询历史各测试桩保护电位数据,并可按日期范围、管线、测试桩编号等条件进行检索显示数据。 图11保护电位数据统计查询界面原型图2.8 测试桩地理信息(GIS)在地图上展现出每个桩所在地理位置以及当前的运行状态(当测试桩发生故障或电位超限时用红色进行标记。图12测试桩地理信息(GIS)界面原型图2.9 测试桩电位超限预警该模

8、块用来显示已超过正常保护电位值的各测试桩的电位情况,其中超限类型分为:较为严重过保护(-1.2 -1.3)、严重过保护(-1.3)。图13 测试桩电位超限预警界面原型图3 系统总体设计埋地管道阴极保护远程监测预警系统主要由现场阴极监测分站和数据采集分析软件系统(监控中心)两大部分组成,其结构如图14所示。现场阴极监测分站由无线数据收发器和阴极数据采集器两个部分组成,阴极数据采集器负责测量管道的保护点位,以及恒电位仪的输出电压输出电流,而无线数据收发器负责把采集所得数据通过通讯网络进行上传。图14 系统总体结构图上位机软件系统(监测中心)采用当下流行的Java语言开发,与C+相比,它集成性好,界

9、面设计便捷美观,更易于开发,节省了程序开发周期;该系统以地理信息系统(GIS)为管理平台,以SQLSERVER数据库作为系统统一的数据库,以公共无线数据通讯方式(GSM)为数据传输手段,最终实现了对管道等被保护体保护数据的监测、超限报警、图形化的管理以及数据的查询与分析。软件系统主要由用户登录模块、位置选择模块、曲线浏览模块、数据管理模块以及记录管理模块组成,其功能结构图如图15所示。图15 软件系统功能结构图4 开发环境搭建4.1 Microsoft SQL Server 2008安装说明(1)首先,在安装文件上,单击鼠标右键选择以管理员的身份运行,如下图所示:打开如下所示的SQL Serv

10、er安装中心对话框:(2)选择左边的安装选项,单击右边的全新SQL Server独立安装或向现有安装添加功能选项,如图所示:(3)在打开的SQL Server 2008安装程序对话框中,出现安装程序支持规则选项,可以看到,一些检查已经通过了,单击确定按钮,进入到下一步,如图所示:(4)单击确定按钮之后,出现输入产品密钥的提示,这里我使用的密钥是企业版的:JD8Y6-HQG69-P9H84-XDTPG-34MBB,单击下一步按钮继续安装,如图所示:(5)在接下来的许可条款页面中选择我接受许可条款选项,单击下一步按钮继续安装,如图所示:(6)在出现的安装程序支持文件页面中,单击安装按钮继续,如图所

11、示:(7)安装程序支持文件的过程如图所示:(8)之后出现了安装程序支持规则页面,只有符合规则才能继续安装,单击下一步按钮继续安装,如图所示:(9)在功能选择页面中,单击全选按钮,并设置共享的功能目录,单击下一步继续,如图所示:(10)在实例配置页面中,选择默认实例,并设置是实例的根目录,单击下一步按钮继续,如图所示:(11)在磁盘空间要求页面中,显示了安装软件所需的空间,单击下一步继续,如图所示:(12)在服务器配置页面中,根据需要进行设置,单击下一步按钮继续安装,如图所示:(13)在数据库引擎配置页面中,设置身份验证模式为混合模式,输入数据库管理员的密码,即sa用户的密码,并添加当前用户,单

12、击下一步按钮继续安装,如图所示:(14)在Analysis Services配置页面中,添加当前用户,单击下一步按钮,如图所示:(15)在Reporting Services配置页面中,按照默认的设置,单击下一步按钮,如图所示:(16)在错误和使用情况报告页面中,根据自己的需要进行选择,单击下一步按钮继续安装,如图所示:(17)在安装规则页面中,如果全部通过,单击下一步按钮继续,如图所示:(18)在准备安装页面中,看到了要安装的功能选项,单击下一步继续安装,如图所示:(19)在安装进度页面中,可以看到正在安装SQL Server 2008,如图所示:(20)经过漫长的等待,SQL Server

13、 2008安装过程完成,单击下一步按钮继续,如图所示:(21)在完成页面中,可以看到SQL Server 2008安装已成功完成的提示,单击关闭按钮结束安装,如图所示:4.2 JDK安装与环境配置(1)工具JDK 1.8.0_77Win7环境(2)安装JDK的安装非常简单,按照安装提示一步步操作即可。A、双击安装程序,选择要安装的组件,更改安装路径;功能全选,路径未更改;B、为配置Java运行时环境(JRE);路径仍选择默认路径;C、完成。(3)环境配置A、选择计算机属性高级系统设置高级环境变量B、系统变量新建 JAVA_HOME 变量,变量值填写JDK的安装目录(我的DProgram Fil

14、eJavajdk1.8.0_77)。C、系统变量寻找 Path 变量编辑。 在变量值最后输入 %JAVA_HOME%bin;%JAVA_HOME%jrebin;D、系统变量新建 CLASSPATH 变量。变量值填写.;%JAVA_HOME%lib;%JAVA_HOME%libtools.jar(注意最前面有一点)系统变量配置完毕。E、检验是否配置成功 运行cmd 输入 java -version (java 和 -version 之间有空格)若如图所示 显示版本信息 则说明安装和配置成功。4.3 NetBeans8.1 安装说明(1)下载NetBeans是一个可以用来编译java语言程序的软件

15、。下载网址:/downloads。根据自己的电脑配置选择合适的版本。(2)安装A、以管理员身份运行下载的安装包B、配置安装程序C、应用服务器全选D、选择磁盘(除系统盘均可)。点击下一步。E、安装完成。5 软件详细开发5.1 地图package com.guanxian.jsf;import javax.inject.Named;import javax.enterprise.context.SessionScoped;import java.io.Serializable;import com.gisfaces.model.*;import java.ut

16、il.ArrayList;import java.util.List;Named(value = mapc)SessionScopedpublic class mapc implements Serializable private GraphicsModel model = new GraphicsModel(); public GraphicsModel getModel() List list = new ArrayList(); for (int i = 0; i 20; i+) MarkerGraphic marker = new MarkerGraphic(); marker.se

17、tCoordinate(new Coordinate(42, -120.66 + i * 4); marker.getAttributes().put(城市, 徐州); marker.getAttributes().put(省份, 江苏); marker.getAttributes().put(Website, marker.setDraggable(true); list.add(marker); PolylineGraphic polyline = new PolylineGraphic(); polyline.getCoordinates().add(new Coordinate(42,

18、 -120.66); polyline.getCoordinates().add(new Coordinate(42, -120.66 + 80); polyline.setStyle(LineStyle.SOLID); polyline.setColor(#0000FF); polyline.setOpacity(0.5); polyline.setWidth(5); polyline.getAttributes().put(Location, The Main Street Bridge); polyline.getAttributes().put(Polyline Setting, Va

19、lue); polyline.getAttributes().put(setColor(), polyline.getColor(); polyline.getAttributes().put(setOpacity(), polyline.getOpacity(); polyline.getAttributes().put(setWidth(), polyline.getWidth(); list.add(polyline); this.model.setGraphics(list); this.model.setName(管线设备管理); return model; public void

20、setModel(GraphicsModel model) this.model = model; public mapc() 5.2 实时曲线界面开发代码Named(aiController)SessionScopedpublic class AiController implements Serializable EJB private com.guanxian.facade.AiFacade ejbFacade; EJB private com.guanxian.facade.GuanxianFacade gejbFacade; EJB private com.guanxian.faca

21、de.ZhuangziFacade zejbFacade; EJB private com.guanxian.facade.CvalueFacade cejbFacade; EJB private com.guanxian.facade.CeliangzhiFacade celiangFacade; private List items = null; private Ai selected; private LineChartModel linemodel = new LineChartModel(); private List list = new ArrayList(); private

22、 List guanxianlist = null; private Guanxian selg; boolean isrender = true; public LineChartModel getLinemodel() return linemodel; public void setLinemodel(LineChartModel linemodel) this.linemodel = linemodel; public boolean isIsrender() return isrender; public void setIsrender(boolean isrender) this

23、.isrender = isrender; public List getGlist() if (guanxianlist = null) guanxianlist = this.gejbFacade.findAll(); return guanxianlist; public void setGlist(List glist) this.guanxianlist = glist; public Guanxian getSelg() return selg; public void setSelg(Guanxian selg) this.selg = selg; public AiContro

24、ller() public List getList() return list; public void setList(List list) this.list = list; public Ai getSelected() return selected; public void setSelected(Ai selected) this.selected = selected; protected void setEmbeddableKeys() protected void initializeEmbeddableKey() private AiFacade getFacade()

25、return ejbFacade; public Ai prepareCreate() selected = new Ai(); initializeEmbeddableKey(); return selected; public void create() persist(PersistAction.CREATE, ResourceBundle.getBundle(/Bundle).getString(AiCreated); if (!JsfUtil.isValidationFailed() items = null; / Invalidate list of items to trigge

26、r re-query. public void update() persist(PersistAction.UPDATE, ResourceBundle.getBundle(/Bundle).getString(AiUpdated); public void destroy() persist(PersistAction.DELETE, ResourceBundle.getBundle(/Bundle).getString(AiDeleted); if (!JsfUtil.isValidationFailed() selected = null; / Remove selection ite

27、ms = null; / Invalidate list of items to trigger re-query. public List getItems() if (items = null) items = getFacade().findAll(); return items; private void persist(PersistAction persistAction, String successMessage) if (selected != null) setEmbeddableKeys(); try if (persistAction != PersistAction.

28、DELETE) getFacade().edit(selected); else getFacade().remove(selected); JsfUtil.addSuccessMessage(successMessage); catch (EJBException ex) String msg = ; Throwable cause = ex.getCause(); if (cause != null) msg = cause.getLocalizedMessage(); if (msg.length() 0) JsfUtil.addErrorMessage(msg); else JsfUt

29、il.addErrorMessage(ex, ResourceBundle.getBundle(/Bundle).getString(PersistenceErrorOccured); catch (Exception ex) Logger.getLogger(this.getClass().getName().log(Level.SEVERE, null, ex); JsfUtil.addErrorMessage(ex, ResourceBundle.getBundle(/Bundle).getString(PersistenceErrorOccured); public Ai getAi(

30、java.lang.String id) return getFacade().find(id); public List getItemsAvailableSelectMany() return getFacade().findAll(); public List getItemsAvailableSelectOne() return getFacade().findAll(); public void buttonAction(ActionEvent actionEvent) this.linemodel.clear(); this.addchartmodel(selg); PostCon

31、struct private void loadguanxian() if (null = this.selg) List listg = this.gejbFacade.findAll(); if (listg.size() 0) this.selg = listg.get(0); this.addchartmodel(selg); this.setIsrender(true); /生成门限模型 private void addchartmodel(Guanxian selg) List listCeliang = celiangFacade.findbyGuanxian(IdUtil.fi

32、ndCeliangToken(selg.getGid();/ List cv = cejbFacade.findbyGuanxian(IdUtil.findCeliangToken(selg.getGid(); if (null = this.linemodel) this.linemodel = new LineChartModel(); Axis x = linemodel.getAxis(AxisType.X); x.setLabel(桩子编号); Axis yAxis = linemodel.getAxis(AxisType.Y); yAxis.setLabel(测量值); yAxis

33、.setMin(-1.8); yAxis.setMax(-0.2); LineChartSeries cedian = new LineChartSeries(); /曲线的名称标签 cedian.setLabel(selg.getGname(); int i = 0; LineChartSeries alarm1 = new LineChartSeries(); alarm1.setShowMarker(false); cedian.setXaxis(AxisType.X); for (Celiangzhi c : listCeliang) i+; cedian.set(测点: + IdUt

34、il.findCidByToken(c.getCeliangzhiPK().getId(), c.getValue(); alarm1.set(i, 7); AlarmGateModelFactory agf = new AlarmGateModelFactory(listCeliang.size(); LineChartSeries gateHHH = agf.getGate(AlarmGates.HHH, 最过严重保护); LineChartSeries gateHH = agf.getGate(AlarmGates.HH, 较过严重保护); LineChartSeries gateH =

35、 agf.getGate(AlarmGates.H, 阴极保护); LineChartSeries gateL = agf.getGate(AlarmGates.L, 阴极保护); LineChartSeries gateLL = agf.getGate(AlarmGates.LL, 最低阴极保护判断); LineChartSeries gateLLL = agf.getGate(AlarmGates.LLL, 自然电位); alarm1.setLabel(高位报警门限); alarm1.setXaxis(AxisType.X2); linemodel.addSeries(gateHHH);

36、linemodel.addSeries(gateHH); linemodel.addSeries(gateH); linemodel.addSeries(gateLLL); linemodel.addSeries(gateLL); linemodel.addSeries(gateL); linemodel.addSeries(cedian); String color = linemodel.getSeriesColors(); System.out.println(color); linemodel.setTitle(管线 + selg.getGname() + 当前状态); linemod

37、el.getAxes().put(AxisType.X, new CategoryAxis(管线编号); linemodel.getAxes().put(AxisType.X2, new CategoryAxis(自然号); linemodel.setLegendPosition(e); linemodel.setShowPointLabels(false); FacesConverter(forClass = Ai.class) public static class AiControllerConverter implements Converter Override public Obj

38、ect getAsObject(FacesContext facesContext, UIComponent component, String value) if (value = null | value.length() = 0) return null; AiController controller = (AiController) facesContext.getApplication().getELResolver(). getValue(facesContext.getELContext(), null, aiController); return controller.get

39、Ai(getKey(value); java.lang.String getKey(String value) java.lang.String key; key = value; return key; String getStringKey(java.lang.String value) StringBuilder sb = new StringBuilder(); sb.append(value); return sb.toString(); Override public String getAsString(FacesContext facesContext, UIComponent

40、 component, Object object) if (object = null) return null; if (object instanceof Ai) Ai o = (Ai) object; return getStringKey(o.getId(); else Logger.getLogger(this.getClass().getName().log(Level.SEVERE, object 0 is of type 1; expected type: 2, new Objectobject, object.getClass().getName(), Ai.class.g

41、etName(); return null; FacesConverter(AigConverter) public static class AigConverter implements Converter Override public Object getAsObject(FacesContext context, UIComponent component, String value) if (value != null & value.trim().length() 0) return controller.getSelg(); for (Guanxian g : controll

42、er.guanxianlist) if (g.getGname().equals(value) return g; return null; else return null; Override public String getAsString(FacesContext context, UIComponent component, Object value) if (value != null) return (Guanxian) value).getGname(); else return null; 5.3 报警设置Named(alarmController)SessionScoped

43、public class AlarmController implements Serializable EJB private com.guanxian.facade.AlarmFacade ejbFacade; EJB private com.guanxian.facade.GuanxianFacade gejbFacade; EJB private com.guanxian.facade.ZhuangziFacade zejbFacade; private List items = null; private Alarm selected; private Date date1; pri

44、vate Date date2; private Integer alrmtype = 0; private List zlist = null; private List glist = null; private Guanxian selg; private Zhuangzi selz; public Guanxian getSelg() return selg; public void setSelg(Guanxian selg) this.selg = selg; public Zhuangzi getSelz() return selz; public void setSelz(Zh

45、uangzi selz) this.selz = selz; public List getZlist() return zlist; public void setZlist(List zlist) this.zlist = zlist; public List getGlist() if (glist = null) glist = this.gejbFacade.findAll(); return glist; public void setGlist(List glist) this.glist = glist; public Date getDate1() return date1; public void setDa

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论