油田计量站控制系统的软件设计.docx
《油田计量站控制系统的软件设计.docx》由会员分享,可在线阅读,更多相关《油田计量站控制系统的软件设计.docx(41页珍藏版)》请在冰豆网上搜索。
油田计量站控制系统的软件设计
河北大学工商学院
本科生毕业论文(设计)
题目:
油田计量站控制系统的软件设计
学部信息科学与工程学部
学科门类工学
专业自动化
学号2007479243
姓名张强
指导教师刘鑫
2011年5月12日
油田计量站控制系统的软件设计
摘 要
在油田生产和管理过程中,油气计量工作是一项非常重要的工作。
随着先进的计算机技术、工业控制技术以及通信技术的迅猛发展和油田信息化进程的不断深入,计量方式向自动化、智能化、远程化方向发展。
因此,实现油田计量自动化是整个油田自动化的一个重要组成部分,它可以提高油田的实时控制和高效管理。
本文设计的是一个基于SCADA的油田计量自动化系统,此系统利用计量控制器作为计量站的下位机,并通过无线通讯网络传输给服务器,利用组态软件对计量站的现场数据和计量过程进行远程实时监控。
对于油气的计量,下位机的计量管理程序会根据液、气计量的数学模型计算出日产液量、气量。
该系统已成功应用于实际的计量中,并取得了很好的效果。
关键词:
油田计量站;自动化;软件
OilFieldMeteringStationControlSystemSoftwareDesign
ABSTRACT
Intheprocessofoilfieldproductionandmanagement,oilandgasmeteringworkisaveryimportantjob.Withadvancedcomputertechnology,industrialcontroltechnology,andrapiddevelopmentofcommunicationtechnologyandoilinformationprocessfurther,meteringautomation,intelligent,long-rangedirection.Therefore,toachieveautomationoftheentireoilfieldmeasurementisanimportantpartofautomation,whichcanincreasethefieldofreal-timecontrolandefficientmanagement.ThisdesignisbasedonmeasurementautomationoilfieldSCADAsystem,thesystemcontrollerasmeasuredbymeasurementstationsunderthecrew,andthroughwirelesscommunicationnetworktransmissiontotheSCADAserver,usingtheconfigurationsoftwareforfielddatameasurementpointsandmeasurementprocessRemotereal-timemonitoring.Forthemeasurementofoilandgas,underthecrewmanagementprocessbasedonthemeasurementofliquidandgasmeasurementmathematicalmodeltocalculatethedailyfluidproductionrate,gas.Thesystemhasbeensuccessfullyappliedinpracticalmeasurement,andachievedgoodresults.
Keywords:
oilfieldmeteringstation;automation;software
4.2组态软件设计23
4.2.1系统参数设置23
前 言
长期以来,工业自动化与计算机技术的应用是分不开的。
从早期的单片机、单板机开始,经历了工业控制机阶段,到目前的DCS系统、SCADA系统,计算机在工业自动化中的应用达到了一个新的水平。
当前,自动化技术与计算机技术、网络技术相结合,朝着管控信息一体化的方向发展。
计量站是油田的重要组成部分。
计量站生产担负着站内各个油井的液、油、气三相计量任务,需要及时、准确地为油田地质部门提供油藏工程资料。
然而,目前我国很多油田计量站仍然采用人工计量方式,采注工人三班工作制,劳动强度大、效率低。
同时,人工计量是间歇不连续的,计量次数少、时间短,再加上大部分油井间出、原油含水较高,所以计量结果代表性差,不能为油藏工程提供真实可靠的资料。
自动化和管理信息系统为实现计量站生产全面自动化提供了可能。
国内外陆续推出了功能完善的远程控制终端(RTU),提高了计量站现场控制的自动化水平;通过无线/有线通信系统,可以将各个计量站RTU与中控室连接起来,构成数据采集和监控(SCADA)系统,在中控室完成生产监控,实现计量站无人值守;而SCADA系统的实时生产数据通过网络传输到管理信息系统(MIS)后,可实现对生产数据的自动分析处理。
1 系统概述
1.1 系统结构
油田计量自动化系统由现场仪表、计量控制器、无线通信网络、SCADA服务器和客户端等组成[1],如图1-1所示。
计量间的现场仪表有、压力变送器、温度变送器、气体流量计、分离器液位计、电动阀等仪表。
计量控制器通过无线通信网络与服务器进行数据双向传输,它向中心控制室传输采集到的实时监测数据和计量结果,同时接收中心控制室或人机界面发送的计量等命令来控制电动阀动作,从而使计量站的远程计量达到很高的自动化控制水平。
图1-1 计量站SCADA系统结构图
1.2 系统功能
ECHO5400RTU是一个真正的实时多任务系统。
计量过程控制程序负责对分离器计量的过程进行控制,而计量管理程序则负责计量结果的计算、计量选井、排序,不仅可以实现自动排序计量,即RTU按照事先预置的计量时间、计量次数、顺序自动选井计量,也可以针对某一口井,实现手动选井计量,系统功能如表1-1。
表1-1 ECHO5401/5406三相计量仪功能表
类别
功能说明
备注
自动三相计量
●计量方式:
✧定时计量。
✧定次计量。
支持定次计量最大时间设定。
●倒井方式:
✧自动排序倒井。
✧人工倒井(多井计量)。
●计量结果:
✧计量过程结果:
总日产液、油、水、气量,平均含水率。
✧单罐计量结果:
单罐日产液、油、水、气量,平均含水率。
2 计量原理
2.1 计量油气分离器加压力平衡罐计量工艺
油气分离器加压力平衡罐计量工艺流程[2]如图2-2所示。
该工艺中,设置一个与油气分离器相互连通的压力平衡罐,二者气压始终平衡。
压油阶段打开压油阀,此时油气分离器内液面相对平衡罐液位存在一定的位差(2m左右),油气分离器内液体靠自重压入压力平衡罐内。
由于减少了故障点,所以增大了采注计量站油气集输、油气计量的安全系数,减少了采注计量站维护工作量。
特别适合低产低能油井自动计量。
图2-2 油气分离器加压力平衡罐计量工艺流程图
2.2计量过程
该工艺[3][4]中,采用油气分离器和压力平衡罐,二者相互连通,气压始终平衡。
压油阶段打开压油阀,此时油气分离器内液面相对平衡罐液位存在一定的位差(2m左右),油气分离器内液体可以靠自重压入压力平衡罐内。
当需要计量时,选择一个电动三通球阀(D10~D12)如图2-3所示,将油井的来油改入分离器进行气、液两相分离。
当向计量站的计量控制终端(RTU)发出启动命令后,RTU将分离器电动两通阀D13关闭,分离器液位上升。
当液位上升到液位计下限时,液位计的相应触点开关F1动作,RTU开始有效计量时间的计时(也可根据液位值判断上下液位)。
当液位上升到液位计上限时,液位计的相应触点开关F2动作,RTU停止有效计量时间的计时。
根据分离器容积和每次计时时间,可以计算出该油井日产液量,结合含水率或原油密度,可计算出该油井的日产油量;气体通过气体流量计计量后与原油混合进集油汇管,混输至集中处理站。
根据每次计时时间内的天然气流量F累计,并检测出气时的温度T、压力P进行补偿,可以计算出该油井的日产气量;
然后进入压油过程,RTU将分离器的电动两通阀D13打开,油水混合液通过D13压出,分离器液位下降。
同时,用高含水分析仪A1连续测量含水率,并计算含水率平均值,从而计算液、油产量。
当分离器液位下降到低于“分离器液位计下限”,液位计的相应触点开关F2动作,压油结束,RTU将电动两通阀D13关闭。
此后分离器液位转而上升,又进入下个罐次的计量。
每个计量过程可包含多个罐次,其结果数据包括:
井号,计量起始日期和时间,计量总时间和有效时间,计量罐数,日产液量(体积和重量)、日产油量(体积和重量)、日产水量(体积和含水率)、日产气量等。
对于这种工艺流程,计量站远程控制终端(RTU)应能够完成以下功能:
(1)倒井控制
根据RTU人机界面操作命令或中控室远程操作命令,自动将某一或多个油井切换到计量位,并启动计量。
倒井控制可包括人工倒井和自动排序倒井等方式,用于倒井的电动阀除了上述的三通阀外,也可以是多通阀。
(2)计量流程控制
某一个或多个油井切换到计量位后,根据上、下液位开关状态自动控制压油阀的开、关,完成一定时间或一定罐次的计量(由RTU人机界面或中控室设置)。
(3)计量计算
计量过程结束后,根据计量有效时间、实际计量罐次、平均含水率、天然气流量自动计算出液、油、气的日产量。
图2-3 采注计量站三相自动计量
3 系统硬件及I/O
3.1 ECHO5400控制器
ECHO5400系列自动计量控制器是为适应油田自动化的需要而设计的远程控制终端,选用先进的主控制器和IO模块,硬件采用模块化结构,控制器指标,如表3-1所示。
表3-1 5400控制器指标
控制器内存
640k
通讯口
2个RS232串行口/一个以太网接口
波特率
300 600 12002400
480096001920038400
通讯协议
ModbusASCIIModbusRTU/Modbus
TCP/IP
AI/AO模块
8路A/D分辨率12位
0-20mA/4-20mADC电流信号
0-5V/1-5VDC电压信号
热电输入
4路
PI模块
4路0-10kHZ频率脉冲信号
DI/DO模块
8路继电器触点信号状态电平信号
串行口
2路RS232口
通讯方式
无线租用电话专用双绞线
供电方式
220VAC(±20%)50HZ
温度特征
使用温度-40℃-+70℃
存储温度-50℃-+80℃
测量精度
0.1%
3.2电动阀
电动阀[5]:
用于液体、气体和风系统管道介质流量的模拟量调节,是AI控制。
在大型阀门和风系统的控制中也可以用电动阀做两位开关控制。
电动阀:
可以有AI反馈信号,可以由DO或AO控制。
(1)开关形式
电动阀的驱动一般是用电机,开或关动作完成需要一定的时间模拟量的,可以做调节。
(2)工作性质
电动阀的驱动一般是用电机,比较耐电压冲击。
电磁阀是快开和快关的,一般用在小流量和小压力,要求开关频率大的地方电动阀反之。
电动阀阀的开度可以控制,状态有开、关、半开半关,可以控制管道中介质的流量而电磁阀达不到这个要求,如图3-1所示。
图3-1计量间电动阀
3.3系统I/O
为了系统计量进行进行更好的控制,需要实时的对计量过程中的气体液体流量、压力、液位、含水率等物理量进行采集,在程序中对这些物理量进行分析,并通过DO控制电动阀动作,同时为油井产量及含水率的计算提供原始数据,以下是系统的I/O配置:
(1)AI工程值,其中通道号的十位数为模块号,个位数为通道号如表3-2。
表3-2 AI工程值
工程值
名称
单位
AI1
分离器液位
mm
AI2
含水率
%
AI3
出气流量AI1
M3/h
AI4
出气流量AI2
M3/h
AI5
出气压力
MPa
(2)DI工程值,采集电动阀及计量罐物理量,如表3-3所示
表3-3 DI工程值
工程值
名称
DI1
断电检测
DI2
下液位开关
DI3
上液位开关
DI4
两通阀开状态
DI5
两通阀关状态
DI6
1号井计量状态
DI7
1号井生产状态
DI8
2号井计量状态
DI9
2号井生产状态
(3)DO工程值,控制电动阀动作,实现倒井功能,如表3-4所示
表3-4 DO工程值
工程值
名称
DO1
计量指示灯
DO15
两通阀开控制
DO16
两通阀关控制
DO17
1号井计量控制
DO18
1号井生产控制
DO19
2号井计量控制
DO20
2号井生产控制
4 系统软件设计
4.1 下位机软件设计
4.1.1下位机软件框架
下位机程序是基于uC/OS-II操作系统[6]的,uC/OS-II是一个实时多任务的操作系统,uC/OS总是运行优先级最高的任务,用户可根据需要注册自己的任务,图4-1所示。
图4-1 下位机软件框架
4.1.2系统设置
1、时间设置,对系统的日期、时间进行设置[7][8],代码如下
typedefstruct{
u_charhour;
u_charminute;
u_charsecond;
u_charyear;
u_charmonth;
u_charday;
u_charweek;
}TIMER;
staticTIMERt;
staticfirst_run;
////////////////////////////////////////////////////////////////////////////////////////
///处理从人机界面对系统时间日期的更改
if(first_run==0)//首次运行时,同步寄存器值和中间变量值
{
first_run=1;
t.hour=Dbase(ADDR_HOUR);
t.minute=Dbase(ADDR_MINUTE);
t.second=Dbase(ADDR_SECOND);
t.year=Dbase(ADDR_YEAR);
t.month=Dbase(ADDR_MONTH);
t.day=Dbase(ADDR_DAY);
}
if(Dbase(ADDR_HOUR)!
=t.hour//若寄存器现在的值与上次写入值不一致,说明从界面对寄存器值进行了修改.
||Dbase(ADDR_MINUTE)!
=t.minute
||Dbase(ADDR_SECOND)!
=t.second
||Dbase(ADDR_YEAR)!
=t.year
||Dbase(ADDR_MONTH)!
=t.month
||Dbase(ADDR_DAY)!
=t.day)
{
t.hour=Dbase(ADDR_HOUR);
t.minute=Dbase(ADDR_MINUTE);
t.second=Dbase(ADDR_SECOND);
t.year=Dbase(ADDR_YEAR);
t.month=Dbase(ADDR_MONTH);
t.day=Dbase(ADDR_DAY);
set_clock(&t);
}
///处理从人机界面对系统时间日期的更改
////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////显示当前的时间日期
get_clock(&t);
SetDbase(ADDR_HOUR,t.hour);
SetDbase(ADDR_MINUTE,t.minute);
SetDbase(ADDR_SECOND,t.second);
SetDbase(ADDR_YEAR,t.year);
SetDbase(ADDR_MONTH,t.month);
SetDbase(ADDR_DAY,t.day);
2、串口通讯参数设置,其主要设置Modbus协议、主从关系、半/全双工、通讯速率、数据位、停止位及校验位的设置。
US2_CONFIG->station=1;
US2_CONFIG->protocol=US_MODBUS_RTU;
US2_CONFIG->state=US_SLAVE;
US2_CONFIG->duplex=US_FULL;
US2_CONFIG->baud=38400;
US2_CONFIG->parity=US_PARITY_NO;
US2_CONFIG->data_bits=US_DATA_BIT_8;
US2_CONFIG->stop_bits=US_STOP_BIT_1;
US2_CONFIG->time_out=100;
US2_CONFIG->time_delay=0;
US2_CONFIG->port_type=US_RS232;
US2_Config=US2_CONFIG;
/*置接收状态*/
IO_Init(&US2_DEF.rts);/*初始化RTS*/
IO_Init(&US2_DEF.cts);/*初始化CTS*/
IO_Output(&US2_DEF.rts,0);/*置接收状态*/
/*串口2初始化*/
set_us_config(&USART2_DESC,US2_Config);
at91_usart_receive_frame(&USART2_DESC,(char*)us2_rx_buf,US_BUF_SIZE,10);
at91_irq_open(US2_ID,7,AIC_SRCTYPE_INT_EDGE_TRIGGERED,asm_us2_irq);
4.1.3AI数据采集
for(i=0;i{
AI_Engi_BaseAddr=E5501_ENGI_START+i*20;
ChannelCode=Dbase(AI_Engi_BaseAddr);/*界面设置的AI量物理通道代号*/
Card=ChannelCode/10-1;/*十位数表示卡件号*/
Channel=ChannelCode%10-1;/*个位数表示通道号*/
AI_Chan_Addr=E5501_CHAN_START+Card*8+Channel;
if(Card<0||Card>=NUM_E5501||Channel<0||Channel>=8)
BinData=0;/*输入卡件、通道数据非法?
*/
/*读物理通道二进制数:
物理通道从E5501_CHAN_START开始*/
elseBinData=Dbase(AI_Chan_Addr);
/************0-20mA到4-20mA转换**********************/
if(BinData<10000)
BinData=10000;
BinData=(unsignedlong)((BinData-10000)*32767.0/40000.0);
………
}
4.1.4检测含水率与计算
floathighth;/*当前液位高度*/
staticfloatpre_highth;/*上个液位段高度*/
staticintpre_measure_water;/*上次的含水检测标志*/
staticfloatnumber;/*在一个液位段内的检测次数累积*/
staticfloataccum;/*在一个液位段内的含水率累积*/
floataverage;/*在一个液位段内的含水率平均值*/
if(measure_water)/*在含水测量起点和终点之间,测量含水率*/
{/*含水检测次数、重量含水率累加在UPON_OIL_UP阶段清零*/
single_ratio_number+=1;/*含水检测次数*/
single_g_ratio_sum+=FloatDbaseWaterRatioG();/*重量含水率累加*/
/*实时动态显示含水检测次数*/
SetLongDbase(ADDR_SINGLE_RATIO_NUMBER_DISPLAY,(int)single_ratio_number);
}
4.1.5 数据显示
switch(Dbase(ADDR_WATER_MODE))/*含水率显示*/
{
case0:
case2:
SetLongDbase(ADDR_WATER_RATIO_DISPLAY,(unsignedlong)
(FloatDbaseWaterRatioG()*WATER_RATIO_SCALE));/*写入重量含水率*/
break;
case1:
/*写入体积含水率*/
case2:
SetLongDbase(ADDR_WATER_RATIO_DISPLAY,
(unsignedlong)(FloatDbaseWaterRatioV()*WATER_RATIO_SCALE));
break;
}
/*出气流量显示*/
SetLongDbase(ADDR_GAS_DISPLAY,(unsignedlong)(FloatDbaseGas()*GAS_SCALE));
4.1.6 ADP处理手动倒井命令
externintstage;/*外部变量声明:
计量阶段*/
inti;
/*处理ADP3人机界面倒井命令,计量过程中应该禁止倒井*/
for(i=0;i<1+Dbase(ADDR_NUM_WELLS);i++)/*1个两通阀+井数个三通阀*/
{
/*开阀或置计量位*/
if(/*stage==IDLE&&*/Dbase(BASE_ADDR_VALVES_ORDER+i)==1)SetDbaseValve(i,1,0);
/*关阀或置生产位*/
if(Dbase(BASE_ADDR_VALVES_ORDER+i)==2)
SetDbaseValve(i