李高鹏,楼海龙,杨 静
(1. 中海油伊拉克有限公司 天津300450;2. 中海油采油技术服务有限公司 天津300450)
生产时率是油田开发生产过程中的重要基础数据,通过生产时率可以反应油田的油井利用率以及整体开发生产效率。生产过程中由于各种原因导致的油井关停事件是造成生产时率损失和产量损失的主要因素。本文以伊拉克某中资油田为背景,该油田投产于20世纪70年代,生产管理手段仍在沿用手工报表,效率低且不便于跟踪统计。该油田主要包括近200口油井,随着地层压力的衰减,生产模式逐渐由自喷生产转向电潜泵开发,生产时率对地面设备和供电的稳定性要求越来越高。
生产时率的影响因素多种多样,如电网波动和停电、管线泄漏、井下电潜泵故障、驱动电潜泵发电机的保养和故障停机、设施流程维修改造、地层原因、偷盗等都会造成生产关停。
常规Excel表格统计生产时率有以下不足:①不能同时多人对表格进行编辑;②在Excel中输入关停事件时,不仅要计算每个关停事件的时长,还要查询单井产量,计算产量损失,工作量大且容易出错; ③Excel安全性差,容易被篡改或删除;④随着数据的增多,Excel运行速度越来越慢。
本文介绍了一种通过网站+数据库的方式实现对关停信息的收集,同时在后台计算出相应的产量损失和生产时率等信息。网站具有共享性好,数据库具有存储量大的优点,对数据的处理和计算上也更加灵活。通过尽量少的输入信息减少人员工作强度,尽可能多地通过后台运算处理来展示更多分析结果。
①通过网站页面实现对关停事件的信息采集,包括井名、站名、关停复产时间、关停原因等。
②通过页面实现对最新油井测井信息的采集,包括单井总产液量、含水率、自喷产量等,并在后台自动计算出纯油产量、产水量、ESP泵的增加产量等信息,补充到该关停事件信息中。
③在信息输入过程中对输入的信息进行必要的数据有效性验证,增强数据可靠性。
④通过页面端查询、更新和删除某一时间段内的油井的所有关停事件信息。
⑤当页面输入关停事件时,根据最新的油井测井信息,自动在后台计算出产量损失和该关停事件对应的当天的生产时率损失,将生产时率的计算精确到每一次关停事件。
⑥查询和显示某一时间段内的按关停原因分组的总的时率损失。
⑦通过页面端输入、查询、更新和删除某一时间段内的所有油井或某一口井的计量和状态信息。
⑧查询和显示截至输入的查询日期,总的油井数量以及总的开井数量,以便快速得出开井率。
⑨通过Excel批量上传油井的测井信息,并在上传数据前进行数据有效性验证,并核对数据库,进行查重。
⑩将查询到符合条件的关停事件信息或者油井信息导出到Excel中。
通过ASP.net编程搭建动态网站作为前台页面,以及MSSQL数据库作为后台数据存储,主要开发平台及软件:Visual Studio 2015;MSSQL 2012数据库;开发语言C#;Bootstrap 4.0 HTML网页页面架构;Microsoft.Net Framework 4.5.2 平台;Windows7+IIS服务。
如图1所示,前台网页页面通过Visual Studio和Bootstrap进行快速开发,作为信息的收集和展示,后台通过Action类作为页面行为的引导,最终通过Sqlhelper类建立和数据库之间的数据交换,实现信息的动态存取。
在进行前端开发前,首先需要对数据库进行配置,规划好所有存储的数据类型和表格。在数据库中建立1个名称为SDcollection的数据库,同时建立 2个表格dbo.SDstatistic和dbo.Wellinfor,分别用来存储关停事件信息和油井测井信息。
图1 数据交换流程 Fig.1 Data exchange process
3.2.1 油井测井信息数据表
油井测井信息数据表总共包含14列,分别用来存储油井的类型、各种产量、含水、测井时间等信息,具体如图2所示,其中产油量Oil、产水量Water、电潜泵增产量ESPproduction,这3项不需要在页面端输入,将根据其他输入的油井测试信息在后台进行计算得出,然后合并填入数据库。
图2 数据库油井信息表结构设计 Fig.2 Structure design of oil well information table in database
3.2.2 关停信息数据表
关停信息数据表包含14列,分别用来存储关停信息的井名、关停时间、关停原因、产量损失及该关停事件所对应的当天的时率损失等信息,具体如图3所示。其中只有SDtime、Starttime、CloseWellYN、SDreason为必填项,Detailreason为选填项,其他项在输入关停信息时,将自动查询测井信息数据表,并计算出对应的信息,一并填入关停事件信息表。
3.2.3 时率计算原则
时率计算根据统计规则的不同,结果也会有差别,本文所列时率计算原则具体如下:
①当输入某油井关停事件时,将首先查询测井信息表中有关该井的最近一条信息,并由此计算出“产 量损失”和“关停时长”,读取该井的“Active”状态、该井的“自喷产量”,关停时“X-tree阀门是否关闭”,“关停和时间”等,并查询截至当天Active=Y的总井数,然后计算出该关停事件的“当天损失时率”,合并以上信息后,作为一条关停记录写入数据库。
图3 数据库关停信息表结构设计 Fig.3 Structure design of shutdown information table in database
②当查询某个时段的时率时,记入时率损失的 2种情况为:如果该井状态Active=Y,并且自喷产量NFproduction>0,并且关闭了采油树阀门CloseValveYN=Y;如果该井状态Active=Y,并且自喷产量NFproduction=0,并且没有关闭采油树阀门CloseValveYN=N。
③当查询某个时段的时率时,不计入时率损失的2种情况:该井状态Active=Y,并且自喷产量NFproduction>0,且没有关闭采油树阀门CloseValveYN=N;该井Active=N,则该关停事件不计入时率损失。
④当输入的关停事件跨越多天时,输入时会自动分解到每一天,并计算每一天的时率损失。
⑤关停事件当天的单井损失时率如式(1)所示:
式中:ts为关停事件当天损失时率;h为该油井关停时长;n为当前状态Active=Y的所有油井数。
⑥当查询某个时间段的总时率时,在检索时间段内,根据条件②、③计算关停损失时率如式(2):
式中:χ为检索时间段内的总生产时率;Tstart为检索起始日期;Tend为检索结束日期。
3.2.4 数据库触发器的设计
在关停信息数据表中,定义了触发器SDstatistic_ AutoEx_trigger,触发器的使用主要满足当输入关停事件时,自动计算相关项目,并更新到数据库中。具体实现以下功能:
①自动计算关停时长、液量损失、油量损失;
②查询测井信息表获得该井的自喷产量,用于后面时率计算的判断依据;
③当关停事件跨越多天时,自动将其拆分到每 一天;
④自动计算每一个关停事件所对应的当天的时率损失。
具体代码逻辑如下,由于篇幅限制,本文以下程序只说明逻辑结构,并非可执行源码。
insert into SDstatistic(*)values(*)
3.2.5 数据库时率计算函数的使用
数据库中定义了1个表值函数FN_TimeRate ByReason,当页面请求计算某个时间段的时率时,数据库将查询该时间段内的每一条关停事件,根据时率计算原则的第②、③、④条判断是否计入时率损失,最后按关停原因分组,返回一个List给页面后台代码,然后绑定到页面GridView中。数据库时率计算函数代码如下:
根据前端页面信息输入和展示的需要,总共规划7个页面:
①Shutdown Event Input输入关停事件信息;
②Shutdown Event State查询关停事件和生产时率;
③Well-Info Import油井测井信息录入;
④Well-Info State查询油井测井信息;
⑤Backup Database备份MSSQL数据库;
让法比感到安全的是,叫赵玉墨的女人,永远不会爱上他。她那含意万千的凝视是她的技巧,是她用来为自己换便利的,由此他更加恨她。他糊涂了,若是她死心塌地真心诚意地爱他,他不就完结了吗?难道他不该感激她只和他玩技巧?
⑥Detail Shutdown Infor展示某一关停事件的详细信息(间接打开);
⑦Detail Well-Info 展示某油井的某条详细测井信息(间接打开)。
前端页面的样式设计使用Bootstrap框架,能够满足快速开发的需求,同时使用母版页,在母版页中对主导航栏进行设计后,可以直接在其他子页面中进行调用,而避免重复开发。
本文着重讲述前2个页面,其他页面具体功能代码、Excel上传下载、Bootstrap页面架构以及Web发布等不再详述。
3.3.1 页面ShutdownEventInput的设计
由于各个脱气站的油井数量是动态变化的,为避免每次有新的油井投产,就要从后台修改网页的页面设计,那么油井输入页面也需要根据各个站的油井数量动态显示所有井。如图4所示。
3.3.2 ShutdownEventInput前台页面
在前台页面中使用DropDownList控件,罗列 9个站的站名,当需要输入某个站的关停事件时,选择该站的站名,在后台程序中将查询油井测井信息表中所有隶属该站的井,并将该站的井名和有油井类型绑定到页面的GridView中,各列功能为:
图4 关停事件输入页面 Fig.4 Input page of shutdown events
②WellName,DGS和Type是从数据库查询出来后直接绑定无需填写;
③SDtime和Starttime为文本框,用于输入时间,通过弹窗方便选取时间;
④XtreeValveClose和SDreason则为下拉菜单,便于填写;
⑤Detailreason为多行文本框。
3.3.3 ShutdownEventInput前台页面代码
3.3.4 ShutdownEventInput后台处理
在后台代码中,当点击提交submit按钮后,将首先对各个checkbox打勾的行所填内容进行有效性验证,如果不满足下面条件,则会在页面弹出报警提示用户:
①输入的 SDtime和 Startime必须符合InputTimeValidation()函数所规定的日期格式;
②XtreeValveClose和SDreason不能为空;
③点击提交后,通过action.TotalCount()类获得该站总的井数;
④通过action类的GetWellName()方法,来获得该站所有井的井名并绑定到GridView。
3.3.5 ShutdownEventInput页面后台代码
3.3.6 Active类的逻辑处理
后台代码响应前台页面请求时,通过传递过来的参数“DGS”名字,查询数据库中对应站所有的井,并生成列表返回到页面后台代码中,最后绑定到页面的GridView。在Action类中,首先定义好查询SQL数据库的字符串sql语句,以及内部形参,然后通过内部方法给形参赋值;最终调用Sqlhelper类中的ExecuteReader()方法获取油井列表返回给页面后台。Active类代码如下:
3.3.7 Sqlhelper类逻辑功能
Sqlhelper类专门用来处理与数据库之间的数据交换,包含5个方法,分别用来实现对数据库的读写等各种操作:
①ExecuteNonQuery()方法,执行SQL语句并返回受影响的行数;
②ExecuteScalar()方法,执行SQL语句并返回查询结果集的第一行第一列的内容;
③ExecuteReader()方法,执行SQL语句并返回查询结果集;
④ExecuteDataTable()方法,执行SQL语句并以表的形式返回查询结果集;
⑤ExecuteProc()方法,执行数据库中预定义的存储过程,并返回第一行第一列的值,以判断是否执行成功,该方法用作备份数据库使用。
如图5所示,在关停事件展示页中,定义了检索条件行,可以分别查询某个时间段的所有关停事件,或者某个井的关停事件,以及对应的时间段内按关停原因分组的生产时率损失和总时率。
图5 关停事件展示页面 Fig.5 Shutdown event state
同时在查询结果表中,通过按钮实现查询结果导出到Excel中。由于在Shutdown Event Input页面中已详细介绍了Action和Sqlhelper类的功能,下面的内容中将不再赘述。
如图6所示,同时展示了符合查询时间的关停事件的列表,在列表的首列定义了超链接,可以打开关于该事件的详细信息。
图6 关停事件列表展示页 Fig.6 Shutdown event list
本文提出了一种时率统计方法,通过网站开发部署和完善,能够满足生产需求,从而减轻了数据统计工作量,有效保障数据的准确性,同时提高了统计的数字化水平,便于后期维护。